navkast commited on
Commit
49b13c6
·
unverified ·
1 Parent(s): a1ead4c

LLM test harness + prompt caching + prompt tuning (#8)

Browse files

* Commit test data + move test data around

* update

* create sample test jsons

* add preliminary VSP modeling

* add preliminary vsp modeling

* Continue iterating on test data

* Add samples

* wip

* wip

* format

* format

* format fixes

* wip

* wip

* wip

* wip

* fix test data, fix prompts, introduce llm cache

* formatting

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitignore +2 -0
  2. enum_classifier_results.json +0 -0
  3. pyproject.toml +2 -0
  4. src/notebooks/classifiers/education_classifier.ipynb +45 -35
  5. src/notebooks/classifiers/work_experience/investment_banking_group_classifier.ipynb +12 -13
  6. src/notebooks/classifiers/work_experience/investment_focus_asset_class_classifier.ipynb +15 -68
  7. src/notebooks/classifiers/work_experience/investment_focus_sectors_classifier.ipynb +15 -64
  8. src/notebooks/classifiers/work_experience/work_experience_classifier.ipynb +16 -108
  9. src/notebooks/data/eric_armagost.json +0 -395
  10. src/notebooks/data/hansae_catlett.json +0 -1054
  11. src/vsp/app/bindings.py +4 -1
  12. src/vsp/app/classifiers/education_classifier.py +4 -4
  13. src/vsp/app/classifiers/work_experience/general_work_experience_classifier.py +8 -6
  14. src/vsp/app/classifiers/work_experience/investing_focus_asset_class_classifier.py +6 -5
  15. src/vsp/app/classifiers/work_experience/investing_focus_sector_classifier.py +6 -5
  16. src/vsp/app/classifiers/work_experience/investment_banking_group_classifier.py +6 -5
  17. src/vsp/app/main.py +48 -102
  18. src/vsp/app/model/linkedin/linkedin_formatters.py +5 -5
  19. src/vsp/app/model/linkedin/linkedin_models.py +3 -0
  20. src/vsp/app/model/vsp/vsp_models.py +74 -0
  21. src/vsp/app/prompts/education_classifier/1 - education_classifier_human.txt +3 -3
  22. src/vsp/app/prompts/education_classifier/1 - education_classifier_system.txt +11 -11
  23. src/vsp/app/prompts/prompt_loader.py +1 -1
  24. src/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_human.txt +1 -1
  25. src/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_system.txt +23 -11
  26. src/vsp/app/prompts/work_experience_classifier/investing_focus_asset_class/1 - investing_focus_asset_class_classifier_human.txt +1 -1
  27. src/vsp/app/prompts/work_experience_classifier/investing_focus_asset_class/1 - investing_focus_asset_class_classifier_system.txt +3 -2
  28. src/vsp/app/prompts/work_experience_classifier/investing_focus_sector/1 - investing_focus_sector_classifier_human.txt +1 -1
  29. src/vsp/app/prompts/work_experience_classifier/investing_focus_sector/1 - investing_focus_sector_classifier_system.txt +4 -5
  30. src/vsp/app/prompts/work_experience_classifier/investment_banking_group/1 - investment_banking_group_classifier_human.txt +1 -1
  31. src/vsp/app/prompts/work_experience_classifier/investment_banking_group/1 - investment_banking_group_classifier_system.txt +2 -1
  32. src/vsp/app/scrapers/linkedin_downloader.py +25 -25
  33. src/vsp/llm/cached_llm_service.py +38 -0
  34. src/vsp/llm/llm_cache.py +49 -0
  35. src/vsp/llm/openai/openai.py +1 -1
  36. src/vsp/shared/config.py +1 -1
  37. tests/test_data/sample_profiles/chanson_zhao.json +527 -0
  38. tests/test_data/sample_profiles/eric_armagost.json +261 -0
  39. tests/test_data/sample_profiles/hansae_catlett.json +565 -0
  40. tests/test_data/sample_profiles/jake_kugler.json +270 -0
  41. tests/test_data/sample_profiles/jeffrey_bai.json +297 -0
  42. tests/test_data/sample_profiles/lauren_hipple.json +411 -0
  43. tests/test_data/sample_profiles/nicholas_penske.json +465 -0
  44. tests/test_data/sample_profiles/peter_tagliaferri.json +316 -0
  45. tests/test_data/sample_profiles/siddharth_saxena.json +625 -0
  46. tests/test_data/sample_profiles/zac_mohring.json +363 -0
  47. tests/test_data/sample_profiles_classified/chanson_zhao.json +190 -0
  48. tests/test_data/sample_profiles_classified/eric_armagost.json +97 -0
  49. tests/test_data/sample_profiles_classified/hansae_catlett.json +180 -0
  50. tests/test_data/sample_profiles_classified/jake_kugler.json +120 -0
.gitignore CHANGED
@@ -1,3 +1,4 @@
 
1
  # Byte-compiled / optimized / DLL files
2
  __pycache__/
3
  *.py[cod]
@@ -163,3 +164,4 @@ cython_debug/
163
 
164
  .claudesync
165
  .aider*
 
 
1
+ .DS_Store
2
  # Byte-compiled / optimized / DLL files
3
  __pycache__/
4
  *.py[cod]
 
164
 
165
  .claudesync
166
  .aider*
167
+ llm_cache.db
enum_classifier_results.json ADDED
The diff for this file is too large to render. See raw diff
 
pyproject.toml CHANGED
@@ -11,7 +11,9 @@ dependencies = [
11
  "pydantic>=2.8.2",
12
  "pytimeparse>=1.1.8",
13
  "requests>=2.32.3",
 
14
  "structlog>=24.4.0",
 
15
  "tenacity>=9.0.0",
16
  "tomli>=2.0.1",
17
  ]
 
11
  "pydantic>=2.8.2",
12
  "pytimeparse>=1.1.8",
13
  "requests>=2.32.3",
14
+ "rich>=13.8.1",
15
  "structlog>=24.4.0",
16
+ "tabulate>=0.9.0",
17
  "tenacity>=9.0.0",
18
  "tomli>=2.0.1",
19
  ]
src/notebooks/classifiers/education_classifier.ipynb CHANGED
@@ -4,13 +4,33 @@
4
  "cell_type": "code",
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 LinkedinProfile\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,60 +39,50 @@
19
  },
20
  {
21
  "cell_type": "code",
22
- "execution_count": 3,
23
  "metadata": {},
24
  "outputs": [
25
  {
26
  "name": "stdout",
27
  "output_type": "stream",
28
  "text": [
29
- "\u001b[2m2024-09-07 15:31:47\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",
30
- "\u001b[2m2024-09-07 15:31:47\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1069\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m122\u001b[0m\n",
31
- "\u001b[2m2024-09-07 15:31:47\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",
32
- "\u001b[2m2024-09-07 15:31:47\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1023\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m117\u001b[0m\n",
33
- "\u001b[2m2024-09-07 15:31:47\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",
34
- "\u001b[2m2024-09-07 15:31:47\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m988\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m145\u001b[0m\n",
35
- "\u001b[2m2024-09-07 15:31:47\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",
36
- "\u001b[2m2024-09-07 15:31:47\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1031\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m127\u001b[0m\n",
37
- "{\n",
38
- " \"output\": \"MBA\",\n",
39
- " \"confidence\": 1.0,\n",
40
- " \"reasoning\": \"The specific LinkedIn education item clearly states that the candidate obtained a Master of Business Administration (M.B.A.) from Stanford University Graduate School of Business, with a period of study from 2016 to 2019. This matches exactly with the educational background provided in the full resume, which also lists the same degree and institution. The presence of additional activities and awards in the LinkedIn item further supports the classification as an MBA, confirming the candidate's engagement and accomplishments during their studies. Therefore, the classification is confidently categorized as \\\"MBA.\\\"\"\n",
41
- "}\n",
 
 
 
 
 
42
  "{\n",
43
  " \"output\": \"Graduate School\",\n",
44
  " \"confidence\": 1.0,\n",
45
- " \"reasoning\": \"The specific LinkedIn education item clearly states that the candidate obtained a Master of Public Policy (M.P.P.) from Stanford University, which aligns perfectly with the information provided in the full resume. The degree is a graduate-level qualification, and the period of study (2016 to 2019) matches the timeline in the resume. Additionally, the description of the candidate's work during this program further supports the classification as a graduate school education. Therefore, it is accurately classified as GRAD_SCHOOL.\"\n",
46
  "}\n",
47
  "{\n",
48
  " \"output\": \"Undergraduate (Incomplete)\",\n",
49
  " \"confidence\": 0.9,\n",
50
- " \"reasoning\": \"The specific LinkedIn education item indicates that the candidate participated in a \\\"Study Abroad\\\" program at the University of New South Wales, which is typically associated with undergraduate studies. The resume shows that the candidate completed a Bachelor of Arts at Harvard University, and the study abroad experience aligns with the undergraduate level of education. Since the degree type is explicitly labeled as \\\"Study Abroad,\\\" it falls under the category of \\\"Undergraduate (Incomplete)\\\" as it does not represent a completed degree but rather an additional educational experience during their undergraduate studies. The confidence level is high due to the clear context provided by both the resume and the LinkedIn item.\"\n",
51
- "}\n",
52
- "{\n",
53
- " \"output\": \"Undergraduate (Completed)\",\n",
54
- " \"confidence\": 1.0,\n",
55
- " \"reasoning\": \"The specific LinkedIn education item clearly states that the candidate earned a Bachelor of Arts degree in Biomedical Engineering and Philosophy from Harvard University, with a graduation period from 2007 to 2011. This aligns perfectly with the information provided in the full resume, which also lists the same degree and institution, confirming its completion. Since the degree is a completed undergraduate degree, it fits squarely into the \\\"Undergraduate (Completed)\\\" category. The additional details about graduating with honors and involvement in various activities further support the classification as a completed undergraduate education.\"\n",
56
  "}\n",
57
  "{\n",
58
  " \"output\": \"MBA\",\n",
59
  " \"confidence\": 1.0,\n",
60
- " \"reasoning\": \"The specific LinkedIn education item clearly states that the candidate obtained a Master of Business Administration (M.B.A.) from Stanford University Graduate School of Business, with a period of study from 2016 to 2019. This matches exactly with the educational background provided in the full resume, which also lists the same degree and institution. The presence of additional activities and awards in the LinkedIn item further supports the classification as an MBA, confirming the candidate's engagement and accomplishments during their studies. Therefore, the classification is confidently categorized as \\\"MBA.\\\"\"\n",
61
- "}\n",
62
- "{\n",
63
- " \"output\": \"Graduate School\",\n",
64
- " \"confidence\": 1.0,\n",
65
- " \"reasoning\": \"The specific LinkedIn education item clearly states that the candidate obtained a Master of Public Policy (M.P.P.) from Stanford University, which aligns perfectly with the information provided in the full resume. The degree is a graduate-level qualification, and the period of study (2016 to 2019) matches the timeline in the resume. Additionally, the description of the candidate's work during this program further supports the classification as a graduate school education. Therefore, it is accurately classified as GRAD_SCHOOL.\"\n",
66
- "}\n",
67
- "{\n",
68
- " \"output\": \"Undergraduate (Incomplete)\",\n",
69
- " \"confidence\": 0.9,\n",
70
- " \"reasoning\": \"The specific LinkedIn education item indicates that the candidate participated in a \\\"Study Abroad\\\" program at the University of New South Wales, which is typically associated with undergraduate studies. The resume shows that the candidate completed a Bachelor of Arts at Harvard University, and the study abroad experience aligns with the undergraduate level of education. Since the degree type is explicitly labeled as \\\"Study Abroad,\\\" it falls under the category of \\\"Undergraduate (Incomplete)\\\" as it does not represent a completed degree but rather an additional educational experience during their undergraduate studies. The confidence level is high due to the clear context provided by both the resume and the LinkedIn item.\"\n",
71
  "}\n",
72
  "{\n",
73
  " \"output\": \"Undergraduate (Completed)\",\n",
74
  " \"confidence\": 1.0,\n",
75
- " \"reasoning\": \"The specific LinkedIn education item clearly states that the candidate earned a Bachelor of Arts degree in Biomedical Engineering and Philosophy from Harvard University, with a graduation period from 2007 to 2011. This aligns perfectly with the information provided in the full resume, which also lists the same degree and institution, confirming its completion. Since the degree is a completed undergraduate degree, it fits squarely into the \\\"Undergraduate (Completed)\\\" category. The additional details about graduating with honors and involvement in various activities further support the classification as a completed undergraduate education.\"\n",
76
  "}\n"
77
  ]
78
  }
 
4
  "cell_type": "code",
5
  "execution_count": 1,
6
  "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "name": "stdout",
10
+ "output_type": "stream",
11
+ "text": [
12
+ "/Volumes/code/geometric/VSP-data-enrichment/src\n"
13
+ ]
14
+ }
15
+ ],
16
  "source": [
17
  "import json\n",
18
+ "import os\n",
19
+ "import subprocess\n",
20
  "\n",
21
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
22
  "\n",
23
+ "\n",
24
+ "def get_git_root():\n",
25
+ " return subprocess.check_output([\"git\", \"rev-parse\", \"--show-toplevel\"]).decode().strip()\n",
26
+ "\n",
27
+ "\n",
28
+ "git_root = get_git_root()\n",
29
+ "os.chdir(path=get_git_root() + \"/src\")\n",
30
+ "print(os.getcwd())\n",
31
+ "\n",
32
+ "\n",
33
+ "with open(\"../tests/test_data/hansae_catlett.json\") as f:\n",
34
  " data = json.load(f)\n",
35
  " # convert to linkedin profile\n",
36
  "\n",
 
39
  },
