gperdrizet commited on
Commit
dfe6c2f
·
verified ·
1 Parent(s): a5548e7

Switched to Claude 3.5 Haiku for both agent and job call summary, seemes to be the best so far

Browse files
.github/workflows/python_ci.yml CHANGED
@@ -25,7 +25,7 @@ jobs:
25
  - name: Test with unittest
26
  env:
27
  OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
28
- MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
29
  run: |
30
  python -m unittest tests/test_gradio.py
31
  python -m unittest tests/test_linkedin_resume.py
 
25
  - name: Test with unittest
26
  env:
27
  OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
28
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
29
  run: |
30
  python -m unittest tests/test_gradio.py
31
  python -m unittest tests/test_linkedin_resume.py
configuration.py CHANGED
@@ -6,30 +6,30 @@ from smolagents import OpenAIServerModel
6
 
7
  DEFAULT_GITHUB_PROFILE = "https://github.com/gperdrizet"
8
 
9
- # AGENT_MODEL = OpenAIServerModel(
10
- # model_id="gpt-4.1",
11
- # max_tokens=8000
12
- # )
13
-
14
  # Will be used for single shot summarization with no-frills prompting
15
  # (e.g. job call extraction). It needs to output JSON formatted text,
16
  # but this task does not require any complex reasoning or planning.
17
- SUMMARIZER_MODEL = OpenAI(
18
- base_url="https://gperdrizet--llama-3-1-8b-instruct-serve.modal.run/v1",
19
- api_key=os.environ['MODAL_TOKEN_SECRET']
20
  )
21
 
 
 
22
  # Will be used for resume resume writing agent via HuggingFace smolagents
23
  # Including selection of relevant projects from GitHub profile
24
  #
25
  # Notes:
26
  # - DeepSeek-R1-Distill-Qwen-32B does not seem to work well with smolagents,
27
  # has trouble correctly formatting responses as code.
 
 
 
28
 
29
  AGENT_MODEL = OpenAIServerModel(
30
- model_id="Qwen/Qwen2.5-Coder-14B-Instruct", # Same as HF model string
31
- api_base="https://gperdrizet--qwen2-5-coder-14b-instruct-serve.modal.run/v1",
32
- api_key=os.environ["MODAL_TOKEN_SECRET"],
33
  )
34
 
35
  INSTRUCTIONS = """
 
6
 
7
  DEFAULT_GITHUB_PROFILE = "https://github.com/gperdrizet"
8
 
 
 
 
 
 
9
  # Will be used for single shot summarization with no-frills prompting
10
  # (e.g. job call extraction). It needs to output JSON formatted text,
11
  # but this task does not require any complex reasoning or planning.
12
+ SUMMARIZER_CLIENT = OpenAI(
13
+ base_url="https://api.anthropic.com/v1/",
14
+ api_key=os.environ["ANTHROPIC_API_KEY"]
15
  )
16
 
17
+ SUMMARIZER_MODEL = "claude-3-5-haiku-20241022"
18
+
19
  # Will be used for resume resume writing agent via HuggingFace smolagents
20
  # Including selection of relevant projects from GitHub profile
21
  #
22
  # Notes:
23
  # - DeepSeek-R1-Distill-Qwen-32B does not seem to work well with smolagents,
24
  # has trouble correctly formatting responses as code.
25
+ # - Qwen2.5-Coder-14B-Instruct works OK, but is not great at markdown formatting
26
+ # and tends to get some details wrong.
27
+ # - Claude-3-5-Haiku is the best model for this task so far.
28
 
29
  AGENT_MODEL = OpenAIServerModel(
30
+ model_id="claude-3-5-haiku-20241022", # Same as HF model string
31
+ api_base="https://api.anthropic.com/v1/",
32
+ api_key=os.environ["ANTHROPIC_API_KEY"],
33
  )
34
 
35
  INSTRUCTIONS = """
functions/job_call.py CHANGED
@@ -4,7 +4,11 @@ import json
4
  import logging
5
  from pathlib import Path
6
  from datetime import datetime
7
- from configuration import JOB_CALL_EXTRACTION_PROMPT, SUMMARIZER_MODEL
 
 
 
 
8
 
9
  # pylint: disable=broad-exception-caught
10
 
@@ -57,11 +61,6 @@ def summarize_job_call(job_call: str) -> str:
57
 
58
  logger.info("Summarizing job call (%d characters)", len(job_call))
59
 
60
- # Default to first available model
61
- model = SUMMARIZER_MODEL.models.list().data[0]
62
- model_id = model.id
63
- print(f"Using model: {model_id}")
64
-
65
  messages = [
66
  {
67
  'role': 'system',
@@ -70,12 +69,12 @@ def summarize_job_call(job_call: str) -> str:
70
  ]
71
 
72
  completion_args = {
73
- 'model': model_id,
74
  'messages': messages,
75
  }
76
 
77
  try:
78
- response = SUMMARIZER_MODEL.chat.completions.create(**completion_args)
79
 
80
  except Exception as e:
81
  response = None
 
4
  import logging
5
  from pathlib import Path
6
  from datetime import datetime
7
+ from configuration import (
8
+ JOB_CALL_EXTRACTION_PROMPT,
9
+ SUMMARIZER_MODEL,
10
+ SUMMARIZER_CLIENT
11
+ )
12
 
13
  # pylint: disable=broad-exception-caught
14
 
 
61
 
62
  logger.info("Summarizing job call (%d characters)", len(job_call))
63
 
 
 
 
 
 
64
  messages = [
65
  {
66
  'role': 'system',
 
69
  ]
70
 
71
  completion_args = {
72
+ 'model': SUMMARIZER_MODEL,
73
  'messages': messages,
74
  }
75
 
76
  try:
77
+ response = SUMMARIZER_CLIENT.chat.completions.create(**completion_args)
78
 
79
  except Exception as e:
80
  response = None