navkast commited on
Commit
c1f8477
Β·
unverified Β·
1 Parent(s): 24d33b9

Update location of the VSP module (#1)

Browse files

* Move the code up one level

* Fixup startendmixin validation

This view is limited to 50 files because it contains too many changes. Β  See raw diff
Files changed (50) hide show
  1. {vsp-data-enrichment/.vscode β†’ .vscode}/settings.json +0 -0
  2. vsp-data-enrichment/Makefile β†’ Makefile +0 -0
  3. vsp-data-enrichment/pyproject.toml β†’ pyproject.toml +0 -0
  4. {vsp-data-enrichment/src β†’ src}/notebooks/data/hansae_catlett.json +0 -0
  5. {vsp-data-enrichment/src β†’ src}/notebooks/education_classifier.ipynb +1 -1
  6. {vsp-data-enrichment/src β†’ src}/notebooks/work_experience_classifier.ipynb +67 -48
  7. {vsp-data-enrichment/src β†’ src}/vsp/__init__.py +0 -0
  8. {vsp-data-enrichment/src β†’ src}/vsp/app/__init__.py +0 -0
  9. {vsp-data-enrichment/src β†’ src}/vsp/app/bindings.py +0 -0
  10. {vsp-data-enrichment/src β†’ src}/vsp/app/education_classifier.py +0 -0
  11. {vsp-data-enrichment/src β†’ src}/vsp/app/model/linkedin/linkedin_formatters.py +0 -0
  12. {vsp-data-enrichment/src β†’ src}/vsp/app/model/linkedin/linkedin_models.py +4 -2
  13. {vsp-data-enrichment/src β†’ src}/vsp/app/prompts/__init__.py +0 -0
  14. {vsp-data-enrichment/src β†’ src}/vsp/app/prompts/education_classifier/1 - education_classifier_human.txt +0 -0
  15. {vsp-data-enrichment/src β†’ src}/vsp/app/prompts/education_classifier/1 - education_classifier_system.txt +0 -0
  16. {vsp-data-enrichment/src β†’ src}/vsp/app/prompts/prompt_loader.py +0 -0
  17. {vsp-data-enrichment/src β†’ src}/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_human.txt +0 -0
  18. {vsp-data-enrichment/src β†’ src}/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_system.txt +0 -0
  19. {vsp-data-enrichment/src β†’ src}/vsp/app/work_experience_classifier.py +0 -0
  20. {vsp-data-enrichment/src β†’ src}/vsp/llm/__init__.py +0 -0
  21. {vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/__init__.py +0 -0
  22. {vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/bedrock.py +0 -0
  23. {vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/bedrock_model.py +0 -0
  24. {vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/bedrock_rate_limiter.py +0 -0
  25. {vsp-data-enrichment/src β†’ src}/vsp/llm/llm_service.py +0 -0
  26. {vsp-data-enrichment/src β†’ src}/vsp/llm/openai/__init__.py +0 -0
  27. {vsp-data-enrichment/src β†’ src}/vsp/llm/openai/openai.py +0 -0
  28. {vsp-data-enrichment/src β†’ src}/vsp/llm/openai/openai_model.py +0 -0
  29. {vsp-data-enrichment/src β†’ src}/vsp/llm/openai/openai_rate_limiter.py +0 -0
  30. {vsp-data-enrichment/src β†’ src}/vsp/llm/openrouter/__init__.py +0 -0
  31. {vsp-data-enrichment/src β†’ src}/vsp/llm/prompt.py +0 -0
  32. {vsp-data-enrichment/src β†’ src}/vsp/llm/prompt_chain.py +0 -0
  33. {vsp-data-enrichment/src β†’ src}/vsp/llm/prompt_template.py +0 -0
  34. {vsp-data-enrichment/src β†’ src}/vsp/llm/prompt_text.py +0 -0
  35. {vsp-data-enrichment/src β†’ src}/vsp/shared/__init__.py +0 -0
  36. {vsp-data-enrichment/src β†’ src}/vsp/shared/aws_clients.py +0 -0
  37. {vsp-data-enrichment/src β†’ src}/vsp/shared/config.py +0 -0
  38. {vsp-data-enrichment/src β†’ src}/vsp/shared/config.toml +0 -0
  39. {vsp-data-enrichment/src β†’ src}/vsp/shared/logger_factory.py +0 -0
  40. {vsp-data-enrichment/tests β†’ tests}/__init__.py +0 -0
  41. {vsp-data-enrichment/tests β†’ tests}/app/__init__.py +0 -0
  42. {vsp-data-enrichment/tests β†’ tests}/app/prompts/__init__.py +0 -0
  43. {vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompt_loader.py +0 -0
  44. {vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompts/basic_test/1 - test_human.txt +0 -0
  45. {vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompts/basic_test/1 - test_system.txt +0 -0
  46. {vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompts/basic_test/2 - test2_human.txt +0 -0
  47. {vsp-data-enrichment/tests β†’ tests}/app/test_education_classifier.py +0 -0
  48. {vsp-data-enrichment/tests β†’ tests}/app/test_work_experience_classifier.py +0 -0
  49. {vsp-data-enrichment/tests β†’ tests}/llm/__ini__.py +0 -0
  50. {vsp-data-enrichment/tests β†’ tests}/llm/test_integration.py +0 -0
{vsp-data-enrichment/.vscode β†’ .vscode}/settings.json RENAMED
File without changes
vsp-data-enrichment/Makefile β†’ Makefile RENAMED
File without changes
vsp-data-enrichment/pyproject.toml β†’ pyproject.toml RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/notebooks/data/hansae_catlett.json RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/notebooks/education_classifier.ipynb RENAMED
@@ -129,7 +129,7 @@
129
  "name": "python",
130
  "nbconvert_exporter": "python",
131
  "pygments_lexer": "ipython3",
132
- "version": "3.12.2"
133
  }
134
  },
135
  "nbformat": 4,
 
129
  "name": "python",
130
  "nbconvert_exporter": "python",
131
  "pygments_lexer": "ipython3",
132
+ "version": "3.12.5"
133
  }
134
  },
135
  "nbformat": 4,
{vsp-data-enrichment/src β†’ src}/notebooks/work_experience_classifier.ipynb RENAMED
@@ -5,12 +5,31 @@
5
  "execution_count": 1,
6
  "metadata": {},
7
  "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  "source": [
9
  "import json\n",
10
  "\n",
11
  "from vsp.app.model.linkedin.linkedin_models import profile_from_json\n",
12
  "\n",
13
- "with open(\"data/hansae_catlett.json\") as f:\n",
14
  " data = json.load(f)\n",
15
  " # convert to linkedin profile\n",
16
  "\n",
@@ -19,97 +38,97 @@
19
  },
20
  {
21
  "cell_type": "code",
22
- "execution_count": 2,
23
  "metadata": {},
24
  "outputs": [
25
  {
26
  "name": "stdout",
27
  "output_type": "stream",
28
  "text": [
29
- "\u001b[2m2024-09-07 17:32:34\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mFetching parameter from Parameter Store\u001b[0m \u001b[36mparameter\u001b[0m=\u001b[35m/secrets/openai/api_key\u001b[0m\n",
30
- "\u001b[2m2024-09-07 17:32:34\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCreating boto3 client \u001b[0m \u001b[36mservice\u001b[0m=\u001b[35mssm\u001b[0m\n",
31
- "\u001b[2m2024-09-07 17:32:34\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mAssuming role \u001b[0m \u001b[36mrole_arn\u001b[0m=\u001b[35marn:aws:iam::339713096219:role/ReadWrite\u001b[0m\n",
32
- "\u001b[2m2024-09-07 17:32:34\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
33
- "\u001b[2m2024-09-07 17:32:35\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mSuccessfully fetched parameter\u001b[0m \u001b[36mparameter\u001b[0m=\u001b[35m/secrets/openai/api_key\u001b[0m\n",
34
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
35
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1350\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m115\u001b[0m\n",
36
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
37
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1351\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m116\u001b[0m\n",
38
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
39
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1548\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m123\u001b[0m\n",
40
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
41
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1353\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m108\u001b[0m\n",
42
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
43
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1352\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m121\u001b[0m\n",
44
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
45
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1355\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m111\u001b[0m\n",
46
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
47
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1355\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m115\u001b[0m\n",
48
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
49
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1354\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m137\u001b[0m\n",
50
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
51
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1386\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m139\u001b[0m\n",
52
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
53
- "\u001b[2m2024-09-07 17:32:37\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1354\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m127\u001b[0m\n",
54
  "{\n",
55
  " \"primary_job_type\": \"Other\",\n",
56
  " \"secondary_job_type\": \"Investing\",\n",
57
  " \"confidence\": 0.9,\n",
58
- " \"reasoning\": \"The work experience as an \\\"Investor\\\" at Spot AI indicates a role focused on investing in a company, which aligns with the secondary job type of INVESTING. The primary job type is classified as OTHER because this position does not represent a full-time role or a traditional employment structure, but rather an investment role that is likely part-time or project-based. The candidate's extensive background in venture capital and investment roles, as seen in their resume, supports this classification.\"\n",
59
  "}\n",
60
  "{\n",
61
  " \"primary_job_type\": \"Full-time\",\n",
62
  " \"secondary_job_type\": \"Investing\",\n",
63
- " \"confidence\": 0.9,\n",
64
- " \"reasoning\": \"The work experience at Archy is classified as FULL_TIME because it is a professional role held from 2022 to 2024, indicating ongoing employment. The title \\\"Investor\\\" aligns with the secondary job type of INVESTING, as it directly relates to the candidate's role in a venture capital context, which is supported by their extensive experience in investment roles, including their position as Vice President at Bessemer Venture Partners and Co-Founder at The MBA Fund.\"\n",
65
  "}\n",
66
  "{\n",
67
  " \"primary_job_type\": \"Full-time\",\n",
68
  " \"secondary_job_type\": \"Entrepreneur / Founder\",\n",
69
  " \"confidence\": 0.9,\n",
70
- " \"reasoning\": \"The work experience item indicates that the candidate is a Co-Founder and General Partner at The MBA Fund, which is a venture capital firm. This role suggests ongoing, full-time involvement in a professional capacity, classifying it as FULL_TIME. Additionally, being a Co-Founder aligns with the ENTREPRENEUR_FOUNDER category, as it involves starting and managing a business. The candidate's extensive background in venture capital, as seen in their resume, further supports this classification.\"\n",
71
  "}\n",
72
  "{\n",
73
  " \"primary_job_type\": \"Other\",\n",
74
- " \"secondary_job_type\": \"Other\",\n",
75
  " \"confidence\": 0.9,\n",
76
- " \"reasoning\": \"The role of \\\"Board Observer\\\" at MaintainX is not a full-time position and does not fit into traditional employment categories like full-time or internship. It is more of an advisory role, but since it does not involve direct investment or operational responsibilities, it is classified as \\\"OTHER.\\\" The candidate's extensive experience in venture capital and board roles supports this classification, as they are involved in oversight rather than direct management or operational tasks.\"\n",
77
  "}\n",
78
  "{\n",
79
  " \"primary_job_type\": \"Other\",\n",
80
- " \"secondary_job_type\": \"Investing\",\n",
81
- " \"confidence\": 0.9,\n",
82
- " \"reasoning\": \"The work experience as a Board Observer at VendorPM is not a full-time role but rather a position that involves oversight and advisory responsibilities, which aligns with the OTHER category. Additionally, the candidate's extensive background in venture capital and investing, as evidenced by their roles at HOF Capital and Bessemer Venture Partners, supports classifying this experience under INVESTING. The confidence level is high due to the clear alignment of the role with investment activities, despite the lack of a traditional employment structure.\"\n",
83
  "}\n",
84
  "{\n",
85
  " \"primary_job_type\": \"Other\",\n",
86
  " \"secondary_job_type\": \"Other\",\n",
87
  " \"confidence\": 0.9,\n",
88
- " \"reasoning\": \"The work experience as a Board Director at Luxury Presence is classified as \\\"OTHER\\\" for both primary and secondary job types because it does not fit the traditional definitions of full-time employment or any specific professional role like investing or consulting. The position is more of a governance role rather than a direct employment position, and it involves oversight rather than operational responsibilities. The candidate's resume indicates a strong background in venture capital and board roles, which supports this classification.\"\n",
89
- "}\n",
90
- "{\n",
91
- " \"primary_job_type\": \"Other\",\n",
92
- " \"secondary_job_type\": \"Consulting\",\n",
93
- " \"confidence\": 0.8,\n",
94
- " \"reasoning\": \"The role of \\\"Board Observer\\\" at Rillavoice is not a full-time position but rather an advisory role, which aligns it with the OTHER category for primary job type. The responsibilities typically associated with board observer roles often involve providing strategic guidance and insights, which can be classified under CONSULTING for the secondary job type. The candidate's extensive experience in venture capital and advisory roles supports this classification, as they are likely leveraging their expertise to guide the company.\"\n",
95
  "}\n",
96
  "{\n",
97
  " \"primary_job_type\": \"Full-time\",\n",
98
  " \"secondary_job_type\": \"Investing\",\n",
99
  " \"confidence\": 0.9,\n",
100
- " \"reasoning\": \"The candidate's role as a Partner at HOF Capital, which is classified under Venture Capital & Private Equity, indicates a full-time position in a professional investing capacity. This aligns with their extensive background in venture capital, as evidenced by their previous role as Vice President at Bessemer Venture Partners and their co-founding of The MBA Fund. The combination of these roles supports the classification of both primary and secondary job types as FULL_TIME and INVESTING, respectively. The confidence level is high due to the clear alignment of the job title and industry with the definitions provided.\"\n",
 
 
 
 
 
 
101
  "}\n",
102
  "{\n",
103
  " \"primary_job_type\": \"Full-time\",\n",
104
  " \"secondary_job_type\": \"Investing\",\n",
105
- " \"confidence\": 1.0,\n",
106
- " \"reasoning\": \"The work experience item indicates that the candidate held a full-time position as Vice President at Bessemer Venture Partners, which is a venture capital firm. This aligns with the primary job type classification of FULL_TIME. Additionally, the role is clearly within the realm of professional investing, as Bessemer Venture Partners operates in the venture capital and private equity industry, thus categorizing it as INVESTING for the secondary job type. The candidate's extensive background in venture capital, including their current role and previous experience as a co-founder of a venture capital firm, further supports this classification.\"\n",
107
  "}\n",
108
  "{\n",
109
  " \"primary_job_type\": \"Other\",\n",
110
  " \"secondary_job_type\": \"Investing\",\n",
111
  " \"confidence\": 0.9,\n",
112
- " \"reasoning\": \"The work experience item lists the candidate as an \\\"Investor\\\" at ServiceTitan, which aligns with their roles in venture capital and investment as seen in their resume. Given that this position does not indicate a full-time employment status and lacks a detailed description, it is classified as \\\"OTHER.\\\" However, the nature of the role clearly fits within the \\\"INVESTING\\\" category, as it involves investment activities in a software company. The confidence level is high due to the clear alignment with the candidate's investment-focused career trajectory.\"\n",
113
  "}\n"
114
  ]
115
  }
@@ -152,7 +171,7 @@
152
  "name": "python",
153
  "nbconvert_exporter": "python",
154
  "pygments_lexer": "ipython3",
155
- "version": "3.12.2"
156
  }
157
  },
158
  "nbformat": 4,
 
5
  "execution_count": 1,
6
  "metadata": {},
7
  "outputs": [],
8
+ "source": [
9
+ "import os\n",
10
+ "\n",
11
+ "os.getcwd()\n",
12
+ "os.chdir(path=os.getcwd() + \"/../\")"
13
+ ]
14
+ },
15
+ {
16
+ "cell_type": "code",
17
+ "execution_count": null,
18
+ "metadata": {},
19
+ "outputs": [],
20
+ "source": []
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": 2,
25
+ "metadata": {},
26
+ "outputs": [],
27
  "source": [
28
  "import json\n",
29
  "\n",
30
  "from vsp.app.model.linkedin.linkedin_models import profile_from_json\n",
31
  "\n",
32
+ "with open(\"notebooks/data/hansae_catlett.json\") as f:\n",
33
  " data = json.load(f)\n",
34
  " # convert to linkedin profile\n",
35
  "\n",
 
38
  },
39
  {
40
  "cell_type": "code",
41
+ "execution_count": 3,
42
  "metadata": {},
43
  "outputs": [
44
  {
45
  "name": "stdout",
46
  "output_type": "stream",
47
  "text": [
48
+ "\u001b[2m2024-09-08 23:16:22\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mFetching parameter from Parameter Store\u001b[0m \u001b[36mparameter\u001b[0m=\u001b[35m/secrets/openai/api_key\u001b[0m\n",
49
+ "\u001b[2m2024-09-08 23:16:22\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCreating boto3 client \u001b[0m \u001b[36mservice\u001b[0m=\u001b[35mssm\u001b[0m\n",
50
+ "\u001b[2m2024-09-08 23:16:22\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mAssuming role \u001b[0m \u001b[36mrole_arn\u001b[0m=\u001b[35marn:aws:iam::339713096219:role/ReadWrite\u001b[0m\n",
51
+ "\u001b[2m2024-09-08 23:16:22\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
52
+ "\u001b[2m2024-09-08 23:16:23\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mSuccessfully fetched parameter\u001b[0m \u001b[36mparameter\u001b[0m=\u001b[35m/secrets/openai/api_key\u001b[0m\n",
53
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
54
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1350\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m114\u001b[0m\n",
55
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
56
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1386\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m116\u001b[0m\n",
57
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
58
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1548\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m130\u001b[0m\n",
59
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
60
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1354\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m119\u001b[0m\n",
61
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
62
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1355\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m115\u001b[0m\n",
63
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
64
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1353\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m110\u001b[0m\n",
65
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
66
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1354\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m116\u001b[0m\n",
67
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
68
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1355\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m124\u001b[0m\n",
69
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
70
+ "\u001b[2m2024-09-08 23:16:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1351\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m144\u001b[0m\n",
71
+ "\u001b[2m2024-09-08 23:16:25\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mOpenAI API called \u001b[0m \u001b[36mmodel\u001b[0m=\u001b[35mgpt-4o-mini\u001b[0m\n",
72
+ "\u001b[2m2024-09-08 23:16:25\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1352\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m114\u001b[0m\n",
73
  "{\n",
74
  " \"primary_job_type\": \"Other\",\n",
75
  " \"secondary_job_type\": \"Investing\",\n",
76
  " \"confidence\": 0.9,\n",
77
+ " \"reasoning\": \"The work experience as an \\\"Investor\\\" at Spot AI indicates a role focused on investing in a company, which aligns with the secondary job type of INVESTING. The primary job type is classified as OTHER because this position does not represent a full-time role or a traditional employment structure; it is more of an investment role without a specified employment type. The candidate's extensive background in venture capital and investment roles, as seen in their resume, supports this classification.\"\n",
78
  "}\n",
79
  "{\n",
80
  " \"primary_job_type\": \"Full-time\",\n",
81
  " \"secondary_job_type\": \"Investing\",\n",
82
+ " \"confidence\": 1.0,\n",
83
+ " \"reasoning\": \"The work experience item indicates that the candidate held a full-time position as Vice President at Bessemer Venture Partners, which is a venture capital firm. This aligns with the primary job type classification of FULL_TIME. Additionally, the role is clearly within the venture capital sector, which fits the secondary job type classification of INVESTING, as it involves professional investing activities. The candidate's resume also supports this classification, highlighting their extensive experience in venture capital and investment roles.\"\n",
84
  "}\n",
85
  "{\n",
86
  " \"primary_job_type\": \"Full-time\",\n",
87
  " \"secondary_job_type\": \"Entrepreneur / Founder\",\n",
88
  " \"confidence\": 0.9,\n",
89
+ " \"reasoning\": \"The candidate is a Co-Founder and General Partner at The MBA Fund, which is a venture capital firm, indicating a significant and ongoing role in a business they helped establish. This aligns with the FULL_TIME classification as it suggests a regular, ongoing employment status. Additionally, the role of Co-Founder clearly fits the ENTREPRENEUR_FOUNDER category, as they are actively involved in creating and managing a venture capital firm. The detailed description of their responsibilities and the nature of the firm further supports this classification.\"\n",
90
  "}\n",
91
  "{\n",
92
  " \"primary_job_type\": \"Other\",\n",
93
+ " \"secondary_job_type\": \"Investing\",\n",
94
  " \"confidence\": 0.9,\n",
95
+ " \"reasoning\": \"The work experience item lists the candidate as an \\\"Investor\\\" at ServiceTitan, which aligns with their roles in venture capital and investment as seen in their resume. Given that this position does not indicate a full-time employment status and lacks a detailed description, it is classified as \\\"OTHER.\\\" The secondary job type is classified as \\\"INVESTING\\\" due to the nature of the role, which involves investment activities in a software company, consistent with the candidate's background in venture capital.\"\n",
96
  "}\n",
97
  "{\n",
98
  " \"primary_job_type\": \"Other\",\n",
99
+ " \"secondary_job_type\": \"Consulting\",\n",
100
+ " \"confidence\": 0.8,\n",
101
+ " \"reasoning\": \"The role of \\\"Board Observer\\\" at Rillavoice is not a full-time position but rather an advisory role, which aligns it with the OTHER category for primary job type. The responsibilities typically associated with board observer roles often involve providing strategic guidance and insights, which can be classified under CONSULTING for the secondary job type. The candidate's extensive experience in venture capital and advisory roles supports this classification, as they are likely leveraging their expertise to guide the company.\"\n",
102
  "}\n",
103
  "{\n",
104
  " \"primary_job_type\": \"Other\",\n",
105
  " \"secondary_job_type\": \"Other\",\n",
106
  " \"confidence\": 0.9,\n",
107
+ " \"reasoning\": \"The role of \\\"Board Observer\\\" at MaintainX is not a full-time position and does not fit into traditional employment categories like full-time or internship. It is more of an advisory role, which aligns with the \\\"OTHER\\\" category for both primary and secondary job types. The candidate's extensive experience in venture capital and board roles, as seen in their resume, supports this classification, indicating a focus on advisory and oversight rather than operational responsibilities.\"\n",
 
 
 
 
 
 
108
  "}\n",
109
  "{\n",
110
  " \"primary_job_type\": \"Full-time\",\n",
111
  " \"secondary_job_type\": \"Investing\",\n",
112
  " \"confidence\": 0.9,\n",
113
+ " \"reasoning\": \"The candidate's role as a Partner at HOF Capital, which is classified under Venture Capital & Private Equity, indicates a full-time, ongoing position in a professional investment firm. This aligns with the primary job type of FULL_TIME. Additionally, the nature of the role involves making investment decisions and managing a portfolio, which fits the secondary job type of INVESTING. The confidence level is high due to the clear alignment of the job title and industry with the classifications.\"\n",
114
+ "}\n",
115
+ "{\n",
116
+ " \"primary_job_type\": \"Other\",\n",
117
+ " \"secondary_job_type\": \"Other\",\n",
118
+ " \"confidence\": 0.8,\n",
119
+ " \"reasoning\": \"The work experience as a Board Director at Luxury Presence is not a full-time role but rather a board position, which typically does not fit into traditional employment categories. Therefore, it is classified as OTHER for the primary job type. For the secondary job type, while it involves oversight and strategic input, it does not align with the specific categories like INVESTING or CONSULTING, leading to the classification of OTHER as well. The confidence level is 0.8 due to the ambiguity of board roles in categorization.\"\n",
120
  "}\n",
121
  "{\n",
122
  " \"primary_job_type\": \"Full-time\",\n",
123
  " \"secondary_job_type\": \"Investing\",\n",
124
+ " \"confidence\": 0.9,\n",
125
+ " \"reasoning\": \"The work experience as an \\\"Investor\\\" at Archy from 2022 to 2024 indicates a full-time role in a venture capital context, aligning with the candidate's other roles in investment and venture capital, such as Vice President at Bessemer Venture Partners and Co-Founder at The MBA Fund. The primary job type is classified as FULL_TIME due to the ongoing nature of the position and its alignment with the candidate's professional career in investing. The secondary job type is INVESTING, as the role directly involves investment activities in a venture capital firm, consistent with the candidate's overall career focus.\"\n",
126
  "}\n",
127
  "{\n",
128
  " \"primary_job_type\": \"Other\",\n",
129
  " \"secondary_job_type\": \"Investing\",\n",
130
  " \"confidence\": 0.9,\n",
131
+ " \"reasoning\": \"The work experience as a Board Observer at VendorPM is not a full-time position but rather a role that involves oversight and advisory responsibilities, which aligns with the OTHER category. Additionally, the candidate's extensive background in venture capital and investing, as evidenced by their roles at HOF Capital and Bessemer Venture Partners, supports classifying this position under INVESTING. The confidence level is high due to the clear alignment of the candidate's experience with investment activities.\"\n",
132
  "}\n"
133
  ]
134
  }
 
171
  "name": "python",
172
  "nbconvert_exporter": "python",
173
  "pygments_lexer": "ipython3",
174
+ "version": "3.12.5"
175
  }
176
  },
177
  "nbformat": 4,
{vsp-data-enrichment/src β†’ src}/vsp/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/bindings.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/education_classifier.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/model/linkedin/linkedin_formatters.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/model/linkedin/linkedin_models.py RENAMED
@@ -44,8 +44,10 @@ class StartEndMixin(BaseSchema):
44
 
45
  @field_validator("start", "end", mode="before")
46
  @classmethod
47
- def validate_date(cls, v: DateComponent) -> DateComponent | None:
48
- if not v or v.year is None:
 
 
49
  return None
50
  return v
51
 
 
44
 
45
  @field_validator("start", "end", mode="before")
46
  @classmethod
47
+ def validate_date(cls, v: dict[str, str] | DateComponent) -> dict[str, str] | DateComponent | None:
48
+ if isinstance(v, DateComponent):
49
+ return v
50
+ if not v or v.get("year") is None:
51
  return None
52
  return v
53
 
{vsp-data-enrichment/src β†’ src}/vsp/app/prompts/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/prompts/education_classifier/1 - education_classifier_human.txt RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/prompts/education_classifier/1 - education_classifier_system.txt RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/prompts/prompt_loader.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_human.txt RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_system.txt RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/app/work_experience_classifier.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/bedrock.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/bedrock_model.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/bedrock/bedrock_rate_limiter.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/llm_service.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/openai/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/openai/openai.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/openai/openai_model.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/openai/openai_rate_limiter.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/openrouter/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/prompt.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/prompt_chain.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/prompt_template.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/llm/prompt_text.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/shared/__init__.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/shared/aws_clients.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/shared/config.py RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/shared/config.toml RENAMED
File without changes
{vsp-data-enrichment/src β†’ src}/vsp/shared/logger_factory.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/__init__.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/__init__.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/prompts/__init__.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompt_loader.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompts/basic_test/1 - test_human.txt RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompts/basic_test/1 - test_system.txt RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/prompts/test_prompts/basic_test/2 - test2_human.txt RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/test_education_classifier.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/app/test_work_experience_classifier.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/llm/__ini__.py RENAMED
File without changes
{vsp-data-enrichment/tests β†’ tests}/llm/test_integration.py RENAMED
File without changes