40
  {
41
  "cell_type": "code",
42
+ "execution_count": 2,
43
  "metadata": {},
44
  "outputs": [
45
  {
46
  "name": "stdout",
47
  "output_type": "stream",
48
  "text": [
49
+ "\u001b[2m2024-09-11 14:33:11\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",
50
+ "\u001b[2m2024-09-11 14:33:11\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCreating boto3 client \u001b[0m \u001b[36mservice\u001b[0m=\u001b[35mssm\u001b[0m\n",
51
+ "\u001b[2m2024-09-11 14:33:11\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",
52
+ "\u001b[2m2024-09-11 14:33:12\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
53
+ "\u001b[2m2024-09-11 14:33:12\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",
54
+ "\u001b[2m2024-09-11 14:33:12\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mFetching parameter from Parameter Store\u001b[0m \u001b[36mparameter\u001b[0m=\u001b[35m/secrets/rapidapi/linkedin\u001b[0m\n",
55
+ "\u001b[2m2024-09-11 14:33:12\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCreating boto3 client \u001b[0m \u001b[36mservice\u001b[0m=\u001b[35mssm\u001b[0m\n",
56
+ "\u001b[2m2024-09-11 14:33:12\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",
57
+ "\u001b[2m2024-09-11 14:33:13\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
58
+ "\u001b[2m2024-09-11 14:33:13\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mSuccessfully fetched parameter\u001b[0m \u001b[36mparameter\u001b[0m=\u001b[35m/secrets/rapidapi/linkedin\u001b[0m\n",
59
+ "\u001b[2m2024-09-11 14:33:14\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-11 14:33:14\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1018\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m116\u001b[0m\n",
61
+ "\u001b[2m2024-09-11 14:33:14\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-11 14:33:14\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m975\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m140\u001b[0m\n",
63
+ "\u001b[2m2024-09-11 14:33:15\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-11 14:33:15\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1064\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m109\u001b[0m\n",
65
+ "\u001b[2m2024-09-11 14:33:15\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-11 14:33:15\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1026\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m111\u001b[0m\n",
67
  "{\n",
68
  " \"output\": \"Graduate School\",\n",
69
  " \"confidence\": 1.0,\n",
70
+ " \"reasoning\": \"The specific Linkedin education item clearly states that the candidate obtained a Master of Public Policy (M.P.P.) from Stanford University, which aligns perfectly with the information provided in the full resume. The degree is a graduate-level qualification, and the period of study (2016 to 2019) matches the timeline in the resume. Additionally, the description of the candidate's work during this program further supports the classification as a graduate school education. Therefore, it is accurately classified as GRAD_SCHOOL.\"\n",
71
  "}\n",
72
  "{\n",
73
  " \"output\": \"Undergraduate (Incomplete)\",\n",
74
  " \"confidence\": 0.9,\n",
75
+ " \"reasoning\": \"The specific Linkedin education item indicates that the candidate participated in a \\\"Study Abroad\\\" program at the University of New South Wales, focusing on Engineering, Philosophy, and Finance. This aligns with the resume, which shows that the candidate completed a Bachelor of Arts at Harvard University, suggesting that the study abroad experience was part of their undergraduate education. Since the degree is classified as \\\"Study Abroad\\\" and does not indicate completion of a separate degree, it falls under the category of \\\"Undergraduate (Incomplete).\\\" The high confidence level is due to the clear connection between the study abroad experience and the candidate's undergraduate studies.\"\n",
 
 
 
 
 
76
  "}\n",
77
  "{\n",
78
  " \"output\": \"MBA\",\n",
79
  " \"confidence\": 1.0,\n",
80
+ " \"reasoning\": \"The specific Linkedin education item clearly states that the candidate obtained a Master of Business Administration (M.B.A.) from Stanford University Graduate School of Business, with the period of study from 2016 to 2019. This matches exactly with the information provided in the full resume, which also lists the same degree and institution. The presence of various activities and awards associated with the MBA program further supports the classification as an MBA. Therefore, the classification is confidently categorized as \\\"MBA.\\\"\"\n",
 
 
 
 
 
 
 
 
 
 
81
  "}\n",
82
  "{\n",
83
  " \"output\": \"Undergraduate (Completed)\",\n",
84
  " \"confidence\": 1.0,\n",
85
+ " \"reasoning\": \"The specific Linkedin education item clearly states that the candidate earned a Bachelor of Arts degree in Biomedical Engineering and Philosophy from Harvard University, with a graduation period from 2007 to 2011. This aligns perfectly with the information provided in the full resume, which also lists the same degree and institution, confirming its completion. The description \\\"Graduated with Honors\\\" further supports that this is a completed undergraduate degree. Therefore, it is classified as \\\"Undergraduate (Completed).\\\"\"\n",
86
  "}\n"
87
  ]
88
  }
src/notebooks/classifiers/work_experience/investment_banking_group_classifier.ipynb CHANGED
@@ -1,17 +1,5 @@
1
  {
2
  "cells": [
3
- {
4
- "cell_type": "code",
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,
@@ -19,13 +7,24 @@
19
  "outputs": [],
20
  "source": [
21
  "import json\n",
 
 
22
  "\n",
23
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
24
  "\n",
 
 
 
 
 
 
 
25
  "print(os.getcwd())\n",
26
  "\n",
27
- "with open(\"notebooks/data/eric_armagost.json\") as f:\n",
 
28
  " data = json.load(f)\n",
 
29
  "\n",
30
  "profile = LinkedinProfile.profile_from_json(data)"
31
  ]
 
1
  {
2
  "cells": [
 
 
 
 
 
 
 
 
 
 
 
 
3
  {
4
  "cell_type": "code",
5
  "execution_count": null,
 
7
  "outputs": [],
8
  "source": [
9
  "import json\n",
10
+ "import os\n",
11
+ "import subprocess\n",
12
  "\n",
13
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
14
  "\n",
15
+ "\n",
16
+ "def get_git_root():\n",
17
+ " return subprocess.check_output([\"git\", \"rev-parse\", \"--show-toplevel\"]).decode().strip()\n",
18
+ "\n",
19
+ "\n",
20
+ "git_root = get_git_root()\n",
21
+ "os.chdir(path=get_git_root() + \"/src\")\n",
22
  "print(os.getcwd())\n",
23
  "\n",
24
+ "\n",
25
+ "with open(\"../tests/test_data/eric_armagost.json\") as f:\n",
26
  " data = json.load(f)\n",
27
+ " # convert to linkedin profile\n",
28
  "\n",
29
  "profile = LinkedinProfile.profile_from_json(data)"
30
  ]
src/notebooks/classifiers/work_experience/investment_focus_asset_class_classifier.ipynb CHANGED
@@ -2,91 +2,38 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
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": 2,
18
- "metadata": {},
19
- "outputs": [
20
- {
21
- "name": "stdout",
22
- "output_type": "stream",
23
- "text": [
24
- "/Volumes/code/geometric/VSP-data-enrichment/src\n"
25
- ]
26
- }
27
- ],
28
  "source": [
29
  "import json\n",
 
 
30
  "\n",
31
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
32
  "\n",
 
 
 
 
 
 
 
33
  "print(os.getcwd())\n",
34
  "\n",
35
- "with open(\"notebooks/data/eric_armagost.json\") as f:\n",
 
36
  " data = json.load(f)\n",
 
37
  "\n",
38
  "profile = LinkedinProfile.profile_from_json(data)"
39
  ]
40
  },
41
  {
42
  "cell_type": "code",
43
- "execution_count": 3,
44
  "metadata": {},
45
- "outputs": [
46
- {
47
- "name": "stdout",
48
- "output_type": "stream",
49
- "text": [
50
- "\u001b[2m2024-09-10 13:03:31\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",
51
- "\u001b[2m2024-09-10 13:03:31\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCreating boto3 client \u001b[0m \u001b[36mservice\u001b[0m=\u001b[35mssm\u001b[0m\n",
52
- "\u001b[2m2024-09-10 13:03:31\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",
53
- "\u001b[2m2024-09-10 13:03:31\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
54
- "\u001b[2m2024-09-10 13:03:32\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",
55
- "\u001b[2m2024-09-10 13:03:33\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-10 13:03:33\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1062\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m102\u001b[0m\n",
57
- "\u001b[2m2024-09-10 13:03:33\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-10 13:03:33\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1139\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m97\u001b[0m\n",
59
- "\u001b[2m2024-09-10 13:03:33\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-10 13:03:33\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1062\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m116\u001b[0m\n",
61
- "\u001b[2m2024-09-10 13:03:33\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-10 13:03:33\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1061\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m114\u001b[0m\n",
63
- "{\n",
64
- " \"investing_focus_asset_class\": \"Other\",\n",
65
- " \"confidence\": 0.4,\n",
66
- " \"reasoning\": \"The specific work experience at William Blair & Company is categorized as \\\"Investment Banking,\\\" which primarily focuses on advisory services rather than direct investments in asset classes like venture capital or private equity. The lack of detailed investment-related responsibilities in the description further supports this classification, leading to a lower confidence level.\",\n",
67
- " \"other_description\": \"Investment banking typically involves advisory services for mergers and acquisitions, capital raising, and financial restructuring, rather than direct investments.\"\n",
68
- "}\n",
69
- "{\n",
70
- " \"investing_focus_asset_class\": \"Private Equity / Buyouts\",\n",
71
- " \"confidence\": 0.9,\n",
72
- " \"reasoning\": \"The specific work experience at Accel-KKR indicates a focus on private equity investments, particularly in technology and software sectors. The description highlights typical transactions such as acquisitions, buyouts of divisions from public companies, and take-private transactions, which are all characteristic of private equity buyouts. This aligns well with the classification of PRIVATE_EQUITY_BUYOUTS.\",\n",
73
- " \"other_description\": null\n",
74
- "}\n",
75
- "{\n",
76
- " \"investing_focus_asset_class\": \"Other\",\n",
77
- " \"confidence\": 0.4,\n",
78
- " \"reasoning\": \"The specific work experience at Fidelity Investments as FFAS Corporate Finance does not provide clear evidence of a direct focus on any of the predefined investing categories. The role likely involved corporate finance activities, which may include advisory services rather than direct investment activities in the specified asset classes. Therefore, I classified it as OTHER, with a low confidence level due to the lack of detailed investment-related responsibilities in the description.\",\n",
79
- " \"other_description\": \"Corporate finance within a financial services context, focusing on financial advisory and capital raising.\"\n",
80
- "}\n",
81
- "{\n",
82
- " \"investing_focus_asset_class\": \"Other\",\n",
83
- " \"confidence\": 0.4,\n",
84
- " \"reasoning\": \"The specific work experience at Fidelity Investments as a PI Corporate Finance professional does not provide enough detail to classify it into one of the predefined investing focus or asset class categories. The lack of a description of responsibilities or specific investment activities makes it difficult to ascertain a clear focus. Therefore, I classified it as OTHER, reflecting its general corporate finance nature within the financial services sector.\",\n",
85
- " \"other_description\": \"Corporate finance role focused on financial services, not directly tied to a specific investing focus or asset class.\"\n",
86
- "}\n"
87
- ]
88
- }
89
- ],
90
  "source": [
91
  "import asyncio\n",
92
  "\n",
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": null,
6
  "metadata": {},
7
  "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  "source": [
9
  "import json\n",
10
+ "import os\n",
11
+ "import subprocess\n",
12
  "\n",
13
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
14
  "\n",
15
+ "\n",
16
+ "def get_git_root():\n",
17
+ " return subprocess.check_output([\"git\", \"rev-parse\", \"--show-toplevel\"]).decode().strip()\n",
18
+ "\n",
19
+ "\n",
20
+ "git_root = get_git_root()\n",
21
+ "os.chdir(path=get_git_root() + \"/src\")\n",
22
  "print(os.getcwd())\n",
23
  "\n",
24
+ "\n",
25
+ "with open(\"../tests/test_data/eric_armagost.json\") as f:\n",
26
  " data = json.load(f)\n",
27
+ " # convert to linkedin profile\n",
28
  "\n",
29
  "profile = LinkedinProfile.profile_from_json(data)"
30
  ]
31
  },
32
  {
33
  "cell_type": "code",
34
+ "execution_count": null,
35
  "metadata": {},
36
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  "source": [
38
  "import asyncio\n",
39
  "\n",
src/notebooks/classifiers/work_experience/investment_focus_sectors_classifier.ipynb CHANGED
@@ -2,87 +2,38 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
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": 2,
18
- "metadata": {},
19
- "outputs": [
20
- {
21
- "name": "stdout",
22
- "output_type": "stream",
23
- "text": [
24
- "/Volumes/code/geometric/VSP-data-enrichment/src\n"
25
- ]
26
- }
27
- ],
28
  "source": [
29
  "import json\n",
 
 
30
  "\n",
31
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
32
  "\n",
 
 
 
 
 
 
 
33
  "print(os.getcwd())\n",
34
  "\n",
35
- "with open(\"notebooks/data/eric_armagost.json\") as f:\n",
 
36
  " data = json.load(f)\n",
 
37
  "\n",
38
  "profile = LinkedinProfile.profile_from_json(data)"
39
  ]
40
  },
41
  {
42
  "cell_type": "code",
43
- "execution_count": 4,
44
  "metadata": {},
45
- "outputs": [
46
- {
47
- "name": "stdout",
48
- "output_type": "stream",
49
- "text": [
50
- "\u001b[2m2024-09-10 14:00: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",
51
- "\u001b[2m2024-09-10 14:00:22\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mCreating boto3 client \u001b[0m \u001b[36mservice\u001b[0m=\u001b[35mssm\u001b[0m\n",
52
- "\u001b[2m2024-09-10 14:00: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",
53
- "\u001b[2m2024-09-10 14:00:23\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
54
- "\u001b[2m2024-09-10 14:00: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",
55
- "\u001b[2m2024-09-10 14:00: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-10 14:00:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1138\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m92\u001b[0m\n",
57
- "\u001b[2m2024-09-10 14:00: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-10 14:00:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1061\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m99\u001b[0m\n",
59
- "\u001b[2m2024-09-10 14:00: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-10 14:00:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1060\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m95\u001b[0m\n",
61
- "\u001b[2m2024-09-10 14:00: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-10 14:00:24\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mToken usage \u001b[0m \u001b[36minput_tokens\u001b[0m=\u001b[35m1061\u001b[0m \u001b[36moutput_tokens\u001b[0m=\u001b[35m115\u001b[0m\n",
63
- "{\n",
64
- " \"investing_focus_sector\": \"Technology / Software / TMT\",\n",
65
- " \"confidence\": 0.9,\n",
66
- " \"reasoning\": \"The specific work experience at Accel-KKR clearly indicates a focus on investing in software and technology-enabled services companies. The description highlights that the firm is dedicated exclusively to this sector, which aligns with the TECHNOLOGY_SOFTWARE_TMT category. The candidate's role as an Investment Professional further supports this classification, as it involves transactions related to technology companies.\"\n",
67
- "}\n",
68
- "{\n",
69
- " \"investing_focus_sector\": \"Financial Institutions Group (FIG) / Fintech\",\n",
70
- " \"confidence\": 0.8,\n",
71
- " \"reasoning\": \"The specific work experience at Fidelity Investments is clearly within the financial services sector, as indicated by the company name and industry classification. The role in FFAS Corporate Finance suggests involvement in financial analysis and corporate finance activities, which aligns with the focus on financial institutions. While the description lacks detail, the context of Fidelity Investments as a major player in financial services supports a strong classification in this sector.\"\n",
72
- "}\n",
73
- "{\n",
74
- " \"investing_focus_sector\": \"Financial Institutions Group (FIG) / Fintech\",\n",
75
- " \"confidence\": 0.8,\n",
76
- " \"reasoning\": \"The specific work experience item is from Fidelity Investments, a company clearly identified within the financial services sector. The job title \\\"PI Corporate Finance\\\" suggests a focus on corporate finance activities, which are typically associated with financial institutions. While the description lacks detail, the context of the company and the role strongly indicate a focus on financial services, justifying a high confidence level.\"\n",
77
- "}\n",
78
- "{\n",
79
- " \"investing_focus_sector\": \"Financial Institutions Group (FIG) / Fintech\",\n",
80
- " \"confidence\": 0.8,\n",
81
- " \"reasoning\": \"The specific work experience item indicates that the candidate worked in Investment Banking at William Blair & Company, which is categorized under Financial Services. This aligns with the focus on financial institutions, as investment banking involves services related to capital raising, mergers and acquisitions, and financial advisory, all of which are core functions of financial institutions. The absence of a detailed description does not detract significantly from this classification, as the job title and company industry provide strong evidence for the sector classification.\"\n",
82
- "}\n"
83
- ]
84
- }
85
- ],
86
  "source": [
87
  "import asyncio\n",
88
  "\n",
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": null,
6
  "metadata": {},
7
  "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  "source": [
9
  "import json\n",
10
+ "import os\n",
11
+ "import subprocess\n",
12
  "\n",
13
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
14
  "\n",
15
+ "\n",
16
+ "def get_git_root():\n",
17
+ " return subprocess.check_output([\"git\", \"rev-parse\", \"--show-toplevel\"]).decode().strip()\n",
18
+ "\n",
19
+ "\n",
20
+ "git_root = get_git_root()\n",
21
+ "os.chdir(path=get_git_root() + \"/src\")\n",
22
  "print(os.getcwd())\n",
23
  "\n",
24
+ "\n",
25
+ "with open(\"../tests/test_data/eric_armagost.json\") as f:\n",
26
  " data = json.load(f)\n",
27
+ " # convert to linkedin profile\n",
28
  "\n",
29
  "profile = LinkedinProfile.profile_from_json(data)"
30
  ]
31
  },
32
  {
33
  "cell_type": "code",
34
+ "execution_count": null,
35
  "metadata": {},
36
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  "source": [
38
  "import asyncio\n",
39
  "\n",
src/notebooks/classifiers/work_experience/work_experience_classifier.ipynb CHANGED
@@ -2,27 +2,27 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
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": 2,
18
  "metadata": {},
19
  "outputs": [],
20
  "source": [
21
  "import json\n",
 
 
22
  "\n",
23
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
24
  "\n",
25
- "with open(\"notebooks/data/hansae_catlett.json\") as f:\n",
 
 
 
 
 
 
 
 
 
 
26
  " data = json.load(f)\n",
27
  " # convert to linkedin profile\n",
28
  "\n",
@@ -31,101 +31,9 @@
31
  },
32
  {
33
  "cell_type": "code",
34
- "execution_count": 3,
35
  "metadata": {},
36
- "outputs": [
37
- {
38
- "name": "stdout",
39
- "output_type": "stream",
40
- "text": [
41
- "\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",
42
- "\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",
43
- "\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",
44
- "\u001b[2m2024-09-08 23:16:22\u001b[0m [\u001b[32m\u001b[1minfo \u001b[0m] \u001b[1mRole assumed successfully \u001b[0m\n",
45
- "\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",
46
- "\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",
47
- "\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",
48
- "\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",
49
- "\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",
50
- "\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",
51
- "\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",
52
- "\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",
53
- "\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",
54
- "\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",
55
- "\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",
56
- "\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",
57
- "\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",
58
- "\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",
59
- "\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",
60
- "\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",
61
- "\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",
62
- "\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",
63
- "\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",
64
- "\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",
65
- "\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",
66
- "{\n",
67
- " \"primary_job_type\": \"Other\",\n",
68
- " \"secondary_job_type\": \"Investing\",\n",
69
- " \"confidence\": 0.9,\n",
70
- " \"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",
71
- "}\n",
72
- "{\n",
73
- " \"primary_job_type\": \"Full-time\",\n",
74
- " \"secondary_job_type\": \"Investing\",\n",
75
- " \"confidence\": 1.0,\n",
76
- " \"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",
77
- "}\n",
78
- "{\n",
79
- " \"primary_job_type\": \"Full-time\",\n",
80
- " \"secondary_job_type\": \"Entrepreneur / Founder\",\n",
81
- " \"confidence\": 0.9,\n",
82
- " \"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",
83
- "}\n",
84
- "{\n",
85
- " \"primary_job_type\": \"Other\",\n",
86
- " \"secondary_job_type\": \"Investing\",\n",
87
- " \"confidence\": 0.9,\n",
88
- " \"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",
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\": \"Other\",\n",
98
- " \"secondary_job_type\": \"Other\",\n",
99
- " \"confidence\": 0.9,\n",
100
- " \"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",
101
- "}\n",
102
- "{\n",
103
- " \"primary_job_type\": \"Full-time\",\n",
104
- " \"secondary_job_type\": \"Investing\",\n",
105
- " \"confidence\": 0.9,\n",
106
- " \"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",
107
- "}\n",
108
- "{\n",
109
- " \"primary_job_type\": \"Other\",\n",
110
- " \"secondary_job_type\": \"Other\",\n",
111
- " \"confidence\": 0.8,\n",
112
- " \"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",
113
- "}\n",
114
- "{\n",
115
- " \"primary_job_type\": \"Full-time\",\n",
116
- " \"secondary_job_type\": \"Investing\",\n",
117
- " \"confidence\": 0.9,\n",
118
- " \"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",
119
- "}\n",
120
- "{\n",
121
- " \"primary_job_type\": \"Other\",\n",
122
- " \"secondary_job_type\": \"Investing\",\n",
123
- " \"confidence\": 0.9,\n",
124
- " \"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",
125
- "}\n"
126
- ]
127
- }
128
- ],
129
  "source": [
130
  "import asyncio\n",
131
  "\n",
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": null,
 
 
 
 
 
 
 
 
 
 
 
 
6
  "metadata": {},
7
  "outputs": [],
8
  "source": [
9
  "import json\n",
10
+ "import os\n",
11
+ "import subprocess\n",
12
  "\n",
13
  "from vsp.app.model.linkedin.linkedin_models import LinkedinProfile\n",
14
  "\n",
15
+ "\n",
16
+ "def get_git_root():\n",
17
+ " return subprocess.check_output([\"git\", \"rev-parse\", \"--show-toplevel\"]).decode().strip()\n",
18
+ "\n",
19
+ "\n",
20
+ "git_root = get_git_root()\n",
21
+ "os.chdir(path=get_git_root() + \"/src\")\n",
22
+ "print(os.getcwd())\n",
23
+ "\n",
24
+ "\n",
25
+ "with open(\"../tests/test_data/hansae_catlett.json\") as f:\n",
26
  " data = json.load(f)\n",
27
  " # convert to linkedin profile\n",
28
  "\n",
 
31
  },
32
  {
33
  "cell_type": "code",
34
+ "execution_count": null,
35
  "metadata": {},
36
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  "source": [
38
  "import asyncio\n",
39
  "\n",
src/notebooks/data/eric_armagost.json DELETED
@@ -1,395 +0,0 @@
1
- {
2
- "urn": "ACoAAApkrrAB8nFEIP2l00BAXgSQ78iUNprebWc",
3
- "username": "eric-armagost-a144904a",
4
- "firstName": "Eric",
5
- "lastName": "Armagost",
6
- "isCreator": false,
7
- "isOpenToWork": false,
8
- "isHiring": false,
9
- "profilePicture": "https://media.licdn.com/dms/image/v2/C5603AQGiv3LeddNxgQ/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1656093036751?e=1730332800&v=beta&t=HruxzTkWpJZ9iro3k20ZKxPXHBerz1altnRU3PPXdUI",
10
- "backgroundImage": null,
11
- "summary": "",
12
- "headline": "Investor at Accel-KKR",
13
- "geo": {
14
- "country": "United States",
15
- "city": "San Francisco, California",
16
- "full": "San Francisco, California, United States"
17
- },
18
- "languages": [
19
- {
20
- "name": "German",
21
- "proficiency": "LIMITED_WORKING"
22
- }
23
- ],
24
- "educations": [
25
- {
26
- "start": {
27
- "year": 0,
28
- "month": 0,
29
- "day": 0
30
- },
31
- "end": {
32
- "year": 0,
33
- "month": 0,
34
- "day": 0
35
- },
36
- "fieldOfStudy": "Business Economics",
37
- "degree": "Bachelor of Arts (B.A.)",
38
- "grade": "",
39
- "schoolName": "Brown University",
40
- "description": "",
41
- "activities": "",
42
- "url": "https://www.linkedin.com/school/brown-university/",
43
- "schoolId": "157343"
44
- }
45
- ],
46
- "position": [
47
- {
48
- "companyId": 57752,
49
- "companyName": "Accel-KKR",
50
- "companyUsername": "accel-kkr",
51
- "companyURL": "https://www.linkedin.com/company/accel-kkr/",
52
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQHJ-Smp3x90Yg/company-logo_400_400/company-logo_400_400/0/1630565829245/accel_kkr_logo?e=1733356800&v=beta&t=MuqS5XhM4c0BNCvk0cCsWIE5YzOWMu7HaFpld467P0w",
53
- "companyIndustry": "Venture Capital & Private Equity",
54
- "companyStaffCountRange": "51 - 200",
55
- "title": "Investment Professional",
56
- "multiLocaleTitle": {
57
- "en_US": "Investment Professional"
58
- },
59
- "multiLocaleCompanyName": {
60
- "en_US": "Accel-KKR"
61
- },
62
- "location": "Menlo Park, California",
63
- "description": "Founded in 2000, Accel-KKR is a leading technology-focused private equity firm dedicated exclusively to investing in software and technology-enabled services companies. \n\nOur typical transactions include: \n\u2022 Acquisitions and recapitalizations of founder-owned or closely-held private companies \n\u2022 Buyouts of divisions, subsidiaries and business units from public companies \n\u2022 Take-private transactions of small public companies\n\u2022 Structured minority equity and debt investments\n\nwww.accel-kkr.com",
64
- "employmentType": "",
65
- "start": {
66
- "year": 2017,
67
- "month": 5,
68
- "day": 0
69
- },
70
- "end": {
71
- "year": 0,
72
- "month": 0,
73
- "day": 0
74
- }
75
- },
76
- {
77
- "companyId": 166939,
78
- "companyName": "William Blair & Company",
79
- "companyUsername": "william-blair-company",
80
- "companyURL": "https://www.linkedin.com/company/william-blair-company/",
81
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQE63WLd1DEgkw/company-logo_400_400/company-logo_400_400/0/1669143293900/william_blair__company_logo?e=1733356800&v=beta&t=lpEb9QzV4aUl3rBk_cyFI2qbyc3fVHQohUoO7kju8PM",
82
- "companyIndustry": "Financial Services",
83
- "companyStaffCountRange": "1001 - 5000",
84
- "title": "Investment Banking",
85
- "multiLocaleTitle": {
86
- "en_US": "Investment Banking"
87
- },
88
- "multiLocaleCompanyName": {
89
- "en_US": "William Blair & Company"
90
- },
91
- "location": "Chicago",
92
- "description": "",
93
- "employmentType": "",
94
- "start": {
95
- "year": 2015,
96
- "month": 6,
97
- "day": 0
98
- },
99
- "end": {
100
- "year": 2017,
101
- "month": 5,
102
- "day": 0
103
- }
104
- },
105
- {
106
- "companyId": 1307,
107
- "companyName": "Fidelity Investments",
108
- "companyUsername": "fidelity-investments",
109
- "companyURL": "https://www.linkedin.com/company/fidelity-investments/",
110
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQF6iwa5VSk-PQ/company-logo_400_400/company-logo_400_400/0/1724950881853/fidelity_investments_logo?e=1733356800&v=beta&t=aUkLhTRKySJtcU9mrvOCDYVYFVH2jStpOVaepBbdO80",
111
- "companyIndustry": "Financial Services",
112
- "companyStaffCountRange": "10001 - 0",
113
- "title": "FFAS Corporate Finance",
114
- "multiLocaleTitle": {
115
- "en_US": "FFAS Corporate Finance"
116
- },
117
- "multiLocaleCompanyName": {
118
- "en_US": "Fidelity Investments"
119
- },
120
- "location": "Smithfield, RI",
121
- "description": "",
122
- "employmentType": "",
123
- "start": {
124
- "year": 2014,
125
- "month": 6,
126
- "day": 0
127
- },
128
- "end": {
129
- "year": 2015,
130
- "month": 5,
131
- "day": 0
132
- }
133
- },
134
- {
135
- "companyId": 1307,
136
- "companyName": "Fidelity Investments",
137
- "companyUsername": "fidelity-investments",
138
- "companyURL": "https://www.linkedin.com/company/fidelity-investments/",
139
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQF6iwa5VSk-PQ/company-logo_400_400/company-logo_400_400/0/1724950881853/fidelity_investments_logo?e=1733356800&v=beta&t=aUkLhTRKySJtcU9mrvOCDYVYFVH2jStpOVaepBbdO80",
140
- "companyIndustry": "Financial Services",
141
- "companyStaffCountRange": "10001 - 0",
142
- "title": "PI Corporate Finance",
143
- "multiLocaleTitle": {
144
- "en_US": "PI Corporate Finance"
145
- },
146
- "multiLocaleCompanyName": {
147
- "en_US": "Fidelity Investments"
148
- },
149
- "location": "Smithfield, RI",
150
- "description": "",
151
- "employmentType": "",
152
- "start": {
153
- "year": 2013,
154
- "month": 6,
155
- "day": 0
156
- },
157
- "end": {
158
- "year": 2014,
159
- "month": 5,
160
- "day": 0
161
- }
162
- }
163
- ],
164
- "fullPositions": [
165
- {
166
- "companyId": 57752,
167
- "companyName": "Accel-KKR",
168
- "companyUsername": "accel-kkr",
169
- "companyURL": "https://www.linkedin.com/company/accel-kkr/",
170
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQHJ-Smp3x90Yg/company-logo_400_400/company-logo_400_400/0/1630565829245/accel_kkr_logo?e=1733356800&v=beta&t=MuqS5XhM4c0BNCvk0cCsWIE5YzOWMu7HaFpld467P0w",
171
- "companyIndustry": "Venture Capital & Private Equity",
172
- "companyStaffCountRange": "51 - 200",
173
- "title": "Investment Professional",
174
- "multiLocaleTitle": {
175
- "en_US": "Investment Professional"
176
- },
177
- "multiLocaleCompanyName": {
178
- "en_US": "Accel-KKR"
179
- },
180
- "location": "Menlo Park, California",
181
- "description": "Founded in 2000, Accel-KKR is a leading technology-focused private equity firm dedicated exclusively to investing in software and technology-enabled services companies. \n\nOur typical transactions include: \n\u2022 Acquisitions and recapitalizations of founder-owned or closely-held private companies \n\u2022 Buyouts of divisions, subsidiaries and business units from public companies \n\u2022 Take-private transactions of small public companies\n\u2022 Structured minority equity and debt investments\n\nwww.accel-kkr.com",
182
- "employmentType": "",
183
- "start": {
184
- "year": 2017,
185
- "month": 5,
186
- "day": 0
187
- },
188
- "end": {
189
- "year": 0,
190
- "month": 0,
191
- "day": 0
192
- }
193
- },
194
- {
195
- "companyId": 166939,
196
- "companyName": "William Blair & Company",
197
- "companyUsername": "william-blair-company",
198
- "companyURL": "https://www.linkedin.com/company/william-blair-company/",
199
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQE63WLd1DEgkw/company-logo_400_400/company-logo_400_400/0/1669143293900/william_blair__company_logo?e=1733356800&v=beta&t=lpEb9QzV4aUl3rBk_cyFI2qbyc3fVHQohUoO7kju8PM",
200
- "companyIndustry": "Financial Services",
201
- "companyStaffCountRange": "1001 - 5000",
202
- "title": "Investment Banking",
203
- "multiLocaleTitle": {
204
- "en_US": "Investment Banking"
205
- },
206
- "multiLocaleCompanyName": {
207
- "en_US": "William Blair & Company"
208
- },
209
- "location": "Chicago",
210
- "description": "",
211
- "employmentType": "",
212
- "start": {
213
- "year": 2015,
214
- "month": 6,
215
- "day": 0
216
- },
217
- "end": {
218
- "year": 2017,
219
- "month": 5,
220
- "day": 0
221
- }
222
- },
223
- {
224
- "companyId": 1307,
225
- "companyName": "Fidelity Investments",
226
- "companyUsername": "fidelity-investments",
227
- "companyURL": "https://www.linkedin.com/company/fidelity-investments/",
228
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQF6iwa5VSk-PQ/company-logo_400_400/company-logo_400_400/0/1724950881853/fidelity_investments_logo?e=1733356800&v=beta&t=aUkLhTRKySJtcU9mrvOCDYVYFVH2jStpOVaepBbdO80",
229
- "companyIndustry": "Financial Services",
230
- "companyStaffCountRange": "10001 - 0",
231
- "title": "FFAS Corporate Finance",
232
- "multiLocaleTitle": {
233
- "en_US": "FFAS Corporate Finance"
234
- },
235
- "multiLocaleCompanyName": {
236
- "en_US": "Fidelity Investments"
237
- },
238
- "location": "Smithfield, RI",
239
- "description": "",
240
- "employmentType": "",
241
- "start": {
242
- "year": 2014,
243
- "month": 6,
244
- "day": 0
245
- },
246
- "end": {
247
- "year": 2015,
248
- "month": 5,
249
- "day": 0
250
- }
251
- },
252
- {
253
- "companyId": 1307,
254
- "companyName": "Fidelity Investments",
255
- "companyUsername": "fidelity-investments",
256
- "companyURL": "https://www.linkedin.com/company/fidelity-investments/",
257
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQF6iwa5VSk-PQ/company-logo_400_400/company-logo_400_400/0/1724950881853/fidelity_investments_logo?e=1733356800&v=beta&t=aUkLhTRKySJtcU9mrvOCDYVYFVH2jStpOVaepBbdO80",
258
- "companyIndustry": "Financial Services",
259
- "companyStaffCountRange": "10001 - 0",
260
- "title": "PI Corporate Finance",
261
- "multiLocaleTitle": {
262
- "en_US": "PI Corporate Finance"
263
- },
264
- "multiLocaleCompanyName": {
265
- "en_US": "Fidelity Investments"
266
- },
267
- "location": "Smithfield, RI",
268
- "description": "",
269
- "employmentType": "",
270
- "start": {
271
- "year": 2013,
272
- "month": 6,
273
- "day": 0
274
- },
275
- "end": {
276
- "year": 2014,
277
- "month": 5,
278
- "day": 0
279
- }
280
- }
281
- ],
282
- "skills": [
283
- {
284
- "name": "Microsoft Office",
285
- "passedSkillAssessment": false,
286
- "endorsementsCount": 5
287
- },
288
- {
289
- "name": "Microsoft Excel",
290
- "passedSkillAssessment": false,
291
- "endorsementsCount": 2
292
- },
293
- {
294
- "name": "Microsoft Word",
295
- "passedSkillAssessment": false,
296
- "endorsementsCount": 7
297
- },
298
- {
299
- "name": "Customer Service",
300
- "passedSkillAssessment": false
301
- },
302
- {
303
- "name": "PowerPoint",
304
- "passedSkillAssessment": false,
305
- "endorsementsCount": 4
306
- },
307
- {
308
- "name": "English",
309
- "passedSkillAssessment": false
310
- },
311
- {
312
- "name": "Windows",
313
- "passedSkillAssessment": false
314
- },
315
- {
316
- "name": "Research",
317
- "passedSkillAssessment": false,
318
- "endorsementsCount": 2
319
- },
320
- {
321
- "name": "Outlook",
322
- "passedSkillAssessment": false
323
- },
324
- {
325
- "name": "Teaching",
326
- "passedSkillAssessment": false
327
- },
328
- {
329
- "name": "Photoshop",
330
- "passedSkillAssessment": false
331
- },
332
- {
333
- "name": "Public Speaking",
334
- "passedSkillAssessment": false,
335
- "endorsementsCount": 2
336
- },
337
- {
338
- "name": "HTML",
339
- "passedSkillAssessment": false
340
- },
341
- {
342
- "name": "Strategic Planning",
343
- "passedSkillAssessment": false
344
- },
345
- {
346
- "name": "Budgets",
347
- "passedSkillAssessment": false
348
- }
349
- ],
350
- "givenRecommendation": null,
351
- "givenRecommendationCount": 0,
352
- "receivedRecommendation": null,
353
- "receivedRecommendationCount": 0,
354
- "courses": null,
355
- "certifications": null,
356
- "honors": null,
357
- "projects": {
358
- "total": 0,
359
- "items": null
360
- },
361
- "volunteering": [
362
- {
363
- "title": "Fundraiser Leader",
364
- "start": {
365
- "year": 2014,
366
- "month": 7,
367
- "day": 0
368
- },
369
- "end": {
370
- "year": 2014,
371
- "month": 7,
372
- "day": 0
373
- },
374
- "companyName": "AHA",
375
- "CompanyId": "",
376
- "companyUrl": "",
377
- "companyLogo": ""
378
- }
379
- ],
380
- "supportedLocales": [
381
- {
382
- "country": "US",
383
- "language": "en"
384
- }
385
- ],
386
- "multiLocaleFirstName": {
387
- "en": "Eric"
388
- },
389
- "multiLocaleLastName": {
390
- "en": "Armagost"
391
- },
392
- "multiLocaleHeadline": {
393
- "en": "Investor at Accel-KKR"
394
- }
395
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/notebooks/data/hansae_catlett.json DELETED
@@ -1,1054 +0,0 @@
1
- {
2
- "urn": "ACoAAAScLaoBojlZZh9af6GI5G566vDOTj50KOw",
3
- "username": "hansae-catlett-436a9b21",
4
- "firstName": "Hansae",
5
- "lastName": "Catlett",
6
- "isCreator": false,
7
- "isOpenToWork": false,
8
- "isHiring": false,
9
- "profilePicture": "https://media.licdn.com/dms/image/v2/D5603AQEVfJQVTKPvYw/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1710971553153?e=1730332800&v=beta&t=D40AmtyFPi_BuJ2JPycWFbv0jSQhf3IqrVnf22BxSZA",
10
- "backgroundImage": null,
11
- "summary": "",
12
- "headline": "Partner at HOF Capital | Co-founder & GP at The MBA Fund",
13
- "geo": {
14
- "country": "United States",
15
- "city": "New York, New York",
16
- "full": "New York, New York, United States"
17
- },
18
- "languages": null,
19
- "educations": [
20
- {
21
- "start": {
22
- "year": 2016,
23
- "month": 0,
24
- "day": 0
25
- },
26
- "end": {
27
- "year": 2019,
28
- "month": 0,
29
- "day": 0
30
- },
31
- "fieldOfStudy": "",
32
- "degree": "Master of Business Administration (M.B.A.)",
33
- "grade": "",
34
- "schoolName": "Stanford University Graduate School of Business",
35
- "description": "",
36
- "activities": "Ernest C. Arbuckle Award Finalist; Miller Social Change Leadership Award Winner; Arbuckle Leadership Fellow; Venture Capital Club; GSB Impact Fund; Co-President Social Innovation Club; Co-President Government & Politics Club; LOWkeynote (main stage featured speaker); TALK Coach; GSB Show",
37
- "url": "https://www.linkedin.com/school/stanford-graduate-school-of-business/",
38
- "schoolId": "1791"
39
- },
40
- {
41
- "start": {
42
- "year": 2016,
43
- "month": 0,
44
- "day": 0
45
- },
46
- "end": {
47
- "year": 2019,
48
- "month": 0,
49
- "day": 0
50
- },
51
- "fieldOfStudy": "",
52
- "degree": "Master of Public Policy (M.P.P.)",
53
- "grade": "",
54
- "schoolName": "Stanford University",
55
- "description": "Led CalFresh/SNAP (food stamps) policy & impact analysis with California State Senator",
56
- "activities": "",
57
- "url": "https://www.linkedin.com/school/stanford-university/",
58
- "schoolId": "1792"
59
- },
60
- {
61
- "start": {
62
- "year": 2007,
63
- "month": 0,
64
- "day": 0
65
- },
66
- "end": {
67
- "year": 2011,
68
- "month": 0,
69
- "day": 0
70
- },
71
- "fieldOfStudy": "Biomedical Engineering, Philosophy",
72
- "degree": "Bachelor of Arts",
73
- "grade": "",
74
- "schoolName": "Harvard University",
75
- "description": "Graduated with Honors",
76
- "activities": "Club Basketball, College Bound Mentoring, Veritas Financial Group, Rugby, Crew",
77
- "url": "https://www.linkedin.com/school/harvard-university/",
78
- "schoolId": "1646"
79
- },
80
- {
81
- "start": {
82
- "year": 0,
83
- "month": 0,
84
- "day": 0
85
- },
86
- "end": {
87
- "year": 0,
88
- "month": 0,
89
- "day": 0
90
- },
91
- "fieldOfStudy": "Engineering, Philosophy, Finance",
92
- "degree": "Study Abroad",
93
- "grade": "",
94
- "schoolName": "University of New South Wales",
95
- "description": "",
96
- "activities": "Premier League Basketball Team",
97
- "url": "https://www.linkedin.com/school/unsw/",
98
- "schoolId": "6096"
99
- }
100
- ],
101
- "position": [
102
- {
103
- "companyId": 9217965,
104
- "companyName": "HOF Capital",
105
- "companyUsername": "hof-capital",
106
- "companyURL": "https://www.linkedin.com/company/hof-capital/",
107
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQFAy04TxfOQ1w/company-logo_400_400/company-logo_400_400/0/1631336133602?e=1733356800&v=beta&t=XT3nnr1M-X8_dEx8Wp2wMOLyu6NXc_9c1CFa1xdu-dY",
108
- "companyIndustry": "Venture Capital & Private Equity",
109
- "companyStaffCountRange": "11 - 50",
110
- "title": "Partner",
111
- "multiLocaleTitle": {
112
- "en_US": "Partner"
113
- },
114
- "multiLocaleCompanyName": {
115
- "en_US": "HOF Capital"
116
- },
117
- "location": "New York City Metropolitan Area",
118
- "description": "",
119
- "employmentType": "",
120
- "start": {
121
- "year": 2024,
122
- "month": 3,
123
- "day": 0
124
- },
125
- "end": {
126
- "year": 0,
127
- "month": 0,
128
- "day": 0
129
- }
130
- },
131
- {
132
- "companyId": 33433434,
133
- "companyName": "The MBA Fund",
134
- "companyUsername": "thembafund",
135
- "companyURL": "https://www.linkedin.com/company/thembafund/",
136
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQHh7Q_nr-3JiA/company-logo_400_400/company-logo_400_400/0/1630572463370/thembafund_logo?e=1733356800&v=beta&t=BJUl211JX6J1xxnvUU4Hy0pNd8lIKesF5XpHEdiJP6M",
137
- "companyIndustry": "Venture Capital & Private Equity",
138
- "companyStaffCountRange": "11 - 50",
139
- "title": "Co-Founder, General Partner",
140
- "multiLocaleTitle": {
141
- "en_US": "Co-Founder, General Partner"
142
- },
143
- "multiLocaleCompanyName": {
144
- "en_US": "The MBA Fund"
145
- },
146
- "location": "San Francisco Bay Area",
147
- "description": "The MBA Fund is a venture capital firm that helps founders from the top startup-producing universities create legendary companies. We most frequently back student, alumni and dropout founders from Harvard, Stanford, and Wharton (expanding presence nationally!). \n\nWe\u2019re a community of investors and operators who aren\u2019t afraid to take the riskiest leaps with founders who are just getting started. Our backers include top-tier VC firms, repeat founders, experienced execs, and super angels with ties to the communities where we invest. This network is ready and willing to help founders in our portfolio with financing, hiring, customer growth and more.\n\nSelect investments include:\n* Jeeves ($2B)\n* Dandy ($1B)\n* TRM Labs ($600M+)\n* Hightouch ($450M+)\n* Luxury Presence ($200M+)\n* FlutterFlow ($150M+)\n* Legacy ($150M+)\n* Seso ($150M+)\n* Peachy ($100M+)",
148
- "employmentType": "",
149
- "start": {
150
- "year": 2018,
151
- "month": 0,
152
- "day": 0
153
- },
154
- "end": {
155
- "year": 0,
156
- "month": 0,
157
- "day": 0
158
- }
159
- },
160
- {
161
- "companyId": 16754,
162
- "companyName": "Bessemer Venture Partners",
163
- "companyUsername": "bessemer-venture-partners",
164
- "companyURL": "https://www.linkedin.com/company/bessemer-venture-partners/",
165
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQF2-_rRIldZpw/company-logo_400_400/company-logo_400_400/0/1719862419823/bessemer_venture_partners_logo?e=1733356800&v=beta&t=rX0N0rY1b8HL1G1_MpwJi16BhGWtBC-dyE2cBFi644A",
166
- "companyIndustry": "Venture Capital & Private Equity",
167
- "companyStaffCountRange": "11 - 50",
168
- "title": "Vice President",
169
- "multiLocaleTitle": {
170
- "en_US": "Vice President"
171
- },
172
- "multiLocaleCompanyName": {
173
- "en_US": "Bessemer Venture Partners"
174
- },
175
- "location": "New York City Metropolitan Area",
176
- "description": "",
177
- "employmentType": "Full-time",
178
- "start": {
179
- "year": 2019,
180
- "month": 7,
181
- "day": 0
182
- },
183
- "end": {
184
- "year": 2024,
185
- "month": 2,
186
- "day": 0
187
- }
188
- },
189
- {
190
- "companyId": 11745039,
191
- "companyName": "Rillavoice",
192
- "companyUsername": "rilla-co",
193
- "companyURL": "https://www.linkedin.com/company/rilla-co/",
194
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQGckOgzxr2p4g/company-logo_400_400/company-logo_400_400/0/1709081270062/rilla_co_logo?e=1733356800&v=beta&t=MvfFWJNVqsB3jaJxROLxP896fz5akuU8pndekbJ3C5g",
195
- "companyIndustry": "Computer Software",
196
- "companyStaffCountRange": "11 - 50",
197
- "title": "Board Observer",
198
- "multiLocaleTitle": {
199
- "en_US": "Board Observer"
200
- },
201
- "multiLocaleCompanyName": {
202
- "en_US": "Rillavoice"
203
- },
204
- "location": "New York City Metropolitan Area",
205
- "description": "",
206
- "employmentType": "",
207
- "start": {
208
- "year": 2023,
209
- "month": 0,
210
- "day": 0
211
- },
212
- "end": {
213
- "year": 2024,
214
- "month": 0,
215
- "day": 0
216
- }
217
- },
218
- {
219
- "companyId": 74099951,
220
- "companyName": "Archy",
221
- "companyUsername": "archydental",
222
- "companyURL": "https://www.linkedin.com/company/archydental/",
223
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQG13A6MTBOt5w/company-logo_400_400/company-logo_400_400/0/1724949981185/archydental_logo?e=1733356800&v=beta&t=prnsqQ4vb9F4cnt5_4Cmc6LHXYKt1ceIU6Z_G4AlzCw",
224
- "companyIndustry": "Computer Software",
225
- "companyStaffCountRange": "11 - 50",
226
- "title": "Investor",
227
- "multiLocaleTitle": {
228
- "en_US": "Investor"
229
- },
230
- "multiLocaleCompanyName": {
231
- "en_US": "Archy"
232
- },
233
- "location": "San Francisco Bay Area",
234
- "description": "",
235
- "employmentType": "",
236
- "start": {
237
- "year": 2022,
238
- "month": 0,
239
- "day": 0
240
- },
241
- "end": {
242
- "year": 2024,
243
- "month": 0,
244
- "day": 0
245
- }
246
- },
247
- {
248
- "companyId": 18762446,
249
- "companyName": "MaintainX",
250
- "companyUsername": "getmaintainx",
251
- "companyURL": "https://www.linkedin.com/company/getmaintainx/",
252
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQEOOm1IB8UHxQ/company-logo_400_400/company-logo_400_400/0/1719257689258/getmaintainx_logo?e=1733356800&v=beta&t=bQzUQXAg00rNpk8-C34bicPL4Dnxwbyl-pp-Z47Ydr8",
253
- "companyIndustry": "Computer Software",
254
- "companyStaffCountRange": "201 - 500",
255
- "title": "Board Observer",
256
- "multiLocaleTitle": {
257
- "en_US": "Board Observer"
258
- },
259
- "multiLocaleCompanyName": {
260
- "en_US": "MaintainX"
261
- },
262
- "location": "San Francisco Bay Area",
263
- "description": "",
264
- "employmentType": "",
265
- "start": {
266
- "year": 2021,
267
- "month": 0,
268
- "day": 0
269
- },
270
- "end": {
271
- "year": 2024,
272
- "month": 0,
273
- "day": 0
274
- }
275
- },
276
- {
277
- "companyId": 18927115,
278
- "companyName": "Spot AI",
279
- "companyUsername": "spot-ai",
280
- "companyURL": "https://www.linkedin.com/company/spot-ai/",
281
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQG2LOnQKbIi4A/company-logo_400_400/company-logo_400_400/0/1630635635761/spot_ai_logo?e=1733356800&v=beta&t=eJx_hAO6SMYTUTnHrmE4-7bz37xkTh1rzjh0CqRBwCs",
282
- "companyIndustry": "Computer Software",
283
- "companyStaffCountRange": "51 - 200",
284
- "title": "Investor",
285
- "multiLocaleTitle": {
286
- "en_US": "Investor"
287
- },
288
- "multiLocaleCompanyName": {
289
- "en_US": "Spot AI"
290
- },
291
- "location": "San Francisco Bay Area",
292
- "description": "",
293
- "employmentType": "",
294
- "start": {
295
- "year": 2021,
296
- "month": 0,
297
- "day": 0
298
- },
299
- "end": {
300
- "year": 2024,
301
- "month": 0,
302
- "day": 0
303
- }
304
- },
305
- {
306
- "companyId": 31404660,
307
- "companyName": "VendorPM",
308
- "companyUsername": "vendorpm",
309
- "companyURL": "https://www.linkedin.com/company/vendorpm/",
310
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQEglOi17VDAUg/company-logo_400_400/company-logo_400_400/0/1688751388502/vendorpm_logo?e=1733356800&v=beta&t=g36lpENHyHRFusF-KOJfJvh97fsAezDC1FAqYzG7zUg",
311
- "companyIndustry": "Computer Software",
312
- "companyStaffCountRange": "11 - 50",
313
- "title": "Board Observer",
314
- "multiLocaleTitle": {
315
- "en_US": "Board Observer"
316
- },
317
- "multiLocaleCompanyName": {
318
- "en_US": "VendorPM"
319
- },
320
- "location": "Toronto, Ontario, Canada",
321
- "description": "",
322
- "employmentType": "",
323
- "start": {
324
- "year": 2021,
325
- "month": 0,
326
- "day": 0
327
- },
328
- "end": {
329
- "year": 2024,
330
- "month": 0,
331
- "day": 0
332
- }
333
- },
334
- {
335
- "companyId": 18872387,
336
- "companyName": "Luxury Presence",
337
- "companyUsername": "luxurypresence",
338
- "companyURL": "https://www.linkedin.com/company/luxurypresence/",
339
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQEv9eTo6golbw/company-logo_400_400/company-logo_400_400/0/1655397407777/luxurypresence_logo?e=1733356800&v=beta&t=SKKunif574CP6v1Z2LjF1sk6ZM254eu5VWN7ESZ1ylc",
340
- "companyIndustry": "Computer Software",
341
- "companyStaffCountRange": "501 - 1000",
342
- "title": "Board Director",
343
- "multiLocaleTitle": {
344
- "en_US": "Board Director"
345
- },
346
- "multiLocaleCompanyName": {
347
- "en_US": "Luxury Presence"
348
- },
349
- "location": "Los Angeles Metropolitan Area",
350
- "description": "",
351
- "employmentType": "",
352
- "start": {
353
- "year": 2021,
354
- "month": 0,
355
- "day": 0
356
- },
357
- "end": {
358
- "year": 2024,
359
- "month": 0,
360
- "day": 0
361
- }
362
- },
363
- {
364
- "companyId": 3157549,
365
- "companyName": "ServiceTitan",
366
- "companyUsername": "servicetitan",
367
- "companyURL": "https://www.linkedin.com/company/servicetitan/",
368
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQEZXBsypK75Fg/company-logo_400_400/company-logo_400_400/0/1660079842958/servicetitan_logo?e=1733356800&v=beta&t=Ly_gt1iDc0qfGCBWgwrUHqnamNy7TZMPEDARe-tlJVA",
369
- "companyIndustry": "Computer Software",
370
- "companyStaffCountRange": "1001 - 5000",
371
- "title": "Investor",
372
- "multiLocaleTitle": {
373
- "en_US": "Investor"
374
- },
375
- "multiLocaleCompanyName": {
376
- "en_US": "ServiceTitan"
377
- },
378
- "location": "Los Angeles Metropolitan Area",
379
- "description": "",
380
- "employmentType": "",
381
- "start": {
382
- "year": 2021,
383
- "month": 0,
384
- "day": 0
385
- },
386
- "end": {
387
- "year": 2024,
388
- "month": 0,
389
- "day": 0
390
- }
391
- }
392
- ],
393
- "fullPositions": [
394
- {
395
- "companyId": 9217965,
396
- "companyName": "HOF Capital",
397
- "companyUsername": "hof-capital",
398
- "companyURL": "https://www.linkedin.com/company/hof-capital",
399
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQFAy04TxfOQ1w/company-logo_400_400/company-logo_400_400/0/1631336133602?e=1733356800&v=beta&t=XT3nnr1M-X8_dEx8Wp2wMOLyu6NXc_9c1CFa1xdu-dY",
400
- "companyIndustry": "Venture Capital & Private Equity",
401
- "companyStaffCountRange": "11 - 50",
402
- "title": "Partner",
403
- "multiLocaleTitle": null,
404
- "multiLocaleCompanyName": null,
405
- "location": "New York City Metropolitan Area",
406
- "description": "",
407
- "employmentType": "",
408
- "start": {
409
- "year": 2024,
410
- "month": 3,
411
- "day": 0
412
- },
413
- "end": {
414
- "year": 0,
415
- "month": 0,
416
- "day": 0
417
- }
418
- },
419
- {
420
- "companyId": 33433434,
421
- "companyName": "The MBA Fund",
422
- "companyUsername": "thembafund",
423
- "companyURL": "https://www.linkedin.com/company/thembafund",
424
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQHh7Q_nr-3JiA/company-logo_400_400/company-logo_400_400/0/1630572463370/thembafund_logo?e=1733356800&v=beta&t=BJUl211JX6J1xxnvUU4Hy0pNd8lIKesF5XpHEdiJP6M",
425
- "companyIndustry": "Venture Capital & Private Equity",
426
- "companyStaffCountRange": "11 - 50",
427
- "title": "Co-Founder, General Partner",
428
- "multiLocaleTitle": null,
429
- "multiLocaleCompanyName": null,
430
- "location": "San Francisco Bay Area",
431
- "description": "The MBA Fund is a venture capital firm that helps founders from the top startup-producing universities create legendary companies. We most frequently back student, alumni and dropout founders from Harvard, Stanford, and Wharton (expanding presence nationally!). \n\nWe\u2019re a community of investors and operators who aren\u2019t afraid to take the riskiest leaps with founders who are just getting started. Our backers include top-tier VC firms, repeat founders, experienced execs, and super angels with ties to the communities where we invest. This network is ready and willing to help founders in our portfolio with financing, hiring, customer growth and more.\n\nSelect investments include:\n* Jeeves ($2B)\n* Dandy ($1B)\n* TRM Labs ($600M+)\n* Hightouch ($450M+)\n* Luxury Presence ($200M+)\n* FlutterFlow ($150M+)\n* Legacy ($150M+)\n* Seso ($150M+)\n* Peachy ($100M+)",
432
- "employmentType": "",
433
- "start": {
434
- "year": 2018,
435
- "month": 0,
436
- "day": 0
437
- },
438
- "end": {
439
- "year": 0,
440
- "month": 0,
441
- "day": 0
442
- }
443
- },
444
- {
445
- "companyId": 16754,
446
- "companyName": "Bessemer Venture Partners",
447
- "companyUsername": "bessemer-venture-partners",
448
- "companyURL": "https://www.linkedin.com/company/bessemer-venture-partners",
449
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQF2-_rRIldZpw/company-logo_400_400/company-logo_400_400/0/1719862419823/bessemer_venture_partners_logo?e=1733356800&v=beta&t=rX0N0rY1b8HL1G1_MpwJi16BhGWtBC-dyE2cBFi644A",
450
- "companyIndustry": "Venture Capital & Private Equity",
451
- "companyStaffCountRange": "11 - 50",
452
- "title": "Vice President",
453
- "multiLocaleTitle": null,
454
- "multiLocaleCompanyName": null,
455
- "location": "New York City Metropolitan Area",
456
- "description": "",
457
- "employmentType": "",
458
- "start": {
459
- "year": 2019,
460
- "month": 7,
461
- "day": 0
462
- },
463
- "end": {
464
- "year": 2024,
465
- "month": 2,
466
- "day": 0
467
- }
468
- },
469
- {
470
- "companyId": 11745039,
471
- "companyName": "Rillavoice",
472
- "companyUsername": "rilla-co",
473
- "companyURL": "https://www.linkedin.com/company/rilla-co",
474
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQGckOgzxr2p4g/company-logo_400_400/company-logo_400_400/0/1709081270062/rilla_co_logo?e=1733356800&v=beta&t=MvfFWJNVqsB3jaJxROLxP896fz5akuU8pndekbJ3C5g",
475
- "companyIndustry": "Computer Software",
476
- "companyStaffCountRange": "11 - 50",
477
- "title": "Board Observer",
478
- "multiLocaleTitle": null,
479
- "multiLocaleCompanyName": null,
480
- "location": "New York City Metropolitan Area",
481
- "description": "",
482
- "employmentType": "",
483
- "start": {
484
- "year": 2023,
485
- "month": 0,
486
- "day": 0
487
- },
488
- "end": {
489
- "year": 2024,
490
- "month": 0,
491
- "day": 0
492
- }
493
- },
494
- {
495
- "companyId": 74099951,
496
- "companyName": "Archy",
497
- "companyUsername": "archydental",
498
- "companyURL": "https://www.linkedin.com/company/archydental",
499
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQG13A6MTBOt5w/company-logo_400_400/company-logo_400_400/0/1724949981185/archydental_logo?e=1733356800&v=beta&t=prnsqQ4vb9F4cnt5_4Cmc6LHXYKt1ceIU6Z_G4AlzCw",
500
- "companyIndustry": "Computer Software",
501
- "companyStaffCountRange": "11 - 50",
502
- "title": "Investor",
503
- "multiLocaleTitle": null,
504
- "multiLocaleCompanyName": null,
505
- "location": "San Francisco Bay Area",
506
- "description": "",
507
- "employmentType": "",
508
- "start": {
509
- "year": 2022,
510
- "month": 0,
511
- "day": 0
512
- },
513
- "end": {
514
- "year": 2024,
515
- "month": 0,
516
- "day": 0
517
- }
518
- },
519
- {
520
- "companyId": 18762446,
521
- "companyName": "MaintainX",
522
- "companyUsername": "getmaintainx",
523
- "companyURL": "https://www.linkedin.com/company/getmaintainx",
524
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQEOOm1IB8UHxQ/company-logo_400_400/company-logo_400_400/0/1719257689258/getmaintainx_logo?e=1733356800&v=beta&t=bQzUQXAg00rNpk8-C34bicPL4Dnxwbyl-pp-Z47Ydr8",
525
- "companyIndustry": "Computer Software",
526
- "companyStaffCountRange": "201 - 500",
527
- "title": "Board Observer",
528
- "multiLocaleTitle": null,
529
- "multiLocaleCompanyName": null,
530
- "location": "San Francisco Bay Area",
531
- "description": "",
532
- "employmentType": "",
533
- "start": {
534
- "year": 2021,
535
- "month": 0,
536
- "day": 0
537
- },
538
- "end": {
539
- "year": 2024,
540
- "month": 0,
541
- "day": 0
542
- }
543
- },
544
- {
545
- "companyId": 18927115,
546
- "companyName": "Spot AI",
547
- "companyUsername": "spot-ai",
548
- "companyURL": "https://www.linkedin.com/company/spot-ai",
549
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQG2LOnQKbIi4A/company-logo_400_400/company-logo_400_400/0/1630635635761/spot_ai_logo?e=1733356800&v=beta&t=eJx_hAO6SMYTUTnHrmE4-7bz37xkTh1rzjh0CqRBwCs",
550
- "companyIndustry": "Computer Software",
551
- "companyStaffCountRange": "51 - 200",
552
- "title": "Investor",
553
- "multiLocaleTitle": null,
554
- "multiLocaleCompanyName": null,
555
- "location": "San Francisco Bay Area",
556
- "description": "",
557
- "employmentType": "",
558
- "start": {
559
- "year": 2021,
560
- "month": 0,
561
- "day": 0
562
- },
563
- "end": {
564
- "year": 2024,
565
- "month": 0,
566
- "day": 0
567
- }
568
- },
569
- {
570
- "companyId": 31404660,
571
- "companyName": "VendorPM",
572
- "companyUsername": "vendorpm",
573
- "companyURL": "https://www.linkedin.com/company/vendorpm",
574
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQEglOi17VDAUg/company-logo_400_400/company-logo_400_400/0/1688751388502/vendorpm_logo?e=1733356800&v=beta&t=g36lpENHyHRFusF-KOJfJvh97fsAezDC1FAqYzG7zUg",
575
- "companyIndustry": "Computer Software",
576
- "companyStaffCountRange": "11 - 50",
577
- "title": "Board Observer",
578
- "multiLocaleTitle": null,
579
- "multiLocaleCompanyName": null,
580
- "location": "Toronto, Ontario, Canada",
581
- "description": "",
582
- "employmentType": "",
583
- "start": {
584
- "year": 2021,
585
- "month": 0,
586
- "day": 0
587
- },
588
- "end": {
589
- "year": 2024,
590
- "month": 0,
591
- "day": 0
592
- }
593
- },
594
- {
595
- "companyId": 18872387,
596
- "companyName": "Luxury Presence",
597
- "companyUsername": "luxurypresence",
598
- "companyURL": "https://www.linkedin.com/company/luxurypresence",
599
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQEv9eTo6golbw/company-logo_400_400/company-logo_400_400/0/1655397407777/luxurypresence_logo?e=1733356800&v=beta&t=SKKunif574CP6v1Z2LjF1sk6ZM254eu5VWN7ESZ1ylc",
600
- "companyIndustry": "Computer Software",
601
- "companyStaffCountRange": "501 - 1000",
602
- "title": "Board Director",
603
- "multiLocaleTitle": null,
604
- "multiLocaleCompanyName": null,
605
- "location": "Los Angeles Metropolitan Area",
606
- "description": "",
607
- "employmentType": "",
608
- "start": {
609
- "year": 2021,
610
- "month": 0,
611
- "day": 0
612
- },
613
- "end": {
614
- "year": 2024,
615
- "month": 0,
616
- "day": 0
617
- }
618
- },
619
- {
620
- "companyId": 3157549,
621
- "companyName": "ServiceTitan",
622
- "companyUsername": "servicetitan",
623
- "companyURL": "https://www.linkedin.com/company/servicetitan",
624
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQEZXBsypK75Fg/company-logo_400_400/company-logo_400_400/0/1660079842958/servicetitan_logo?e=1733356800&v=beta&t=Ly_gt1iDc0qfGCBWgwrUHqnamNy7TZMPEDARe-tlJVA",
625
- "companyIndustry": "Computer Software",
626
- "companyStaffCountRange": "1001 - 5000",
627
- "title": "Investor",
628
- "multiLocaleTitle": null,
629
- "multiLocaleCompanyName": null,
630
- "location": "Los Angeles Metropolitan Area",
631
- "description": "",
632
- "employmentType": "",
633
- "start": {
634
- "year": 2021,
635
- "month": 0,
636
- "day": 0
637
- },
638
- "end": {
639
- "year": 2024,
640
- "month": 0,
641
- "day": 0
642
- }
643
- },
644
- {
645
- "companyId": 18319862,
646
- "companyName": "NALA",
647
- "companyUsername": "nalamoney",
648
- "companyURL": "https://www.linkedin.com/company/nalamoney",
649
- "companyLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQGjdH4F8iQgGg/company-logo_400_400/company-logo_400_400/0/1704710437688/nalamoney_logo?e=1733356800&v=beta&t=vrKr_YzZMgCUv0XjRVWlWkxSBZLnNpl42wU87xvAZTM",
650
- "companyIndustry": "Financial Services",
651
- "companyStaffCountRange": "11 - 50",
652
- "title": "Investor",
653
- "multiLocaleTitle": null,
654
- "multiLocaleCompanyName": null,
655
- "location": "",
656
- "description": "",
657
- "employmentType": "",
658
- "start": {
659
- "year": 2021,
660
- "month": 0,
661
- "day": 0
662
- },
663
- "end": {
664
- "year": 2024,
665
- "month": 0,
666
- "day": 0
667
- }
668
- },
669
- {
670
- "companyId": 70904927,
671
- "companyName": "Jasper",
672
- "companyUsername": "heyjasperai",
673
- "companyURL": "https://www.linkedin.com/company/heyjasperai",
674
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQHsWD7LHz0Ekw/company-logo_400_400/company-logo_400_400/0/1719256081254?e=1733356800&v=beta&t=MknEiRcpHfjOrS4QK4FpHIisWPG7yvD1Mv8LFkrMl4k",
675
- "companyIndustry": "Computer Software",
676
- "companyStaffCountRange": "51 - 200",
677
- "title": "Investor",
678
- "multiLocaleTitle": null,
679
- "multiLocaleCompanyName": null,
680
- "location": "San Francisco Bay Area",
681
- "description": "",
682
- "employmentType": "",
683
- "start": {
684
- "year": 2021,
685
- "month": 0,
686
- "day": 0
687
- },
688
- "end": {
689
- "year": 2024,
690
- "month": 0,
691
- "day": 0
692
- }
693
- },
694
- {
695
- "companyId": 18364911,
696
- "companyName": "Shopmonkey",
697
- "companyUsername": "shopmonkey",
698
- "companyURL": "https://www.linkedin.com/company/shopmonkey",
699
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQGgBRI5FdMkug/company-logo_400_400/company-logo_400_400/0/1630537505248/shopmonkey_logo?e=1733356800&v=beta&t=4NG5tw0Oam6ezsJeCcvYl8dZ7OgnhOygV3f1Bl9WWyI",
700
- "companyIndustry": "Computer Software",
701
- "companyStaffCountRange": "51 - 200",
702
- "title": "Board Observer",
703
- "multiLocaleTitle": null,
704
- "multiLocaleCompanyName": null,
705
- "location": "San Francisco Bay Area",
706
- "description": "",
707
- "employmentType": "",
708
- "start": {
709
- "year": 2020,
710
- "month": 0,
711
- "day": 0
712
- },
713
- "end": {
714
- "year": 2024,
715
- "month": 0,
716
- "day": 0
717
- }
718
- },
719
- {
720
- "companyId": 1292340,
721
- "companyName": "Syndio",
722
- "companyUsername": "syndioinc",
723
- "companyURL": "https://www.linkedin.com/company/syndioinc",
724
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQEDBc5ZaUmvWQ/company-logo_400_400/company-logo_400_400/0/1681938104635/syndioinc_logo?e=1733356800&v=beta&t=qIFwJgc8zf8xSgpjGqxuNmPm4HgsndG4AYQ1b61x3zM",
725
- "companyIndustry": "Computer Software",
726
- "companyStaffCountRange": "51 - 200",
727
- "title": "Investor",
728
- "multiLocaleTitle": null,
729
- "multiLocaleCompanyName": null,
730
- "location": "",
731
- "description": "",
732
- "employmentType": "",
733
- "start": {
734
- "year": 2020,
735
- "month": 0,
736
- "day": 0
737
- },
738
- "end": {
739
- "year": 2024,
740
- "month": 0,
741
- "day": 0
742
- }
743
- },
744
- {
745
- "companyId": 18742807,
746
- "companyName": "TRM Labs",
747
- "companyUsername": "trmlabs",
748
- "companyURL": "https://www.linkedin.com/company/trmlabs",
749
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4E0BAQGk-xkrdUoBpg/company-logo_400_400/company-logo_400_400/0/1638543126715/trmlabs_logo?e=1733356800&v=beta&t=7uFH1kBZBJRaHtBSTG3jq6ChQlI1ZQM3XoZIGQyBq7Y",
750
- "companyIndustry": "Information Services",
751
- "companyStaffCountRange": "201 - 500",
752
- "title": "Board Observer",
753
- "multiLocaleTitle": null,
754
- "multiLocaleCompanyName": null,
755
- "location": "San Francisco Bay Area",
756
- "description": "",
757
- "employmentType": "",
758
- "start": {
759
- "year": 2020,
760
- "month": 0,
761
- "day": 0
762
- },
763
- "end": {
764
- "year": 2024,
765
- "month": 0,
766
- "day": 0
767
- }
768
- },
769
- {
770
- "companyId": 5903162,
771
- "companyName": "Sila Nanotechnologies Inc.",
772
- "companyUsername": "sila-nanotechnologies-inc-",
773
- "companyURL": "https://www.linkedin.com/company/sila-nanotechnologies-inc-",
774
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQF7zqbzbyb9pQ/company-logo_400_400/company-logo_400_400/0/1639412633827/sila_nanotechnologies_inc__logo?e=1733356800&v=beta&t=2ei9-L8B4AfuZaEgu7zoHhu098YYcL2b5xUcsPMuwho",
775
- "companyIndustry": "Renewables & Environment",
776
- "companyStaffCountRange": "201 - 500",
777
- "title": "Investor",
778
- "multiLocaleTitle": null,
779
- "multiLocaleCompanyName": null,
780
- "location": "San Francisco Bay Areas",
781
- "description": "",
782
- "employmentType": "",
783
- "start": {
784
- "year": 2020,
785
- "month": 0,
786
- "day": 0
787
- },
788
- "end": {
789
- "year": 2024,
790
- "month": 0,
791
- "day": 0
792
- }
793
- },
794
- {
795
- "companyId": 18960490,
796
- "companyName": "Courier",
797
- "companyUsername": "trycourier",
798
- "companyURL": "https://www.linkedin.com/company/trycourier",
799
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQGhsLWH5Oz1PA/company-logo_400_400/company-logo_400_400/0/1718748389821/trycourier_logo?e=1733356800&v=beta&t=fqs9mj9F17GSAQhALd6Et-BSRsZMxT51GrGLWStPcjg",
800
- "companyIndustry": "Computer Software",
801
- "companyStaffCountRange": "11 - 50",
802
- "title": "Board Observer",
803
- "multiLocaleTitle": null,
804
- "multiLocaleCompanyName": null,
805
- "location": "San Francisco Bay Area",
806
- "description": "",
807
- "employmentType": "",
808
- "start": {
809
- "year": 2019,
810
- "month": 0,
811
- "day": 0
812
- },
813
- "end": {
814
- "year": 2024,
815
- "month": 0,
816
- "day": 0
817
- }
818
- },
819
- {
820
- "companyId": 5324440,
821
- "companyName": "Productboard",
822
- "companyUsername": "productboard",
823
- "companyURL": "https://www.linkedin.com/company/productboard",
824
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQGNdwi0nLUPTg/company-logo_400_400/company-logo_400_400/0/1719256300453/productboard_logo?e=1733356800&v=beta&t=2cf3ZSkvsgxTY1dqhR-bl32uJgIiV7nmcIvqAIn9VTw",
825
- "companyIndustry": "Computer Software",
826
- "companyStaffCountRange": "201 - 500",
827
- "title": "Board Observer",
828
- "multiLocaleTitle": null,
829
- "multiLocaleCompanyName": null,
830
- "location": "",
831
- "description": "",
832
- "employmentType": "",
833
- "start": {
834
- "year": 2019,
835
- "month": 0,
836
- "day": 0
837
- },
838
- "end": {
839
- "year": 2024,
840
- "month": 0,
841
- "day": 0
842
- }
843
- },
844
- {
845
- "companyId": 6588485,
846
- "companyName": "Guild",
847
- "companyUsername": "guildeducation",
848
- "companyURL": "https://www.linkedin.com/company/guildeducation",
849
- "companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQFQjfjzaP-wmA/company-logo_400_400/company-logo_400_400/0/1681301994500/guildeducation_logo?e=1733356800&v=beta&t=8eSaHxcOPerDLCZtagOPVDl5rmeBNY0TDiSK0Jiu1GY",
850
- "companyIndustry": "Higher Education",
851
- "companyStaffCountRange": "1001 - 5000",
852
- "title": "Investor",
853
- "multiLocaleTitle": null,
854
- "multiLocaleCompanyName": null,
855
- "location": "Denver Metropolitan Area",
856
- "description": "",
857
- "employmentType": "",
858
- "start": {
859
- "year": 2019,
860
- "month": 0,
861
- "day": 0
862
- },
863
- "end": {
864
- "year": 2024,
865
- "month": 0,
866
- "day": 0
867
- }
868
- },
869
- {
870
- "companyId": 2850862,
871
- "companyName": "Canva",
872
- "companyUsername": "canva",
873
- "companyURL": "https://www.linkedin.com/company/canva",
874
- "companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQGO1uzGzmVB-A/company-logo_400_400/company-logo_400_400/0/1656630679668/canva_logo?e=1733356800&v=beta&t=f-EU-W2e0K0IW1-sDDiwpYG0GsRBK2Nh2UX__pbjF38",
875
- "companyIndustry": "Computer Software",
876
- "companyStaffCountRange": "1001 - 5000",
877
- "title": "Investor",
878
- "multiLocaleTitle": null,
879
- "multiLocaleCompanyName": null,
880
- "location": "",
881
- "description": "",
882
- "employmentType": "",
883
- "start": {
884
- "year": 2019,
885
- "month": 0,
886
- "day": 0
887
- },
888
- "end": {
889
- "year": 2024,
890
- "month": 0,
891
- "day": 0
892
- }
893
- }
894
- ],
895
- "skills": [
896
- {
897
- "name": "Project Planning",
898
- "passedSkillAssessment": false,
899
- "endorsementsCount": 2
900
- },
901
- {
902
- "name": "Research",
903
- "passedSkillAssessment": false,
904
- "endorsementsCount": 14
905
- },
906
- {
907
- "name": "Project Exec",
908
- "passedSkillAssessment": false
909
- },
910
- {
911
- "name": "Strategic Planning",
912
- "passedSkillAssessment": false
913
- },
914
- {
915
- "name": "Market Research",
916
- "passedSkillAssessment": false,
917
- "endorsementsCount": 6
918
- },
919
- {
920
- "name": "Nonprofits",
921
- "passedSkillAssessment": false,
922
- "endorsementsCount": 11
923
- },
924
- {
925
- "name": "Leadership",
926
- "passedSkillAssessment": false,
927
- "endorsementsCount": 9
928
- },
929
- {
930
- "name": "Strategy",
931
- "passedSkillAssessment": false,
932
- "endorsementsCount": 23
933
- },
934
- {
935
- "name": "Entrepreneurship",
936
- "passedSkillAssessment": false,
937
- "endorsementsCount": 7
938
- },
939
- {
940
- "name": "Economics",
941
- "passedSkillAssessment": false,
942
- "endorsementsCount": 3
943
- },
944
- {
945
- "name": "Public Speaking",
946
- "passedSkillAssessment": false,
947
- "endorsementsCount": 16
948
- },
949
- {
950
- "name": "Data Analysis",
951
- "passedSkillAssessment": false,
952
- "endorsementsCount": 8
953
- },
954
- {
955
- "name": "Fundraising",
956
- "passedSkillAssessment": false,
957
- "endorsementsCount": 4
958
- },
959
- {
960
- "name": "Venture Capital",
961
- "passedSkillAssessment": false,
962
- "endorsementsCount": 3
963
- },
964
- {
965
- "name": "Spanish",
966
- "passedSkillAssessment": false,
967
- "endorsementsCount": 4
968
- },
969
- {
970
- "name": "Financial Modeling",
971
- "passedSkillAssessment": false,
972
- "endorsementsCount": 2
973
- }
974
- ],
975
- "givenRecommendation": null,
976
- "givenRecommendationCount": 0,
977
- "receivedRecommendation": null,
978
- "receivedRecommendationCount": 0,
979
- "courses": null,
980
- "certifications": null,
981
- "honors": null,
982
- "projects": {
983
- "total": 0,
984
- "items": null
985
- },
986
- "volunteering": [
987
- {
988
- "title": "Venture Capital Advisor & Mentor",
989
- "start": {
990
- "year": 2011,
991
- "month": 11,
992
- "day": 0
993
- },
994
- "end": {
995
- "year": 2015,
996
- "month": 10,
997
- "day": 0
998
- },
999
- "companyName": "BUILD",
1000
- "CompanyId": "513390",
1001
- "companyUrl": "https://www.linkedin.com/company/513390",
1002
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQGT3pm5lHpqVQ/company-logo_400_400/company-logo_400_400/0/1630640162308/build_logo?e=1733356800&v=beta&t=u9inGRmQwmaTL-DDgPc6nPPqVI630FhJ-PSK_xil_Vw"
1003
- },
1004
- {
1005
- "title": "Alumni Board Member, Mentor",
1006
- "start": {
1007
- "year": 2012,
1008
- "month": 11,
1009
- "day": 0
1010
- },
1011
- "end": {
1012
- "year": 2016,
1013
- "month": 8,
1014
- "day": 0
1015
- },
1016
- "companyName": "New Sector Alliance",
1017
- "CompanyId": "24636",
1018
- "companyUrl": "https://www.linkedin.com/company/24636",
1019
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQFXSfHrJYz7Cw/company-logo_400_400/company-logo_400_400/0/1669748969129/new_sector_alliance_logo?e=1733356800&v=beta&t=-G5ciTX5xibgKUH4ox1ABzNNtReauNHLlmYAMglU7nA"
1020
- },
1021
- {
1022
- "title": "Mentor",
1023
- "start": {
1024
- "year": 2014,
1025
- "month": 9,
1026
- "day": 0
1027
- },
1028
- "end": {
1029
- "year": 2015,
1030
- "month": 9,
1031
- "day": 0
1032
- },
1033
- "companyName": "Year Up",
1034
- "CompanyId": "28447",
1035
- "companyUrl": "https://www.linkedin.com/company/28447",
1036
- "companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQFsfLcEADumZg/company-logo_400_400/company-logo_400_400/0/1631350820683?e=1733356800&v=beta&t=-GRlO3yQYdYJUK6a6iP_jRzhVKartf6FaZ0sxKOQH1g"
1037
- }
1038
- ],
1039
- "supportedLocales": [
1040
- {
1041
- "country": "US",
1042
- "language": "en"
1043
- }
1044
- ],
1045
- "multiLocaleFirstName": {
1046
- "en": "Hansae"
1047
- },
1048
- "multiLocaleLastName": {
1049
- "en": "Catlett"
1050
- },
1051
- "multiLocaleHeadline": {
1052
- "en": "Partner at HOF Capital | Co-founder & GP at The MBA Fund"
1053
- }
1054
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/vsp/app/bindings.py CHANGED
@@ -1,8 +1,11 @@
1
  from vsp.app.prompts.prompt_loader import PromptLoader
2
  from vsp.app.scrapers.linkedin_downloader import LinkedinDownloader
 
 
3
  from vsp.llm.openai.openai import AsyncOpenAIService
4
  from vsp.llm.openai.openai_model import OpenAIModel
5
 
6
  prompt_loader = PromptLoader()
7
- open_ai_service = AsyncOpenAIService(OpenAIModel.GPT_4_MINI)
 
8
  linkedin_downloader = LinkedinDownloader()
 
1
  from vsp.app.prompts.prompt_loader import PromptLoader
2
  from vsp.app.scrapers.linkedin_downloader import LinkedinDownloader
3
+ from vsp.llm.cached_llm_service import CachedLLMService
4
+ from vsp.llm.llm_cache import LLMCache
5
  from vsp.llm.openai.openai import AsyncOpenAIService
6
  from vsp.llm.openai.openai_model import OpenAIModel
7
 
8
  prompt_loader = PromptLoader()
9
+ llm_cache = LLMCache()
10
+ open_ai_service = CachedLLMService(llm_service=AsyncOpenAIService(OpenAIModel.GPT_4_MINI), cache=llm_cache)
11
  linkedin_downloader = LinkedinDownloader()
src/vsp/app/classifiers/education_classifier.py CHANGED
@@ -56,10 +56,10 @@ class EducationClassification(BaseModel):
56
 
57
  class EducationClassifier:
58
  """
59
- A class for classifying education items from LinkedIn profiles.
60
 
61
  This classifier uses a language model to determine the type of educational
62
- institution and program based on the information provided in a LinkedIn profile.
63
 
64
  Attributes:
65
  _llm_service (LLMService): The language model service used for classification.
@@ -114,13 +114,13 @@ class EducationClassifier:
114
  self, linkedin_profile: LinkedinProfile, education: Education
115
  ) -> EducationClassification:
116
  """
117
- Classify a single education item from a LinkedIn profile.
118
 
119
  This method prepares the input for the language model, sends the query,
120
  and processes the result to classify the education item.
121
 
122
  Args:
123
- linkedin_profile (LinkedinProfile): The full LinkedIn profile of the individual.
124
  education (Education): The specific education item to classify.
125
 
126
  Returns:
 
56
 
57
  class EducationClassifier:
58
  """
59
+ A class for classifying education items from Linkedin profiles.
60
 
61
  This classifier uses a language model to determine the type of educational
62
+ institution and program based on the information provided in a Linkedin profile.
63
 
64
  Attributes:
65
  _llm_service (LLMService): The language model service used for classification.
 
114
  self, linkedin_profile: LinkedinProfile, education: Education
115
  ) -> EducationClassification:
116
  """
117
+ Classify a single education item from a Linkedin profile.
118
 
119
  This method prepares the input for the language model, sends the query,
120
  and processes the result to classify the education item.
121
 
122
  Args:
123
+ linkedin_profile (LinkedinProfile): The full Linkedin profile of the individual.
124
  education (Education): The specific education item to classify.
125
 
126
  Returns:
src/vsp/app/classifiers/work_experience/general_work_experience_classifier.py CHANGED
@@ -1,9 +1,9 @@
1
  """
2
  work_experience_classifier.py
3
 
4
- This module provides functionality for classifying work experiences from LinkedIn profiles.
5
  It uses a language model to determine the primary and secondary job types based on the
6
- information provided in a LinkedIn profile and specific work experience.
7
 
8
  Classes:
9
  PrimaryJobType: Enum representing different primary job types.
@@ -78,10 +78,10 @@ class WorkExperienceClassification(BaseModel):
78
 
79
  class WorkExperienceClassifier:
80
  """
81
- A class for classifying work experiences from LinkedIn profiles.
82
 
83
  This classifier uses a language model to determine the primary and secondary job types
84
- based on the information provided in a LinkedIn profile and specific work experience.
85
 
86
  Attributes:
87
  _llm_service (LLMService): The language model service used for classification.
@@ -122,6 +122,8 @@ class WorkExperienceClassifier:
122
  lines = output.strip().split("\n")
123
  parsed: dict[str, Any] = {}
124
  for line in lines:
 
 
125
  key, value = line.split(":", 1)
126
  parsed[key.strip()] = value.strip()
127
 
@@ -150,13 +152,13 @@ class WorkExperienceClassifier:
150
  self, linkedin_profile: LinkedinProfile, work_experience: Position
151
  ) -> WorkExperienceClassification:
152
  """
153
- Classify a single work experience item from a LinkedIn profile.
154
 
155
  This method prepares the input for the language model, sends the query,
156
  and processes the result to classify the work experience item.
157
 
158
  Args:
159
- linkedin_profile (LinkedinProfile): The full LinkedIn profile of the individual.
160
  work_experience (Position): The specific work experience item to classify.
161
 
162
  Returns:
 
1
  """
2
  work_experience_classifier.py
3
 
4
+ This module provides functionality for classifying work experiences from Linkedin profiles.
5
  It uses a language model to determine the primary and secondary job types based on the
6
+ information provided in a Linkedin profile and specific work experience.
7
 
8
  Classes:
9
  PrimaryJobType: Enum representing different primary job types.
 
78
 
79
  class WorkExperienceClassifier:
80
  """
81
+ A class for classifying work experiences from Linkedin profiles.
82
 
83
  This classifier uses a language model to determine the primary and secondary job types
84
+ based on the information provided in a Linkedin profile and specific work experience.
85
 
86
  Attributes:
87
  _llm_service (LLMService): The language model service used for classification.
 
122
  lines = output.strip().split("\n")
123
  parsed: dict[str, Any] = {}
124
  for line in lines:
125
+ if not line:
126
+ continue
127
  key, value = line.split(":", 1)
128
  parsed[key.strip()] = value.strip()
129
 
 
152
  self, linkedin_profile: LinkedinProfile, work_experience: Position
153
  ) -> WorkExperienceClassification:
154
  """
155
+ Classify a single work experience item from a Linkedin profile.
156
 
157
  This method prepares the input for the language model, sends the query,
158
  and processes the result to classify the work experience item.
159
 
160
  Args:
161
+ linkedin_profile (LinkedinProfile): The full Linkedin profile of the individual.
162
  work_experience (Position): The specific work experience item to classify.
163
 
164
  Returns:
src/vsp/app/classifiers/work_experience/investing_focus_asset_class_classifier.py CHANGED
@@ -2,7 +2,7 @@
2
  investing_focus_asset_class_classifier.py
3
 
4
  This module provides functionality for classifying investing focus and asset classes
5
- based on work experiences from LinkedIn profiles. It uses a language model to
6
  determine the specific investing focus or asset class a position belongs to.
7
 
8
  Classes:
@@ -42,6 +42,7 @@ class InvestingFocusAssetClass(str, Enum):
42
  CREDIT = "Credit"
43
  SECONDARIES = "Secondaries"
44
  OTHER = "Other"
 
45
 
46
 
47
  _INVESTING_FOCUS_ASSET_CLASS_MAPPINGS: Final[dict[str, InvestingFocusAssetClass]] = {
@@ -69,10 +70,10 @@ class InvestingFocusAssetClassClassification(BaseModel):
69
 
70
  class InvestingFocusAssetClassClassifier:
71
  """
72
- A class for classifying investing focus and asset classes based on work experiences from LinkedIn profiles.
73
 
74
  This classifier uses a language model to determine the specific investing focus or asset class
75
- a position belongs to based on the information provided in a LinkedIn profile and specific work experience.
76
 
77
  Attributes:
78
  _llm_service (LLMService): The language model service used for classification.
@@ -151,13 +152,13 @@ class InvestingFocusAssetClassClassifier:
151
  self, linkedin_profile: LinkedinProfile, work_experience: Position
152
  ) -> InvestingFocusAssetClassClassification:
153
  """
154
- Classify a single work experience item from a LinkedIn profile into an investing focus or asset class.
155
 
156
  This method prepares the input for the language model, sends the query,
157
  and processes the result to classify the work experience item into an investing focus or asset class.
158
 
159
  Args:
160
- linkedin_profile (LinkedinProfile): The full LinkedIn profile of the individual.
161
  work_experience (Position): The specific work experience item to classify.
162
 
163
  Returns:
 
2
  investing_focus_asset_class_classifier.py
3
 
4
  This module provides functionality for classifying investing focus and asset classes
5
+ based on work experiences from Linkedin profiles. It uses a language model to
6
  determine the specific investing focus or asset class a position belongs to.
7
 
8
  Classes:
 
42
  CREDIT = "Credit"
43
  SECONDARIES = "Secondaries"
44
  OTHER = "Other"
45
+ UNCLASSIFIABLE = "Unclassifiable"
46
 
47
 
48
  _INVESTING_FOCUS_ASSET_CLASS_MAPPINGS: Final[dict[str, InvestingFocusAssetClass]] = {
 
70
 
71
  class InvestingFocusAssetClassClassifier:
72
  """
73
+ A class for classifying investing focus and asset classes based on work experiences from Linkedin profiles.
74
 
75
  This classifier uses a language model to determine the specific investing focus or asset class
76
+ a position belongs to based on the information provided in a Linkedin profile and specific work experience.
77
 
78
  Attributes:
79
  _llm_service (LLMService): The language model service used for classification.
 
152
  self, linkedin_profile: LinkedinProfile, work_experience: Position
153
  ) -> InvestingFocusAssetClassClassification:
154
  """
155
+ Classify a single work experience item from a Linkedin profile into an investing focus or asset class.
156
 
157
  This method prepares the input for the language model, sends the query,
158
  and processes the result to classify the work experience item into an investing focus or asset class.
159
 
160
  Args:
161
+ linkedin_profile (LinkedinProfile): The full Linkedin profile of the individual.
162
  work_experience (Position): The specific work experience item to classify.
163
 
164
  Returns:
src/vsp/app/classifiers/work_experience/investing_focus_sector_classifier.py CHANGED
@@ -2,7 +2,7 @@
2
  investing_focus_sector_classifier.py
3
 
4
  This module provides functionality for classifying investing focus sectors
5
- based on work experiences from LinkedIn profiles. It uses a language model to
6
  determine the specific sector a position focuses on in terms of investments.
7
 
8
  Classes:
@@ -42,6 +42,7 @@ class InvestingFocusSector(str, Enum):
42
  FINANCIAL_INSTITUTIONS = "Financial Institutions Group (FIG) / Fintech"
43
  INFRASTRUCTURE_TRANSPORTATION = "Infrastructure / Transportation"
44
  OTHER = "Other"
 
45
 
46
 
47
  _INVESTING_FOCUS_SECTOR_MAPPINGS: Final[dict[str, InvestingFocusSector]] = {
@@ -67,11 +68,11 @@ class InvestingFocusSectorClassification(BaseModel):
67
 
68
  class InvestingFocusSectorClassifier:
69
  """
70
- A class for classifying investing focus sectors based on work experiences from LinkedIn profiles.
71
 
72
  This classifier uses a language model to determine the specific sector
73
  a position focuses on in terms of investments, based on the information
74
- provided in a LinkedIn profile and specific work experience.
75
 
76
  Attributes:
77
  _llm_service (LLMService): The language model service used for classification.
@@ -140,13 +141,13 @@ class InvestingFocusSectorClassifier:
140
  self, linkedin_profile: LinkedinProfile, work_experience: Position
141
  ) -> InvestingFocusSectorClassification:
142
  """
143
- Classify a single work experience item from a LinkedIn profile into an investing focus sector.
144
 
145
  This method prepares the input for the language model, sends the query,
146
  and processes the result to classify the work experience item into an investing focus sector.
147
 
148
  Args:
149
- linkedin_profile (LinkedinProfile): The full LinkedIn profile of the individual.
150
  work_experience (Position): The specific work experience item to classify.
151
 
152
  Returns:
 
2
  investing_focus_sector_classifier.py
3
 
4
  This module provides functionality for classifying investing focus sectors
5
+ based on work experiences from Linkedin profiles. It uses a language model to
6
  determine the specific sector a position focuses on in terms of investments.
7
 
8
  Classes:
 
42
  FINANCIAL_INSTITUTIONS = "Financial Institutions Group (FIG) / Fintech"
43
  INFRASTRUCTURE_TRANSPORTATION = "Infrastructure / Transportation"
44
  OTHER = "Other"
45
+ UNCLASSIFIABLE = "Unclassifiable"
46
 
47
 
48
  _INVESTING_FOCUS_SECTOR_MAPPINGS: Final[dict[str, InvestingFocusSector]] = {
 
68
 
69
  class InvestingFocusSectorClassifier:
70
  """
71
+ A class for classifying investing focus sectors based on work experiences from Linkedin profiles.
72
 
73
  This classifier uses a language model to determine the specific sector
74
  a position focuses on in terms of investments, based on the information
75
+ provided in a Linkedin profile and specific work experience.
76
 
77
  Attributes:
78
  _llm_service (LLMService): The language model service used for classification.
 
141
  self, linkedin_profile: LinkedinProfile, work_experience: Position
142
  ) -> InvestingFocusSectorClassification:
143
  """
144
+ Classify a single work experience item from a Linkedin profile into an investing focus sector.
145
 
146
  This method prepares the input for the language model, sends the query,
147
  and processes the result to classify the work experience item into an investing focus sector.
148
 
149
  Args:
150
+ linkedin_profile (LinkedinProfile): The full Linkedin profile of the individual.
151
  work_experience (Position): The specific work experience item to classify.
152
 
153
  Returns:
src/vsp/app/classifiers/work_experience/investment_banking_group_classifier.py CHANGED
@@ -2,7 +2,7 @@
2
  investment_banking_group_classifier.py
3
 
4
  This module provides functionality for classifying investment banking groups
5
- based on work experiences from LinkedIn profiles. It uses a language model to
6
  determine the specific investment banking group a position belongs to.
7
 
8
  Classes:
@@ -50,6 +50,7 @@ class InvestmentBankingGroup(str, Enum):
50
  FINANCIAL_INSTITUTIONS = "Financial Institutions Group (FIG) / Fintech"
51
  INFRASTRUCTURE = "Infrastructure / Transportation"
52
  OTHER = "Other"
 
53
 
54
 
55
  _INVESTMENT_BANKING_GROUP_MAPPINGS: Final[dict[str, InvestmentBankingGroup]] = {
@@ -75,10 +76,10 @@ class InvestmentBankingGroupClassification(BaseModel):
75
 
76
  class InvestmentBankingGroupClassifier:
77
  """
78
- A class for classifying investment banking groups based on work experiences from LinkedIn profiles.
79
 
80
  This classifier uses a language model to determine the specific investment banking group
81
- a position belongs to based on the information provided in a LinkedIn profile and specific work experience.
82
 
83
  Attributes:
84
  _llm_service (LLMService): The language model service used for classification.
@@ -146,13 +147,13 @@ class InvestmentBankingGroupClassifier:
146
  self, linkedin_profile: LinkedinProfile, work_experience: Position
147
  ) -> InvestmentBankingGroupClassification:
148
  """
149
- Classify a single work experience item from a LinkedIn profile into an investment banking group.
150
 
151
  This method prepares the input for the language model, sends the query,
152
  and processes the result to classify the work experience item into an investment banking group.
153
 
154
  Args:
155
- linkedin_profile (LinkedinProfile): The full LinkedIn profile of the individual.
156
  work_experience (Position): The specific work experience item to classify.
157
 
158
  Returns:
 
2
  investment_banking_group_classifier.py
3
 
4
  This module provides functionality for classifying investment banking groups
5
+ based on work experiences from Linkedin profiles. It uses a language model to
6
  determine the specific investment banking group a position belongs to.
7
 
8
  Classes:
 
50
  FINANCIAL_INSTITUTIONS = "Financial Institutions Group (FIG) / Fintech"
51
  INFRASTRUCTURE = "Infrastructure / Transportation"
52
  OTHER = "Other"
53
+ UNCLASSIFIABLE = "Unclassifiable"
54
 
55
 
56
  _INVESTMENT_BANKING_GROUP_MAPPINGS: Final[dict[str, InvestmentBankingGroup]] = {
 
76
 
77
  class InvestmentBankingGroupClassifier:
78
  """
79
+ A class for classifying investment banking groups based on work experiences from Linkedin profiles.
80
 
81
  This classifier uses a language model to determine the specific investment banking group
82
+ a position belongs to based on the information provided in a Linkedin profile and specific work experience.
83
 
84
  Attributes:
85
  _llm_service (LLMService): The language model service used for classification.
 
147
  self, linkedin_profile: LinkedinProfile, work_experience: Position
148
  ) -> InvestmentBankingGroupClassification:
149
  """
150
+ Classify a single work experience item from a Linkedin profile into an investment banking group.
151
 
152
  This method prepares the input for the language model, sends the query,
153
  and processes the result to classify the work experience item into an investment banking group.
154
 
155
  Args:
156
+ linkedin_profile (LinkedinProfile): The full Linkedin profile of the individual.
157
  work_experience (Position): The specific work experience item to classify.
158
 
159
  Returns:
src/vsp/app/main.py CHANGED
@@ -1,32 +1,4 @@
1
- """
2
- main.py
3
-
4
- This module provides functionality for processing and classifying LinkedIn profiles.
5
- It uses various classifiers to analyze education and work experience data,
6
- including specific classifications for investment banking roles.
7
-
8
- The main components are:
9
- 1. Data models for classified education and work experience.
10
- 2. A function to process a LinkedIn profile and generate classification results.
11
- 3. An example usage demonstrating how to use the module with a JSON file input.
12
-
13
- This module leverages asyncio for concurrent processing of profile data.
14
-
15
- Classes:
16
- ClassifiedEducation: Represents a classified education item.
17
- ClassifiedWorkExperience: Represents a classified work experience item.
18
- LinkedinProfileClassificationResults: Holds the classification results for a LinkedIn profile.
19
-
20
- Functions:
21
- process_linkedin_profile: Asynchronously processes a LinkedIn profile and returns classification results.
22
- main: An example async function demonstrating how to use the module.
23
-
24
- Usage:
25
- This script can be run directly to process a sample LinkedIn profile:
26
- $ python main.py
27
-
28
- Or the `process_linkedin_profile` function can be imported and used in other modules.
29
- """
30
 
31
  import asyncio
32
  import json
@@ -36,6 +8,7 @@ from pydantic import BaseModel, Field
36
 
37
  from vsp.app.classifiers.education_classifier import EducationClassification, EducationClassifier
38
  from vsp.app.classifiers.work_experience.general_work_experience_classifier import (
 
39
  SecondaryJobType,
40
  WorkExperienceClassification,
41
  WorkExperienceClassifier,
@@ -56,32 +29,14 @@ from vsp.app.model.linkedin.linkedin_models import Education, LinkedinProfile, P
56
 
57
 
58
  class ClassifiedEducation(BaseModel):
59
- """
60
- Represents a classified education item from a LinkedIn profile.
61
-
62
- Attributes:
63
- education (Education): The original education data from the LinkedIn profile.
64
- classification (EducationClassification): The classification results for the education item.
65
- """
66
 
67
  education: Education
68
  classification: EducationClassification
69
 
70
 
71
  class ClassifiedWorkExperience(BaseModel):
72
- """
73
- Represents a classified work experience item from a LinkedIn profile.
74
-
75
- Attributes:
76
- position (Position): The original position data from the LinkedIn profile.
77
- work_experience_classification (WorkExperienceClassification): The general work experience classification.
78
- investment_banking_classification (InvestmentBankingGroupClassification | None):
79
- The investment banking group classification, if applicable.
80
- investing_focus_asset_class_classification (InvestingFocusAssetClassClassification | None):
81
- The investing focus or asset class classification, if applicable.
82
- investing_focus_sector_classification (InvestingFocusSectorClassification | None):
83
- The investing focus sector classification, if applicable.
84
- """
85
 
86
  position: Position
87
  work_experience_classification: WorkExperienceClassification
@@ -91,13 +46,7 @@ class ClassifiedWorkExperience(BaseModel):
91
 
92
 
93
  class LinkedinProfileClassificationResults(BaseModel):
94
- """
95
- Holds the classification results for a LinkedIn profile.
96
-
97
- Attributes:
98
- classified_educations (Sequence[ClassifiedEducation]): List of classified education items.
99
- classified_work_experiences (Sequence[ClassifiedWorkExperience]): List of classified work experience items.
100
- """
101
 
102
  classified_educations: Sequence[ClassifiedEducation] = Field(default_factory=list)
103
  classified_work_experiences: Sequence[ClassifiedWorkExperience] = Field(default_factory=list)
@@ -105,15 +54,10 @@ class LinkedinProfileClassificationResults(BaseModel):
105
 
106
  async def process_linkedin_profile(profile: LinkedinProfile) -> LinkedinProfileClassificationResults:
107
  """
108
- Asynchronously process a LinkedIn profile and generate classification results.
109
 
110
- This function performs the following steps:
111
- 1. Classifies all education items in the profile.
112
- 2. Classifies all work experience items in the profile.
113
- 3. For work experiences classified as investment banking, performs an additional
114
- investment banking group classification.
115
- 4. For work experiences classified as investing, performs an additional
116
- investing focus or asset class classification.
117
 
118
  Args:
119
  profile (LinkedinProfile): The LinkedIn profile to process.
@@ -127,63 +71,65 @@ async def process_linkedin_profile(profile: LinkedinProfile) -> LinkedinProfileC
127
  investing_focus_asset_class_classifier = InvestingFocusAssetClassClassifier()
128
  investing_focus_sector_classifier = InvestingFocusSectorClassifier()
129
 
130
- # Classify educations
131
- education_tasks = [education_classifier.classify_education(profile, education) for education in profile.educations]
132
- education_classifications = await asyncio.gather(*education_tasks)
133
-
134
- # Classify work experiences
135
- work_experience_tasks = [
136
- work_experience_classifier.classify_work_experience(profile, position) for position in profile.positions
 
 
 
 
 
 
 
 
 
 
 
 
137
  ]
138
- work_experience_classifications = await asyncio.gather(*work_experience_tasks)
139
 
140
- # Classify investment banking groups and investing focus/asset classes for relevant positions
141
  classified_work_experiences = []
142
- for position, work_classification in zip(profile.positions, work_experience_classifications):
143
  classified_work_experience = ClassifiedWorkExperience(
144
  position=position, work_experience_classification=work_classification
145
  )
146
 
147
- if work_classification.secondary_job_type == SecondaryJobType.INVESTMENT_BANKING:
148
- ib_classification = await investment_banking_classifier.classify_investment_banking_group(profile, position)
149
- classified_work_experience.investment_banking_classification = ib_classification
 
 
 
 
 
 
 
 
 
150
 
151
- if work_classification.secondary_job_type == SecondaryJobType.INVESTING:
152
- investing_asset_class_classification = (
153
- await investing_focus_asset_class_classifier.classify_investing_focus_asset_class(profile, position)
154
- )
155
- classified_work_experience.investing_focus_asset_class_classification = investing_asset_class_classification
156
 
157
- investing_sector_classification = await investing_focus_sector_classifier.classify_investing_focus_sector(
158
- profile, position
159
- )
160
- classified_work_experience.investing_focus_sector_classification = investing_sector_classification
161
 
162
  classified_work_experiences.append(classified_work_experience)
163
 
164
- # Prepare the results using Pydantic models
165
  return LinkedinProfileClassificationResults(
166
- classified_educations=[
167
- ClassifiedEducation(education=education, classification=classification)
168
- for education, classification in zip(profile.educations, education_classifications)
169
- ],
170
- classified_work_experiences=classified_work_experiences,
171
  )
172
 
173
 
174
  async def main() -> None:
175
  """
176
- Example usage of the LinkedIn profile processing functionality.
177
-
178
- This function demonstrates how to:
179
- 1. Load a LinkedIn profile from a JSON file.
180
- 2. Process the profile using the `process_linkedin_profile` function.
181
- 3. Print the classification results.
182
-
183
- The function is asynchronous and should be run in an event loop.
184
  """
185
- with open("src/notebooks/data/eric_armagost.json") as f:
186
- profile = LinkedinProfile.profile_from_json(json.load(f))
187
  results = await process_linkedin_profile(profile)
188
  print(results.model_dump_json(indent=2))
189
 
 
1
+ # src/vsp/app/main.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  import asyncio
4
  import json
 
8
 
9
  from vsp.app.classifiers.education_classifier import EducationClassification, EducationClassifier
10
  from vsp.app.classifiers.work_experience.general_work_experience_classifier import (
11
+ PrimaryJobType,
12
  SecondaryJobType,
13
  WorkExperienceClassification,
14
  WorkExperienceClassifier,
 
29
 
30
 
31
  class ClassifiedEducation(BaseModel):
32
+ """Represents a classified education item."""
 
 
 
 
 
 
33
 
34
  education: Education
35
  classification: EducationClassification
36
 
37
 
38
  class ClassifiedWorkExperience(BaseModel):
39
+ """Represents a classified work experience item."""
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
  position: Position
42
  work_experience_classification: WorkExperienceClassification
 
46
 
47
 
48
  class LinkedinProfileClassificationResults(BaseModel):
49
+ """Represents the classification results for a LinkedIn profile."""
 
 
 
 
 
 
50
 
51
  classified_educations: Sequence[ClassifiedEducation] = Field(default_factory=list)
52
  classified_work_experiences: Sequence[ClassifiedWorkExperience] = Field(default_factory=list)
 
54
 
55
  async def process_linkedin_profile(profile: LinkedinProfile) -> LinkedinProfileClassificationResults:
56
  """
57
+ Process a LinkedIn profile and classify its education and work experiences.
58
 
59
+ This function maintains the original order of educations and work experiences
60
+ from the input profile while performing asynchronous classification tasks.
 
 
 
 
 
61
 
62
  Args:
63
  profile (LinkedinProfile): The LinkedIn profile to process.
 
71
  investing_focus_asset_class_classifier = InvestingFocusAssetClassClassifier()
72
  investing_focus_sector_classifier = InvestingFocusSectorClassifier()
73
 
74
+ # Create tasks for education classification
75
+ education_tasks = {
76
+ education: education_classifier.classify_education(profile, education) for education in profile.educations
77
+ }
78
+
79
+ # Create tasks for work experience classification
80
+ work_experience_tasks = {
81
+ position: work_experience_classifier.classify_work_experience(profile, position)
82
+ for position in profile.positions
83
+ }
84
+
85
+ # Wait for all education and work experience classifications to complete
86
+ education_results = await asyncio.gather(*education_tasks.values())
87
+ work_experience_results = await asyncio.gather(*work_experience_tasks.values())
88
+
89
+ # Create ClassifiedEducation objects in the original order
90
+ classified_educations = [
91
+ ClassifiedEducation(education=education, classification=classification)
92
+ for education, classification in zip(profile.educations, education_results)
93
  ]
 
94
 
95
+ # Process work experiences and create ClassifiedWorkExperience objects
96
  classified_work_experiences = []
97
+ for position, work_classification in zip(profile.positions, work_experience_results):
98
  classified_work_experience = ClassifiedWorkExperience(
99
  position=position, work_experience_classification=work_classification
100
  )
101
 
102
+ if work_classification.primary_job_type not in {PrimaryJobType.INTERNSHIP, PrimaryJobType.EXTRACURRICULAR}:
103
+ if work_classification.secondary_job_type == SecondaryJobType.INVESTMENT_BANKING:
104
+ ib_classification = await investment_banking_classifier.classify_investment_banking_group(
105
+ profile, position
106
+ )
107
+ classified_work_experience.investment_banking_classification = ib_classification
108
+
109
+ if work_classification.secondary_job_type == SecondaryJobType.INVESTING:
110
+ asset_class_task = investing_focus_asset_class_classifier.classify_investing_focus_asset_class(
111
+ profile, position
112
+ )
113
+ sector_task = investing_focus_sector_classifier.classify_investing_focus_sector(profile, position)
114
 
115
+ asset_class_result, sector_result = await asyncio.gather(asset_class_task, sector_task)
 
 
 
 
116
 
117
+ classified_work_experience.investing_focus_asset_class_classification = asset_class_result
118
+ classified_work_experience.investing_focus_sector_classification = sector_result
 
 
119
 
120
  classified_work_experiences.append(classified_work_experience)
121
 
 
122
  return LinkedinProfileClassificationResults(
123
+ classified_educations=classified_educations, classified_work_experiences=classified_work_experiences
 
 
 
 
124
  )
125
 
126
 
127
  async def main() -> None:
128
  """
129
+ Main function to demonstrate the usage of process_linkedin_profile.
 
 
 
 
 
 
 
130
  """
131
+ with open("tests/test_data/sample_profiles/eric_armagost.json") as f:
132
+ profile = LinkedinProfile.model_validate(json.load(f))
133
  results = await process_linkedin_profile(profile)
134
  print(results.model_dump_json(indent=2))
135
 
src/vsp/app/model/linkedin/linkedin_formatters.py CHANGED
@@ -83,7 +83,7 @@ def format_education_human(education: List[Education]) -> str:
83
 
84
  def _format_work_experience_human(positions: List[Position]) -> str:
85
  """
86
- Formats the work experience section of a LinkedIn profile in a human-readable format.
87
 
88
  Args:
89
  positions (List[Position]): A list of Position objects representing work experience.
@@ -111,10 +111,10 @@ def _format_work_experience_human(positions: List[Position]) -> str:
111
 
112
  def format_profile_as_resume(profile: LinkedinProfile) -> str:
113
  """
114
- Formats the given LinkedIn profile as a resume.
115
 
116
  Args:
117
- profile (Profile): The LinkedIn profile to be formatted.
118
 
119
  Returns:
120
  str: The formatted resume as a string.
@@ -151,10 +151,10 @@ def format_profile_as_resume(profile: LinkedinProfile) -> str:
151
 
152
  def format_profile_for_llm(profile: LinkedinProfile) -> str:
153
  """
154
- Formats the given LinkedIn profile for input to the LLM. Uses XML-like tags for each section.
155
 
156
  Args:
157
- profile (Profile): The LinkedIn profile to be formatted.
158
 
159
  Returns:
160
  str: The formatted profile as a string.
 
83
 
84
  def _format_work_experience_human(positions: List[Position]) -> str:
85
  """
86
+ Formats the work experience section of a Linkedin profile in a human-readable format.
87
 
88
  Args:
89
  positions (List[Position]): A list of Position objects representing work experience.
 
111
 
112
  def format_profile_as_resume(profile: LinkedinProfile) -> str:
113
  """
114
+ Formats the given Linkedin profile as a resume.
115
 
116
  Args:
117
+ profile (Profile): The Linkedin profile to be formatted.
118
 
119
  Returns:
120
  str: The formatted resume as a string.
 
151
 
152
  def format_profile_for_llm(profile: LinkedinProfile) -> str:
153
  """
154
+ Formats the given Linkedin profile for input to the LLM. Uses XML-like tags for each section.
155
 
156
  Args:
157
+ profile (Profile): The Linkedin profile to be formatted.
158
 
159
  Returns:
160
  str: The formatted profile as a string.
src/vsp/app/model/linkedin/linkedin_models.py CHANGED
@@ -25,6 +25,7 @@ class DateComponent(BaseSchema):
25
  year: int | None = None
26
  month: int | None = None
27
  day: int | None = None
 
28
 
29
  @field_validator("year", "month", "day", mode="before")
30
  @classmethod
@@ -70,6 +71,7 @@ class Education(StartEndMixin):
70
  school_name: str | None = None
71
  description: str | None = None
72
  activities: str | None = None
 
73
 
74
 
75
  class Position(StartEndMixin):
@@ -82,6 +84,7 @@ class Position(StartEndMixin):
82
  location: str | None = None
83
  description: str | None = None
84
  employment_type: str | None = None
 
85
 
86
 
87
  class Skill(BaseSchema):
 
25
  year: int | None = None
26
  month: int | None = None
27
  day: int | None = None
28
+ model_config = {"frozen": True} # This makes the model immutable and hashable
29
 
30
  @field_validator("year", "month", "day", mode="before")
31
  @classmethod
 
71
  school_name: str | None = None
72
  description: str | None = None
73
  activities: str | None = None
74
+ model_config = {"frozen": True} # This makes the model immutable and hashable
75
 
76
 
77
  class Position(StartEndMixin):
 
84
  location: str | None = None
85
  description: str | None = None
86
  employment_type: str | None = None
87
+ model_config = {"frozen": True} # This makes the model immutable and hashable
88
 
89
 
90
  class Skill(BaseSchema):
src/vsp/app/model/vsp/vsp_models.py ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Optional, Sequence
2
+
3
+ from pydantic import BaseModel, Field, field_validator
4
+
5
+
6
+ class General(BaseModel):
7
+ linkedin_url: str
8
+ first_name: str
9
+ last_name: str
10
+ current_location: Optional[str] = None
11
+
12
+
13
+ class EducationItem(BaseModel):
14
+ school: str
15
+ beginning_year: Optional[str] = None
16
+ ending_year: Optional[str] = None
17
+ degree_type: Optional[str] = None
18
+ degree_characterization: str
19
+ school_type: str
20
+ school_location: Optional[str] = None
21
+
22
+ @field_validator("beginning_year", "ending_year", mode="before")
23
+ @classmethod
24
+ def convert_year_to_string(cls, v: int | str | None) -> str | None:
25
+ if isinstance(v, int):
26
+ return str(v)
27
+ return v
28
+
29
+
30
+ class Education(BaseModel):
31
+ undergraduate_school: Optional[str] = None
32
+ undergraduate_year: Optional[int] = None
33
+ graduate_school: Optional[str] = None
34
+ graduate_school_year: Optional[int] = None
35
+ education_history: Sequence[EducationItem] = Field(default_factory=list)
36
+
37
+
38
+ class ExperienceBySecondaryJobType(BaseModel):
39
+ investing: Optional[float] = None
40
+ back_office: Optional[float] = None
41
+ investment_banking: Optional[float] = None
42
+ consulting: Optional[float] = None
43
+ engineering: Optional[float] = None
44
+ entrepreneur_founder: Optional[float] = None
45
+ corpdev_strategy: Optional[float] = None
46
+ other: Optional[float] = None
47
+
48
+
49
+ class ExperienceHistoryItem(BaseModel):
50
+ company: str
51
+ title: Optional[str]
52
+ location: Optional[str] = None
53
+ start_date: str
54
+ end_date: str
55
+ duration: str
56
+ description: Optional[str] = None
57
+ primary_job_type: str
58
+ secondary_job_type: Optional[str] = None
59
+ investing_focus_stage: Optional[str] = None
60
+ investing_focus_sector: Optional[str] = None
61
+ investment_banking_focus: Optional[str] = None
62
+
63
+
64
+ class ProfessionalExperience(BaseModel):
65
+ total_years_of_experience: float
66
+ experience_by_secondary_job_type: ExperienceBySecondaryJobType
67
+ linkedin_title: str
68
+ experience_history: Sequence[ExperienceHistoryItem] = Field(default_factory=list)
69
+
70
+
71
+ class VSPProfile(BaseModel):
72
+ general: General
73
+ education: Education
74
+ professional_experience: ProfessionalExperience
src/vsp/app/prompts/education_classifier/1 - education_classifier_human.txt CHANGED
@@ -1,9 +1,9 @@
1
- Please classify the following educational item based on the job candidate's full resume and the specific LinkedIn education information provided. Analyze both sources of information carefully to determine the most accurate classification.
2
 
3
  Full Resume:
4
  {resume}
5
 
6
- Specific LinkedIn Education Item:
7
  {education}
8
 
9
- Provide your classification, confidence level (0.0 to 1.0), and reasoning in the specified format. Ensure your reasoning refers to specific details from both the resume and the LinkedIn education item that support your decision.
 
1
+ Please classify the following educational item based on the job candidate's full resume and the specific Linkedin education information provided. Analyze both sources of information carefully to determine the most accurate classification.
2
 
3
  Full Resume:
4
  {resume}
5
 
6
+ Specific Linkedin Education Item:
7
  {education}
8
 
9
+ Provide your classification, confidence level (0.0 to 1.0), and reasoning in the specified format. Ensure your reasoning refers to specific details from both the resume and the Linkedin education item that support your decision.
src/vsp/app/prompts/education_classifier/1 - education_classifier_system.txt CHANGED
@@ -1,16 +1,16 @@
1
- You are an expert in analyzing educational backgrounds and classifying them according to specific categories. Your task is to examine a founder's full resume and a specific educational item from LinkedIn, then classify the educational item into one of the predefined categories. Use the provided information carefully to make an accurate classification.
2
 
3
  The classification categories are:
4
- 1. PRIMARY_SECONDARY: "Primary / Secondary School"
5
- 2. UNDERGRAD_INCOMPLETE: "Undergraduate (Incomplete)" (Includes things like study abroad)
6
- 3. UNDERGRAD_COMPLETED: "Undergraduate (Completed)"
7
- 4. MBA: "MBA"
8
- 5. LAW_SCHOOL: "Law School"
9
- 6. GRAD_SCHOOL: "Graduate School"
10
- 7. PHD: "PhD"
11
- 8. OTHER: "Other"
12
 
13
- Pay close attention to the degree type, field of study, and any other relevant information provided in both the resume and the specific LinkedIn education item. Consider the context of the entire educational background when making your classification.
14
 
15
  Provide your response in the following format:
16
 
@@ -18,4 +18,4 @@ output: [CATEGORY_NAME]
18
  confidence: [0.0 to 1.0]
19
  reasoning: [Your explanation here]
20
 
21
- Ensure each part of your response is on a separate line, exactly as shown above.
 
1
+ You are an expert in analyzing educational backgrounds and classifying them according to specific categories. Your task is to examine a founder's full resume and a specific educational item from Linkedin, then classify the educational item into one of the predefined categories. Use the provided information carefully to make an accurate classification.
2
 
3
  The classification categories are:
4
+ 1. PRIMARY_SECONDARY: Primary / Secondary School. This includes high school, middle school, and elementary school.
5
+ 2. UNDERGRAD_INCOMPLETE: An incomplete / in-progress undergraduate degree. This includes study-abroad programs, transfer credits, and other incomplete undergraduate studies.
6
+ 3. UNDERGRAD_COMPLETED: A completed undergraduate degree.
7
+ 4. MBA: A Master of Business Administration degree. This includes Executive MBA programs. This is not the same as a Master's degree in Business Analytics, Finance, or other fields.
8
+ 5. LAW_SCHOOL: Successful completion of law school.
9
+ 6. GRAD_SCHOOL: A Master's degree in a field other than Business Administration or Law.
10
+ 7. PHD: A PhD or doctorate degree in any field.
11
+ 8. OTHER: Any other educational experience that doesn't fit the above categories.
12
 
13
+ Pay close attention to the degree type, field of study, and any other relevant information provided in both the resume and the specific Linkedin education item. Consider the context of the entire educational background when making your classification.
14
 
15
  Provide your response in the following format:
16
 
 
18
  confidence: [0.0 to 1.0]
19
  reasoning: [Your explanation here]
20
 
21
+ Ensure each part of your response is on a separate line, exactly as shown above. There should be exactly three lines.
src/vsp/app/prompts/prompt_loader.py CHANGED
@@ -56,7 +56,7 @@ class PromptLoader:
56
  temperature=0.7,
57
  output_formatter=lambda x: {"classification": x},
58
  resume="Full resume text...",
59
- education="Specific LinkedIn education item..."
60
  )
61
 
62
  # Load and create the narrative generator prompt
 
56
  temperature=0.7,
57
  output_formatter=lambda x: {"classification": x},
58
  resume="Full resume text...",
59
+ education="Specific Linkedin education item..."
60
  )
61
 
62
  # Load and create the narrative generator prompt
src/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_human.txt CHANGED
@@ -1,4 +1,4 @@
1
- Please classify the following work experience item based on the job candidate's full resume and the specific work experience information provided from their LinkedIn profile. Analyze both sources of information carefully to determine the most accurate classification for both Primary Job Type and Secondary Job Type.
2
 
3
  Full Resume:
4
  {resume}
 
1
+ Please classify the following work experience item based on the job candidate's full resume and the specific work experience information provided from their Linkedin profile. Analyze both sources of information carefully to determine the most accurate classification for both Primary Job Type and Secondary Job Type.
2
 
3
  Full Resume:
4
  {resume}
src/vsp/app/prompts/work_experience_classifier/1 - work_experience_classifier_system.txt CHANGED
@@ -6,33 +6,45 @@ Primary Job Type categories:
6
  1. FULL_TIME: Regular, ongoing employment
7
  2. ADVISORY_BOARD_INVESTOR: Advisory roles, board memberships, or independent investing activities
8
  3. INTERNSHIP: Short-term positions for students or recent graduates, including summer/seasonal analyst roles
9
- 4. EXTRACURRICULAR: Non-professional activities related to career development
10
  5. EDUCATION: When educational experiences are listed as work experiences
11
  6. OTHER: Volunteer work or any other type that doesn't fit the above categories
12
 
 
 
 
 
 
 
 
 
 
 
13
  Secondary Job Type categories:
14
- 1. INVESTING: Professional investing roles, such as venture capital, private equity, or hedge fund positions
15
  2. BACK_OFFICE: Supporting roles in financial firms, such as operations, accounting, or IT
16
- 3. INVESTMENT_BANKING: Roles in investment banks or related financial services
17
  4. CONSULTING: Management or strategy consulting roles
18
  5. ENGINEERING: Software development, hardware engineering, or other technical roles
19
  6. ENTREPRENEUR_FOUNDER: Founding or co-founding a company
20
  7. CORPDEV_STRATEGY: Corporate development or strategic planning roles
21
  8. OTHER: Any role that doesn't fit the above categories
22
 
 
 
 
 
 
23
  Provide your response in the following format exactly:
24
 
25
- primary_job_type: [PRIMARY_JOB_TYPE]
26
- secondary_job_type: [SECONDARY_JOB_TYPE]
27
- confidence: [0.0 to 1.0]
28
  reasoning: [Your explanation here]
 
 
 
29
 
30
- Ensure each part of your response is on a separate line, exactly as shown above. There should be only four lines.
31
 
32
  The PRIMARY_JOB_TYPE must be one of: FULL_TIME, ADVISORY_BOARD_INVESTOR, INTERNSHIP, EXTRACURRICULAR, EDUCATION, OTHER
33
-
34
  The SECONDARY_JOB_TYPE must be one of: INVESTING, BACK_OFFICE, INVESTMENT_BANKING, CONSULTING, ENGINEERING, ENTREPRENEUR_FOUNDER, CORPDEV_STRATEGY, OTHER
35
 
36
- Your confidence level should reflect how certain you are about your classification based on the information provided.
37
-
38
- In your reasoning, briefly explain why you chose these classifications, referencing specific details from the resume and work experience item that support your decision.
 
6
  1. FULL_TIME: Regular, ongoing employment
7
  2. ADVISORY_BOARD_INVESTOR: Advisory roles, board memberships, or independent investing activities
8
  3. INTERNSHIP: Short-term positions for students or recent graduates, including summer/seasonal analyst roles
9
+ 4. EXTRACURRICULAR: Unpaid activities related to career development, such as student clubs or competitions
10
  5. EDUCATION: When educational experiences are listed as work experiences
11
  6. OTHER: Volunteer work or any other type that doesn't fit the above categories
12
 
13
+ Some tips for primary job type categories:
14
+ - Primary job categories are used to describe the hours and compensation setup of the work experience, as opposed to the industry of focus.
15
+ - It cannot be ENTREPRENEUR_FOUNDER: Founding or co-founding a company, as this is a secondary job type category.
16
+ - If the role is a 2-4 month job that happened in the summer, it's likely an INTERNSHIP. Something that's longer than 6 months is unlikely to be an internship unless it meets the other criteria below.
17
+ - If the role is a part-time job while the candidate was in school, it's likely an INTERNSHIP.
18
+ - If the role is before the first full-time job, it's probably during school and should be classified as INTERNSHIP.
19
+ - If the role explicitly says "intern", "internship", or "externship", 'summer analyst', 'summer associate', 'winter analyst', or 'winter associate' it's almost certainly an INTERNSHIP.
20
+ - If the role is a student club, a competition, or something related to the college of the job candidate, it's likely EXTRACURRICULAR.
21
+ - If the role's company is a fraternity, a sorority, or a business fraternity, it's likely EXTRACURRICULAR.
22
+
23
  Secondary Job Type categories:
24
+ 1. INVESTING: Professional investing roles, such as venture capital, private equity, or hedge fund positions (Note: Roles in private equity should be classified as INVESTING)
25
  2. BACK_OFFICE: Supporting roles in financial firms, such as operations, accounting, or IT
26
+ 3. INVESTMENT_BANKING: Roles in investment banks or related financial services (Note: **Exclude roles in private equity and venture capital**)
27
  4. CONSULTING: Management or strategy consulting roles
28
  5. ENGINEERING: Software development, hardware engineering, or other technical roles
29
  6. ENTREPRENEUR_FOUNDER: Founding or co-founding a company
30
  7. CORPDEV_STRATEGY: Corporate development or strategic planning roles
31
  8. OTHER: Any role that doesn't fit the above categories
32
 
33
+ Some tips for secondary job type categories:
34
+ - If the role involves analyzing potential investments, it's likely INVESTING.
35
+ - Roles in private equity, venture capital, or hedge fund positions should be classified as INVESTING. Exclude these roles from INVESTMENT_BANKING.
36
+ - A candidate can be doing investment banking activities in a corp dev role. In this case, the role should be classified as CORPDEV_STRATEGY. You can tell if the role is corp dev if the candidate is working for a company and not a bank.
37
+
38
  Provide your response in the following format exactly:
39
 
 
 
 
40
  reasoning: [Your explanation here]
41
+ confidence: [0.0 to 1.0]
42
+ primary_job_type: [one of: FULL_TIME, ADVISORY_BOARD_INVESTOR, INTERNSHIP, EXTRACURRICULAR, EDUCATION, OTHER]
43
+ secondary_job_type: [one of: INVESTING, BACK_OFFICE, INVESTMENT_BANKING, CONSULTING, ENGINEERING, ENTREPRENEUR_FOUNDER, CORPDEV_STRATEGY, OTHER]
44
 
45
+ Ensure each part of your response is on a separate line, exactly as shown above. There should be EXACTLY four lines.
46
 
47
  The PRIMARY_JOB_TYPE must be one of: FULL_TIME, ADVISORY_BOARD_INVESTOR, INTERNSHIP, EXTRACURRICULAR, EDUCATION, OTHER
 
48
  The SECONDARY_JOB_TYPE must be one of: INVESTING, BACK_OFFICE, INVESTMENT_BANKING, CONSULTING, ENGINEERING, ENTREPRENEUR_FOUNDER, CORPDEV_STRATEGY, OTHER
49
 
50
+ Your confidence level should reflect how certain you are about your classification based on the information provided. In your reasoning, briefly explain why you chose these classifications, referencing specific details from the resume and work experience item that support your decision.
 
 
src/vsp/app/prompts/work_experience_classifier/investing_focus_asset_class/1 - investing_focus_asset_class_classifier_human.txt CHANGED
@@ -1,4 +1,4 @@
1
- Please classify the following work experience item based on the job candidate's full resume and the specific work experience information provided from their LinkedIn profile. Analyze both sources of information carefully to determine the most accurate classification for the investing focus or asset class.
2
 
3
  Full Resume:
4
  {resume}
 
1
+ Please classify the following work experience item based on the job candidate's full resume and the specific work experience information provided from their Linkedin profile. Analyze both sources of information carefully to determine the most accurate classification for the investing focus or asset class.
2
 
3
  Full Resume:
4
  {resume}
src/vsp/app/prompts/work_experience_classifier/investing_focus_asset_class/1 - investing_focus_asset_class_classifier_system.txt CHANGED
@@ -1,4 +1,4 @@
1
- You are an expert in analyzing professional work experiences and classifying them according to specific investing focus and asset classes. Your task is to examine a job candidate's full resume and a specific work experience item from their LinkedIn profile, then classify the work experience into one of the predefined investing focus or asset class categories.
2
 
3
  Use the provided information carefully to make an accurate classification. Pay close attention to job titles, responsibilities, company descriptions, and any other relevant information provided in both the resume and the specific work experience item.
4
 
@@ -11,10 +11,11 @@ Investing Focus / Asset Class categories:
11
  6. PUBLIC_EQUITIES: Investments in publicly traded equities
12
  7. REAL_ESTATE: Real estate investments
13
  8. PRIVATE_EQUITY_BUYOUTS: Private equity and buyout investments
14
- 9. HEDGE_FUND: Hedge fund investments
15
  10. CREDIT: Credit investments
16
  11. SECONDARIES: Secondary market investments
17
  12. OTHER: Any focus or asset class that doesn't fit the above categories
 
18
 
19
  Provide your response in the following format exactly:
20
 
 
1
+ You are an expert in analyzing professional work experiences and classifying them according to specific investing focus and asset classes. Your task is to examine a job candidate's full resume and a specific work experience item from their Linkedin profile, then classify the work experience into one of the predefined investing focus or asset class categories.
2
 
3
  Use the provided information carefully to make an accurate classification. Pay close attention to job titles, responsibilities, company descriptions, and any other relevant information provided in both the resume and the specific work experience item.
4
 
 
11
  6. PUBLIC_EQUITIES: Investments in publicly traded equities
12
  7. REAL_ESTATE: Real estate investments
13
  8. PRIVATE_EQUITY_BUYOUTS: Private equity and buyout investments
14
+ 9. HEDGE_FUND: Hedge fund investments, such as fund-of-funds
15
  10. CREDIT: Credit investments
16
  11. SECONDARIES: Secondary market investments
17
  12. OTHER: Any focus or asset class that doesn't fit the above categories
18
+ 13. UNCLASSIFIABLE: If the information provided is insufficient to make a classification
19
 
20
  Provide your response in the following format exactly:
21
 
src/vsp/app/prompts/work_experience_classifier/investing_focus_sector/1 - investing_focus_sector_classifier_human.txt CHANGED
@@ -1,4 +1,4 @@
1
- Please classify the following work experience item based on the job candidate's full resume and the specific work experience information provided from their LinkedIn profile. Analyze both sources of information carefully to determine the most accurate classification for the investing focus sector.
2
 
3
  Full Resume:
4
  {resume}
 
1
+ Please classify the following work experience item based on the job candidate's full resume and the specific work experience information provided from their Linkedin profile. Analyze both sources of information carefully to determine the most accurate classification for the investing focus sector.
2
 
3
  Full Resume:
4
  {resume}
src/vsp/app/prompts/work_experience_classifier/investing_focus_sector/1 - investing_focus_sector_classifier_system.txt CHANGED
@@ -1,4 +1,4 @@
1
- You are an expert in analyzing professional work experiences and classifying them according to specific investing focus sectors. Your task is to examine a job candidate's full resume and a specific work experience item from their LinkedIn profile, then classify the work experience into one of the predefined investing focus sector categories.
2
 
3
  Use the provided information carefully to make an accurate classification. Pay close attention to job titles, responsibilities, company descriptions, and any other relevant information provided in both the resume and the specific work experience item.
4
 
@@ -15,6 +15,7 @@ Investing Focus Sector categories:
15
  10. FINANCIAL_INSTITUTIONS: Focus on banks, insurance, fintech, and other financial services
16
  11. INFRASTRUCTURE_TRANSPORTATION: Focus on infrastructure projects and transportation
17
  12. OTHER: Any focus that doesn't fit the above categories
 
18
 
19
  Provide your response in the following format exactly:
20
 
@@ -24,8 +25,6 @@ reasoning: [Your explanation here]
24
 
25
  Ensure each part of your response is on a separate line, exactly as shown above. There should be exactly three lines.
26
 
27
- The investing_focus_sector must be one of: GENERALIST, HEALTHCARE, INDUSTRIALS, BUSINESS_SERVICES, CONSUMER_RETAIL, ENERGY_NATURAL_RESOURCES, REAL_ESTATE_GAMING_LODGING, TECHNOLOGY_SOFTWARE_TMT, MEDIA_ENTERTAINMENT, FINANCIAL_INSTITUTIONS, INFRASTRUCTURE_TRANSPORTATION, OTHER.
28
 
29
- Your confidence level should reflect how certain you are about your classification based on the information provided.
30
-
31
- In your reasoning, briefly explain why you chose this classification, referencing specific details from the resume and work experience item that support your decision.
 
1
+ You are an expert in analyzing professional work experiences and classifying them according to specific investing focus sectors. Your task is to examine a job candidate's full resume and a specific work experience item from their Linkedin profile, then classify the work experience into one of the predefined investing focus sector categories.
2
 
3
  Use the provided information carefully to make an accurate classification. Pay close attention to job titles, responsibilities, company descriptions, and any other relevant information provided in both the resume and the specific work experience item.
4
 
 
15
  10. FINANCIAL_INSTITUTIONS: Focus on banks, insurance, fintech, and other financial services
16
  11. INFRASTRUCTURE_TRANSPORTATION: Focus on infrastructure projects and transportation
17
  12. OTHER: Any focus that doesn't fit the above categories
18
+ 13. UNCLASSIFIABLE: If the information provided is insufficient to make a classification.
19
 
20
  Provide your response in the following format exactly:
21
 
 
25
 
26
  Ensure each part of your response is on a separate line, exactly as shown above. There should be exactly three lines.
27
 
28
+ The investing_focus_sector must be one of: GENERALIST, HEALTHCARE, INDUSTRIALS, BUSINESS_SERVICES, CONSUMER_RETAIL, ENERGY_NATURAL_RESOURCES, REAL_ESTATE_GAMING_LODGING, TECHNOLOGY_SOFTWARE_TMT, MEDIA_ENTERTAINMENT, FINANCIAL_INSTITUTIONS, INFRASTRUCTURE_TRANSPORTATION, OTHER, UNCLASSIFIABLE.
29
 
30
+ Your confidence level should reflect how certain you are about your classification based on the information provided. In your reasoning, briefly explain why you chose this classification, referencing specific details from the resume and work experience item that support your decision.
 
 
src/vsp/app/prompts/work_experience_classifier/investment_banking_group/1 - investment_banking_group_classifier_human.txt CHANGED
@@ -1,4 +1,4 @@
1
- Please classify the following investment banking work experience item based on the job candidate's full resume and the specific investment banking work experience information provided from their LinkedIn profile. Analyze both sources of information carefully to determine the most accurate classification for the investment banking group the candidate worked in.
2
 
3
  Full Resume:
4
  {resume}
 
1
+ Please classify the following investment banking work experience item based on the job candidate's full resume and the specific investment banking work experience information provided from their Linkedin profile. Analyze both sources of information carefully to determine the most accurate classification for the investment banking group the candidate worked in.
2
 
3
  Full Resume:
4
  {resume}
src/vsp/app/prompts/work_experience_classifier/investment_banking_group/1 - investment_banking_group_classifier_system.txt CHANGED
@@ -1,4 +1,4 @@
1
- You are an expert investment banking recruiter. You have been asked to analyze a specific investment banking work experience item from a job candidate's LinkedIn profile. Your task is to accurately classify the investment banking group the candidate worked in.
2
 
3
  You can use your understanding of the investment banking industry as an expert recruiter in investment banking to make the best guess. Use the provided information carefully to make accurate classifications.
4
 
@@ -23,6 +23,7 @@ Investment banking groups:
23
  18. FINANCIAL_INSTITUTIONS: A group focused on financial institutions and banking transactions.
24
  19. INFRASTRUCTURE: A group specializing in infrastructure and transportation transactions.
25
  20. OTHER: Any group that doesn't fit the above categories.
 
26
 
27
  Provide your response in the following format exactly:
28
 
 
1
+ You are an expert investment banking recruiter. You have been asked to analyze a specific investment banking work experience item from a job candidate's Linkedin profile. Your task is to accurately classify the investment banking group the candidate worked in.
2
 
3
  You can use your understanding of the investment banking industry as an expert recruiter in investment banking to make the best guess. Use the provided information carefully to make accurate classifications.
4
 
 
23
  18. FINANCIAL_INSTITUTIONS: A group focused on financial institutions and banking transactions.
24
  19. INFRASTRUCTURE: A group specializing in infrastructure and transportation transactions.
25
  20. OTHER: Any group that doesn't fit the above categories.
26
+ 21. UNCLASSIFIABLE: If the information provided is insufficient to make a classification
27
 
28
  Provide your response in the following format exactly:
29
 
src/vsp/app/scrapers/linkedin_downloader.py CHANGED
@@ -1,14 +1,14 @@
1
  """
2
  linkedin_downloader.py
3
 
4
- This module provides functionality for asynchronously downloading LinkedIn profile data
5
- using the RapidAPI LinkedIn API. It handles authentication, rate limiting, and retrying
6
  of requests in case of failures.
7
 
8
  Classes:
9
- LinkedInFetchFailedError: Custom exception for LinkedIn fetch failures.
10
  RateLimiter: Token bucket algorithm implementation for rate limiting.
11
- LinkedinDownloader: Main class for downloading LinkedIn profile data.
12
 
13
  Usage:
14
  downloader = LinkedinDownloader()
@@ -29,8 +29,8 @@ from vsp.shared import aws_clients, config, logger_factory
29
  logger = logger_factory.get_logger(__name__)
30
 
31
 
32
- class LinkedInFetchFailedError(Exception):
33
- """Custom exception raised when fetching LinkedIn profile data fails."""
34
 
35
 
36
  class RateLimiter:
@@ -76,14 +76,14 @@ class RateLimiter:
76
 
77
  class LinkedinDownloader:
78
  """
79
- A class for asynchronously downloading LinkedIn profile data.
80
 
81
  This class handles authentication, rate limiting, and retrying of requests
82
- when interacting with the RapidAPI LinkedIn API.
83
 
84
  Attributes:
85
- _URL (Final[str]): The RapidAPI endpoint for LinkedIn data.
86
- _X_RAPIDAPI_HOST (Final[str]): The RapidAPI host for LinkedIn API.
87
  _api_key (str): The RapidAPI key for authentication.
88
  _semaphore (asyncio.Semaphore): Semaphore for limiting concurrent requests.
89
  _rate_limiter (RateLimiter): Rate limiter for controlling requests per minute.
@@ -107,10 +107,10 @@ class LinkedinDownloader:
107
  @staticmethod
108
  def _fetch_api_key() -> str:
109
  """
110
- Fetch the LinkedIn RapidAPI key from AWS Parameter Store.
111
 
112
  Returns:
113
- str: The LinkedIn RapidAPI key.
114
 
115
  Raises:
116
  ValueError: If the API key is not found in the Parameter Store.
@@ -119,18 +119,18 @@ class LinkedinDownloader:
119
  try:
120
  return aws_clients.fetch_from_parameter_store(config.get_linkedin_key_path(), is_secret=True)
121
  except aws_clients.ParameterNotFoundError as e:
122
- logger.error("LinkedIn RapidAPI key not found in Parameter Store", error=str(e))
123
- raise ValueError("LinkedIn RapidAPI key not found") from e
124
  except aws_clients.ParameterStoreAccessError as e:
125
  logger.error("Error accessing Parameter Store", error=str(e))
126
- raise RuntimeError("Unable to access LinkedIn RapidAPI key") from e
127
 
128
  def _compose_request(self, linkedin_url: str) -> tuple[dict[str, str], dict[str, str]]:
129
  """
130
  Compose the request headers and query parameters for the API call.
131
 
132
  Args:
133
- linkedin_url (str): The LinkedIn profile URL.
134
 
135
  Returns:
136
  tuple[dict[str, str], dict[str, str]]: A tuple containing the headers and query parameters.
@@ -143,34 +143,34 @@ class LinkedinDownloader:
143
  @retry(
144
  wait=wait_random_exponential(min=1, max=60),
145
  stop=stop_after_attempt(3),
146
- retry=retry_if_exception_type(LinkedInFetchFailedError),
147
  reraise=True,
148
  )
149
  async def fetch_linkedin_data(self, linkedin_url: str) -> LinkedinProfile:
150
  """
151
- Fetch LinkedIn profile data for a given URL.
152
 
153
  This method is decorated with a retry mechanism that will attempt to retry
154
- the call up to 3 times with exponential backoff if a LinkedInFetchFailedError is raised.
155
 
156
  Args:
157
- linkedin_url (str): The LinkedIn profile URL to fetch data for.
158
 
159
  Returns:
160
- LinkedinProfile: The fetched LinkedIn profile data.
161
 
162
  Raises:
163
- LinkedInFetchFailedError: If the API call fails after all retry attempts.
164
  """
165
  async with self._semaphore:
166
  await self._rate_limiter.acquire() # Acquire a token from the rate limiter
167
  headers, querystring = self._compose_request(linkedin_url)
168
- logger.info("Fetching LinkedIn profile", url=linkedin_url)
169
  async with aiohttp.ClientSession() as session:
170
  async with session.get(self._URL, headers=headers, params=querystring) as response:
171
  if response.status == 200:
172
  data = await response.json()
173
  return LinkedinProfile.profile_from_json(data)
174
  else:
175
- logger.error("Failed to fetch LinkedIn profile", url=linkedin_url, status=response.status)
176
- raise LinkedInFetchFailedError(f"Failed to fetch LinkedIn profile for {linkedin_url}")
 
1
  """
2
  linkedin_downloader.py
3
 
4
+ This module provides functionality for asynchronously downloading Linkedin profile data
5
+ using the RapidAPI Linkedin API. It handles authentication, rate limiting, and retrying
6
  of requests in case of failures.
7
 
8
  Classes:
9
+ LinkedinFetchFailedError: Custom exception for Linkedin fetch failures.
10
  RateLimiter: Token bucket algorithm implementation for rate limiting.
11
+ LinkedinDownloader: Main class for downloading Linkedin profile data.
12
 
13
  Usage:
14
  downloader = LinkedinDownloader()
 
29
  logger = logger_factory.get_logger(__name__)
30
 
31
 
32
+ class LinkedinFetchFailedError(Exception):
33
+ """Custom exception raised when fetching Linkedin profile data fails."""
34
 
35
 
36
  class RateLimiter:
 
76
 
77
  class LinkedinDownloader:
78
  """
79
+ A class for asynchronously downloading Linkedin profile data.
80
 
81
  This class handles authentication, rate limiting, and retrying of requests
82
+ when interacting with the RapidAPI Linkedin API.
83
 
84
  Attributes:
85
+ _URL (Final[str]): The RapidAPI endpoint for Linkedin data.
86
+ _X_RAPIDAPI_HOST (Final[str]): The RapidAPI host for Linkedin API.
87
  _api_key (str): The RapidAPI key for authentication.
88
  _semaphore (asyncio.Semaphore): Semaphore for limiting concurrent requests.
89
  _rate_limiter (RateLimiter): Rate limiter for controlling requests per minute.
 
107
  @staticmethod
108
  def _fetch_api_key() -> str:
109
  """
110
+ Fetch the Linkedin RapidAPI key from AWS Parameter Store.
111
 
112
  Returns:
113
+ str: The Linkedin RapidAPI key.
114
 
115
  Raises:
116
  ValueError: If the API key is not found in the Parameter Store.
 
119
  try:
120
  return aws_clients.fetch_from_parameter_store(config.get_linkedin_key_path(), is_secret=True)
121
  except aws_clients.ParameterNotFoundError as e:
122
+ logger.error("Linkedin RapidAPI key not found in Parameter Store", error=str(e))
123
+ raise ValueError("Linkedin RapidAPI key not found") from e
124
  except aws_clients.ParameterStoreAccessError as e:
125
  logger.error("Error accessing Parameter Store", error=str(e))
126
+ raise RuntimeError("Unable to access Linkedin RapidAPI key") from e
127
 
128
  def _compose_request(self, linkedin_url: str) -> tuple[dict[str, str], dict[str, str]]:
129
  """
130
  Compose the request headers and query parameters for the API call.
131
 
132
  Args:
133
+ linkedin_url (str): The Linkedin profile URL.
134
 
135
  Returns:
136
  tuple[dict[str, str], dict[str, str]]: A tuple containing the headers and query parameters.
 
143
  @retry(
144
  wait=wait_random_exponential(min=1, max=60),
145
  stop=stop_after_attempt(3),
146
+ retry=retry_if_exception_type(LinkedinFetchFailedError),
147
  reraise=True,
148
  )
149
  async def fetch_linkedin_data(self, linkedin_url: str) -> LinkedinProfile:
150
  """
151
+ Fetch Linkedin profile data for a given URL.
152
 
153
  This method is decorated with a retry mechanism that will attempt to retry
154
+ the call up to 3 times with exponential backoff if a LinkedinFetchFailedError is raised.
155
 
156
  Args:
157
+ linkedin_url (str): The Linkedin profile URL to fetch data for.
158
 
159
  Returns:
160
+ LinkedinProfile: The fetched Linkedin profile data.
161
 
162
  Raises:
163
+ LinkedinFetchFailedError: If the API call fails after all retry attempts.
164
  """
165
  async with self._semaphore:
166
  await self._rate_limiter.acquire() # Acquire a token from the rate limiter
167
  headers, querystring = self._compose_request(linkedin_url)
168
+ logger.info("Fetching Linkedin profile", url=linkedin_url)
169
  async with aiohttp.ClientSession() as session:
170
  async with session.get(self._URL, headers=headers, params=querystring) as response:
171
  if response.status == 200:
172
  data = await response.json()
173
  return LinkedinProfile.profile_from_json(data)
174
  else:
175
+ logger.error("Failed to fetch Linkedin profile", url=linkedin_url, status=response.status)
176
+ raise LinkedinFetchFailedError(f"Failed to fetch Linkedin profile for {linkedin_url}")
src/vsp/llm/cached_llm_service.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from vsp.llm.llm_cache import LLMCache
2
+ from vsp.llm.llm_service import LLMService
3
+ from vsp.shared import logger_factory
4
+
5
+ logger = logger_factory.get_logger(__name__)
6
+
7
+
8
+ class CachedLLMService(LLMService):
9
+ def __init__(self, llm_service: LLMService, cache: LLMCache | None = None):
10
+ self.llm_service = llm_service
11
+ self.cache = cache or LLMCache()
12
+
13
+ async def invoke(
14
+ self,
15
+ user_prompt: str | None = None,
16
+ system_prompt: str | None = None,
17
+ partial_assistant_prompt: str | None = None,
18
+ max_tokens: int = 1000,
19
+ temperature: float = 0.0,
20
+ ) -> str | None:
21
+ cache_key = f"{user_prompt}_{system_prompt}_{partial_assistant_prompt}_{max_tokens}_{temperature}"
22
+ cached_response = self.cache.get(cache_key, {})
23
+ if cached_response is not None:
24
+ logger.debug("LLM cache hit")
25
+ return cached_response
26
+
27
+ response = await self.llm_service.invoke(
28
+ user_prompt=user_prompt,
29
+ system_prompt=system_prompt,
30
+ partial_assistant_prompt=partial_assistant_prompt,
31
+ max_tokens=max_tokens,
32
+ temperature=temperature,
33
+ )
34
+
35
+ if response is not None:
36
+ self.cache.set(cache_key, response, {})
37
+
38
+ return response
src/vsp/llm/llm_cache.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # llm_cache.py
2
+ import hashlib
3
+ import json
4
+ import sqlite3
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+
9
+ class LLMCache:
10
+ def __init__(self, db_path: str | Path = "llm_cache.db"):
11
+ self.db_path = Path(db_path)
12
+ self._init_db()
13
+
14
+ def _init_db(self) -> None:
15
+ with sqlite3.connect(self.db_path) as conn:
16
+ conn.execute(
17
+ """
18
+ CREATE TABLE IF NOT EXISTS llm_cache (
19
+ prompt_hash TEXT PRIMARY KEY,
20
+ prompt TEXT,
21
+ response TEXT,
22
+ metadata TEXT
23
+ )
24
+ """
25
+ )
26
+
27
+ def _hash_prompt(self, prompt: str, metadata: dict[str, Any]) -> str:
28
+ combined = json.dumps({"prompt": prompt, "metadata": metadata}, sort_keys=True)
29
+ return hashlib.sha256(combined.encode()).hexdigest()
30
+
31
+ def get(self, prompt: str, metadata: dict[str, Any]) -> str | None:
32
+ prompt_hash = self._hash_prompt(prompt, metadata)
33
+ with sqlite3.connect(self.db_path) as conn:
34
+ cursor = conn.cursor()
35
+ cursor.execute("SELECT response FROM llm_cache WHERE prompt_hash = ?", (prompt_hash,))
36
+ result = cursor.fetchone()
37
+ return result[0] if result else None
38
+
39
+ def set(self, prompt: str, response: str, metadata: dict[str, Any]) -> None:
40
+ prompt_hash = self._hash_prompt(prompt, metadata)
41
+ with sqlite3.connect(self.db_path) as conn:
42
+ conn.execute(
43
+ "INSERT OR REPLACE INTO llm_cache (prompt_hash, prompt, response, metadata) VALUES (?, ?, ?, ?)",
44
+ (prompt_hash, prompt, response, json.dumps(metadata)),
45
+ )
46
+
47
+ def clear(self) -> None:
48
+ with sqlite3.connect(self.db_path) as conn:
49
+ conn.execute("DELETE FROM llm_cache")
src/vsp/llm/openai/openai.py CHANGED
@@ -44,7 +44,7 @@ class AsyncOpenAIService(LLMService):
44
  when interacting with OpenAI's language models.
45
  """
46
 
47
- def __init__(self, model: OpenAIModel, max_concurrency: int = 10):
48
  """
49
  Initialize the AsyncOpenAIService.
50
 
 
44
  when interacting with OpenAI's language models.
45
  """
46
 
47
+ def __init__(self, model: OpenAIModel, max_concurrency: int = 30):
48
  """
49
  Initialize the AsyncOpenAIService.
50
 
src/vsp/shared/config.py CHANGED
@@ -106,7 +106,7 @@ def get_openrouter_api_key_path() -> str:
106
  @cache
107
  def get_linkedin_key_path() -> str:
108
  """
109
- Reads the RapidAPI key path from the TOML configuration file for LinkedIn.
110
  Key is in AWS parameter store
111
  """
112
  config = _get_config()
 
106
  @cache
107
  def get_linkedin_key_path() -> str:
108
  """
109
+ Reads the RapidAPI key path from the TOML configuration file for Linkedin.
110
  Key is in AWS parameter store
111
  """
112
  config = _get_config()
tests/test_data/sample_profiles/chanson_zhao.json ADDED
@@ -0,0 +1,527 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Chanson",
3
+ "last_name": "Zhao",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/C5603AQFgxjJgSDk0rg/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1631210582540?e=1731542400&v=beta&t=lL5-tBPruy_78Wvb9Uc3U6owV3wDisWNlcKLmlqvRAQ",
7
+ "summary": "USC grad and investment banking analyst at Barclays. Passionate about the intersection of finance and technology.",
8
+ "headline": "Investment Banking Analyst at Barclays",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "San Francisco, California",
12
+ "full": "San Francisco, California, United States"
13
+ },
14
+ "languages": null,
15
+ "educations": [
16
+ {
17
+ "start": {
18
+ "year": 2018,
19
+ "month": null,
20
+ "day": null
21
+ },
22
+ "end": {
23
+ "year": 2022,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "field_of_study": "Business Administration and Management, General",
28
+ "degree": "Bachelor of Science - BS",
29
+ "grade": "",
30
+ "school_name": "University of Southern California",
31
+ "description": "",
32
+ "activities": "Trojan Investing Society, Delta Sigma Pi, Undergraduate Student Investment Fund (USIF), Marshall Global Leadership Program"
33
+ },
34
+ {
35
+ "start": {
36
+ "year": 2014,
37
+ "month": null,
38
+ "day": null
39
+ },
40
+ "end": {
41
+ "year": 2018,
42
+ "month": null,
43
+ "day": null
44
+ },
45
+ "field_of_study": "",
46
+ "degree": "",
47
+ "grade": "",
48
+ "school_name": "Valencia High School",
49
+ "description": "",
50
+ "activities": "Chemistry Olympiad, Future Business Leaders of America, National AP Scholar"
51
+ }
52
+ ],
53
+ "positions": [
54
+ {
55
+ "start": {
56
+ "year": 2022,
57
+ "month": 7,
58
+ "day": null
59
+ },
60
+ "end": {
61
+ "year": null,
62
+ "month": null,
63
+ "day": null
64
+ },
65
+ "company_name": "Barclays",
66
+ "company_username": "barclays-bank",
67
+ "company_url": null,
68
+ "company_industry": "Financial Services",
69
+ "company_staff_count_range": "10001 - 0",
70
+ "title": "Investment Banking Analyst",
71
+ "location": "San Francisco Bay Area",
72
+ "description": "Technology Coverage",
73
+ "employment_type": "Full-time"
74
+ },
75
+ {
76
+ "start": {
77
+ "year": 2021,
78
+ "month": 3,
79
+ "day": null
80
+ },
81
+ "end": {
82
+ "year": 2022,
83
+ "month": 5,
84
+ "day": null
85
+ },
86
+ "company_name": "University of Southern California - Marshall School of Business",
87
+ "company_username": "uscmarshallschoolofbusiness",
88
+ "company_url": null,
89
+ "company_industry": "Higher Education",
90
+ "company_staff_count_range": "10001 - 0",
91
+ "title": "Portfolio Manager - Undergraduate Student Investment Fund (USIF)",
92
+ "location": "Los Angeles, California, United States",
93
+ "description": "AUM: $5.3MM",
94
+ "employment_type": ""
95
+ },
96
+ {
97
+ "start": {
98
+ "year": 2021,
99
+ "month": 6,
100
+ "day": null
101
+ },
102
+ "end": {
103
+ "year": 2021,
104
+ "month": 8,
105
+ "day": null
106
+ },
107
+ "company_name": "Barclays",
108
+ "company_username": "barclays-bank",
109
+ "company_url": null,
110
+ "company_industry": "Financial Services",
111
+ "company_staff_count_range": "10001 - 0",
112
+ "title": "Investment Banking Summer Analyst",
113
+ "location": "San Francisco Bay Area",
114
+ "description": "Technology Coverage",
115
+ "employment_type": "Internship"
116
+ },
117
+ {
118
+ "start": {
119
+ "year": 2019,
120
+ "month": 2,
121
+ "day": null
122
+ },
123
+ "end": {
124
+ "year": 2021,
125
+ "month": 6,
126
+ "day": null
127
+ },
128
+ "company_name": "Delta Sigma Pi",
129
+ "company_username": "delta-sigma-pi",
130
+ "company_url": null,
131
+ "company_industry": "Professional Training & Coaching",
132
+ "company_staff_count_range": "11 - 50",
133
+ "title": "VP Finance",
134
+ "location": "Los Angeles, CA",
135
+ "description": "",
136
+ "employment_type": ""
137
+ },
138
+ {
139
+ "start": {
140
+ "year": 2019,
141
+ "month": 11,
142
+ "day": null
143
+ },
144
+ "end": {
145
+ "year": 2020,
146
+ "month": 12,
147
+ "day": null
148
+ },
149
+ "company_name": "Trojan Investing Society",
150
+ "company_username": "trojaninvestingsociety",
151
+ "company_url": null,
152
+ "company_industry": "Investment Banking",
153
+ "company_staff_count_range": "201 - 500",
154
+ "title": "Senior Vice President",
155
+ "location": "Los Angeles, CA",
156
+ "description": "USC's premier undergraduate finance organization comprised of 450+ members",
157
+ "employment_type": ""
158
+ },
159
+ {
160
+ "start": {
161
+ "year": 2020,
162
+ "month": 1,
163
+ "day": null
164
+ },
165
+ "end": {
166
+ "year": 2020,
167
+ "month": 6,
168
+ "day": null
169
+ },
170
+ "company_name": "Trojan Investing Society",
171
+ "company_username": "trojaninvestingsociety",
172
+ "company_url": null,
173
+ "company_industry": "Investment Banking",
174
+ "company_staff_count_range": "201 - 500",
175
+ "title": "Mentorship Program",
176
+ "location": "Los Angeles, California",
177
+ "description": "",
178
+ "employment_type": ""
179
+ },
180
+ {
181
+ "start": {
182
+ "year": 2019,
183
+ "month": 8,
184
+ "day": null
185
+ },
186
+ "end": {
187
+ "year": 2019,
188
+ "month": 11,
189
+ "day": null
190
+ },
191
+ "company_name": "Trojan Investing Society",
192
+ "company_username": "trojaninvestingsociety",
193
+ "company_url": null,
194
+ "company_industry": "Investment Banking",
195
+ "company_staff_count_range": "201 - 500",
196
+ "title": "Leaders Program",
197
+ "location": "Los Angeles, CA",
198
+ "description": "",
199
+ "employment_type": ""
200
+ },
201
+ {
202
+ "start": {
203
+ "year": 2020,
204
+ "month": 5,
205
+ "day": null
206
+ },
207
+ "end": {
208
+ "year": 2020,
209
+ "month": 8,
210
+ "day": null
211
+ },
212
+ "company_name": "TELEO Capital",
213
+ "company_username": "teleo-capital",
214
+ "company_url": null,
215
+ "company_industry": "Venture Capital & Private Equity",
216
+ "company_staff_count_range": "11 - 50",
217
+ "title": "Private Equity Intern",
218
+ "location": "Los Angeles, CA",
219
+ "description": "Private equity firm targeting opportunities in the software & technology, healthcare IT, and industrial sectors",
220
+ "employment_type": "Internship"
221
+ },
222
+ {
223
+ "start": {
224
+ "year": 2019,
225
+ "month": 8,
226
+ "day": null
227
+ },
228
+ "end": {
229
+ "year": 2020,
230
+ "month": 1,
231
+ "day": null
232
+ },
233
+ "company_name": "Business Technology Group",
234
+ "company_username": "business-tech-group",
235
+ "company_url": null,
236
+ "company_industry": "Management Consulting",
237
+ "company_staff_count_range": "11 - 50",
238
+ "title": "VP Operations",
239
+ "location": "Los Angeles, CA",
240
+ "description": "",
241
+ "employment_type": ""
242
+ },
243
+ {
244
+ "start": {
245
+ "year": 2019,
246
+ "month": 2,
247
+ "day": null
248
+ },
249
+ "end": {
250
+ "year": 2019,
251
+ "month": 8,
252
+ "day": null
253
+ },
254
+ "company_name": "USC Association of Innovative Marketing (AIM) Consulting",
255
+ "company_username": "usc-aim-consulting",
256
+ "company_url": null,
257
+ "company_industry": "Marketing & Advertising",
258
+ "company_staff_count_range": "11 - 50",
259
+ "title": "Consultant",
260
+ "location": "Los Angeles, CA",
261
+ "description": "",
262
+ "employment_type": ""
263
+ }
264
+ ],
265
+ "full_positions": [
266
+ {
267
+ "start": {
268
+ "year": 2022,
269
+ "month": 7,
270
+ "day": null
271
+ },
272
+ "end": {
273
+ "year": null,
274
+ "month": null,
275
+ "day": null
276
+ },
277
+ "company_name": "Barclays",
278
+ "company_username": "barclays-bank",
279
+ "company_url": null,
280
+ "company_industry": "Financial Services",
281
+ "company_staff_count_range": "10001 - 0",
282
+ "title": "Investment Banking Analyst",
283
+ "location": "San Francisco Bay Area",
284
+ "description": "Technology Coverage",
285
+ "employment_type": "Full-time"
286
+ },
287
+ {
288
+ "start": {
289
+ "year": 2021,
290
+ "month": 3,
291
+ "day": null
292
+ },
293
+ "end": {
294
+ "year": 2022,
295
+ "month": 5,
296
+ "day": null
297
+ },
298
+ "company_name": "University of Southern California - Marshall School of Business",
299
+ "company_username": "uscmarshallschoolofbusiness",
300
+ "company_url": null,
301
+ "company_industry": "Higher Education",
302
+ "company_staff_count_range": "10001 - 0",
303
+ "title": "Portfolio Manager - Undergraduate Student Investment Fund (USIF)",
304
+ "location": "Los Angeles, California, United States",
305
+ "description": "AUM: $5.3MM",
306
+ "employment_type": ""
307
+ },
308
+ {
309
+ "start": {
310
+ "year": 2021,
311
+ "month": 6,
312
+ "day": null
313
+ },
314
+ "end": {
315
+ "year": 2021,
316
+ "month": 8,
317
+ "day": null
318
+ },
319
+ "company_name": "Barclays",
320
+ "company_username": "barclays-bank",
321
+ "company_url": null,
322
+ "company_industry": "Financial Services",
323
+ "company_staff_count_range": "10001 - 0",
324
+ "title": "Investment Banking Summer Analyst",
325
+ "location": "San Francisco Bay Area",
326
+ "description": "Technology Coverage",
327
+ "employment_type": "Internship"
328
+ },
329
+ {
330
+ "start": {
331
+ "year": 2019,
332
+ "month": 2,
333
+ "day": null
334
+ },
335
+ "end": {
336
+ "year": 2021,
337
+ "month": 6,
338
+ "day": null
339
+ },
340
+ "company_name": "Delta Sigma Pi",
341
+ "company_username": "delta-sigma-pi",
342
+ "company_url": null,
343
+ "company_industry": "Professional Training & Coaching",
344
+ "company_staff_count_range": "11 - 50",
345
+ "title": "VP Finance",
346
+ "location": "Los Angeles, CA",
347
+ "description": "",
348
+ "employment_type": ""
349
+ },
350
+ {
351
+ "start": {
352
+ "year": 2019,
353
+ "month": 11,
354
+ "day": null
355
+ },
356
+ "end": {
357
+ "year": 2020,
358
+ "month": 12,
359
+ "day": null
360
+ },
361
+ "company_name": "Trojan Investing Society",
362
+ "company_username": "trojaninvestingsociety",
363
+ "company_url": null,
364
+ "company_industry": "Investment Banking",
365
+ "company_staff_count_range": "201 - 500",
366
+ "title": "Senior Vice President",
367
+ "location": "Los Angeles, CA",
368
+ "description": "USC's premier undergraduate finance organization comprised of 450+ members",
369
+ "employment_type": ""
370
+ },
371
+ {
372
+ "start": {
373
+ "year": 2020,
374
+ "month": 1,
375
+ "day": null
376
+ },
377
+ "end": {
378
+ "year": 2020,
379
+ "month": 6,
380
+ "day": null
381
+ },
382
+ "company_name": "Trojan Investing Society",
383
+ "company_username": "trojaninvestingsociety",
384
+ "company_url": null,
385
+ "company_industry": "Investment Banking",
386
+ "company_staff_count_range": "201 - 500",
387
+ "title": "Mentorship Program",
388
+ "location": "Los Angeles, California",
389
+ "description": "",
390
+ "employment_type": ""
391
+ },
392
+ {
393
+ "start": {
394
+ "year": 2019,
395
+ "month": 8,
396
+ "day": null
397
+ },
398
+ "end": {
399
+ "year": 2019,
400
+ "month": 11,
401
+ "day": null
402
+ },
403
+ "company_name": "Trojan Investing Society",
404
+ "company_username": "trojaninvestingsociety",
405
+ "company_url": null,
406
+ "company_industry": "Investment Banking",
407
+ "company_staff_count_range": "201 - 500",
408
+ "title": "Leaders Program",
409
+ "location": "Los Angeles, CA",
410
+ "description": "",
411
+ "employment_type": ""
412
+ },
413
+ {
414
+ "start": {
415
+ "year": 2020,
416
+ "month": 5,
417
+ "day": null
418
+ },
419
+ "end": {
420
+ "year": 2020,
421
+ "month": 8,
422
+ "day": null
423
+ },
424
+ "company_name": "TELEO Capital",
425
+ "company_username": "teleo-capital",
426
+ "company_url": null,
427
+ "company_industry": "Venture Capital & Private Equity",
428
+ "company_staff_count_range": "11 - 50",
429
+ "title": "Private Equity Intern",
430
+ "location": "Los Angeles, CA",
431
+ "description": "Private equity firm targeting opportunities in the software & technology, healthcare IT, and industrial sectors",
432
+ "employment_type": "Internship"
433
+ },
434
+ {
435
+ "start": {
436
+ "year": 2019,
437
+ "month": 8,
438
+ "day": null
439
+ },
440
+ "end": {
441
+ "year": 2020,
442
+ "month": 1,
443
+ "day": null
444
+ },
445
+ "company_name": "Business Technology Group",
446
+ "company_username": "business-tech-group",
447
+ "company_url": null,
448
+ "company_industry": "Management Consulting",
449
+ "company_staff_count_range": "11 - 50",
450
+ "title": "VP Operations",
451
+ "location": "Los Angeles, CA",
452
+ "description": "",
453
+ "employment_type": ""
454
+ },
455
+ {
456
+ "start": {
457
+ "year": 2019,
458
+ "month": 2,
459
+ "day": null
460
+ },
461
+ "end": {
462
+ "year": 2019,
463
+ "month": 8,
464
+ "day": null
465
+ },
466
+ "company_name": "USC Association of Innovative Marketing (AIM) Consulting",
467
+ "company_username": "usc-aim-consulting",
468
+ "company_url": null,
469
+ "company_industry": "Marketing & Advertising",
470
+ "company_staff_count_range": "11 - 50",
471
+ "title": "Consultant",
472
+ "location": "Los Angeles, CA",
473
+ "description": "",
474
+ "employment_type": ""
475
+ }
476
+ ],
477
+ "skills": [
478
+ {
479
+ "name": "Leadership"
480
+ },
481
+ {
482
+ "name": "Microsoft Office"
483
+ },
484
+ {
485
+ "name": "Teamwork"
486
+ }
487
+ ],
488
+ "courses": [
489
+ {
490
+ "name": "Business Finance",
491
+ "number": ""
492
+ },
493
+ {
494
+ "name": "Business Statistics",
495
+ "number": ""
496
+ },
497
+ {
498
+ "name": "Financial Accounting",
499
+ "number": ""
500
+ },
501
+ {
502
+ "name": "Financial Analysis and Valuation",
503
+ "number": ""
504
+ },
505
+ {
506
+ "name": "Macroeconomics",
507
+ "number": ""
508
+ },
509
+ {
510
+ "name": "Managerial Accounting",
511
+ "number": ""
512
+ },
513
+ {
514
+ "name": "Marketing",
515
+ "number": ""
516
+ },
517
+ {
518
+ "name": "Microeconomics",
519
+ "number": ""
520
+ },
521
+ {
522
+ "name": "Operations Management",
523
+ "number": ""
524
+ }
525
+ ],
526
+ "certifications": null
527
+ }
tests/test_data/sample_profiles/eric_armagost.json ADDED
@@ -0,0 +1,261 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Eric",
3
+ "last_name": "Armagost",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/C5603AQGiv3LeddNxgQ/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1656093036751?e=1731542400&v=beta&t=sCbIQ-lAwATDVl_dEBBk-5Y35Z62aqJGL4utGStw26Y",
7
+ "summary": "",
8
+ "headline": "Investor at Accel-KKR",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "San Francisco, California",
12
+ "full": "San Francisco, California, United States"
13
+ },
14
+ "languages": [
15
+ {
16
+ "name": "German",
17
+ "proficiency": "LIMITED_WORKING"
18
+ }
19
+ ],
20
+ "educations": [
21
+ {
22
+ "start": {
23
+ "year": null,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "end": {
28
+ "year": null,
29
+ "month": null,
30
+ "day": null
31
+ },
32
+ "field_of_study": "Business Economics",
33
+ "degree": "Bachelor of Arts (B.A.)",
34
+ "grade": "",
35
+ "school_name": "Brown University",
36
+ "description": "",
37
+ "activities": ""
38
+ }
39
+ ],
40
+ "positions": [
41
+ {
42
+ "start": {
43
+ "year": 2017,
44
+ "month": 5,
45
+ "day": null
46
+ },
47
+ "end": {
48
+ "year": null,
49
+ "month": null,
50
+ "day": null
51
+ },
52
+ "company_name": "Accel-KKR",
53
+ "company_username": "accel-kkr",
54
+ "company_url": null,
55
+ "company_industry": "Venture Capital & Private Equity",
56
+ "company_staff_count_range": "51 - 200",
57
+ "title": "Investment Professional",
58
+ "location": "Menlo Park, California",
59
+ "description": "Founded in 2000, Accel-KKR is a leading technology-focused private equity firm dedicated exclusively to investing in software and technology-enabled services companies. \n\nOur typical transactions include: \n• Acquisitions and recapitalizations of founder-owned or closely-held private companies \n• Buyouts of divisions, subsidiaries and business units from public companies \n• Take-private transactions of small public companies\n• Structured minority equity and debt investments\n\nwww.accel-kkr.com",
60
+ "employment_type": ""
61
+ },
62
+ {
63
+ "start": {
64
+ "year": 2015,
65
+ "month": 6,
66
+ "day": null
67
+ },
68
+ "end": {
69
+ "year": 2017,
70
+ "month": 5,
71
+ "day": null
72
+ },
73
+ "company_name": "William Blair & Company",
74
+ "company_username": "william-blair-company",
75
+ "company_url": null,
76
+ "company_industry": "Financial Services",
77
+ "company_staff_count_range": "1001 - 5000",
78
+ "title": "Investment Banking",
79
+ "location": "Chicago",
80
+ "description": "",
81
+ "employment_type": ""
82
+ },
83
+ {
84
+ "start": {
85
+ "year": 2014,
86
+ "month": 6,
87
+ "day": null
88
+ },
89
+ "end": {
90
+ "year": 2015,
91
+ "month": 5,
92
+ "day": null
93
+ },
94
+ "company_name": "Fidelity Investments",
95
+ "company_username": "fidelity-investments",
96
+ "company_url": null,
97
+ "company_industry": "Financial Services",
98
+ "company_staff_count_range": "10001 - 0",
99
+ "title": "FFAS Corporate Finance",
100
+ "location": "Smithfield, RI",
101
+ "description": "",
102
+ "employment_type": ""
103
+ },
104
+ {
105
+ "start": {
106
+ "year": 2013,
107
+ "month": 6,
108
+ "day": null
109
+ },
110
+ "end": {
111
+ "year": 2014,
112
+ "month": 5,
113
+ "day": null
114
+ },
115
+ "company_name": "Fidelity Investments",
116
+ "company_username": "fidelity-investments",
117
+ "company_url": null,
118
+ "company_industry": "Financial Services",
119
+ "company_staff_count_range": "10001 - 0",
120
+ "title": "PI Corporate Finance",
121
+ "location": "Smithfield, RI",
122
+ "description": "",
123
+ "employment_type": ""
124
+ }
125
+ ],
126
+ "full_positions": [
127
+ {
128
+ "start": {
129
+ "year": 2017,
130
+ "month": 5,
131
+ "day": null
132
+ },
133
+ "end": {
134
+ "year": null,
135
+ "month": null,
136
+ "day": null
137
+ },
138
+ "company_name": "Accel-KKR",
139
+ "company_username": "accel-kkr",
140
+ "company_url": null,
141
+ "company_industry": "Venture Capital & Private Equity",
142
+ "company_staff_count_range": "51 - 200",
143
+ "title": "Investment Professional",
144
+ "location": "Menlo Park, California",
145
+ "description": "Founded in 2000, Accel-KKR is a leading technology-focused private equity firm dedicated exclusively to investing in software and technology-enabled services companies. \n\nOur typical transactions include: \n• Acquisitions and recapitalizations of founder-owned or closely-held private companies \n• Buyouts of divisions, subsidiaries and business units from public companies \n• Take-private transactions of small public companies\n• Structured minority equity and debt investments\n\nwww.accel-kkr.com",
146
+ "employment_type": ""
147
+ },
148
+ {
149
+ "start": {
150
+ "year": 2015,
151
+ "month": 6,
152
+ "day": null
153
+ },
154
+ "end": {
155
+ "year": 2017,
156
+ "month": 5,
157
+ "day": null
158
+ },
159
+ "company_name": "William Blair & Company",
160
+ "company_username": "william-blair-company",
161
+ "company_url": null,
162
+ "company_industry": "Financial Services",
163
+ "company_staff_count_range": "1001 - 5000",
164
+ "title": "Investment Banking",
165
+ "location": "Chicago",
166
+ "description": "",
167
+ "employment_type": ""
168
+ },
169
+ {
170
+ "start": {
171
+ "year": 2014,
172
+ "month": 6,
173
+ "day": null
174
+ },
175
+ "end": {
176
+ "year": 2015,
177
+ "month": 5,
178
+ "day": null
179
+ },
180
+ "company_name": "Fidelity Investments",
181
+ "company_username": "fidelity-investments",
182
+ "company_url": null,
183
+ "company_industry": "Financial Services",
184
+ "company_staff_count_range": "10001 - 0",
185
+ "title": "FFAS Corporate Finance",
186
+ "location": "Smithfield, RI",
187
+ "description": "",
188
+ "employment_type": ""
189
+ },
190
+ {
191
+ "start": {
192
+ "year": 2013,
193
+ "month": 6,
194
+ "day": null
195
+ },
196
+ "end": {
197
+ "year": 2014,
198
+ "month": 5,
199
+ "day": null
200
+ },
201
+ "company_name": "Fidelity Investments",
202
+ "company_username": "fidelity-investments",
203
+ "company_url": null,
204
+ "company_industry": "Financial Services",
205
+ "company_staff_count_range": "10001 - 0",
206
+ "title": "PI Corporate Finance",
207
+ "location": "Smithfield, RI",
208
+ "description": "",
209
+ "employment_type": ""
210
+ }
211
+ ],
212
+ "skills": [
213
+ {
214
+ "name": "Microsoft Office"
215
+ },
216
+ {
217
+ "name": "Microsoft Excel"
218
+ },
219
+ {
220
+ "name": "Microsoft Word"
221
+ },
222
+ {
223
+ "name": "Customer Service"
224
+ },
225
+ {
226
+ "name": "PowerPoint"
227
+ },
228
+ {
229
+ "name": "English"
230
+ },
231
+ {
232
+ "name": "Windows"
233
+ },
234
+ {
235
+ "name": "Research"
236
+ },
237
+ {
238
+ "name": "Outlook"
239
+ },
240
+ {
241
+ "name": "Teaching"
242
+ },
243
+ {
244
+ "name": "Photoshop"
245
+ },
246
+ {
247
+ "name": "Public Speaking"
248
+ },
249
+ {
250
+ "name": "HTML"
251
+ },
252
+ {
253
+ "name": "Strategic Planning"
254
+ },
255
+ {
256
+ "name": "Budgets"
257
+ }
258
+ ],
259
+ "courses": null,
260
+ "certifications": null
261
+ }
tests/test_data/sample_profiles/hansae_catlett.json ADDED
@@ -0,0 +1,565 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Hansae",
3
+ "last_name": "Catlett",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/D5603AQEVfJQVTKPvYw/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1710971553153?e=1731542400&v=beta&t=IigcCEXSLIAg6PkoARvbzNXarj2O2n8BbSu-wrS8vkQ",
7
+ "summary": "",
8
+ "headline": "Partner at HOF Capital | Co-founder & GP at The MBA Fund",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "New York, New York",
12
+ "full": "New York, New York, United States"
13
+ },
14
+ "languages": null,
15
+ "educations": [
16
+ {
17
+ "start": {
18
+ "year": 2016,
19
+ "month": null,
20
+ "day": null
21
+ },
22
+ "end": {
23
+ "year": 2019,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "field_of_study": "",
28
+ "degree": "Master of Business Administration (M.B.A.)",
29
+ "grade": "",
30
+ "school_name": "Stanford University Graduate School of Business",
31
+ "description": "",
32
+ "activities": "Ernest C. Arbuckle Award Finalist; Miller Social Change Leadership Award Winner; Arbuckle Leadership Fellow; Venture Capital Club; GSB Impact Fund; Co-President Social Innovation Club; Co-President Government & Politics Club; LOWkeynote (main stage featured speaker); TALK Coach; GSB Show"
33
+ },
34
+ {
35
+ "start": {
36
+ "year": 2016,
37
+ "month": null,
38
+ "day": null
39
+ },
40
+ "end": {
41
+ "year": 2019,
42
+ "month": null,
43
+ "day": null
44
+ },
45
+ "field_of_study": "",
46
+ "degree": "Master of Public Policy (M.P.P.)",
47
+ "grade": "",
48
+ "school_name": "Stanford University",
49
+ "description": "Led CalFresh/SNAP (food stamps) policy & impact analysis with California State Senator",
50
+ "activities": ""
51
+ },
52
+ {
53
+ "start": {
54
+ "year": 2007,
55
+ "month": null,
56
+ "day": null
57
+ },
58
+ "end": {
59
+ "year": 2011,
60
+ "month": null,
61
+ "day": null
62
+ },
63
+ "field_of_study": "Biomedical Engineering, Philosophy",
64
+ "degree": "Bachelor of Arts",
65
+ "grade": "",
66
+ "school_name": "Harvard University",
67
+ "description": "Graduated with Honors",
68
+ "activities": "Club Basketball, College Bound Mentoring, Veritas Financial Group, Rugby, Crew"
69
+ },
70
+ {
71
+ "start": {
72
+ "year": null,
73
+ "month": null,
74
+ "day": null
75
+ },
76
+ "end": {
77
+ "year": null,
78
+ "month": null,
79
+ "day": null
80
+ },
81
+ "field_of_study": "Engineering, Philosophy, Finance",
82
+ "degree": "Study Abroad",
83
+ "grade": "",
84
+ "school_name": "University of New South Wales",
85
+ "description": "",
86
+ "activities": "Premier League Basketball Team"
87
+ }
88
+ ],
89
+ "positions": [
90
+ {
91
+ "start": {
92
+ "year": 2024,
93
+ "month": 3,
94
+ "day": null
95
+ },
96
+ "end": {
97
+ "year": null,
98
+ "month": null,
99
+ "day": null
100
+ },
101
+ "company_name": "HOF Capital",
102
+ "company_username": "hof-capital",
103
+ "company_url": null,
104
+ "company_industry": "Venture Capital & Private Equity",
105
+ "company_staff_count_range": "11 - 50",
106
+ "title": "Partner",
107
+ "location": "New York City Metropolitan Area",
108
+ "description": "",
109
+ "employment_type": ""
110
+ },
111
+ {
112
+ "start": {
113
+ "year": 2018,
114
+ "month": null,
115
+ "day": null
116
+ },
117
+ "end": {
118
+ "year": null,
119
+ "month": null,
120
+ "day": null
121
+ },
122
+ "company_name": "The MBA Fund",
123
+ "company_username": "thembafund",
124
+ "company_url": null,
125
+ "company_industry": "Venture Capital & Private Equity",
126
+ "company_staff_count_range": "11 - 50",
127
+ "title": "Co-Founder, General Partner",
128
+ "location": "San Francisco Bay Area",
129
+ "description": "The MBA Fund is a venture capital firm that helps founders from the top startup-producing universities create legendary companies. We most frequently back student, alumni and dropout founders from Harvard, Stanford, and Wharton (expanding presence nationally!). \n\nWe’re a community of investors and operators who aren’t afraid to take the riskiest leaps with founders who are just getting started. Our backers include top-tier VC firms, repeat founders, experienced execs, and super angels with ties to the communities where we invest. This network is ready and willing to help founders in our portfolio with financing, hiring, customer growth and more.\n\nSelect investments include:\n* Jeeves ($2B)\n* Dandy ($1B)\n* TRM Labs ($600M+)\n* Hightouch ($450M+)\n* Luxury Presence ($200M+)\n* FlutterFlow ($150M+)\n* Legacy ($150M+)\n* Seso ($150M+)\n* Peachy ($100M+)",
130
+ "employment_type": ""
131
+ },
132
+ {
133
+ "start": {
134
+ "year": 2019,
135
+ "month": 7,
136
+ "day": null
137
+ },
138
+ "end": {
139
+ "year": 2024,
140
+ "month": 2,
141
+ "day": null
142
+ },
143
+ "company_name": "Bessemer Venture Partners",
144
+ "company_username": "bessemer-venture-partners",
145
+ "company_url": null,
146
+ "company_industry": "Venture Capital & Private Equity",
147
+ "company_staff_count_range": "11 - 50",
148
+ "title": "Vice President",
149
+ "location": "New York City Metropolitan Area",
150
+ "description": "",
151
+ "employment_type": "Full-time"
152
+ },
153
+ {
154
+ "start": {
155
+ "year": 2023,
156
+ "month": null,
157
+ "day": null
158
+ },
159
+ "end": {
160
+ "year": 2024,
161
+ "month": null,
162
+ "day": null
163
+ },
164
+ "company_name": "Rillavoice",
165
+ "company_username": "rilla-co",
166
+ "company_url": null,
167
+ "company_industry": "Computer Software",
168
+ "company_staff_count_range": "11 - 50",
169
+ "title": "Board Observer",
170
+ "location": "New York City Metropolitan Area",
171
+ "description": "",
172
+ "employment_type": ""
173
+ },
174
+ {
175
+ "start": {
176
+ "year": 2022,
177
+ "month": null,
178
+ "day": null
179
+ },
180
+ "end": {
181
+ "year": 2024,
182
+ "month": null,
183
+ "day": null
184
+ },
185
+ "company_name": "Archy",
186
+ "company_username": "archydental",
187
+ "company_url": null,
188
+ "company_industry": "Computer Software",
189
+ "company_staff_count_range": "11 - 50",
190
+ "title": "Investor",
191
+ "location": "San Francisco Bay Area",
192
+ "description": "",
193
+ "employment_type": ""
194
+ },
195
+ {
196
+ "start": {
197
+ "year": 2021,
198
+ "month": null,
199
+ "day": null
200
+ },
201
+ "end": {
202
+ "year": 2024,
203
+ "month": null,
204
+ "day": null
205
+ },
206
+ "company_name": "MaintainX",
207
+ "company_username": "getmaintainx",
208
+ "company_url": null,
209
+ "company_industry": "Computer Software",
210
+ "company_staff_count_range": "201 - 500",
211
+ "title": "Board Observer",
212
+ "location": "San Francisco Bay Area",
213
+ "description": "",
214
+ "employment_type": ""
215
+ },
216
+ {
217
+ "start": {
218
+ "year": 2021,
219
+ "month": null,
220
+ "day": null
221
+ },
222
+ "end": {
223
+ "year": 2024,
224
+ "month": null,
225
+ "day": null
226
+ },
227
+ "company_name": "Spot AI",
228
+ "company_username": "spot-ai",
229
+ "company_url": null,
230
+ "company_industry": "Computer Software",
231
+ "company_staff_count_range": "51 - 200",
232
+ "title": "Investor",
233
+ "location": "San Francisco Bay Area",
234
+ "description": "",
235
+ "employment_type": ""
236
+ },
237
+ {
238
+ "start": {
239
+ "year": 2021,
240
+ "month": null,
241
+ "day": null
242
+ },
243
+ "end": {
244
+ "year": 2024,
245
+ "month": null,
246
+ "day": null
247
+ },
248
+ "company_name": "VendorPM",
249
+ "company_username": "vendorpm",
250
+ "company_url": null,
251
+ "company_industry": "Computer Software",
252
+ "company_staff_count_range": "11 - 50",
253
+ "title": "Board Observer",
254
+ "location": "Toronto, Ontario, Canada",
255
+ "description": "",
256
+ "employment_type": ""
257
+ },
258
+ {
259
+ "start": {
260
+ "year": 2021,
261
+ "month": null,
262
+ "day": null
263
+ },
264
+ "end": {
265
+ "year": 2024,
266
+ "month": null,
267
+ "day": null
268
+ },
269
+ "company_name": "Luxury Presence",
270
+ "company_username": "luxurypresence",
271
+ "company_url": null,
272
+ "company_industry": "Computer Software",
273
+ "company_staff_count_range": "501 - 1000",
274
+ "title": "Board Director",
275
+ "location": "Los Angeles Metropolitan Area",
276
+ "description": "",
277
+ "employment_type": ""
278
+ },
279
+ {
280
+ "start": {
281
+ "year": 2021,
282
+ "month": null,
283
+ "day": null
284
+ },
285
+ "end": {
286
+ "year": 2024,
287
+ "month": null,
288
+ "day": null
289
+ },
290
+ "company_name": "ServiceTitan",
291
+ "company_username": "servicetitan",
292
+ "company_url": null,
293
+ "company_industry": "Computer Software",
294
+ "company_staff_count_range": "1001 - 5000",
295
+ "title": "Investor",
296
+ "location": "Los Angeles Metropolitan Area",
297
+ "description": "",
298
+ "employment_type": ""
299
+ }
300
+ ],
301
+ "full_positions": [
302
+ {
303
+ "start": {
304
+ "year": 2024,
305
+ "month": 3,
306
+ "day": null
307
+ },
308
+ "end": {
309
+ "year": null,
310
+ "month": null,
311
+ "day": null
312
+ },
313
+ "company_name": "HOF Capital",
314
+ "company_username": "hof-capital",
315
+ "company_url": null,
316
+ "company_industry": "Venture Capital & Private Equity",
317
+ "company_staff_count_range": "11 - 50",
318
+ "title": "Partner",
319
+ "location": "New York City Metropolitan Area",
320
+ "description": "",
321
+ "employment_type": ""
322
+ },
323
+ {
324
+ "start": {
325
+ "year": 2018,
326
+ "month": null,
327
+ "day": null
328
+ },
329
+ "end": {
330
+ "year": null,
331
+ "month": null,
332
+ "day": null
333
+ },
334
+ "company_name": "The MBA Fund",
335
+ "company_username": "thembafund",
336
+ "company_url": null,
337
+ "company_industry": "Venture Capital & Private Equity",
338
+ "company_staff_count_range": "11 - 50",
339
+ "title": "Co-Founder, General Partner",
340
+ "location": "San Francisco Bay Area",
341
+ "description": "The MBA Fund is a venture capital firm that helps founders from the top startup-producing universities create legendary companies. We most frequently back student, alumni and dropout founders from Harvard, Stanford, and Wharton (expanding presence nationally!). \n\nWe’re a community of investors and operators who aren’t afraid to take the riskiest leaps with founders who are just getting started. Our backers include top-tier VC firms, repeat founders, experienced execs, and super angels with ties to the communities where we invest. This network is ready and willing to help founders in our portfolio with financing, hiring, customer growth and more.\n\nSelect investments include:\n* Jeeves ($2B)\n* Dandy ($1B)\n* TRM Labs ($600M+)\n* Hightouch ($450M+)\n* Luxury Presence ($200M+)\n* FlutterFlow ($150M+)\n* Legacy ($150M+)\n* Seso ($150M+)\n* Peachy ($100M+)",
342
+ "employment_type": ""
343
+ },
344
+ {
345
+ "start": {
346
+ "year": 2019,
347
+ "month": 7,
348
+ "day": null
349
+ },
350
+ "end": {
351
+ "year": 2024,
352
+ "month": 2,
353
+ "day": null
354
+ },
355
+ "company_name": "Bessemer Venture Partners",
356
+ "company_username": "bessemer-venture-partners",
357
+ "company_url": null,
358
+ "company_industry": "Venture Capital & Private Equity",
359
+ "company_staff_count_range": "11 - 50",
360
+ "title": "Vice President",
361
+ "location": "New York City Metropolitan Area",
362
+ "description": "",
363
+ "employment_type": "Full-time"
364
+ },
365
+ {
366
+ "start": {
367
+ "year": 2023,
368
+ "month": null,
369
+ "day": null
370
+ },
371
+ "end": {
372
+ "year": 2024,
373
+ "month": null,
374
+ "day": null
375
+ },
376
+ "company_name": "Rillavoice",
377
+ "company_username": "rilla-co",
378
+ "company_url": null,
379
+ "company_industry": "Computer Software",
380
+ "company_staff_count_range": "11 - 50",
381
+ "title": "Board Observer",
382
+ "location": "New York City Metropolitan Area",
383
+ "description": "",
384
+ "employment_type": ""
385
+ },
386
+ {
387
+ "start": {
388
+ "year": 2022,
389
+ "month": null,
390
+ "day": null
391
+ },
392
+ "end": {
393
+ "year": 2024,
394
+ "month": null,
395
+ "day": null
396
+ },
397
+ "company_name": "Archy",
398
+ "company_username": "archydental",
399
+ "company_url": null,
400
+ "company_industry": "Computer Software",
401
+ "company_staff_count_range": "11 - 50",
402
+ "title": "Investor",
403
+ "location": "San Francisco Bay Area",
404
+ "description": "",
405
+ "employment_type": ""
406
+ },
407
+ {
408
+ "start": {
409
+ "year": 2021,
410
+ "month": null,
411
+ "day": null
412
+ },
413
+ "end": {
414
+ "year": 2024,
415
+ "month": null,
416
+ "day": null
417
+ },
418
+ "company_name": "MaintainX",
419
+ "company_username": "getmaintainx",
420
+ "company_url": null,
421
+ "company_industry": "Computer Software",
422
+ "company_staff_count_range": "201 - 500",
423
+ "title": "Board Observer",
424
+ "location": "San Francisco Bay Area",
425
+ "description": "",
426
+ "employment_type": ""
427
+ },
428
+ {
429
+ "start": {
430
+ "year": 2021,
431
+ "month": null,
432
+ "day": null
433
+ },
434
+ "end": {
435
+ "year": 2024,
436
+ "month": null,
437
+ "day": null
438
+ },
439
+ "company_name": "Spot AI",
440
+ "company_username": "spot-ai",
441
+ "company_url": null,
442
+ "company_industry": "Computer Software",
443
+ "company_staff_count_range": "51 - 200",
444
+ "title": "Investor",
445
+ "location": "San Francisco Bay Area",
446
+ "description": "",
447
+ "employment_type": ""
448
+ },
449
+ {
450
+ "start": {
451
+ "year": 2021,
452
+ "month": null,
453
+ "day": null
454
+ },
455
+ "end": {
456
+ "year": 2024,
457
+ "month": null,
458
+ "day": null
459
+ },
460
+ "company_name": "VendorPM",
461
+ "company_username": "vendorpm",
462
+ "company_url": null,
463
+ "company_industry": "Computer Software",
464
+ "company_staff_count_range": "11 - 50",
465
+ "title": "Board Observer",
466
+ "location": "Toronto, Ontario, Canada",
467
+ "description": "",
468
+ "employment_type": ""
469
+ },
470
+ {
471
+ "start": {
472
+ "year": 2021,
473
+ "month": null,
474
+ "day": null
475
+ },
476
+ "end": {
477
+ "year": 2024,
478
+ "month": null,
479
+ "day": null
480
+ },
481
+ "company_name": "Luxury Presence",
482
+ "company_username": "luxurypresence",
483
+ "company_url": null,
484
+ "company_industry": "Computer Software",
485
+ "company_staff_count_range": "501 - 1000",
486
+ "title": "Board Director",
487
+ "location": "Los Angeles Metropolitan Area",
488
+ "description": "",
489
+ "employment_type": ""
490
+ },
491
+ {
492
+ "start": {
493
+ "year": 2021,
494
+ "month": null,
495
+ "day": null
496
+ },
497
+ "end": {
498
+ "year": 2024,
499
+ "month": null,
500
+ "day": null
501
+ },
502
+ "company_name": "ServiceTitan",
503
+ "company_username": "servicetitan",
504
+ "company_url": null,
505
+ "company_industry": "Computer Software",
506
+ "company_staff_count_range": "1001 - 5000",
507
+ "title": "Investor",
508
+ "location": "Los Angeles Metropolitan Area",
509
+ "description": "",
510
+ "employment_type": ""
511
+ }
512
+ ],
513
+ "skills": [
514
+ {
515
+ "name": "Project Planning"
516
+ },
517
+ {
518
+ "name": "Research"
519
+ },
520
+ {
521
+ "name": "Project Exec"
522
+ },
523
+ {
524
+ "name": "Strategic Planning"
525
+ },
526
+ {
527
+ "name": "Market Research"
528
+ },
529
+ {
530
+ "name": "Nonprofits"
531
+ },
532
+ {
533
+ "name": "Leadership"
534
+ },
535
+ {
536
+ "name": "Strategy"
537
+ },
538
+ {
539
+ "name": "Entrepreneurship"
540
+ },
541
+ {
542
+ "name": "Economics"
543
+ },
544
+ {
545
+ "name": "Public Speaking"
546
+ },
547
+ {
548
+ "name": "Data Analysis"
549
+ },
550
+ {
551
+ "name": "Fundraising"
552
+ },
553
+ {
554
+ "name": "Venture Capital"
555
+ },
556
+ {
557
+ "name": "Spanish"
558
+ },
559
+ {
560
+ "name": "Financial Modeling"
561
+ }
562
+ ],
563
+ "courses": null,
564
+ "certifications": null
565
+ }
tests/test_data/sample_profiles/jake_kugler.json ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Jake",
3
+ "last_name": "Kugler",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/C5103AQFSyxD4FYivpw/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1517033032014?e=1731542400&v=beta&t=wrLJPExyTUe2YunjMnSaXftEHnE0SB_ArtYqBzlBVEo",
7
+ "summary": "",
8
+ "headline": "MBA Candidate at Harvard Business School",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "Cambridge, Massachusetts",
12
+ "full": "Cambridge, Massachusetts, United States"
13
+ },
14
+ "languages": null,
15
+ "educations": [
16
+ {
17
+ "start": {
18
+ "year": null,
19
+ "month": null,
20
+ "day": null
21
+ },
22
+ "end": {
23
+ "year": null,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "field_of_study": "",
28
+ "degree": "Master of Business Administration - MBA",
29
+ "grade": "",
30
+ "school_name": "Harvard Business School",
31
+ "description": "",
32
+ "activities": ""
33
+ },
34
+ {
35
+ "start": {
36
+ "year": null,
37
+ "month": null,
38
+ "day": null
39
+ },
40
+ "end": {
41
+ "year": null,
42
+ "month": null,
43
+ "day": null
44
+ },
45
+ "field_of_study": "Finance",
46
+ "degree": "BSBA",
47
+ "grade": "Magna Cum Laude",
48
+ "school_name": "Northeastern University",
49
+ "description": "",
50
+ "activities": ""
51
+ }
52
+ ],
53
+ "positions": [
54
+ {
55
+ "start": {
56
+ "year": 2022,
57
+ "month": 8,
58
+ "day": null
59
+ },
60
+ "end": {
61
+ "year": null,
62
+ "month": null,
63
+ "day": null
64
+ },
65
+ "company_name": "Harvard Business School",
66
+ "company_username": "harvard-business-school",
67
+ "company_url": null,
68
+ "company_industry": "Higher Education",
69
+ "company_staff_count_range": "1001 - 5000",
70
+ "title": "MBA Candidate",
71
+ "location": "Boston, Massachusetts, United States",
72
+ "description": "",
73
+ "employment_type": ""
74
+ },
75
+ {
76
+ "start": {
77
+ "year": 2022,
78
+ "month": 1,
79
+ "day": null
80
+ },
81
+ "end": {
82
+ "year": 2022,
83
+ "month": 7,
84
+ "day": null
85
+ },
86
+ "company_name": "Declaration Partners",
87
+ "company_username": "declaration-partners",
88
+ "company_url": null,
89
+ "company_industry": "Financial Services",
90
+ "company_staff_count_range": "11 - 50",
91
+ "title": "Advisor - Growth Equity",
92
+ "location": "New York, United States",
93
+ "description": "BayPine's Sister Firm. Anchored by the family office of Carlyle Co-Founder and philanthropist David M. Rubenstein, Declaration is a private investment firm with approximately $2.5B in AUM.",
94
+ "employment_type": "Part-time"
95
+ },
96
+ {
97
+ "start": {
98
+ "year": 2020,
99
+ "month": 9,
100
+ "day": null
101
+ },
102
+ "end": {
103
+ "year": 2022,
104
+ "month": 7,
105
+ "day": null
106
+ },
107
+ "company_name": "BayPine",
108
+ "company_username": "baypine",
109
+ "company_url": null,
110
+ "company_industry": "Financial Services",
111
+ "company_staff_count_range": "11 - 50",
112
+ "title": "Investment Professional",
113
+ "location": "New York, United States",
114
+ "description": "",
115
+ "employment_type": ""
116
+ },
117
+ {
118
+ "start": {
119
+ "year": 2017,
120
+ "month": 7,
121
+ "day": null
122
+ },
123
+ "end": {
124
+ "year": 2020,
125
+ "month": 8,
126
+ "day": null
127
+ },
128
+ "company_name": "General Atlantic",
129
+ "company_username": "general-atlantic",
130
+ "company_url": null,
131
+ "company_industry": "Financial Services",
132
+ "company_staff_count_range": "201 - 500",
133
+ "title": "Investment Professional",
134
+ "location": "San Francisco Bay Area",
135
+ "description": "Technology Group",
136
+ "employment_type": ""
137
+ },
138
+ {
139
+ "start": {
140
+ "year": 2015,
141
+ "month": 6,
142
+ "day": null
143
+ },
144
+ "end": {
145
+ "year": 2017,
146
+ "month": 7,
147
+ "day": null
148
+ },
149
+ "company_name": "Morgan Stanley",
150
+ "company_username": "morgan-stanley",
151
+ "company_url": null,
152
+ "company_industry": "Financial Services",
153
+ "company_staff_count_range": "10001 - 0",
154
+ "title": "Investment Banking",
155
+ "location": "Greater New York City Area",
156
+ "description": "",
157
+ "employment_type": ""
158
+ }
159
+ ],
160
+ "full_positions": [
161
+ {
162
+ "start": {
163
+ "year": 2022,
164
+ "month": 8,
165
+ "day": null
166
+ },
167
+ "end": {
168
+ "year": null,
169
+ "month": null,
170
+ "day": null
171
+ },
172
+ "company_name": "Harvard Business School",
173
+ "company_username": "harvard-business-school",
174
+ "company_url": null,
175
+ "company_industry": "Higher Education",
176
+ "company_staff_count_range": "1001 - 5000",
177
+ "title": "MBA Candidate",
178
+ "location": "Boston, Massachusetts, United States",
179
+ "description": "",
180
+ "employment_type": ""
181
+ },
182
+ {
183
+ "start": {
184
+ "year": 2022,
185
+ "month": 1,
186
+ "day": null
187
+ },
188
+ "end": {
189
+ "year": 2022,
190
+ "month": 7,
191
+ "day": null
192
+ },
193
+ "company_name": "Declaration Partners",
194
+ "company_username": "declaration-partners",
195
+ "company_url": null,
196
+ "company_industry": "Financial Services",
197
+ "company_staff_count_range": "11 - 50",
198
+ "title": "Advisor - Growth Equity",
199
+ "location": "New York, United States",
200
+ "description": "BayPine's Sister Firm. Anchored by the family office of Carlyle Co-Founder and philanthropist David M. Rubenstein, Declaration is a private investment firm with approximately $2.5B in AUM.",
201
+ "employment_type": "Part-time"
202
+ },
203
+ {
204
+ "start": {
205
+ "year": 2020,
206
+ "month": 9,
207
+ "day": null
208
+ },
209
+ "end": {
210
+ "year": 2022,
211
+ "month": 7,
212
+ "day": null
213
+ },
214
+ "company_name": "BayPine",
215
+ "company_username": "baypine",
216
+ "company_url": null,
217
+ "company_industry": "Financial Services",
218
+ "company_staff_count_range": "11 - 50",
219
+ "title": "Investment Professional",
220
+ "location": "New York, United States",
221
+ "description": "",
222
+ "employment_type": ""
223
+ },
224
+ {
225
+ "start": {
226
+ "year": 2017,
227
+ "month": 7,
228
+ "day": null
229
+ },
230
+ "end": {
231
+ "year": 2020,
232
+ "month": 8,
233
+ "day": null
234
+ },
235
+ "company_name": "General Atlantic",
236
+ "company_username": "general-atlantic",
237
+ "company_url": null,
238
+ "company_industry": "Financial Services",
239
+ "company_staff_count_range": "201 - 500",
240
+ "title": "Investment Professional",
241
+ "location": "San Francisco Bay Area",
242
+ "description": "Technology Group",
243
+ "employment_type": ""
244
+ },
245
+ {
246
+ "start": {
247
+ "year": 2015,
248
+ "month": 6,
249
+ "day": null
250
+ },
251
+ "end": {
252
+ "year": 2017,
253
+ "month": 7,
254
+ "day": null
255
+ },
256
+ "company_name": "Morgan Stanley",
257
+ "company_username": "morgan-stanley",
258
+ "company_url": null,
259
+ "company_industry": "Financial Services",
260
+ "company_staff_count_range": "10001 - 0",
261
+ "title": "Investment Banking",
262
+ "location": "Greater New York City Area",
263
+ "description": "",
264
+ "employment_type": ""
265
+ }
266
+ ],
267
+ "skills": null,
268
+ "courses": null,
269
+ "certifications": null
270
+ }
tests/test_data/sample_profiles/jeffrey_bai.json ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Jeffrey",
3
+ "last_name": "Bai",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "",
7
+ "summary": "",
8
+ "headline": "Senior Associate at Rubicon Technology Partners",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "Boulder, Colorado",
12
+ "full": "Boulder, Colorado, United States"
13
+ },
14
+ "languages": [
15
+ {
16
+ "name": "Chinese (Simplified)",
17
+ "proficiency": "NATIVE_OR_BILINGUAL"
18
+ },
19
+ {
20
+ "name": "English",
21
+ "proficiency": "NATIVE_OR_BILINGUAL"
22
+ },
23
+ {
24
+ "name": "German",
25
+ "proficiency": "LIMITED_WORKING"
26
+ },
27
+ {
28
+ "name": "Spanish",
29
+ "proficiency": "LIMITED_WORKING"
30
+ }
31
+ ],
32
+ "educations": [
33
+ {
34
+ "start": {
35
+ "year": 2015,
36
+ "month": null,
37
+ "day": null
38
+ },
39
+ "end": {
40
+ "year": 2019,
41
+ "month": null,
42
+ "day": null
43
+ },
44
+ "field_of_study": "Finance and Management ",
45
+ "degree": "Bachelor of Science (BS) in Economics",
46
+ "grade": "",
47
+ "school_name": "University of Pennsylvania - The Wharton School",
48
+ "description": "",
49
+ "activities": ""
50
+ }
51
+ ],
52
+ "positions": [
53
+ {
54
+ "start": {
55
+ "year": 2023,
56
+ "month": 8,
57
+ "day": null
58
+ },
59
+ "end": {
60
+ "year": null,
61
+ "month": null,
62
+ "day": null
63
+ },
64
+ "company_name": "Rubicon Technology Partners",
65
+ "company_username": "rubicon-technology-partners",
66
+ "company_url": null,
67
+ "company_industry": "Venture Capital & Private Equity",
68
+ "company_staff_count_range": "11 - 50",
69
+ "title": "Senior Associate",
70
+ "location": "Boulder, Colorado, United States",
71
+ "description": "Private Equity – Enterprise Software",
72
+ "employment_type": ""
73
+ },
74
+ {
75
+ "start": {
76
+ "year": 2021,
77
+ "month": 8,
78
+ "day": null
79
+ },
80
+ "end": {
81
+ "year": 2023,
82
+ "month": 7,
83
+ "day": null
84
+ },
85
+ "company_name": "Rubicon Technology Partners",
86
+ "company_username": "rubicon-technology-partners",
87
+ "company_url": null,
88
+ "company_industry": "Venture Capital & Private Equity",
89
+ "company_staff_count_range": "11 - 50",
90
+ "title": "Associate",
91
+ "location": "Boulder, Colorado",
92
+ "description": "Private Equity – Enterprise Software",
93
+ "employment_type": ""
94
+ },
95
+ {
96
+ "start": {
97
+ "year": 2019,
98
+ "month": 7,
99
+ "day": null
100
+ },
101
+ "end": {
102
+ "year": 2021,
103
+ "month": 7,
104
+ "day": null
105
+ },
106
+ "company_name": "DC Advisory",
107
+ "company_username": "dcadvisory",
108
+ "company_url": null,
109
+ "company_industry": "Investment Banking",
110
+ "company_staff_count_range": "501 - 1000",
111
+ "title": "Investment Banking Analyst",
112
+ "location": "Washington D.C. Metro Area",
113
+ "description": "Technology and Software M&A",
114
+ "employment_type": ""
115
+ },
116
+ {
117
+ "start": {
118
+ "year": 2018,
119
+ "month": 6,
120
+ "day": null
121
+ },
122
+ "end": {
123
+ "year": 2018,
124
+ "month": 8,
125
+ "day": null
126
+ },
127
+ "company_name": "Payoneer",
128
+ "company_username": "payoneer",
129
+ "company_url": null,
130
+ "company_industry": "Financial Services",
131
+ "company_staff_count_range": "1001 - 5000",
132
+ "title": "Corporate Development Summer Analyst",
133
+ "location": "Hong Kong",
134
+ "description": "",
135
+ "employment_type": ""
136
+ },
137
+ {
138
+ "start": {
139
+ "year": 2017,
140
+ "month": 6,
141
+ "day": null
142
+ },
143
+ "end": {
144
+ "year": 2017,
145
+ "month": 8,
146
+ "day": null
147
+ },
148
+ "company_name": "XLP Capital",
149
+ "company_username": "xlp-capital",
150
+ "company_url": null,
151
+ "company_industry": "Financial Services",
152
+ "company_staff_count_range": "2 - 10",
153
+ "title": "Summer Analyst",
154
+ "location": "Greater New York City Area",
155
+ "description": "Technology-focused; short-bias strategy",
156
+ "employment_type": ""
157
+ }
158
+ ],
159
+ "full_positions": [
160
+ {
161
+ "start": {
162
+ "year": 2023,
163
+ "month": 8,
164
+ "day": null
165
+ },
166
+ "end": {
167
+ "year": null,
168
+ "month": null,
169
+ "day": null
170
+ },
171
+ "company_name": "Rubicon Technology Partners",
172
+ "company_username": "rubicon-technology-partners",
173
+ "company_url": null,
174
+ "company_industry": "Venture Capital & Private Equity",
175
+ "company_staff_count_range": "11 - 50",
176
+ "title": "Senior Associate",
177
+ "location": "Boulder, Colorado, United States",
178
+ "description": "Private Equity – Enterprise Software",
179
+ "employment_type": ""
180
+ },
181
+ {
182
+ "start": {
183
+ "year": 2021,
184
+ "month": 8,
185
+ "day": null
186
+ },
187
+ "end": {
188
+ "year": 2023,
189
+ "month": 7,
190
+ "day": null
191
+ },
192
+ "company_name": "Rubicon Technology Partners",
193
+ "company_username": "rubicon-technology-partners",
194
+ "company_url": null,
195
+ "company_industry": "Venture Capital & Private Equity",
196
+ "company_staff_count_range": "11 - 50",
197
+ "title": "Associate",
198
+ "location": "Boulder, Colorado",
199
+ "description": "Private Equity – Enterprise Software",
200
+ "employment_type": ""
201
+ },
202
+ {
203
+ "start": {
204
+ "year": 2019,
205
+ "month": 7,
206
+ "day": null
207
+ },
208
+ "end": {
209
+ "year": 2021,
210
+ "month": 7,
211
+ "day": null
212
+ },
213
+ "company_name": "DC Advisory",
214
+ "company_username": "dcadvisory",
215
+ "company_url": null,
216
+ "company_industry": "Investment Banking",
217
+ "company_staff_count_range": "501 - 1000",
218
+ "title": "Investment Banking Analyst",
219
+ "location": "Washington D.C. Metro Area",
220
+ "description": "Technology and Software M&A",
221
+ "employment_type": ""
222
+ },
223
+ {
224
+ "start": {
225
+ "year": 2018,
226
+ "month": 6,
227
+ "day": null
228
+ },
229
+ "end": {
230
+ "year": 2018,
231
+ "month": 8,
232
+ "day": null
233
+ },
234
+ "company_name": "Payoneer",
235
+ "company_username": "payoneer",
236
+ "company_url": null,
237
+ "company_industry": "Financial Services",
238
+ "company_staff_count_range": "1001 - 5000",
239
+ "title": "Corporate Development Summer Analyst",
240
+ "location": "Hong Kong",
241
+ "description": "",
242
+ "employment_type": ""
243
+ },
244
+ {
245
+ "start": {
246
+ "year": 2017,
247
+ "month": 6,
248
+ "day": null
249
+ },
250
+ "end": {
251
+ "year": 2017,
252
+ "month": 8,
253
+ "day": null
254
+ },
255
+ "company_name": "XLP Capital",
256
+ "company_username": "xlp-capital",
257
+ "company_url": null,
258
+ "company_industry": "Financial Services",
259
+ "company_staff_count_range": "2 - 10",
260
+ "title": "Summer Analyst",
261
+ "location": "Greater New York City Area",
262
+ "description": "Technology-focused; short-bias strategy",
263
+ "employment_type": ""
264
+ }
265
+ ],
266
+ "skills": [
267
+ {
268
+ "name": "Management"
269
+ },
270
+ {
271
+ "name": "Sales"
272
+ },
273
+ {
274
+ "name": "Research"
275
+ },
276
+ {
277
+ "name": "Business Development"
278
+ },
279
+ {
280
+ "name": "Start-ups"
281
+ },
282
+ {
283
+ "name": "Entrepreneurship"
284
+ },
285
+ {
286
+ "name": "Data Analysis"
287
+ },
288
+ {
289
+ "name": "Teamwork"
290
+ },
291
+ {
292
+ "name": "Public Speaking"
293
+ }
294
+ ],
295
+ "courses": null,
296
+ "certifications": null
297
+ }
tests/test_data/sample_profiles/lauren_hipple.json ADDED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Lauren",
3
+ "last_name": "Hipple",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "",
7
+ "summary": "Dedicated and entrepreneurial investment professional with experience across a diverse set of industries and assets classes. Experience includes control buyouts, structured credit products, minority equity investments, and bolt-on acquisitions. Proven capability in effectively sourcing, performing diligence, executing transactions, and managing post-transaction investments / strategic initiatives.\n\nPlease reach out to me if you have a relevant investment opportunity that you would like to discuss.",
8
+ "headline": "Long Arc Capital",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "New York, New York",
12
+ "full": "New York, New York, United States"
13
+ },
14
+ "languages": null,
15
+ "educations": [
16
+ {
17
+ "start": {
18
+ "year": null,
19
+ "month": null,
20
+ "day": null
21
+ },
22
+ "end": {
23
+ "year": null,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "field_of_study": "Mathematics and Statistics",
28
+ "degree": "",
29
+ "grade": "",
30
+ "school_name": "Rice University",
31
+ "description": "",
32
+ "activities": ""
33
+ },
34
+ {
35
+ "start": {
36
+ "year": null,
37
+ "month": null,
38
+ "day": null
39
+ },
40
+ "end": {
41
+ "year": null,
42
+ "month": null,
43
+ "day": null
44
+ },
45
+ "field_of_study": "",
46
+ "degree": "",
47
+ "grade": "",
48
+ "school_name": "Laurel School",
49
+ "description": "",
50
+ "activities": ""
51
+ }
52
+ ],
53
+ "positions": [
54
+ {
55
+ "start": {
56
+ "year": 2023,
57
+ "month": 3,
58
+ "day": null
59
+ },
60
+ "end": {
61
+ "year": null,
62
+ "month": null,
63
+ "day": null
64
+ },
65
+ "company_name": "Long Arc Capital",
66
+ "company_username": "long-arc-capital",
67
+ "company_url": null,
68
+ "company_industry": "Venture Capital & Private Equity",
69
+ "company_staff_count_range": "11 - 50",
70
+ "title": "Private Equity Vice President",
71
+ "location": "New York, United States",
72
+ "description": "~$500 million AUM private equity firm specializing in providing growth capital to companies in the Financial Services, Business Services, and TMT sectors undergoing technology-driven transformations",
73
+ "employment_type": "Full-time"
74
+ },
75
+ {
76
+ "start": {
77
+ "year": 2022,
78
+ "month": 7,
79
+ "day": null
80
+ },
81
+ "end": {
82
+ "year": 2022,
83
+ "month": 12,
84
+ "day": null
85
+ },
86
+ "company_name": "Forum Brands",
87
+ "company_username": "forumbrands",
88
+ "company_url": null,
89
+ "company_industry": "Retail",
90
+ "company_staff_count_range": "51 - 200",
91
+ "title": "M&A",
92
+ "location": "New York, New York, United States",
93
+ "description": "Co-Led M&A team at a series A e-commerce company focused on acquiring digitally native brands",
94
+ "employment_type": "Full-time"
95
+ },
96
+ {
97
+ "start": {
98
+ "year": 2020,
99
+ "month": null,
100
+ "day": null
101
+ },
102
+ "end": {
103
+ "year": 2022,
104
+ "month": null,
105
+ "day": null
106
+ },
107
+ "company_name": "FocusGrowth Asset Management, LP.",
108
+ "company_username": "focusgrowth-asset-management-lp",
109
+ "company_url": null,
110
+ "company_industry": "Financial Services",
111
+ "company_staff_count_range": "2 - 10",
112
+ "title": "Vice President",
113
+ "location": "",
114
+ "description": "Private Credit and Special Situations Asset Manager",
115
+ "employment_type": ""
116
+ },
117
+ {
118
+ "start": {
119
+ "year": 2017,
120
+ "month": null,
121
+ "day": null
122
+ },
123
+ "end": {
124
+ "year": 2019,
125
+ "month": null,
126
+ "day": null
127
+ },
128
+ "company_name": "Alinda Capital Partners LLC",
129
+ "company_username": "alinda-capital-partners-llc",
130
+ "company_url": null,
131
+ "company_industry": "Financial Services",
132
+ "company_staff_count_range": "11 - 50",
133
+ "title": "Private Equity Associate",
134
+ "location": "Greater New York City Area",
135
+ "description": "Private equity funds, with over $8Bn under management. Focused on transportation & logistics, telecommunications, and energy infrastructure.",
136
+ "employment_type": "Full-time"
137
+ },
138
+ {
139
+ "start": {
140
+ "year": 2015,
141
+ "month": 7,
142
+ "day": null
143
+ },
144
+ "end": {
145
+ "year": 2017,
146
+ "month": 6,
147
+ "day": null
148
+ },
149
+ "company_name": "UBS",
150
+ "company_username": "ubs",
151
+ "company_url": null,
152
+ "company_industry": "Financial Services",
153
+ "company_staff_count_range": "10001 - 0",
154
+ "title": "Investment Banking Analyst",
155
+ "location": "New York, United States",
156
+ "description": "Energy M&A and Coverage",
157
+ "employment_type": "Full-time"
158
+ }
159
+ ],
160
+ "full_positions": [
161
+ {
162
+ "start": {
163
+ "year": 2023,
164
+ "month": 3,
165
+ "day": null
166
+ },
167
+ "end": {
168
+ "year": null,
169
+ "month": null,
170
+ "day": null
171
+ },
172
+ "company_name": "Long Arc Capital",
173
+ "company_username": "long-arc-capital",
174
+ "company_url": null,
175
+ "company_industry": "Venture Capital & Private Equity",
176
+ "company_staff_count_range": "11 - 50",
177
+ "title": "Private Equity Vice President",
178
+ "location": "New York, United States",
179
+ "description": "~$500 million AUM private equity firm specializing in providing growth capital to companies in the Financial Services, Business Services, and TMT sectors undergoing technology-driven transformations",
180
+ "employment_type": "Full-time"
181
+ },
182
+ {
183
+ "start": {
184
+ "year": 2022,
185
+ "month": 7,
186
+ "day": null
187
+ },
188
+ "end": {
189
+ "year": 2022,
190
+ "month": 12,
191
+ "day": null
192
+ },
193
+ "company_name": "Forum Brands",
194
+ "company_username": "forumbrands",
195
+ "company_url": null,
196
+ "company_industry": "Retail",
197
+ "company_staff_count_range": "51 - 200",
198
+ "title": "M&A",
199
+ "location": "New York, New York, United States",
200
+ "description": "Co-Led M&A team at a series A e-commerce company focused on acquiring digitally native brands",
201
+ "employment_type": "Full-time"
202
+ },
203
+ {
204
+ "start": {
205
+ "year": 2020,
206
+ "month": null,
207
+ "day": null
208
+ },
209
+ "end": {
210
+ "year": 2022,
211
+ "month": null,
212
+ "day": null
213
+ },
214
+ "company_name": "FocusGrowth Asset Management, LP.",
215
+ "company_username": "focusgrowth-asset-management-lp",
216
+ "company_url": null,
217
+ "company_industry": "Financial Services",
218
+ "company_staff_count_range": "2 - 10",
219
+ "title": "Vice President",
220
+ "location": "",
221
+ "description": "Private Credit and Special Situations Asset Manager",
222
+ "employment_type": ""
223
+ },
224
+ {
225
+ "start": {
226
+ "year": 2017,
227
+ "month": null,
228
+ "day": null
229
+ },
230
+ "end": {
231
+ "year": 2019,
232
+ "month": null,
233
+ "day": null
234
+ },
235
+ "company_name": "Alinda Capital Partners LLC",
236
+ "company_username": "alinda-capital-partners-llc",
237
+ "company_url": null,
238
+ "company_industry": "Financial Services",
239
+ "company_staff_count_range": "11 - 50",
240
+ "title": "Private Equity Associate",
241
+ "location": "Greater New York City Area",
242
+ "description": "Private equity funds, with over $8Bn under management. Focused on transportation & logistics, telecommunications, and energy infrastructure.",
243
+ "employment_type": "Full-time"
244
+ },
245
+ {
246
+ "start": {
247
+ "year": 2015,
248
+ "month": 7,
249
+ "day": null
250
+ },
251
+ "end": {
252
+ "year": 2017,
253
+ "month": 6,
254
+ "day": null
255
+ },
256
+ "company_name": "UBS",
257
+ "company_username": "ubs",
258
+ "company_url": null,
259
+ "company_industry": "Financial Services",
260
+ "company_staff_count_range": "10001 - 0",
261
+ "title": "Investment Banking Analyst",
262
+ "location": "New York, United States",
263
+ "description": "Energy M&A and Coverage",
264
+ "employment_type": "Full-time"
265
+ }
266
+ ],
267
+ "skills": [
268
+ {
269
+ "name": "Special Situations Investing"
270
+ },
271
+ {
272
+ "name": "Private Credit"
273
+ },
274
+ {
275
+ "name": "Transportation"
276
+ },
277
+ {
278
+ "name": "Infrastructure"
279
+ },
280
+ {
281
+ "name": "Energy Industry"
282
+ },
283
+ {
284
+ "name": "B2B Software"
285
+ },
286
+ {
287
+ "name": "Business-to-Business (B2B)"
288
+ },
289
+ {
290
+ "name": "Relationship Building"
291
+ },
292
+ {
293
+ "name": "Strategic Partnerships"
294
+ },
295
+ {
296
+ "name": "Financial Literacy"
297
+ },
298
+ {
299
+ "name": "Mergers & Acquisitions (M&A)"
300
+ },
301
+ {
302
+ "name": "Bridging Gaps"
303
+ },
304
+ {
305
+ "name": "Timelines"
306
+ },
307
+ {
308
+ "name": "Confidentiality"
309
+ },
310
+ {
311
+ "name": "Investor Relations"
312
+ },
313
+ {
314
+ "name": "Problem Solving"
315
+ },
316
+ {
317
+ "name": "Negotiation"
318
+ },
319
+ {
320
+ "name": "Analytical Skills"
321
+ },
322
+ {
323
+ "name": "Presentations"
324
+ },
325
+ {
326
+ "name": "Strategic Initiatives"
327
+ },
328
+ {
329
+ "name": "External Communications"
330
+ },
331
+ {
332
+ "name": "Oral Communication"
333
+ },
334
+ {
335
+ "name": "Insurance Industry"
336
+ },
337
+ {
338
+ "name": "Corporate Finance"
339
+ },
340
+ {
341
+ "name": "Financial Analysis"
342
+ },
343
+ {
344
+ "name": "Business Strategy"
345
+ },
346
+ {
347
+ "name": "Microsoft Office"
348
+ },
349
+ {
350
+ "name": "Management"
351
+ },
352
+ {
353
+ "name": "Business Requirements"
354
+ },
355
+ {
356
+ "name": "Competitive Assessment"
357
+ },
358
+ {
359
+ "name": "Financial Performance"
360
+ },
361
+ {
362
+ "name": "Presentation Skills"
363
+ },
364
+ {
365
+ "name": "Financial Forecasting"
366
+ },
367
+ {
368
+ "name": "Corporate Strategy"
369
+ },
370
+ {
371
+ "name": "Business Insights"
372
+ },
373
+ {
374
+ "name": "Board of Directors"
375
+ }
376
+ ],
377
+ "courses": null,
378
+ "certifications": [
379
+ {
380
+ "start": {
381
+ "year": 2015,
382
+ "month": 8,
383
+ "day": null
384
+ },
385
+ "end": {
386
+ "year": null,
387
+ "month": null,
388
+ "day": null
389
+ },
390
+ "name": "Series 79",
391
+ "authority": "Financial Industry Regulatory Authority (FINRA)",
392
+ "company": {
393
+ "name": null,
394
+ "universal_name": null,
395
+ "logo": null
396
+ },
397
+ "time_period": {
398
+ "start": {
399
+ "year": null,
400
+ "month": null,
401
+ "day": null
402
+ },
403
+ "end": {
404
+ "year": null,
405
+ "month": null,
406
+ "day": null
407
+ }
408
+ }
409
+ }
410
+ ]
411
+ }
tests/test_data/sample_profiles/nicholas_penske.json ADDED
@@ -0,0 +1,465 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Nicholas",
3
+ "last_name": "Penske",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/D4E03AQGjJjhVrT2S5g/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1720543826672?e=1731542400&v=beta&t=gIrnl3W-K6gXUXVaPm4SjSe0o_bfJQfBkJswmfZ7x98",
7
+ "summary": "",
8
+ "headline": "Investor at 8VC",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "New York, New York",
12
+ "full": "New York, New York, United States"
13
+ },
14
+ "languages": [
15
+ {
16
+ "name": "Spanish",
17
+ "proficiency": "PROFESSIONAL_WORKING"
18
+ }
19
+ ],
20
+ "educations": [
21
+ {
22
+ "start": {
23
+ "year": 2015,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "end": {
28
+ "year": 2019,
29
+ "month": null,
30
+ "day": null
31
+ },
32
+ "field_of_study": "American Government and Politics (United States)",
33
+ "degree": "Bachelor of Arts - BA",
34
+ "grade": "",
35
+ "school_name": "Cornell University",
36
+ "description": "",
37
+ "activities": ""
38
+ },
39
+ {
40
+ "start": {
41
+ "year": 2009,
42
+ "month": null,
43
+ "day": null
44
+ },
45
+ "end": {
46
+ "year": 2015,
47
+ "month": null,
48
+ "day": null
49
+ },
50
+ "field_of_study": "",
51
+ "degree": "",
52
+ "grade": "",
53
+ "school_name": "Harvard Westlake School",
54
+ "description": "",
55
+ "activities": "Student Ambassador, Varsity Lacrosse"
56
+ }
57
+ ],
58
+ "positions": [
59
+ {
60
+ "start": {
61
+ "year": 2024,
62
+ "month": 4,
63
+ "day": null
64
+ },
65
+ "end": {
66
+ "year": null,
67
+ "month": null,
68
+ "day": null
69
+ },
70
+ "company_name": "8VC",
71
+ "company_username": "8vc",
72
+ "company_url": null,
73
+ "company_industry": "Venture Capital & Private Equity",
74
+ "company_staff_count_range": "11 - 50",
75
+ "title": "Investor",
76
+ "location": "New York City Metropolitan Area",
77
+ "description": "",
78
+ "employment_type": "Full-time"
79
+ },
80
+ {
81
+ "start": {
82
+ "year": 2023,
83
+ "month": 9,
84
+ "day": null
85
+ },
86
+ "end": {
87
+ "year": 2024,
88
+ "month": 4,
89
+ "day": null
90
+ },
91
+ "company_name": "TRP Capital Partners",
92
+ "company_username": "trp-capital-partners",
93
+ "company_url": null,
94
+ "company_industry": "Financial Services",
95
+ "company_staff_count_range": "2 - 10",
96
+ "title": "Private Equity Associate",
97
+ "location": "New York, New York, United States",
98
+ "description": "",
99
+ "employment_type": "Full-time"
100
+ },
101
+ {
102
+ "start": {
103
+ "year": 2021,
104
+ "month": 10,
105
+ "day": null
106
+ },
107
+ "end": {
108
+ "year": 2023,
109
+ "month": 9,
110
+ "day": null
111
+ },
112
+ "company_name": "TRP Capital Partners",
113
+ "company_username": "trp-capital-partners",
114
+ "company_url": null,
115
+ "company_industry": "Financial Services",
116
+ "company_staff_count_range": "2 - 10",
117
+ "title": "Private Equity Analyst",
118
+ "location": "Detroit, Michigan, United States",
119
+ "description": "",
120
+ "employment_type": "Full-time"
121
+ },
122
+ {
123
+ "start": {
124
+ "year": 2020,
125
+ "month": null,
126
+ "day": null
127
+ },
128
+ "end": {
129
+ "year": 2021,
130
+ "month": null,
131
+ "day": null
132
+ },
133
+ "company_name": "",
134
+ "company_username": "",
135
+ "company_url": null,
136
+ "company_industry": "",
137
+ "company_staff_count_range": "",
138
+ "title": "Hotel Investments",
139
+ "location": "New York, New York, United States",
140
+ "description": "Hospitality start-up looking to acquire and reposition unbranded bed and breakfasts, hotels, and motels.",
141
+ "employment_type": "Self-employed"
142
+ },
143
+ {
144
+ "start": {
145
+ "year": 2019,
146
+ "month": 7,
147
+ "day": null
148
+ },
149
+ "end": {
150
+ "year": 2020,
151
+ "month": 11,
152
+ "day": null
153
+ },
154
+ "company_name": "Hudson Pacific Properties",
155
+ "company_username": "hudson-pacific-properties-inc-",
156
+ "company_url": null,
157
+ "company_industry": "Real Estate",
158
+ "company_staff_count_range": "201 - 500",
159
+ "title": "Analyst",
160
+ "location": "Los Angeles, California, United States",
161
+ "description": "",
162
+ "employment_type": "Full-time"
163
+ },
164
+ {
165
+ "start": {
166
+ "year": 2018,
167
+ "month": 6,
168
+ "day": null
169
+ },
170
+ "end": {
171
+ "year": 2018,
172
+ "month": 8,
173
+ "day": null
174
+ },
175
+ "company_name": "Ares Management, L.P.",
176
+ "company_username": "ares-management",
177
+ "company_url": null,
178
+ "company_industry": "Financial Services",
179
+ "company_staff_count_range": "1001 - 5000",
180
+ "title": "Summer Intern",
181
+ "location": "Greater Los Angeles Area",
182
+ "description": "",
183
+ "employment_type": ""
184
+ },
185
+ {
186
+ "start": {
187
+ "year": 2017,
188
+ "month": 6,
189
+ "day": null
190
+ },
191
+ "end": {
192
+ "year": 2017,
193
+ "month": 8,
194
+ "day": null
195
+ },
196
+ "company_name": "Caruso Affiliated",
197
+ "company_username": "caruso",
198
+ "company_url": null,
199
+ "company_industry": "Real Estate",
200
+ "company_staff_count_range": "51 - 200",
201
+ "title": "Summer Associate, Operations",
202
+ "location": "Greater Los Angeles Area",
203
+ "description": "",
204
+ "employment_type": ""
205
+ },
206
+ {
207
+ "start": {
208
+ "year": 2016,
209
+ "month": 7,
210
+ "day": null
211
+ },
212
+ "end": {
213
+ "year": 2016,
214
+ "month": 8,
215
+ "day": null
216
+ },
217
+ "company_name": "WME (William Morris Endeavor)",
218
+ "company_username": "william-morris-endeavor",
219
+ "company_url": null,
220
+ "company_industry": "Entertainment",
221
+ "company_staff_count_range": "5001 - 10000",
222
+ "title": "Summer Intern",
223
+ "location": "Greater Los Angeles Area",
224
+ "description": "",
225
+ "employment_type": ""
226
+ },
227
+ {
228
+ "start": {
229
+ "year": 2013,
230
+ "month": 6,
231
+ "day": null
232
+ },
233
+ "end": {
234
+ "year": 2015,
235
+ "month": 8,
236
+ "day": null
237
+ },
238
+ "company_name": "Longo Toyota/Scion",
239
+ "company_username": "longo-toyota-scion",
240
+ "company_url": null,
241
+ "company_industry": "Automotive",
242
+ "company_staff_count_range": "501 - 1000",
243
+ "title": "Summer Intern",
244
+ "location": "Greater Los Angeles Area",
245
+ "description": "",
246
+ "employment_type": ""
247
+ }
248
+ ],
249
+ "full_positions": [
250
+ {
251
+ "start": {
252
+ "year": 2024,
253
+ "month": 4,
254
+ "day": null
255
+ },
256
+ "end": {
257
+ "year": null,
258
+ "month": null,
259
+ "day": null
260
+ },
261
+ "company_name": "8VC",
262
+ "company_username": "8vc",
263
+ "company_url": null,
264
+ "company_industry": "Venture Capital & Private Equity",
265
+ "company_staff_count_range": "11 - 50",
266
+ "title": "Investor",
267
+ "location": "New York City Metropolitan Area",
268
+ "description": "",
269
+ "employment_type": "Full-time"
270
+ },
271
+ {
272
+ "start": {
273
+ "year": 2023,
274
+ "month": 9,
275
+ "day": null
276
+ },
277
+ "end": {
278
+ "year": 2024,
279
+ "month": 4,
280
+ "day": null
281
+ },
282
+ "company_name": "TRP Capital Partners",
283
+ "company_username": "trp-capital-partners",
284
+ "company_url": null,
285
+ "company_industry": "Financial Services",
286
+ "company_staff_count_range": "2 - 10",
287
+ "title": "Private Equity Associate",
288
+ "location": "New York, New York, United States",
289
+ "description": "",
290
+ "employment_type": "Full-time"
291
+ },
292
+ {
293
+ "start": {
294
+ "year": 2021,
295
+ "month": 10,
296
+ "day": null
297
+ },
298
+ "end": {
299
+ "year": 2023,
300
+ "month": 9,
301
+ "day": null
302
+ },
303
+ "company_name": "TRP Capital Partners",
304
+ "company_username": "trp-capital-partners",
305
+ "company_url": null,
306
+ "company_industry": "Financial Services",
307
+ "company_staff_count_range": "2 - 10",
308
+ "title": "Private Equity Analyst",
309
+ "location": "Detroit, Michigan, United States",
310
+ "description": "",
311
+ "employment_type": "Full-time"
312
+ },
313
+ {
314
+ "start": {
315
+ "year": 2020,
316
+ "month": null,
317
+ "day": null
318
+ },
319
+ "end": {
320
+ "year": 2021,
321
+ "month": null,
322
+ "day": null
323
+ },
324
+ "company_name": "",
325
+ "company_username": "",
326
+ "company_url": null,
327
+ "company_industry": "",
328
+ "company_staff_count_range": "",
329
+ "title": "Hotel Investments",
330
+ "location": "New York, New York, United States",
331
+ "description": "Hospitality start-up looking to acquire and reposition unbranded bed and breakfasts, hotels, and motels.",
332
+ "employment_type": "Self-employed"
333
+ },
334
+ {
335
+ "start": {
336
+ "year": 2019,
337
+ "month": 7,
338
+ "day": null
339
+ },
340
+ "end": {
341
+ "year": 2020,
342
+ "month": 11,
343
+ "day": null
344
+ },
345
+ "company_name": "Hudson Pacific Properties",
346
+ "company_username": "hudson-pacific-properties-inc-",
347
+ "company_url": null,
348
+ "company_industry": "Real Estate",
349
+ "company_staff_count_range": "201 - 500",
350
+ "title": "Analyst",
351
+ "location": "Los Angeles, California, United States",
352
+ "description": "",
353
+ "employment_type": "Full-time"
354
+ },
355
+ {
356
+ "start": {
357
+ "year": 2018,
358
+ "month": 6,
359
+ "day": null
360
+ },
361
+ "end": {
362
+ "year": 2018,
363
+ "month": 8,
364
+ "day": null
365
+ },
366
+ "company_name": "Ares Management, L.P.",
367
+ "company_username": "ares-management",
368
+ "company_url": null,
369
+ "company_industry": "Financial Services",
370
+ "company_staff_count_range": "1001 - 5000",
371
+ "title": "Summer Intern",
372
+ "location": "Greater Los Angeles Area",
373
+ "description": "",
374
+ "employment_type": ""
375
+ },
376
+ {
377
+ "start": {
378
+ "year": 2017,
379
+ "month": 6,
380
+ "day": null
381
+ },
382
+ "end": {
383
+ "year": 2017,
384
+ "month": 8,
385
+ "day": null
386
+ },
387
+ "company_name": "Caruso Affiliated",
388
+ "company_username": "caruso",
389
+ "company_url": null,
390
+ "company_industry": "Real Estate",
391
+ "company_staff_count_range": "51 - 200",
392
+ "title": "Summer Associate, Operations",
393
+ "location": "Greater Los Angeles Area",
394
+ "description": "",
395
+ "employment_type": ""
396
+ },
397
+ {
398
+ "start": {
399
+ "year": 2016,
400
+ "month": 7,
401
+ "day": null
402
+ },
403
+ "end": {
404
+ "year": 2016,
405
+ "month": 8,
406
+ "day": null
407
+ },
408
+ "company_name": "WME (William Morris Endeavor)",
409
+ "company_username": "william-morris-endeavor",
410
+ "company_url": null,
411
+ "company_industry": "Entertainment",
412
+ "company_staff_count_range": "5001 - 10000",
413
+ "title": "Summer Intern",
414
+ "location": "Greater Los Angeles Area",
415
+ "description": "",
416
+ "employment_type": ""
417
+ },
418
+ {
419
+ "start": {
420
+ "year": 2013,
421
+ "month": 6,
422
+ "day": null
423
+ },
424
+ "end": {
425
+ "year": 2015,
426
+ "month": 8,
427
+ "day": null
428
+ },
429
+ "company_name": "Longo Toyota/Scion",
430
+ "company_username": "longo-toyota-scion",
431
+ "company_url": null,
432
+ "company_industry": "Automotive",
433
+ "company_staff_count_range": "501 - 1000",
434
+ "title": "Summer Intern",
435
+ "location": "Greater Los Angeles Area",
436
+ "description": "",
437
+ "employment_type": ""
438
+ }
439
+ ],
440
+ "skills": [
441
+ {
442
+ "name": "Microsoft Office"
443
+ },
444
+ {
445
+ "name": "Customer Service"
446
+ },
447
+ {
448
+ "name": "Hospitality Industry"
449
+ },
450
+ {
451
+ "name": "Public Speaking"
452
+ },
453
+ {
454
+ "name": "Microsoft Excel"
455
+ },
456
+ {
457
+ "name": "Microsoft Word"
458
+ },
459
+ {
460
+ "name": "Microsoft PowerPoint"
461
+ }
462
+ ],
463
+ "courses": null,
464
+ "certifications": null
465
+ }
tests/test_data/sample_profiles/peter_tagliaferri.json ADDED
@@ -0,0 +1,316 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Peter",
3
+ "last_name": "Tagliaferri",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/C4E03AQFlo8eRarRnSA/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1570065735671?e=1731542400&v=beta&t=bU0FVhun7ur1CckwLMHHugFK4uzP5Ar3hUF_ewsDO-k",
7
+ "summary": "",
8
+ "headline": "Software Investor at Accel-KKR",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "San Francisco Bay Area",
12
+ "full": "San Francisco Bay Area"
13
+ },
14
+ "languages": null,
15
+ "educations": [
16
+ {
17
+ "start": {
18
+ "year": null,
19
+ "month": null,
20
+ "day": null
21
+ },
22
+ "end": {
23
+ "year": null,
24
+ "month": null,
25
+ "day": null
26
+ },
27
+ "field_of_study": "Economics",
28
+ "degree": "Bachelor of Arts - BA",
29
+ "grade": "Second Honors, Dean's List",
30
+ "school_name": "Georgetown University",
31
+ "description": "",
32
+ "activities": "Men's Varsity Lacrosse"
33
+ },
34
+ {
35
+ "start": {
36
+ "year": null,
37
+ "month": null,
38
+ "day": null
39
+ },
40
+ "end": {
41
+ "year": null,
42
+ "month": null,
43
+ "day": null
44
+ },
45
+ "field_of_study": "",
46
+ "degree": "High School Diploma",
47
+ "grade": "",
48
+ "school_name": "San Ramon Valley High School",
49
+ "description": "",
50
+ "activities": ""
51
+ }
52
+ ],
53
+ "positions": [
54
+ {
55
+ "start": {
56
+ "year": 2024,
57
+ "month": 1,
58
+ "day": null
59
+ },
60
+ "end": {
61
+ "year": null,
62
+ "month": null,
63
+ "day": null
64
+ },
65
+ "company_name": "Accel-KKR",
66
+ "company_username": "accel-kkr",
67
+ "company_url": null,
68
+ "company_industry": "Venture Capital & Private Equity",
69
+ "company_staff_count_range": "51 - 200",
70
+ "title": "Senior Associate",
71
+ "location": "Menlo Park, California, United States",
72
+ "description": "",
73
+ "employment_type": "Full-time"
74
+ },
75
+ {
76
+ "start": {
77
+ "year": 2020,
78
+ "month": 11,
79
+ "day": null
80
+ },
81
+ "end": {
82
+ "year": 2024,
83
+ "month": 2,
84
+ "day": null
85
+ },
86
+ "company_name": "Accel-KKR",
87
+ "company_username": "accel-kkr",
88
+ "company_url": null,
89
+ "company_industry": "Venture Capital & Private Equity",
90
+ "company_staff_count_range": "51 - 200",
91
+ "title": "Investment Professional",
92
+ "location": "Menlo Park, California, United States",
93
+ "description": "",
94
+ "employment_type": "Full-time"
95
+ },
96
+ {
97
+ "start": {
98
+ "year": 2018,
99
+ "month": 7,
100
+ "day": null
101
+ },
102
+ "end": {
103
+ "year": 2020,
104
+ "month": 10,
105
+ "day": null
106
+ },
107
+ "company_name": "Stifel Financial Corp.",
108
+ "company_username": "stifel-financial-corp-",
109
+ "company_url": null,
110
+ "company_industry": "Financial Services",
111
+ "company_staff_count_range": "5001 - 10000",
112
+ "title": "Investment Banking Professional",
113
+ "location": "San Francisco Bay Area",
114
+ "description": "",
115
+ "employment_type": ""
116
+ },
117
+ {
118
+ "start": {
119
+ "year": 2017,
120
+ "month": 6,
121
+ "day": null
122
+ },
123
+ "end": {
124
+ "year": 2017,
125
+ "month": 8,
126
+ "day": null
127
+ },
128
+ "company_name": "Accel-KKR",
129
+ "company_username": "accel-kkr",
130
+ "company_url": null,
131
+ "company_industry": "Venture Capital & Private Equity",
132
+ "company_staff_count_range": "51 - 200",
133
+ "title": "Private Equity",
134
+ "location": "Menlo Park, CA",
135
+ "description": "",
136
+ "employment_type": ""
137
+ },
138
+ {
139
+ "start": {
140
+ "year": 2016,
141
+ "month": 6,
142
+ "day": null
143
+ },
144
+ "end": {
145
+ "year": 2016,
146
+ "month": 12,
147
+ "day": null
148
+ },
149
+ "company_name": "Securian Financial Group",
150
+ "company_username": "securian-financial",
151
+ "company_url": null,
152
+ "company_industry": "Financial Services",
153
+ "company_staff_count_range": "1001 - 5000",
154
+ "title": "Analyst",
155
+ "location": "Danville, California",
156
+ "description": "",
157
+ "employment_type": ""
158
+ }
159
+ ],
160
+ "full_positions": [
161
+ {
162
+ "start": {
163
+ "year": 2024,
164
+ "month": 1,
165
+ "day": null
166
+ },
167
+ "end": {
168
+ "year": null,
169
+ "month": null,
170
+ "day": null
171
+ },
172
+ "company_name": "Accel-KKR",
173
+ "company_username": "accel-kkr",
174
+ "company_url": null,
175
+ "company_industry": "Venture Capital & Private Equity",
176
+ "company_staff_count_range": "51 - 200",
177
+ "title": "Senior Associate",
178
+ "location": "Menlo Park, California, United States",
179
+ "description": "",
180
+ "employment_type": "Full-time"
181
+ },
182
+ {
183
+ "start": {
184
+ "year": 2020,
185
+ "month": 11,
186
+ "day": null
187
+ },
188
+ "end": {
189
+ "year": 2024,
190
+ "month": 2,
191
+ "day": null
192
+ },
193
+ "company_name": "Accel-KKR",
194
+ "company_username": "accel-kkr",
195
+ "company_url": null,
196
+ "company_industry": "Venture Capital & Private Equity",
197
+ "company_staff_count_range": "51 - 200",
198
+ "title": "Investment Professional",
199
+ "location": "Menlo Park, California, United States",
200
+ "description": "",
201
+ "employment_type": "Full-time"
202
+ },
203
+ {
204
+ "start": {
205
+ "year": 2018,
206
+ "month": 7,
207
+ "day": null
208
+ },
209
+ "end": {
210
+ "year": 2020,
211
+ "month": 10,
212
+ "day": null
213
+ },
214
+ "company_name": "Stifel Financial Corp.",
215
+ "company_username": "stifel-financial-corp-",
216
+ "company_url": null,
217
+ "company_industry": "Financial Services",
218
+ "company_staff_count_range": "5001 - 10000",
219
+ "title": "Investment Banking Professional",
220
+ "location": "San Francisco Bay Area",
221
+ "description": "",
222
+ "employment_type": ""
223
+ },
224
+ {
225
+ "start": {
226
+ "year": 2017,
227
+ "month": 6,
228
+ "day": null
229
+ },
230
+ "end": {
231
+ "year": 2017,
232
+ "month": 8,
233
+ "day": null
234
+ },
235
+ "company_name": "Accel-KKR",
236
+ "company_username": "accel-kkr",
237
+ "company_url": null,
238
+ "company_industry": "Venture Capital & Private Equity",
239
+ "company_staff_count_range": "51 - 200",
240
+ "title": "Private Equity",
241
+ "location": "Menlo Park, CA",
242
+ "description": "",
243
+ "employment_type": ""
244
+ },
245
+ {
246
+ "start": {
247
+ "year": 2016,
248
+ "month": 6,
249
+ "day": null
250
+ },
251
+ "end": {
252
+ "year": 2016,
253
+ "month": 12,
254
+ "day": null
255
+ },
256
+ "company_name": "Securian Financial Group",
257
+ "company_username": "securian-financial",
258
+ "company_url": null,
259
+ "company_industry": "Financial Services",
260
+ "company_staff_count_range": "1001 - 5000",
261
+ "title": "Analyst",
262
+ "location": "Danville, California",
263
+ "description": "",
264
+ "employment_type": ""
265
+ }
266
+ ],
267
+ "skills": [
268
+ {
269
+ "name": "Microsoft Excel"
270
+ },
271
+ {
272
+ "name": "Leadership"
273
+ },
274
+ {
275
+ "name": "PowerPoint"
276
+ },
277
+ {
278
+ "name": "Research"
279
+ },
280
+ {
281
+ "name": "Public Speaking"
282
+ },
283
+ {
284
+ "name": "Project Management"
285
+ },
286
+ {
287
+ "name": "Strategic Planning"
288
+ },
289
+ {
290
+ "name": "Sales"
291
+ },
292
+ {
293
+ "name": "Sports"
294
+ },
295
+ {
296
+ "name": "Microsoft Office"
297
+ },
298
+ {
299
+ "name": "Microsoft Word"
300
+ },
301
+ {
302
+ "name": "Customer Service"
303
+ },
304
+ {
305
+ "name": "Management"
306
+ },
307
+ {
308
+ "name": "Microsoft PowerPoint"
309
+ },
310
+ {
311
+ "name": "Teamwork"
312
+ }
313
+ ],
314
+ "courses": null,
315
+ "certifications": null
316
+ }
tests/test_data/sample_profiles/siddharth_saxena.json ADDED
@@ -0,0 +1,625 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Siddharth",
3
+ "last_name": "Saxena",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/D4D03AQHgeX32k__sWw/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1713830613767?e=1731542400&v=beta&t=5T2Ps0uAVC3hiq4iTL4zmYbSpPn6zzZzEIFokzuSC0Q",
7
+ "summary": "",
8
+ "headline": "Investor @ Vedanta Capital",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "New York City Metropolitan Area",
12
+ "full": "New York City Metropolitan Area"
13
+ },
14
+ "languages": [
15
+ {
16
+ "name": "English",
17
+ "proficiency": "NATIVE_OR_BILINGUAL"
18
+ },
19
+ {
20
+ "name": "Japanese",
21
+ "proficiency": "LIMITED_WORKING"
22
+ }
23
+ ],
24
+ "educations": [
25
+ {
26
+ "start": {
27
+ "year": 2011,
28
+ "month": null,
29
+ "day": null
30
+ },
31
+ "end": {
32
+ "year": 2015,
33
+ "month": null,
34
+ "day": null
35
+ },
36
+ "field_of_study": "Architectural Studies",
37
+ "degree": "Bachelor of Arts (B.A.)",
38
+ "grade": "",
39
+ "school_name": "Brown University",
40
+ "description": "",
41
+ "activities": ""
42
+ },
43
+ {
44
+ "start": {
45
+ "year": 2004,
46
+ "month": null,
47
+ "day": null
48
+ },
49
+ "end": {
50
+ "year": 2011,
51
+ "month": null,
52
+ "day": null
53
+ },
54
+ "field_of_study": "",
55
+ "degree": "",
56
+ "grade": "",
57
+ "school_name": "Horace Mann School",
58
+ "description": "",
59
+ "activities": ""
60
+ }
61
+ ],
62
+ "positions": [
63
+ {
64
+ "start": {
65
+ "year": 2024,
66
+ "month": 4,
67
+ "day": null
68
+ },
69
+ "end": {
70
+ "year": null,
71
+ "month": null,
72
+ "day": null
73
+ },
74
+ "company_name": "Vedanta Capital",
75
+ "company_username": "vedacap",
76
+ "company_url": null,
77
+ "company_industry": "Venture Capital & Private Equity",
78
+ "company_staff_count_range": "2 - 10",
79
+ "title": "Investor",
80
+ "location": "New York, New York, United States",
81
+ "description": "Investing in start-ups (robotics, defense tech, VR/AR, space, AI/ML, health tech and more), and in venture and growth equity funds.",
82
+ "employment_type": "Full-time"
83
+ },
84
+ {
85
+ "start": {
86
+ "year": 2022,
87
+ "month": 8,
88
+ "day": null
89
+ },
90
+ "end": {
91
+ "year": 2024,
92
+ "month": 4,
93
+ "day": null
94
+ },
95
+ "company_name": "Vedanta Capital",
96
+ "company_username": "vedacap",
97
+ "company_url": null,
98
+ "company_industry": "Venture Capital & Private Equity",
99
+ "company_staff_count_range": "2 - 10",
100
+ "title": "Associate",
101
+ "location": "New York, New York, United States",
102
+ "description": "Investing in start-ups (robotics, defense tech, VR/AR, space, AI/ML, health tech and more), and in venture and growth equity funds.",
103
+ "employment_type": "Full-time"
104
+ },
105
+ {
106
+ "start": {
107
+ "year": 2024,
108
+ "month": 4,
109
+ "day": null
110
+ },
111
+ "end": {
112
+ "year": null,
113
+ "month": null,
114
+ "day": null
115
+ },
116
+ "company_name": "Carbon Origins Inc.",
117
+ "company_username": "carbon-origins",
118
+ "company_url": null,
119
+ "company_industry": "Information Technology & Services",
120
+ "company_staff_count_range": "2 - 10",
121
+ "title": "Advisor",
122
+ "location": "",
123
+ "description": "",
124
+ "employment_type": "Part-time"
125
+ },
126
+ {
127
+ "start": {
128
+ "year": 2020,
129
+ "month": 11,
130
+ "day": null
131
+ },
132
+ "end": {
133
+ "year": 2022,
134
+ "month": 4,
135
+ "day": null
136
+ },
137
+ "company_name": "Reactiv",
138
+ "company_username": "reactivrehab",
139
+ "company_url": null,
140
+ "company_industry": "Health, Wellness & Fitness",
141
+ "company_staff_count_range": "2 - 10",
142
+ "title": "Co-Founder & COO",
143
+ "location": "Brooklyn, New York, United States",
144
+ "description": "Reactiv (UnitedHealthcare / Techstars '21) is the virtual clinic for people with chronic joint pain, offering clinician support and interactive experiences to promote healthy movements.",
145
+ "employment_type": "Full-time"
146
+ },
147
+ {
148
+ "start": {
149
+ "year": 2019,
150
+ "month": 12,
151
+ "day": null
152
+ },
153
+ "end": {
154
+ "year": 2020,
155
+ "month": 10,
156
+ "day": null
157
+ },
158
+ "company_name": "Reactiv",
159
+ "company_username": "reactivrehab",
160
+ "company_url": null,
161
+ "company_industry": "Health, Wellness & Fitness",
162
+ "company_staff_count_range": "2 - 10",
163
+ "title": "Consultant, Technical & Product",
164
+ "location": "",
165
+ "description": "",
166
+ "employment_type": ""
167
+ },
168
+ {
169
+ "start": {
170
+ "year": 2015,
171
+ "month": 6,
172
+ "day": null
173
+ },
174
+ "end": {
175
+ "year": 2020,
176
+ "month": 10,
177
+ "day": null
178
+ },
179
+ "company_name": "Oblix",
180
+ "company_username": "oblix-vr",
181
+ "company_url": null,
182
+ "company_industry": "Computer Software",
183
+ "company_staff_count_range": "2 - 10",
184
+ "title": "Founder & CEO",
185
+ "location": "Greater New York City Area",
186
+ "description": "Oblix is an angel-funded, virtual reality start-up based in Brooklyn, NY, and the developer behind Go Guess, a social, geographic guessing game for the Oculus Rift and HTC Vive. Go Guess is currently live on the Oculus Store, Steam and Viveport.",
187
+ "employment_type": ""
188
+ },
189
+ {
190
+ "start": {
191
+ "year": 2019,
192
+ "month": 4,
193
+ "day": null
194
+ },
195
+ "end": {
196
+ "year": 2019,
197
+ "month": 8,
198
+ "day": null
199
+ },
200
+ "company_name": "GAROU",
201
+ "company_username": "mira.world",
202
+ "company_url": null,
203
+ "company_industry": "Computer Software",
204
+ "company_staff_count_range": "11 - 50",
205
+ "title": "Acting Chief Strategy Officer",
206
+ "location": "Greater New York City Area",
207
+ "description": "Acted as Chief Strategy Officer for Garou through a partnership with Oblix. Developed custom VR experiences for clients such as Viacom, Fujitsu and SNCF in entertainment, e-commerce and real estate. Developed and managed the Business Development pipeline. Led Garou's application to Verizon's Built on 5G Challenge, resulting in a $500K award.",
208
+ "employment_type": ""
209
+ },
210
+ {
211
+ "start": {
212
+ "year": 2014,
213
+ "month": 6,
214
+ "day": null
215
+ },
216
+ "end": {
217
+ "year": 2014,
218
+ "month": 8,
219
+ "day": null
220
+ },
221
+ "company_name": "Architizer",
222
+ "company_username": "architizer",
223
+ "company_url": null,
224
+ "company_industry": "Computer Software",
225
+ "company_staff_count_range": "11 - 50",
226
+ "title": "Intern",
227
+ "location": "",
228
+ "description": "Developed and led the Architecture Genome Project. Collaborated closely with Marc Kushner and TED on The Future of Architecture in 100 Buildings. Systematically identified and routed dirty data from Architizer servers.",
229
+ "employment_type": ""
230
+ },
231
+ {
232
+ "start": {
233
+ "year": 2012,
234
+ "month": 4,
235
+ "day": null
236
+ },
237
+ "end": {
238
+ "year": 2012,
239
+ "month": 9,
240
+ "day": null
241
+ },
242
+ "company_name": "CasualEat",
243
+ "company_username": "",
244
+ "company_url": null,
245
+ "company_industry": "",
246
+ "company_staff_count_range": "",
247
+ "title": "Co-Founder",
248
+ "location": "Providence, Rhode Island Area",
249
+ "description": "Developed a model alongside three other Brown University students to bring an internet-based product to food services businesses in India and the United Arab Emirates. Personally managed a team of Bangalore-based software developers and a Palo Alto-based graphic designer and organized workflow among the founding partners.",
250
+ "employment_type": ""
251
+ },
252
+ {
253
+ "start": {
254
+ "year": 2011,
255
+ "month": 8,
256
+ "day": null
257
+ },
258
+ "end": {
259
+ "year": 2011,
260
+ "month": 8,
261
+ "day": null
262
+ },
263
+ "company_name": "Weikfield Foods Private Limited",
264
+ "company_username": "",
265
+ "company_url": null,
266
+ "company_industry": "",
267
+ "company_staff_count_range": "",
268
+ "title": "Marketing Intern",
269
+ "location": "Pune, India",
270
+ "description": "Produced original marketing materials alongside another intern with oversight from senior management for this multi-generational food-products business.",
271
+ "employment_type": ""
272
+ },
273
+ {
274
+ "start": {
275
+ "year": 2011,
276
+ "month": 7,
277
+ "day": null
278
+ },
279
+ "end": {
280
+ "year": 2011,
281
+ "month": 8,
282
+ "day": null
283
+ },
284
+ "company_name": "Kirloskar Oil Engines Ltd",
285
+ "company_username": "kirloskar-oil-engines",
286
+ "company_url": null,
287
+ "company_industry": "Mechanical Or Industrial Engineering",
288
+ "company_staff_count_range": "5001 - 10000",
289
+ "title": "Intern",
290
+ "location": "",
291
+ "description": "Developed a comprehensive report detailing potential manufacturing and logistical improvements to shop-floor operating practices as defined by the Toyota Production System.",
292
+ "employment_type": ""
293
+ },
294
+ {
295
+ "start": {
296
+ "year": 2010,
297
+ "month": 6,
298
+ "day": null
299
+ },
300
+ "end": {
301
+ "year": 2010,
302
+ "month": 8,
303
+ "day": null
304
+ },
305
+ "company_name": "New Silk Route",
306
+ "company_username": "new-silk-route",
307
+ "company_url": null,
308
+ "company_industry": "Venture Capital & Private Equity",
309
+ "company_staff_count_range": "11 - 50",
310
+ "title": "Intern",
311
+ "location": "",
312
+ "description": "Led a team of interns in analyzing the social impact of this $1.4 billion Asia-focused private equity fund’s investments, measuring job creation and tax revenue generation among other data then distributed to limited partners.",
313
+ "employment_type": ""
314
+ }
315
+ ],
316
+ "full_positions": [
317
+ {
318
+ "start": {
319
+ "year": 2024,
320
+ "month": 4,
321
+ "day": null
322
+ },
323
+ "end": {
324
+ "year": null,
325
+ "month": null,
326
+ "day": null
327
+ },
328
+ "company_name": "Vedanta Capital",
329
+ "company_username": "vedacap",
330
+ "company_url": null,
331
+ "company_industry": "Venture Capital & Private Equity",
332
+ "company_staff_count_range": "2 - 10",
333
+ "title": "Investor",
334
+ "location": "New York, New York, United States",
335
+ "description": "Investing in start-ups (robotics, defense tech, VR/AR, space, AI/ML, health tech and more), and in venture and growth equity funds.",
336
+ "employment_type": "Full-time"
337
+ },
338
+ {
339
+ "start": {
340
+ "year": 2022,
341
+ "month": 8,
342
+ "day": null
343
+ },
344
+ "end": {
345
+ "year": 2024,
346
+ "month": 4,
347
+ "day": null
348
+ },
349
+ "company_name": "Vedanta Capital",
350
+ "company_username": "vedacap",
351
+ "company_url": null,
352
+ "company_industry": "Venture Capital & Private Equity",
353
+ "company_staff_count_range": "2 - 10",
354
+ "title": "Associate",
355
+ "location": "New York, New York, United States",
356
+ "description": "Investing in start-ups (robotics, defense tech, VR/AR, space, AI/ML, health tech and more), and in venture and growth equity funds.",
357
+ "employment_type": "Full-time"
358
+ },
359
+ {
360
+ "start": {
361
+ "year": 2024,
362
+ "month": 4,
363
+ "day": null
364
+ },
365
+ "end": {
366
+ "year": null,
367
+ "month": null,
368
+ "day": null
369
+ },
370
+ "company_name": "Carbon Origins Inc.",
371
+ "company_username": "carbon-origins",
372
+ "company_url": null,
373
+ "company_industry": "Information Technology & Services",
374
+ "company_staff_count_range": "2 - 10",
375
+ "title": "Advisor",
376
+ "location": "",
377
+ "description": "",
378
+ "employment_type": "Part-time"
379
+ },
380
+ {
381
+ "start": {
382
+ "year": 2020,
383
+ "month": 11,
384
+ "day": null
385
+ },
386
+ "end": {
387
+ "year": 2022,
388
+ "month": 4,
389
+ "day": null
390
+ },
391
+ "company_name": "Reactiv",
392
+ "company_username": "reactivrehab",
393
+ "company_url": null,
394
+ "company_industry": "Health, Wellness & Fitness",
395
+ "company_staff_count_range": "2 - 10",
396
+ "title": "Co-Founder & COO",
397
+ "location": "Brooklyn, New York, United States",
398
+ "description": "Reactiv (UnitedHealthcare / Techstars '21) is the virtual clinic for people with chronic joint pain, offering clinician support and interactive experiences to promote healthy movements.",
399
+ "employment_type": "Full-time"
400
+ },
401
+ {
402
+ "start": {
403
+ "year": 2019,
404
+ "month": 12,
405
+ "day": null
406
+ },
407
+ "end": {
408
+ "year": 2020,
409
+ "month": 10,
410
+ "day": null
411
+ },
412
+ "company_name": "Reactiv",
413
+ "company_username": "reactivrehab",
414
+ "company_url": null,
415
+ "company_industry": "Health, Wellness & Fitness",
416
+ "company_staff_count_range": "2 - 10",
417
+ "title": "Consultant, Technical & Product",
418
+ "location": "",
419
+ "description": "",
420
+ "employment_type": ""
421
+ },
422
+ {
423
+ "start": {
424
+ "year": 2015,
425
+ "month": 6,
426
+ "day": null
427
+ },
428
+ "end": {
429
+ "year": 2020,
430
+ "month": 10,
431
+ "day": null
432
+ },
433
+ "company_name": "Oblix",
434
+ "company_username": "oblix-vr",
435
+ "company_url": null,
436
+ "company_industry": "Computer Software",
437
+ "company_staff_count_range": "2 - 10",
438
+ "title": "Founder & CEO",
439
+ "location": "Greater New York City Area",
440
+ "description": "Oblix is an angel-funded, virtual reality start-up based in Brooklyn, NY, and the developer behind Go Guess, a social, geographic guessing game for the Oculus Rift and HTC Vive. Go Guess is currently live on the Oculus Store, Steam and Viveport.",
441
+ "employment_type": ""
442
+ },
443
+ {
444
+ "start": {
445
+ "year": 2019,
446
+ "month": 4,
447
+ "day": null
448
+ },
449
+ "end": {
450
+ "year": 2019,
451
+ "month": 8,
452
+ "day": null
453
+ },
454
+ "company_name": "GAROU",
455
+ "company_username": "mira.world",
456
+ "company_url": null,
457
+ "company_industry": "Computer Software",
458
+ "company_staff_count_range": "11 - 50",
459
+ "title": "Acting Chief Strategy Officer",
460
+ "location": "Greater New York City Area",
461
+ "description": "Acted as Chief Strategy Officer for Garou through a partnership with Oblix. Developed custom VR experiences for clients such as Viacom, Fujitsu and SNCF in entertainment, e-commerce and real estate. Developed and managed the Business Development pipeline. Led Garou's application to Verizon's Built on 5G Challenge, resulting in a $500K award.",
462
+ "employment_type": ""
463
+ },
464
+ {
465
+ "start": {
466
+ "year": 2014,
467
+ "month": 6,
468
+ "day": null
469
+ },
470
+ "end": {
471
+ "year": 2014,
472
+ "month": 8,
473
+ "day": null
474
+ },
475
+ "company_name": "Architizer",
476
+ "company_username": "architizer",
477
+ "company_url": null,
478
+ "company_industry": "Computer Software",
479
+ "company_staff_count_range": "11 - 50",
480
+ "title": "Intern",
481
+ "location": "",
482
+ "description": "Developed and led the Architecture Genome Project. Collaborated closely with Marc Kushner and TED on The Future of Architecture in 100 Buildings. Systematically identified and routed dirty data from Architizer servers.",
483
+ "employment_type": ""
484
+ },
485
+ {
486
+ "start": {
487
+ "year": 2012,
488
+ "month": 4,
489
+ "day": null
490
+ },
491
+ "end": {
492
+ "year": 2012,
493
+ "month": 9,
494
+ "day": null
495
+ },
496
+ "company_name": "CasualEat",
497
+ "company_username": "",
498
+ "company_url": null,
499
+ "company_industry": "",
500
+ "company_staff_count_range": "",
501
+ "title": "Co-Founder",
502
+ "location": "Providence, Rhode Island Area",
503
+ "description": "Developed a model alongside three other Brown University students to bring an internet-based product to food services businesses in India and the United Arab Emirates. Personally managed a team of Bangalore-based software developers and a Palo Alto-based graphic designer and organized workflow among the founding partners.",
504
+ "employment_type": ""
505
+ },
506
+ {
507
+ "start": {
508
+ "year": 2011,
509
+ "month": 8,
510
+ "day": null
511
+ },
512
+ "end": {
513
+ "year": 2011,
514
+ "month": 8,
515
+ "day": null
516
+ },
517
+ "company_name": "Weikfield Foods Private Limited",
518
+ "company_username": "",
519
+ "company_url": null,
520
+ "company_industry": "",
521
+ "company_staff_count_range": "",
522
+ "title": "Marketing Intern",
523
+ "location": "Pune, India",
524
+ "description": "Produced original marketing materials alongside another intern with oversight from senior management for this multi-generational food-products business.",
525
+ "employment_type": ""
526
+ },
527
+ {
528
+ "start": {
529
+ "year": 2011,
530
+ "month": 7,
531
+ "day": null
532
+ },
533
+ "end": {
534
+ "year": 2011,
535
+ "month": 8,
536
+ "day": null
537
+ },
538
+ "company_name": "Kirloskar Oil Engines Ltd",
539
+ "company_username": "kirloskar-oil-engines",
540
+ "company_url": null,
541
+ "company_industry": "Mechanical Or Industrial Engineering",
542
+ "company_staff_count_range": "5001 - 10000",
543
+ "title": "Intern",
544
+ "location": "",
545
+ "description": "Developed a comprehensive report detailing potential manufacturing and logistical improvements to shop-floor operating practices as defined by the Toyota Production System.",
546
+ "employment_type": ""
547
+ },
548
+ {
549
+ "start": {
550
+ "year": 2010,
551
+ "month": 6,
552
+ "day": null
553
+ },
554
+ "end": {
555
+ "year": 2010,
556
+ "month": 8,
557
+ "day": null
558
+ },
559
+ "company_name": "New Silk Route",
560
+ "company_username": "new-silk-route",
561
+ "company_url": null,
562
+ "company_industry": "Venture Capital & Private Equity",
563
+ "company_staff_count_range": "11 - 50",
564
+ "title": "Intern",
565
+ "location": "",
566
+ "description": "Led a team of interns in analyzing the social impact of this $1.4 billion Asia-focused private equity fund’s investments, measuring job creation and tax revenue generation among other data then distributed to limited partners.",
567
+ "employment_type": ""
568
+ }
569
+ ],
570
+ "skills": [
571
+ {
572
+ "name": "HTML"
573
+ },
574
+ {
575
+ "name": "CSS"
576
+ },
577
+ {
578
+ "name": "JavaScript"
579
+ },
580
+ {
581
+ "name": "jQuery"
582
+ },
583
+ {
584
+ "name": "PHP"
585
+ },
586
+ {
587
+ "name": "Photoshop"
588
+ },
589
+ {
590
+ "name": "Microsoft Office"
591
+ },
592
+ {
593
+ "name": "Microsoft Word"
594
+ },
595
+ {
596
+ "name": "Microsoft Excel"
597
+ },
598
+ {
599
+ "name": "PowerPoint"
600
+ },
601
+ {
602
+ "name": "Research"
603
+ },
604
+ {
605
+ "name": "Social Media"
606
+ },
607
+ {
608
+ "name": "Process Improvement"
609
+ },
610
+ {
611
+ "name": "English"
612
+ },
613
+ {
614
+ "name": "Public Speaking"
615
+ },
616
+ {
617
+ "name": "Customer Service"
618
+ },
619
+ {
620
+ "name": "Teamwork"
621
+ }
622
+ ],
623
+ "courses": null,
624
+ "certifications": null
625
+ }
tests/test_data/sample_profiles/zac_mohring.json ADDED
@@ -0,0 +1,363 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "first_name": "Zac",
3
+ "last_name": "Mohring",
4
+ "is_open_to_work": false,
5
+ "is_hiring": false,
6
+ "profile_picture": "https://media.licdn.com/dms/image/v2/D5603AQFTdCS9WznD7w/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1708043869042?e=1731542400&v=beta&t=kiIH3KY6CIXTRzuIEvyA2JpZSnbd6SR9Z3v2NXrParo",
7
+ "summary": "",
8
+ "headline": "Altos Ventures",
9
+ "geo": {
10
+ "country": "United States",
11
+ "city": "San Francisco, California",
12
+ "full": "San Francisco, California, United States"
13
+ },
14
+ "languages": [
15
+ {
16
+ "name": "English",
17
+ "proficiency": ""
18
+ },
19
+ {
20
+ "name": "German",
21
+ "proficiency": ""
22
+ },
23
+ {
24
+ "name": "Greek",
25
+ "proficiency": ""
26
+ },
27
+ {
28
+ "name": "Spanish",
29
+ "proficiency": ""
30
+ }
31
+ ],
32
+ "educations": [
33
+ {
34
+ "start": {
35
+ "year": null,
36
+ "month": null,
37
+ "day": null
38
+ },
39
+ "end": {
40
+ "year": null,
41
+ "month": null,
42
+ "day": null
43
+ },
44
+ "field_of_study": "",
45
+ "degree": "Master of Business Administration - MBA",
46
+ "grade": "",
47
+ "school_name": "Stanford University Graduate School of Business",
48
+ "description": "",
49
+ "activities": ""
50
+ },
51
+ {
52
+ "start": {
53
+ "year": null,
54
+ "month": null,
55
+ "day": null
56
+ },
57
+ "end": {
58
+ "year": null,
59
+ "month": null,
60
+ "day": null
61
+ },
62
+ "field_of_study": "Ethics, Politics & Economics",
63
+ "degree": "Bachelor of Arts (B.A.)",
64
+ "grade": "",
65
+ "school_name": "Yale University",
66
+ "description": "",
67
+ "activities": ""
68
+ },
69
+ {
70
+ "start": {
71
+ "year": null,
72
+ "month": null,
73
+ "day": null
74
+ },
75
+ "end": {
76
+ "year": null,
77
+ "month": null,
78
+ "day": null
79
+ },
80
+ "field_of_study": "",
81
+ "degree": "Study abroad",
82
+ "grade": "",
83
+ "school_name": "University of Cambridge",
84
+ "description": "",
85
+ "activities": ""
86
+ },
87
+ {
88
+ "start": {
89
+ "year": null,
90
+ "month": null,
91
+ "day": null
92
+ },
93
+ "end": {
94
+ "year": null,
95
+ "month": null,
96
+ "day": null
97
+ },
98
+ "field_of_study": "",
99
+ "degree": "High School Diploma",
100
+ "grade": "",
101
+ "school_name": "St. Paul Academy and Summit School",
102
+ "description": "",
103
+ "activities": ""
104
+ }
105
+ ],
106
+ "positions": [
107
+ {
108
+ "start": {
109
+ "year": 2022,
110
+ "month": null,
111
+ "day": null
112
+ },
113
+ "end": {
114
+ "year": null,
115
+ "month": null,
116
+ "day": null
117
+ },
118
+ "company_name": "Altos Ventures",
119
+ "company_username": "altos-ventures",
120
+ "company_url": null,
121
+ "company_industry": "Venture Capital & Private Equity",
122
+ "company_staff_count_range": "11 - 50",
123
+ "title": "Principal",
124
+ "location": "Menlo Park, California, United States",
125
+ "description": "",
126
+ "employment_type": ""
127
+ },
128
+ {
129
+ "start": {
130
+ "year": 2019,
131
+ "month": null,
132
+ "day": null
133
+ },
134
+ "end": {
135
+ "year": 2021,
136
+ "month": null,
137
+ "day": null
138
+ },
139
+ "company_name": "Darlington Partners",
140
+ "company_username": "darlington-partners-capital",
141
+ "company_url": null,
142
+ "company_industry": "Financial Services",
143
+ "company_staff_count_range": "2 - 10",
144
+ "title": "Analyst",
145
+ "location": "San Francisco Bay Area",
146
+ "description": "Darlington Partners is a value-oriented investment partnership that invests in a small number of high-quality companies with a multi-year investment horizon. Most investments are in US public equities, though the fund has a broad investment mandate.",
147
+ "employment_type": ""
148
+ },
149
+ {
150
+ "start": {
151
+ "year": 2018,
152
+ "month": null,
153
+ "day": null
154
+ },
155
+ "end": {
156
+ "year": 2019,
157
+ "month": null,
158
+ "day": null
159
+ },
160
+ "company_name": "Bain Capital",
161
+ "company_username": "bain-capital",
162
+ "company_url": null,
163
+ "company_industry": "Financial Services",
164
+ "company_staff_count_range": "1001 - 5000",
165
+ "title": "Private Equity Associate",
166
+ "location": "Greater Boston Area",
167
+ "description": "",
168
+ "employment_type": ""
169
+ },
170
+ {
171
+ "start": {
172
+ "year": 2016,
173
+ "month": null,
174
+ "day": null
175
+ },
176
+ "end": {
177
+ "year": 2018,
178
+ "month": null,
179
+ "day": null
180
+ },
181
+ "company_name": "Bain Capital",
182
+ "company_username": "bain-capital",
183
+ "company_url": null,
184
+ "company_industry": "Financial Services",
185
+ "company_staff_count_range": "1001 - 5000",
186
+ "title": "Private Equity Analyst",
187
+ "location": "Greater Boston Area",
188
+ "description": "",
189
+ "employment_type": ""
190
+ },
191
+ {
192
+ "start": {
193
+ "year": 2015,
194
+ "month": null,
195
+ "day": null
196
+ },
197
+ "end": {
198
+ "year": 2015,
199
+ "month": null,
200
+ "day": null
201
+ },
202
+ "company_name": "Bain Capital",
203
+ "company_username": "bain-capital",
204
+ "company_url": null,
205
+ "company_industry": "Financial Services",
206
+ "company_staff_count_range": "1001 - 5000",
207
+ "title": "Private Equity Summer Analyst",
208
+ "location": "",
209
+ "description": "",
210
+ "employment_type": "Internship"
211
+ }
212
+ ],
213
+ "full_positions": [
214
+ {
215
+ "start": {
216
+ "year": 2022,
217
+ "month": null,
218
+ "day": null
219
+ },
220
+ "end": {
221
+ "year": null,
222
+ "month": null,
223
+ "day": null
224
+ },
225
+ "company_name": "Altos Ventures",
226
+ "company_username": "altos-ventures",
227
+ "company_url": null,
228
+ "company_industry": "Venture Capital & Private Equity",
229
+ "company_staff_count_range": "11 - 50",
230
+ "title": "Principal",
231
+ "location": "Menlo Park, California, United States",
232
+ "description": "",
233
+ "employment_type": ""
234
+ },
235
+ {
236
+ "start": {
237
+ "year": 2019,
238
+ "month": null,
239
+ "day": null
240
+ },
241
+ "end": {
242
+ "year": 2021,
243
+ "month": null,
244
+ "day": null
245
+ },
246
+ "company_name": "Darlington Partners",
247
+ "company_username": "darlington-partners-capital",
248
+ "company_url": null,
249
+ "company_industry": "Financial Services",
250
+ "company_staff_count_range": "2 - 10",
251
+ "title": "Analyst",
252
+ "location": "San Francisco Bay Area",
253
+ "description": "Darlington Partners is a value-oriented investment partnership that invests in a small number of high-quality companies with a multi-year investment horizon. Most investments are in US public equities, though the fund has a broad investment mandate.",
254
+ "employment_type": ""
255
+ },
256
+ {
257
+ "start": {
258
+ "year": 2018,
259
+ "month": null,
260
+ "day": null
261
+ },
262
+ "end": {
263
+ "year": 2019,
264
+ "month": null,
265
+ "day": null
266
+ },
267
+ "company_name": "Bain Capital",
268
+ "company_username": "bain-capital",
269
+ "company_url": null,
270
+ "company_industry": "Financial Services",
271
+ "company_staff_count_range": "1001 - 5000",
272
+ "title": "Private Equity Associate",
273
+ "location": "Greater Boston Area",
274
+ "description": "",
275
+ "employment_type": ""
276
+ },
277
+ {
278
+ "start": {
279
+ "year": 2016,
280
+ "month": null,
281
+ "day": null
282
+ },
283
+ "end": {
284
+ "year": 2018,
285
+ "month": null,
286
+ "day": null
287
+ },
288
+ "company_name": "Bain Capital",
289
+ "company_username": "bain-capital",
290
+ "company_url": null,
291
+ "company_industry": "Financial Services",
292
+ "company_staff_count_range": "1001 - 5000",
293
+ "title": "Private Equity Analyst",
294
+ "location": "Greater Boston Area",
295
+ "description": "",
296
+ "employment_type": ""
297
+ },
298
+ {
299
+ "start": {
300
+ "year": 2015,
301
+ "month": null,
302
+ "day": null
303
+ },
304
+ "end": {
305
+ "year": 2015,
306
+ "month": null,
307
+ "day": null
308
+ },
309
+ "company_name": "Bain Capital",
310
+ "company_username": "bain-capital",
311
+ "company_url": null,
312
+ "company_industry": "Financial Services",
313
+ "company_staff_count_range": "1001 - 5000",
314
+ "title": "Private Equity Summer Analyst",
315
+ "location": "",
316
+ "description": "",
317
+ "employment_type": "Internship"
318
+ }
319
+ ],
320
+ "skills": [
321
+ {
322
+ "name": "Microsoft Excel"
323
+ },
324
+ {
325
+ "name": "Customer Service"
326
+ },
327
+ {
328
+ "name": "Microsoft Office"
329
+ },
330
+ {
331
+ "name": "Policy Analysis"
332
+ },
333
+ {
334
+ "name": "PowerPoint"
335
+ },
336
+ {
337
+ "name": "Microsoft Word"
338
+ },
339
+ {
340
+ "name": "Financial Analysis"
341
+ },
342
+ {
343
+ "name": "Analysis"
344
+ },
345
+ {
346
+ "name": "Financial Modeling"
347
+ },
348
+ {
349
+ "name": "Leadership"
350
+ },
351
+ {
352
+ "name": "Editing"
353
+ },
354
+ {
355
+ "name": "Public Speaking"
356
+ },
357
+ {
358
+ "name": "Data Analysis"
359
+ }
360
+ ],
361
+ "courses": null,
362
+ "certifications": null
363
+ }
tests/test_data/sample_profiles_classified/chanson_zhao.json ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "general": {
3
+ "linkedin_url": "https://www.linkedin.com/in/chansonzhao/",
4
+ "first_name": "Chanson",
5
+ "last_name": "Zhao",
6
+ "current_location": "San Francisco, CA"
7
+ },
8
+ "education": {
9
+ "undergraduate_school": "University of Southern California",
10
+ "undergraduate_year": 2022,
11
+ "graduate_school": null,
12
+ "graduate_school_year": null,
13
+ "education_history": [
14
+ {
15
+ "school": "University of Southern California",
16
+ "beginning_year": 2018,
17
+ "ending_year": 2022,
18
+ "degree_type": "Bachelor of Science - BS, Business Administration and Management, general",
19
+ "degree_characterization": "Undergraduate (Completed)",
20
+ "school_type": "Higher Education",
21
+ "school_location": "Los Angeles, CA"
22
+ },
23
+ {
24
+ "school": "Valencia High School",
25
+ "beginning_year": 2014,
26
+ "ending_year": 2018,
27
+ "degree_type": "High School Diploma",
28
+ "degree_characterization": "Primary / Secondary School",
29
+ "school_type": "Primary and Secondary School",
30
+ "school_location": "Valencia, CA"
31
+ }
32
+ ]
33
+ },
34
+ "professional_experience": {
35
+ "total_years_of_experience": 2.0,
36
+ "experience_by_secondary_job_type": {
37
+ "investing": 0.0,
38
+ "back_office": null,
39
+ "investment_banking": null,
40
+ "consulting": null,
41
+ "engineering": null,
42
+ "entrepreneur_founder": null,
43
+ "corpdev_strategy": null,
44
+ "Other": null
45
+ },
46
+ "linkedin_title": "Investment Banking Analyst at Barclays",
47
+ "experience_history": [
48
+ {
49
+ "company": "Barclays",
50
+ "title": "Investment Banking Analyst",
51
+ "location": "San Francisco, CA",
52
+ "start_date": "07/2022",
53
+ "end_date": "Current",
54
+ "duration": "2 (2/12) years",
55
+ "description": "Technology Coverage",
56
+ "primary_job_type": "Full-time",
57
+ "secondary_job_type": "Investment Banking",
58
+ "investing_focus_stage": null,
59
+ "investing_focus_sector": null,
60
+ "investment_banking_focus": "Technology / Software / TMT"
61
+ },
62
+ {
63
+ "company": "University of Southern California - Marshall School of Business",
64
+ "title": "Portfolio Manager - Undergraduate Student Investment Fund (USIF)",
65
+ "location": "Los Angeles, CA",
66
+ "start_date": "03/2021",
67
+ "end_date": "05/2022",
68
+ "duration": "1 (3 / 12) years",
69
+ "description": "AUM: $5.3MM",
70
+ "primary_job_type": "Extracurricular",
71
+ "secondary_job_type": "Investing",
72
+ "investing_focus_stage": null,
73
+ "investing_focus_sector": null,
74
+ "investment_banking_focus": null
75
+ },
76
+ {
77
+ "company": "Barclays",
78
+ "title": "Investment Banking Summer Analyst",
79
+ "location": "San Francisco, CA",
80
+ "start_date": "06/2021",
81
+ "end_date": "08/2021",
82
+ "duration": "(3 / 12) years",
83
+ "description": "Technology Coverage",
84
+ "primary_job_type": "Internship",
85
+ "secondary_job_type": "Investment Banking",
86
+ "investing_focus_stage": "Investment Banking",
87
+ "investing_focus_sector": null,
88
+ "investment_banking_focus": "Technology / Software / TMT"
89
+ },
90
+ {
91
+ "company": "Delta Sigma Pi",
92
+ "title": "VP Finance",
93
+ "location": "Los Angeles, CA",
94
+ "start_date": "02/2019",
95
+ "end_date": "06/2021",
96
+ "duration": "2 (5/12) years",
97
+ "description": null,
98
+ "primary_job_type": "Extracurricular",
99
+ "secondary_job_type": null,
100
+ "investing_focus_stage": null,
101
+ "investing_focus_sector": null,
102
+ "investment_banking_focus": null
103
+ },
104
+ {
105
+ "company": "Trojan Investing Society",
106
+ "title": "Senior Vice President",
107
+ "location": "Los Angeles, CA",
108
+ "start_date": "11/2019",
109
+ "end_date": "12/2020",
110
+ "duration": "2 (1/12) years",
111
+ "description": "USC's premier undergraduate finance organization comprised of 450+ members",
112
+ "primary_job_type": "Extracurricular",
113
+ "secondary_job_type": null,
114
+ "investing_focus_stage": null,
115
+ "investing_focus_sector": null,
116
+ "investment_banking_focus": null
117
+ },
118
+ {
119
+ "company": "Trojan Investing Society",
120
+ "title": "Mentorship Program",
121
+ "location": "Los Angeles, CA",
122
+ "start_date": "01/2020",
123
+ "end_date": "06/2020",
124
+ "duration": "(6/12) years",
125
+ "description": "",
126
+ "primary_job_type": "Extracurricular",
127
+ "secondary_job_type": null,
128
+ "investing_focus_stage": null,
129
+ "investing_focus_sector": null,
130
+ "investment_banking_focus": null
131
+ },
132
+ {
133
+ "company": "Trojan Investing Society",
134
+ "title": "Leaders Program",
135
+ "location": "Los Angeles, CA",
136
+ "start_date": "08/2019",
137
+ "end_date": "11/2020",
138
+ "duration": "(3/12) years",
139
+ "description": "",
140
+ "primary_job_type": "Extracurricular",
141
+ "secondary_job_type": null,
142
+ "investing_focus_stage": null,
143
+ "investing_focus_sector": null,
144
+ "investment_banking_focus": null
145
+ },
146
+ {
147
+ "company": "Teleo Capital",
148
+ "title": "Private Equity Intern",
149
+ "location": "Los Angeles, CA",
150
+ "start_date": "05/2020",
151
+ "end_date": "08/2020",
152
+ "duration": "(3/12) years",
153
+ "description": "Private equity firm targeting opportunities in the software & technology, healthcare IT, and industrial sectors",
154
+ "primary_job_type": "Internship",
155
+ "secondary_job_type": "Investing",
156
+ "investing_focus_stage": "Private Equity / Buyouts",
157
+ "investing_focus_sector": null,
158
+ "investment_banking_focus": null
159
+ },
160
+ {
161
+ "company": "Business Technology Group",
162
+ "title": "VP Operations",
163
+ "location": "Los Angeles, CA",
164
+ "start_date": "08/2019",
165
+ "end_date": "01/2020",
166
+ "duration": "(6 / 12) years",
167
+ "description": null,
168
+ "primary_job_type": "Internship",
169
+ "secondary_job_type": "Other",
170
+ "investing_focus_stage": null,
171
+ "investing_focus_sector": null,
172
+ "investment_banking_focus": null
173
+ },
174
+ {
175
+ "company": "USC Association of Innovative Marketing (AIM) Consulting",
176
+ "title": "Consultant",
177
+ "location": "Los Angeles, CA",
178
+ "start_date": "02/2019",
179
+ "end_date": "08/2019",
180
+ "duration": "(7 / 12) years",
181
+ "description": null,
182
+ "primary_job_type": "Extracurricular",
183
+ "secondary_job_type": "Other",
184
+ "investing_focus_stage": null,
185
+ "investing_focus_sector": null,
186
+ "investment_banking_focus": null
187
+ }
188
+ ]
189
+ }
190
+ }
tests/test_data/sample_profiles_classified/eric_armagost.json ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "general": {
3
+ "linkedin_url": "https://www.linkedin.com/in/eric-armagost-a144904a/",
4
+ "first_name": "Eric",
5
+ "last_name": "Armagost",
6
+ "current_location": "San Francisco, CA"
7
+ },
8
+ "education": {
9
+ "undergraduate_school": "Brown University",
10
+ "undergraduate_year": 2013,
11
+ "graduate_school": null,
12
+ "graduate_school_year": null,
13
+ "education_history": [
14
+ {
15
+ "school": "Brown University",
16
+ "beginning_year": null,
17
+ "ending_year": null,
18
+ "degree_type": "Bachelor of Arts (B.A.), Business Economics",
19
+ "degree_characterization": "Undergraduate (Completed)",
20
+ "school_type": "Higher Education",
21
+ "school_location": "Providence, RI"
22
+ }
23
+ ]
24
+ },
25
+ "professional_experience": {
26
+ "total_years_of_experience": 11.0,
27
+ "experience_by_secondary_job_type": {
28
+ "investing": 7.3,
29
+ "back_office": null,
30
+ "investment_banking": null,
31
+ "consulting": null,
32
+ "engineering": null,
33
+ "entrepreneur_founder": null,
34
+ "corpdev_strategy": null,
35
+ "Other": null
36
+ },
37
+ "linkedin_title": "Investor at Accel-KKR",
38
+ "experience_history": [
39
+ {
40
+ "company": "Accel-KKR",
41
+ "title": "Investment Professional",
42
+ "location": "Menlo Park, CA",
43
+ "start_date": "05/2017",
44
+ "end_date": "Current",
45
+ "duration": "7 (3 / 12) years",
46
+ "description": "Founded in 2000, Accel-KKR is a leading technology-focused private equity firm dedicated exclusively to investing in software and technology-enabled services companies. \n\nOur typical transactions include: \n• Acquisitions and recapitalizations of founder-owned or closely-held private companies \n• Buyouts of divisions, subsidiaries and business units from public companies \n• Take-private transactions of small public companies\n• Structured minority equity and debt investments\n\nwww.accel-kkr.com",
47
+ "primary_job_type": "Full-time",
48
+ "secondary_job_type": "Investing",
49
+ "investing_focus_stage": "Growth Equity",
50
+ "investing_focus_sector": null,
51
+ "investment_banking_focus": null
52
+ },
53
+ {
54
+ "company": "William Blair & Company",
55
+ "title": null,
56
+ "location": "Chicago, Illinois",
57
+ "start_date": "06/2015",
58
+ "end_date": "05/2017",
59
+ "duration": "2 years",
60
+ "description": null,
61
+ "primary_job_type": "Full-time",
62
+ "secondary_job_type": "Investment Banking",
63
+ "investing_focus_stage": null,
64
+ "investing_focus_sector": null,
65
+ "investment_banking_focus": "Not Specified"
66
+ },
67
+ {
68
+ "company": "Fidelity Investments",
69
+ "title": null,
70
+ "location": "Smithfiled, Rhode Island",
71
+ "start_date": "06/2014",
72
+ "end_date": "05/2015",
73
+ "duration": "1 year",
74
+ "description": null,
75
+ "primary_job_type": "Full-time",
76
+ "secondary_job_type": "Other",
77
+ "investing_focus_stage": "Other - [ ]",
78
+ "investing_focus_sector": null,
79
+ "investment_banking_focus": null
80
+ },
81
+ {
82
+ "company": "Fidelity Investments",
83
+ "title": null,
84
+ "location": "Smithfield, Rhode Island",
85
+ "start_date": "06/2013",
86
+ "end_date": "05/2014",
87
+ "duration": "1 year",
88
+ "description": null,
89
+ "primary_job_type": "Full-time",
90
+ "secondary_job_type": "Other",
91
+ "investing_focus_stage": "Other - [ ]",
92
+ "investing_focus_sector": null,
93
+ "investment_banking_focus": null
94
+ }
95
+ ]
96
+ }
97
+ }
tests/test_data/sample_profiles_classified/hansae_catlett.json ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "general": {
3
+ "linkedin_url": "https://www.linkedin.com/in/hansae-catlett-436a9b21/details/experience/",
4
+ "first_name": "Hansae",
5
+ "last_name": "Catlett",
6
+ "current_location": null
7
+ },
8
+ "education": {
9
+ "undergraduate_school": "Harvard University",
10
+ "undergraduate_year": 2011,
11
+ "graduate_school": "Stanford",
12
+ "graduate_school_year": 2019,
13
+ "education_history": [
14
+ {
15
+ "school": "Stanford University Graduate School of Business",
16
+ "beginning_year": 2016,
17
+ "ending_year": 2019,
18
+ "degree_type": "Master of Business Administration, M.B.A.",
19
+ "degree_characterization": "MBA",
20
+ "school_type": "Higher Education",
21
+ "school_location": "Stanford, CA"
22
+ },
23
+ {
24
+ "school": "Stanford University",
25
+ "beginning_year": 2016,
26
+ "ending_year": 2019,
27
+ "degree_type": "Master of Public Policy (M.P.P.)",
28
+ "degree_characterization": "graduate_school",
29
+ "school_type": "Higher Education",
30
+ "school_location": "Stanford, CA"
31
+ },
32
+ {
33
+ "school": "Harvard University",
34
+ "beginning_year": 2007,
35
+ "ending_year": 2011,
36
+ "degree_type": "Bachelor of Arts, Biomedical Engineering, Philosophy",
37
+ "degree_characterization": "Undergraduate (Completed)",
38
+ "school_type": "Higher Education",
39
+ "school_location": "Cambridge, MA"
40
+ },
41
+ {
42
+ "school": "UNSW",
43
+ "beginning_year": null,
44
+ "ending_year": null,
45
+ "degree_type": "Engineering, Philosophy, Finance",
46
+ "degree_characterization": "Undergraduate (Incomplete)",
47
+ "school_type": "Higher Education",
48
+ "school_location": "Sydney, New South Wales"
49
+ }
50
+ ]
51
+ },
52
+ "professional_experience": {
53
+ "total_years_of_experience": 13.0,
54
+ "experience_by_secondary_job_type": {
55
+ "investing": 9.2,
56
+ "back_office": null,
57
+ "investment_banking": null,
58
+ "consulting": null,
59
+ "engineering": null,
60
+ "entrepreneur_founder": null,
61
+ "corpdev_strategy": null,
62
+ "Other": null
63
+ },
64
+ "linkedin_title": "Partner at HOF Capital | Co-founder & GP at The MBA Fund",
65
+ "experience_history": [
66
+ {
67
+ "company": "HOF Capital",
68
+ "title": "Partner",
69
+ "location": "New York, New York",
70
+ "start_date": "04/2024",
71
+ "end_date": "Present",
72
+ "duration": "(6 / 12) years",
73
+ "description": null,
74
+ "primary_job_type": "Full-time",
75
+ "secondary_job_type": "Investing",
76
+ "investing_focus_stage": "Multi-stage VC",
77
+ "investing_focus_sector": null,
78
+ "investment_banking_focus": null
79
+ },
80
+ {
81
+ "company": "The MBA Fund",
82
+ "title": "Co-Founder, General Partner",
83
+ "location": "San Francisco, CA",
84
+ "start_date": "2018",
85
+ "end_date": "Present",
86
+ "duration": "6 (8 / 12) years",
87
+ "description": "The MBA Fund is a venture capital firm that helps founders from the top startup-producing universities create legendary companies. We most frequently back student, alumni and dropout founders from Harvard, Stanford, and Wharton (expanding presence nationally!). \n\nWe're a community of investors and operators who aren't afraid to take the riskiest leaps with founders who are just getting started. Our backers include top-tier VC firms, repeat founders, experienced execs, and super angels with ties to the communities where we invest. This network is ready and willing to help founders in our portfolio with financing, hiring, customer growth and more.\n\nSelect investments include:\n* Jeeves ($2B)\n* Dandy ($1B)\n* TRM Labs ($600M+)\n* Hightouch ($450M+)\n* Luxury Presence ($200M+)\n* FlutterFlow ($150M+)\n* Legacy ($150M+)\n* Seso ($150M+)\n* Peachy ($100M+)",
88
+ "primary_job_type": "Other",
89
+ "secondary_job_type": "Investing",
90
+ "investing_focus_stage": "Early-stage VC",
91
+ "investing_focus_sector": null,
92
+ "investment_banking_focus": null
93
+ },
94
+ {
95
+ "company": "Bessemer Venture Partners",
96
+ "title": "Vice President",
97
+ "location": "New York, New York",
98
+ "start_date": "07/2019",
99
+ "end_date": "02/2024",
100
+ "duration": "4 (8 / 12) years",
101
+ "description": null,
102
+ "primary_job_type": "Full-time",
103
+ "secondary_job_type": "Investing",
104
+ "investing_focus_stage": "Multi-stage VC",
105
+ "investing_focus_sector": null,
106
+ "investment_banking_focus": null
107
+ },
108
+ {
109
+ "company": "Omidyar Network",
110
+ "title": "Venture Associate",
111
+ "location": "San Francisco, CA",
112
+ "start_date": "2017",
113
+ "end_date": "2018",
114
+ "duration": "1 year",
115
+ "description": null,
116
+ "primary_job_type": "Internship",
117
+ "secondary_job_type": "Investing",
118
+ "investing_focus_stage": null,
119
+ "investing_focus_sector": null,
120
+ "investment_banking_focus": null
121
+ },
122
+ {
123
+ "company": "Slow Ventures",
124
+ "title": "Venture Associate",
125
+ "location": "San Francisco, CA",
126
+ "start_date": "2016",
127
+ "end_date": "2017",
128
+ "duration": "1 year",
129
+ "description": null,
130
+ "primary_job_type": "Internship",
131
+ "secondary_job_type": "Investing",
132
+ "investing_focus_stage": null,
133
+ "investing_focus_sector": null,
134
+ "investment_banking_focus": null
135
+ },
136
+ {
137
+ "company": "The Bridgespan Group",
138
+ "title": "Venture Investor & Consultant",
139
+ "location": "San Francisco, CA",
140
+ "start_date": "09/2013",
141
+ "end_date": "09/2016",
142
+ "duration": "3 (1 /12) years",
143
+ "description": "Led/Co-led Seed through Series C financings for biomedical informatics/computational biology, enterprise & edtech startups on behalf of Intuit founder, Scott Cook's family office.",
144
+ "primary_job_type": "Full-time",
145
+ "secondary_job_type": "Early-stage VC",
146
+ "investing_focus_stage": null,
147
+ "investing_focus_sector": null,
148
+ "investment_banking_focus": null
149
+ },
150
+ {
151
+ "company": "Soundscope",
152
+ "title": "Co-Founder & Head of Product",
153
+ "location": "New York, New York",
154
+ "start_date": "2012",
155
+ "end_date": "2014",
156
+ "duration": "2 years",
157
+ "description": "Musician/entertainer discovery & data analytics application based on research conducted at Duke University on how people move through cities and engage with mobile devices. Acquired in 2015.",
158
+ "primary_job_type": "Full-time",
159
+ "secondary_job_type": "Entrepreneur / Founder",
160
+ "investing_focus_stage": null,
161
+ "investing_focus_sector": null,
162
+ "investment_banking_focus": null
163
+ },
164
+ {
165
+ "company": "Pacific Community Ventures",
166
+ "title": "Venture Analyst",
167
+ "location": "San Francisco, CA",
168
+ "start_date": "09/2011",
169
+ "end_date": "07/2012",
170
+ "duration": "(11 / 12) years",
171
+ "description": null,
172
+ "primary_job_type": "Full-time",
173
+ "secondary_job_type": "Investing",
174
+ "investing_focus_stage": null,
175
+ "investing_focus_sector": null,
176
+ "investment_banking_focus": null
177
+ }
178
+ ]
179
+ }
180
+ }
tests/test_data/sample_profiles_classified/jake_kugler.json ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "general": {
3
+ "linkedin_url": "https://www.linkedin.com/in/jake-kugler-0371a958/",
4
+ "first_name": "Jake",
5
+ "last_name": "Kugler",
6
+ "current_location": null
7
+ },
8
+ "education": {
9
+ "undergraduate_school": "Northeastern University",
10
+ "undergraduate_year": 2015,
11
+ "graduate_school": "Harvard University",
12
+ "graduate_school_year": 2024,
13
+ "education_history": [
14
+ {
15
+ "school": "Harvard Business School",
16
+ "beginning_year": 2022,
17
+ "ending_year": "Present",
18
+ "degree_type": "Master of Business Administration - MBA",
19
+ "degree_characterization": "MBA",
20
+ "school_type": "Higher Education",
21
+ "school_location": "Boston, MA"
22
+ },
23
+ {
24
+ "school": "Northeastern University",
25
+ "beginning_year": 2011,
26
+ "ending_year": 2015,
27
+ "degree_type": "BSBA, Finance",
28
+ "degree_characterization": "Undergraduate (Completed)",
29
+ "school_type": "Higher Education",
30
+ "school_location": null
31
+ }
32
+ ]
33
+ },
34
+ "professional_experience": {
35
+ "total_years_of_experience": 9.0,
36
+ "experience_by_secondary_job_type": {
37
+ "investing": 5.1,
38
+ "back_office": null,
39
+ "investment_banking": null,
40
+ "consulting": null,
41
+ "engineering": null,
42
+ "entrepreneur_founder": null,
43
+ "corpdev_strategy": null,
44
+ "Other": null
45
+ },
46
+ "linkedin_title": "MBA Candidate at Harvard Busine School",
47
+ "experience_history": [
48
+ {
49
+ "company": "Harvard Business School",
50
+ "title": "MBA Candidate",
51
+ "location": "Boston, MA",
52
+ "start_date": "08/2022",
53
+ "end_date": "Present",
54
+ "duration": "2 years",
55
+ "description": "[ ]",
56
+ "primary_job_type": "Other",
57
+ "secondary_job_type": "Other",
58
+ "investing_focus_stage": null,
59
+ "investing_focus_sector": null,
60
+ "investment_banking_focus": null
61
+ },
62
+ {
63
+ "company": "Declaration Partners",
64
+ "title": "Advisor - Growth Equity",
65
+ "location": "New York, New York",
66
+ "start_date": "01/2022",
67
+ "end_date": "07/2022",
68
+ "duration": "(7 / 12) years",
69
+ "description": "BayPine's Sister Firm. Anchored by the family office of Carlyle Co-Founder and philanthropist David M. Rubenstein, Declaration is a private investment firm with approximately $2.5B in AUM.",
70
+ "primary_job_type": "Advisory / Board / Independent Investor",
71
+ "secondary_job_type": "Investing",
72
+ "investing_focus_stage": "Growth Equity",
73
+ "investing_focus_sector": null,
74
+ "investment_banking_focus": null
75
+ },
76
+ {
77
+ "company": "BayPine",
78
+ "title": "Investment Professional",
79
+ "location": "New York, New York",
80
+ "start_date": "09/2020",
81
+ "end_date": "08/2022",
82
+ "duration": "1 (11 / 12) years",
83
+ "description": null,
84
+ "primary_job_type": "Full-time",
85
+ "secondary_job_type": "Investing",
86
+ "investing_focus_stage": "Private Equity / Buyouts",
87
+ "investing_focus_sector": null,
88
+ "investment_banking_focus": "generalist"
89
+ },
90
+ {
91
+ "company": "General Atlantic",
92
+ "title": "Investment Professional",
93
+ "location": "San Francisco, CA",
94
+ "start_date": "07/2017",
95
+ "end_date": "08/2020",
96
+ "duration": "3 (2 / 12) years",
97
+ "description": "Technology Group",
98
+ "primary_job_type": "Full-time",
99
+ "secondary_job_type": "Investing",
100
+ "investing_focus_stage": "Growth Equity",
101
+ "investing_focus_sector": "Technology / Software / TMT",
102
+ "investment_banking_focus": null
103
+ },
104
+ {
105
+ "company": "Morgan Stanley",
106
+ "title": "Investment Banking",
107
+ "location": "New York, New York",
108
+ "start_date": "06/2015",
109
+ "end_date": "08/2017",
110
+ "duration": "2 (2 / 12) years",
111
+ "description": null,
112
+ "primary_job_type": "Full-time",
113
+ "secondary_job_type": "Investment Banking",
114
+ "investing_focus_stage": null,
115
+ "investing_focus_sector": null,
116
+ "investment_banking_focus": "Not Specified"
117
+ }
118
+ ]
119
+ }
120
+ }