kerplunk-ai-prompts 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/kerplunk/ai/prompts/prompt_handler.rb +9 -0
- data/lib/kerplunk/ai/prompts/templates/analysis/interview.rb +2 -1
- data/lib/kerplunk/ai/prompts/templates/generation/candidate_search_criteria.rb +281 -0
- data/lib/kerplunk/ai/prompts/templates/generation/invite_to_apply_email.rb +55 -0
- data/lib/kerplunk/ai/prompts/templates/generation/invite_to_apply_follow_up_email.rb +56 -0
- data/lib/kerplunk/ai/prompts/version.rb +1 -1
- data/lib/kerplunk/ai/prompts.rb +4 -1
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b80255cf1b766738586974f053777b1b6b62ed948524022b76828d22aa3fe99c
|
4
|
+
data.tar.gz: 1b9d2209522821095b0296f1a883e60f8f8e2e9ed3b7eda77ebc86b25195b693
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dec853757d9fb09e88db14653e6d1608ce505f873267f75c67199bbe740863c00f419c2ebb3cc92dd87695cf47050e8010a98fa0344b42f8bd758625507354d2
|
7
|
+
data.tar.gz: eaa3646cb5d7f2453a1bbcafb6ebcdf9d14ecc517664013f66f32771dfafda00374955e501e888739b3a6df29230a30085b6fbd5c54e65ac413110c8ae6818a8
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require_relative "templates/generation/interview_questions"
|
2
2
|
require_relative "templates/generation/job_description"
|
3
|
+
require_relative "templates//generation/candidate_search_criteria"
|
4
|
+
require_relative "templates//generation/invite_to_apply_email"
|
5
|
+
require_relative "templates//generation/invite_to_apply_follow_up_email"
|
3
6
|
require_relative "templates/analysis/interview"
|
4
7
|
require_relative "templates/analysis/interview_question"
|
5
8
|
require_relative "templates/analysis/resume"
|
@@ -25,6 +28,12 @@ module Kerplunk
|
|
25
28
|
Templates::Generation::InterviewQuestions.generate_prompt(*args)
|
26
29
|
when :job_description
|
27
30
|
Templates::Generation::JobDescription.generate_prompt(*args)
|
31
|
+
when :invite_to_apply_email
|
32
|
+
Templates::Generation::InviteToApplyEmail.generate_prompt
|
33
|
+
when :invite_to_apply_follow_up_email
|
34
|
+
Templates::Generation::InviteToApplyFollowUpEmail.generate_prompt
|
35
|
+
when :candidate_search_criteria
|
36
|
+
Templates::Generation::CandidateSearchCriteria.generate_prompt(*args)
|
28
37
|
when :interview_question_analysis
|
29
38
|
Templates::Analysis::InterviewQuestion.generate_prompt(*args)
|
30
39
|
when :interview_analysis
|
@@ -124,7 +124,8 @@ module Kerplunk
|
|
124
124
|
=== The Job Description
|
125
125
|
#{job_description}
|
126
126
|
|
127
|
-
=== The Interview Questions with the Transcript of the Interview Answers (some answers may have a score from a previous analysis, please aggregate these scores by category). Some Interview Questions will provide an array of suggested answers, please evaluate the Transcript answer against the suggested answers where each one could be the correct answer.
|
127
|
+
=== The Interview Questions with the Transcript of the Interview Answers (some answers may have a score from a previous analysis, please aggregate these scores by category). Some Interview Questions will provide an array of suggested answers, please evaluate the Transcript answer against the suggested answers where each one could be the correct answer. For yes/no questions without suggested answers, do not include them in the scoring.
|
128
|
+
|
128
129
|
|
129
130
|
#{question_answer_prompts.join("\n\n")}
|
130
131
|
PROMPT
|
@@ -0,0 +1,281 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kerplunk
|
4
|
+
module AI
|
5
|
+
module Prompts
|
6
|
+
module Templates
|
7
|
+
module Generation
|
8
|
+
# The CandidateSearchCriteria class is responsible for generating a prompt for search criteria
|
9
|
+
# for the search for potential candidates
|
10
|
+
class CandidateSearchCriteria # rubocop:disable Metrics/ClassLength
|
11
|
+
# Generates a candidate search prompt for a given search input.
|
12
|
+
#
|
13
|
+
# @param search_query [String] the search string input to extract job search keywords from
|
14
|
+
# @return [String] the generated candidate search prompt
|
15
|
+
def self.generate_prompt(search_query) # rubocop:disable Metrics/MethodLength
|
16
|
+
raise ArgumentError, "search_query is required" if search_query.nil? || search_query.empty?
|
17
|
+
|
18
|
+
<<~PROMPT
|
19
|
+
Respond with a RAW JSON object only. Do not include any explanatory text outside the JSON.
|
20
|
+
|
21
|
+
You are an expert technical recruiter seeking to build a query criteria for searching for potential job candidates.
|
22
|
+
|
23
|
+
You need to analyse a search query provided to you and build a search criteria object that is an array of all the possible field/operator/value objects out of it.
|
24
|
+
Additionally in the output you need to split the search query into keywords as well.
|
25
|
+
|
26
|
+
=== The Search Query
|
27
|
+
#{search_query}
|
28
|
+
|
29
|
+
Search Query Example 1: Experienced software engineer who lives in Austin TX.
|
30
|
+
Example output 1: {
|
31
|
+
"search_criteria": [
|
32
|
+
{ "field": "job_title", operator: "=", value: "software engineer" },
|
33
|
+
{ "field": "location_name", operator: "=", value: "austin, texas, united states" },
|
34
|
+
{ "field": "experience.num_sources", operator: ">", value: 2 }
|
35
|
+
],
|
36
|
+
keywords: {
|
37
|
+
name: "Experienced Software Engineer",
|
38
|
+
geography: "Austin, Texas, USA",
|
39
|
+
location: "Austin, Texas, USA"
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
Search Query Example 2: Software engineers at google with 5+ years of experience.
|
44
|
+
Example output 1: {
|
45
|
+
"search_criteria": [
|
46
|
+
{ "field": "job_title", operator: "=", value: "software engineer" },
|
47
|
+
{ "field": "job_company_name", operator: "=", value: "google" },
|
48
|
+
{ "field": "experience.num_sources", operator: ">", value: 5 }
|
49
|
+
],
|
50
|
+
keywords: {
|
51
|
+
name: "Experienced Software Engineer",
|
52
|
+
geography: "",
|
53
|
+
location: ""
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
=== VALUES FOR FIELD KEY
|
58
|
+
The possible values for the "field" key in each object should basically be picked out according to the following criteria:
|
59
|
+
|
60
|
+
birth_date: The day the person was born
|
61
|
+
birth_year: The year the person was born
|
62
|
+
countries: All countries associated with the person
|
63
|
+
education: The person's education information
|
64
|
+
education.summary: User-inputted summary of their education
|
65
|
+
education.degrees: The degrees the person earned at the school
|
66
|
+
education.end_date: The date the person left the school
|
67
|
+
education.gpa: The GPA the person earned at the school
|
68
|
+
education.majors: All majors the person earned at the school
|
69
|
+
education.minors: All minors the person earned at the school
|
70
|
+
education.school: The school the person attended
|
71
|
+
education.school.domain: The primary website domain associated with the school
|
72
|
+
education.school.facebook_url: The school's Facebook URL
|
73
|
+
education.school.location: The location of the school
|
74
|
+
education.school.location.continent: The continent the school is in
|
75
|
+
education.school.location.country: The country the school is in
|
76
|
+
education.school.location.locality: The locality the school is in
|
77
|
+
education.school.location.name: School location in the format "locality, region, country"
|
78
|
+
education.school.location.region: The region the school is in
|
79
|
+
education.school.name: The name of the school
|
80
|
+
education.school.type: The school type, from canonical values for school type specified in the below section
|
81
|
+
education.school.website: The website URL associated with the school
|
82
|
+
education.start_date: The date the person started at the school
|
83
|
+
emails: Email addresses associated with the person
|
84
|
+
emails.address: The fully parsed email address
|
85
|
+
emails.type: The type of email address, from canonical values for email types specified in the below section
|
86
|
+
experience: The person's work experience
|
87
|
+
experience.company: The company where the person worked
|
88
|
+
experience.company.facebook_url: The company's Facebook URL
|
89
|
+
experience.company.founded: The founding year of the company
|
90
|
+
experience.company.industry: The self-identified industry of the company, from canonical values for industries specified in the below section
|
91
|
+
experience.company.location: The location of the company's headquarters
|
92
|
+
experience.company.location.address_line_2: The street address line 2 of the company HQ address
|
93
|
+
experience.company.location.continent: The continent the company HQ is in
|
94
|
+
experience.company.location.country: The country the company HQ is in
|
95
|
+
experience.company.location.geo: City-center geo code of the company HQ, in the format "latitude, longitude"
|
96
|
+
experience.company.location.locality: The locality the company HQ is in
|
97
|
+
experience.company.location.metro: The metro area the company HQ is in
|
98
|
+
experience.company.location.name: Company HQ location in the format "locality, region, country"
|
99
|
+
experience.company.location.postal_code: The postal code of the company HQ address
|
100
|
+
experience.company.location.region: The region the company HQ is in
|
101
|
+
experience.company.location.street_address: The street address of the company HQ
|
102
|
+
experience.company.name: The company name, cleaned and standardized
|
103
|
+
experience.company.size: The self-reported company size range
|
104
|
+
experience.company.website: The company's primary website, cleaned and standardized
|
105
|
+
experience.end_date: The date the person left the company
|
106
|
+
experience.summary: User-inputted summary of their work experience
|
107
|
+
experience.num_sources: The number of total experience sources that this person has
|
108
|
+
experience.is_primary: Whether this is the person's current job or not
|
109
|
+
experience.location_names: Locations where the person has worked while with this company (if different from the company HQ)
|
110
|
+
experience.start_date: The date the person started at the company
|
111
|
+
experience.title: The person's job title while at the company
|
112
|
+
experience.title.levels: The level(s) of the job, from canonical values for job levels specified in the below section
|
113
|
+
experience.title.name: The job title itself
|
114
|
+
experience.title.role: The job role, from canonical values for job roles specified in the below section
|
115
|
+
experience.title.sub_role: The job sub role, from canonical values for job sub roles specified in the below section
|
116
|
+
experience.title.class: The job class, from canonical values for job classes specified in the below section
|
117
|
+
facebook_id: The person's Facebook profile ID based on source agreement
|
118
|
+
facebook_url: The person's Facebook profile URL based on source agreement
|
119
|
+
facebook_username: The person's Facebook profile username based on source agreement
|
120
|
+
first_name: The person's first name
|
121
|
+
last_name: The person's last name
|
122
|
+
full_name: The person's full name
|
123
|
+
sex: The person's biological sex
|
124
|
+
github_url: The person's GitHub profile URL based on source agreement
|
125
|
+
github_username: The person's GitHub profile username based on source agreement
|
126
|
+
industry: The most relevant industry for this person based on their work history, from canonical values for industries specified in the below section
|
127
|
+
interests: The person's self-reported interests
|
128
|
+
job_company_facebook_url: The person's current company's Facebook URL
|
129
|
+
job_company_founded: The person's current company's founding year
|
130
|
+
job_company_industry: The person's current company's industry, from canonical values for industries specified in the below section
|
131
|
+
job_company_linkedin_id: The person's current company's LinkedIn ID
|
132
|
+
job_company_linkedin_url: The person's current company's LinkedIn URL
|
133
|
+
job_company_location_address_line_2: The person's current company's headquarters' street address line 2
|
134
|
+
job_company_location_continent: The person's current company's headquarters' continent
|
135
|
+
job_company_location_country: The person's current company's headquarters' country
|
136
|
+
job_company_location_geo: The person's current company's headquarters' city-center geographic coordinates
|
137
|
+
job_company_location_locality: The person's current company's headquarters' locality
|
138
|
+
job_company_location_metro: The person's current company's headquarters' metro area
|
139
|
+
job_company_location_name: The person's current company's headquarters' location name in the format "locality, region, country"
|
140
|
+
job_company_location_postal_code: The person's current company's headquarters' postal code
|
141
|
+
job_company_location_region: The person's current company's headquarters' region
|
142
|
+
job_company_location_street_address: The person's current company's headquarters' street address
|
143
|
+
job_company_name: The person's current company's name
|
144
|
+
job_company_size: The person's current company's size range
|
145
|
+
job_company_twitter_url: The person's current company's Twitter URL
|
146
|
+
job_company_website: The person's current company's website
|
147
|
+
job_last_changed: The timestamp that reflects when the top-level job information changed
|
148
|
+
job_last_verified: The timestamp that reflects when the information on the top level job information has been last validated by a data source
|
149
|
+
job_start_date: The date the person started their current job
|
150
|
+
job_title: The person's current job title
|
151
|
+
job_title_levels: The derived level(s) of the person's current job title, from canonical values for job levels specified in the below section
|
152
|
+
job_title_role: The derived role of the person's current job title
|
153
|
+
job_title_sub_role: The derived sub-role of the person's current job title
|
154
|
+
job_title_class: The derived class of the person's current job title
|
155
|
+
linkedin_id: The person's LinkedIn profile ID. This is null when no values in the "profiles" array are active
|
156
|
+
linkedin_url: The person's current LinkedIn profile URL. This is null when no values in the "profiles" array are active
|
157
|
+
linkedin_username: The person's LinkedIn profile username. This is null when no values in the "profiles" array are active
|
158
|
+
location_address_line_2: The person's current street address line 2
|
159
|
+
location_continent: The continent of the person's current address
|
160
|
+
location_country: The country of the person's current address
|
161
|
+
location_geo: The geo code of the city center of the person's current address
|
162
|
+
location_last_updated: The timestamp that a new data source contributed to the record for the person's current address
|
163
|
+
location_locality: The locality of the person's current address
|
164
|
+
location_metro: The metro of the person's current address
|
165
|
+
location_name: The location of the person's current address in the format "locality, region, country"
|
166
|
+
location_names: All location names (in the format "locality, region, country") associated with the person
|
167
|
+
location_postal_code: The postal code of the person's current address
|
168
|
+
location_region: The region of the person's current address
|
169
|
+
location_street_address: The person's current street address
|
170
|
+
middle_name: The person's middle name
|
171
|
+
mobile_phone: The direct-dial mobile phone associated with the person
|
172
|
+
personal_emails: All personal emails associated with the person
|
173
|
+
phone_numbers: All phone numbers associated with the person
|
174
|
+
profiles: Social profiles associated with the person
|
175
|
+
profiles.id: The profile ID (format varies based on social network)
|
176
|
+
profiles.network: The social network the profile is on
|
177
|
+
profiles.url: The profile URL
|
178
|
+
profiles.username: The profile username
|
179
|
+
recommended_personal_email: The best available email to reach a person
|
180
|
+
regions: All regions associated with the person
|
181
|
+
skills: The person's self-reported skills
|
182
|
+
street_addresses: All street addresses associated with the person
|
183
|
+
street_addresses.address_line_2: The street address line 2
|
184
|
+
street_addresses.continent: The continent the address is in
|
185
|
+
street_addresses.country: The country the address is in
|
186
|
+
street_addresses.geo: The city-center geographic coordinates of the address
|
187
|
+
street_addresses.locality: The locality the address is in
|
188
|
+
street_addresses.metro: The metro area the address is in
|
189
|
+
street_addresses.name: The location of the address in the format "locality, region, country"
|
190
|
+
street_addresses.postal_code: The postal code of the address
|
191
|
+
street_addresses.region: The region of the address
|
192
|
+
street_addresses.street_address: The street address
|
193
|
+
twitter_url: The person's Twitter profile URL based on source agreement
|
194
|
+
twitter_username: The person's Twitter profile username based on source agreement
|
195
|
+
work_email: The person's current work email
|
196
|
+
inferred_years_experience: The person's inferred years of total work experience
|
197
|
+
certifications: Any certifications the person has
|
198
|
+
certifications.end_date: The expiration date of the certification
|
199
|
+
certifications.name: Certification name
|
200
|
+
certifications.organization: The organization awarding the certification
|
201
|
+
certifications.start_date: The date the certification was awarded
|
202
|
+
headline: The brief headline associated with the person profile.
|
203
|
+
job_summary: User-inputted summary of their current job
|
204
|
+
languages: Languages the person knows
|
205
|
+
languages.name: The language
|
206
|
+
languages.proficiency: Self-ranked language proficiency from 1 (limited) to 5 (fluent)
|
207
|
+
|
208
|
+
=== CANONICAL VALUES
|
209
|
+
Below are some canonical ENUM specific values that specify possible values against a particular field:
|
210
|
+
|
211
|
+
Job Classes: [general_and_administrative, research_and_development, sales_and_marketing, services, unemployed]
|
212
|
+
Job Sub Roles: [accounting, accounts, brand_marketing, broadcasting, business_development, compensation, content_marketing, customer_success, data, dental, devops, doctor, editorial, education_administration, electrical, employee_development, events, fitness, graphic_design, information_technology, instructor, investment, journalism, judicial, lawyer, logistics, marketing_communications, mechanical, media_relations, network, nursing, office_management, paralegal, pipeline, product, product_design, product_marketing, professor, project_engineering, project_management, property_management, quality_assurance, realtor, recruiting, researcher, security, software, support, systems, tax, teacher, therapy, video, web, web_design, wellness, writing]
|
213
|
+
Job Roles: [customer_service, design, education, engineering, finance, health, human_resources, legal, marketing, media, operations, public_relations, real_estate, sales, trades]
|
214
|
+
Job Levels: [cxo, director, entry, manager, owner, partner, senior, training, unpaid, vp]
|
215
|
+
Email Types: [current_professional, disposable, personal, professional]
|
216
|
+
School Types: [post-secondary institution, primary school, secondary school]
|
217
|
+
Industry types: [accounting, airlines/aviation, alternative dispute resolution, alternative medicine, animation, apparel & fashion, architecture & planning, arts and crafts, automotive, aviation & aerospace, banking, biotechnology, broadcast media, building materials, business supplies and equipment, capital markets, chemicals, civic & social organization, civil engineering, commercial real estate, computer & network security, computer games, computer hardware, computer networking, computer software, construction, consumer electronics, consumer goods, consumer services, cosmetics, dairy, defense & space, design, e-learning, education management, electrical/electronic manufacturing, entertainment, environmental services, events services, executive office, facilities services, farming, financial services, fine art, fishery, food & beverages, food production, fund-raising, furniture, gambling & casinos, glass, ceramics & concrete, government administration, government relations, graphic design, health, wellness and fitness, higher education, hospital & health care, hospitality, human resources, import and export, individual & family services, industrial automation, information services, information technology and services, insurance, international affairs, international trade and development, internet, investment banking, investment management, judiciary, law enforcement, law practice, legal services, legislative office, leisure, travel & tourism, libraries, logistics and supply chain, luxury goods & jewelry, machinery, management consulting, maritime, market research, marketing and advertising, mechanical or industrial engineering, media production, medical devices, medical practice, mental health care, military, mining & metals, motion pictures and film, museums and institutions, music, nanotechnology, newspapers, non-profit organization management, oil & energy, online media, outsourcing/offshoring, package/freight delivery, packaging and containers, paper & forest products, performing arts, pharmaceuticals, philanthropy, photography, plastics, political organization, primary/secondary education, printing, professional training & coaching, program development, public policy, public relations and communications, public safety, publishing, railroad manufacture, ranching, real estate, recreational facilities and services, religious institutions, renewables & environment, research, restaurants, retail, security and investigations, semiconductors, shipbuilding, sporting goods, sports, staffing and recruiting, supermarkets, telecommunications, textiles, think tanks, tobacco, translation and localization, transportation/trucking/railroad, utilities, venture capital & private equity, veterinary, warehousing, wholesale, wine and spirits, wireless, writing and editing]
|
218
|
+
|
219
|
+
If there is any inference from the search query that the user is searching with a particular field type that falls under the category of one of the above fields,
|
220
|
+
try to populate the "value" key with the enum values provided against the associated particular field.
|
221
|
+
|
222
|
+
=== When analyzing the search query, please consider a few key points that might usually be associated with each query:
|
223
|
+
|
224
|
+
1. Current Location
|
225
|
+
If you encounter any information related to a location that is not related/attached to a specific work experience build the field/operator/value object with keys starting with location_.
|
226
|
+
Populate country/locality/name/continent accordingly.
|
227
|
+
If you encounter an alpha-2/alpha-3 code inferring a location convert it into the corresponding name for the city/state/country before building a field/operator/value object out of it and DO NOT INCLUDE THE CODES in the object.
|
228
|
+
location_name field contains the format "locality, region, country" so if all three are inferred from the query use build only a single object with location_name field instead of separate objects for location_name, location_locality and location_country fields.
|
229
|
+
For example, for the search query: experienced software engineers from austin tx,
|
230
|
+
use the object { "field": "location_name", "operator": "=", "austin, texas, united states" } instead of { "field": "location_name", "operator": "=", "austin, tx, united states" }
|
231
|
+
|
232
|
+
2. Work Experience
|
233
|
+
If there's any indication in the query that the candidate should have some sort of work experience in whatsoever field build the field/operator/value object with field value as experience.
|
234
|
+
For example, if the search query states 5+ years of experience the object comes out to be { "field": "experience.num_sources", operator: ">", "value": 5 } or { "field": "inferred_years_experience", operator: ">", "value": 5 }.
|
235
|
+
Another example would be if the query stated principal software engineers it would ideally be good to build field/operator/value object with value greater than 7, i.e { "field": "experience.num_sources", operator: ">", "value": 7 } or { "field": "inferred_years_experience", operator: ">", "value": 7 }.
|
236
|
+
Do not explicitly assume that an experienced software engineer means that the work experience must more than 5 years rather try to deduce it from the title if there is any in the search query.
|
237
|
+
|
238
|
+
3. Contact information & Not Null
|
239
|
+
The main fields for mapping any sort of contact information that is found in the search query are mobile_phone and recommended_personal_email. If there's any indication
|
240
|
+
in the search query that the candidates should have some sort of contact information build the objects for those as well otherwise skip them
|
241
|
+
|
242
|
+
4. Current Job Title/Current Company
|
243
|
+
Majority of the search queries will have some sort of job title or an indication towards the past/current field of the potential candidates search.
|
244
|
+
populate those fields against the job_title key.
|
245
|
+
And populate any sort of information from the search query about the current company against the keys starting with job_company_
|
246
|
+
|
247
|
+
=== Additional analysis criteria
|
248
|
+
|
249
|
+
When selecting the field, always pick the values for the "field" key from the section specifying the possible values for it that fall under the description for the value.
|
250
|
+
For example { "field": "experience.num_sources", operator: ">", "value": 7 } is a valid object according to the schema.
|
251
|
+
On the other hand { "field": "experience", operator: ">", "value": 7 } is not
|
252
|
+
|
253
|
+
Assume that the operators will be adding up to an SQL query so make use of CONTAINS, IN, NULL and NOT NULL as operators where necessary, in which case value field should be null/array of values.
|
254
|
+
Example 1: The search query indicates that the candidates should have experience in Python and AWS
|
255
|
+
Generated Object 1: { "field": "skills", "operator": "in", "value": ["Python", "AWS"] }
|
256
|
+
|
257
|
+
Example 2: The search query indicates that the candidates should have an email and a phone number
|
258
|
+
Generated Object 2: { "field": "recommended_personal_email", "operator": "not null", "value": null }
|
259
|
+
|
260
|
+
If you are unable to generate a search criteria, please try again. Check your output and rerun the prompt if you are not satisfied with the results.
|
261
|
+
|
262
|
+
Example JSON output structure:
|
263
|
+
{
|
264
|
+
"search_criteria": [
|
265
|
+
{ "field": "field1", operator: "operator1", "value": "value1" },
|
266
|
+
{ "field": "field2", operator: "operator2", "value": "value2" }
|
267
|
+
],
|
268
|
+
"keywords": {
|
269
|
+
name: "Any job title inferred from the query",
|
270
|
+
geography: "geographical location inferred from the query",
|
271
|
+
location: "location inferred from the query"
|
272
|
+
}
|
273
|
+
}
|
274
|
+
PROMPT
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kerplunk
|
4
|
+
module AI
|
5
|
+
module Prompts
|
6
|
+
module Templates
|
7
|
+
module Generation
|
8
|
+
# The InviteToApplyEmail class is responsible for generating a prompt for generation of invitation
|
9
|
+
# to apply email
|
10
|
+
class InviteToApplyEmail
|
11
|
+
# Generates an application invitation email prompt
|
12
|
+
def self.generate_prompt
|
13
|
+
<<~PROMPT
|
14
|
+
Respond with a RAW JSON object only. Do not include any explanatory text outside the JSON. The JSON object should have the key "email" and "subject" with a values that is a string containing valid HTML for the invite to apply email and the email subject respectively.
|
15
|
+
|
16
|
+
You are a recruiter writing a short, friendly, and slightly playful email to a passive candidate. Please include the following placeholders exactly as written:
|
17
|
+
- *first_name*
|
18
|
+
- *job_title*
|
19
|
+
- *current_company*
|
20
|
+
- *job_link*
|
21
|
+
- *industry*
|
22
|
+
|
23
|
+
Required Output Format:
|
24
|
+
|
25
|
+
1. Subject Line:
|
26
|
+
Provide a concise subject line that entices the candidate to open the email. And include it in the response against the "subject" key
|
27
|
+
|
28
|
+
2. Email Body:
|
29
|
+
- Greet the candidate using *first_name*.
|
30
|
+
- Mention that you saw their profile on LinkedIn.
|
31
|
+
- Highlight why they caught your eye by using a compliment.
|
32
|
+
- Introduce the opportunity for a *job_title* role.
|
33
|
+
- Mention the role is in the *industry*, but not at *current_company*.
|
34
|
+
- Indicate that the pay can go up to $150k/year.
|
35
|
+
- Invite them to apply or learn more via the link *job_link*.
|
36
|
+
- Close with a warm and friendly sign-off, using the name "Jonathan."
|
37
|
+
|
38
|
+
Tone & Style:
|
39
|
+
- Warm, authentic, and slightly playful.
|
40
|
+
- Keep it short and to the point.
|
41
|
+
- Show genuine enthusiasm for their skills.
|
42
|
+
|
43
|
+
Example JSON output structure:
|
44
|
+
{
|
45
|
+
"subject": "You’d be great at this, *first_name*!",
|
46
|
+
"email": "<p>The email body goes here....</p>"
|
47
|
+
}
|
48
|
+
PROMPT
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kerplunk
|
4
|
+
module AI
|
5
|
+
module Prompts
|
6
|
+
module Templates
|
7
|
+
module Generation
|
8
|
+
# The InviteToApplyFollowUpEmail class is responsible for generating a prompt for generation
|
9
|
+
# of a follow-up invitation email.
|
10
|
+
class InviteToApplyFollowUpEmail
|
11
|
+
# Generates an application invitation follow-up prompt
|
12
|
+
def self.generate_prompt
|
13
|
+
<<~PROMPT
|
14
|
+
Respond with a RAW JSON object only. Do not include any explanatory text outside the JSON. The JSON object should have the key "email" and "subject" with a values that is a string containing valid HTML for the invitation to apply follow up email and the email subject respectively.
|
15
|
+
|
16
|
+
You are a recruiter writing a short, friendly, and slightly playful follow-up email to a candidate previously approached for an opportunity through an email.
|
17
|
+
Please include the following placeholders exactly as written:
|
18
|
+
- *first_name*
|
19
|
+
- *job_title*
|
20
|
+
- *current_company*
|
21
|
+
- *job_link*
|
22
|
+
- *industry*
|
23
|
+
|
24
|
+
Required Output Format:
|
25
|
+
|
26
|
+
1. Subject Line:
|
27
|
+
Provide a concise subject line that entices the candidate to open the email. And include it in the response against the "subject" key
|
28
|
+
|
29
|
+
2. Email Body:
|
30
|
+
- Greet the candidate using *first_name*.
|
31
|
+
- Mention that you saw their profile on LinkedIn.
|
32
|
+
- Highlight why they caught your eye by using a compliment.
|
33
|
+
- Introduce the opportunity for a *job_title* role.
|
34
|
+
- Mention the role is in the *industry*, but not at *current_company*.
|
35
|
+
- Indicate that the pay can go up to $150k/year.
|
36
|
+
- Invite them to apply or learn more via the link *job_link*.
|
37
|
+
- Close with a warm and friendly sign-off, using the name "Jonathan."
|
38
|
+
|
39
|
+
Tone & Style:
|
40
|
+
- Warm, authentic, and slightly playful.
|
41
|
+
- Keep it short and to the point.
|
42
|
+
- Show genuine enthusiasm for their skills.
|
43
|
+
|
44
|
+
Example JSON output structure:
|
45
|
+
{
|
46
|
+
"subject": "Following up on an opportunity, *first_name*!",
|
47
|
+
"email": "<p>The email body goes here....</p>"
|
48
|
+
}
|
49
|
+
PROMPT
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/kerplunk/ai/prompts.rb
CHANGED
@@ -22,7 +22,10 @@ module Kerplunk
|
|
22
22
|
:interview_question_analysis,
|
23
23
|
:interview_analysis,
|
24
24
|
:copilot_interview_analysis,
|
25
|
-
:resume_analysis
|
25
|
+
:resume_analysis,
|
26
|
+
:candidate_search_criteria,
|
27
|
+
:invite_to_apply_email,
|
28
|
+
:invite_to_apply_follow_up_email
|
26
29
|
]
|
27
30
|
end
|
28
31
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kerplunk-ai-prompts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kyle Schutt
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A collection of AI prompt templates for use in Kerplunk
|
14
14
|
email:
|
@@ -33,7 +33,10 @@ files:
|
|
33
33
|
- lib/kerplunk/ai/prompts/templates/analysis/interview.rb
|
34
34
|
- lib/kerplunk/ai/prompts/templates/analysis/interview_question.rb
|
35
35
|
- lib/kerplunk/ai/prompts/templates/analysis/resume.rb
|
36
|
+
- lib/kerplunk/ai/prompts/templates/generation/candidate_search_criteria.rb
|
36
37
|
- lib/kerplunk/ai/prompts/templates/generation/interview_questions.rb
|
38
|
+
- lib/kerplunk/ai/prompts/templates/generation/invite_to_apply_email.rb
|
39
|
+
- lib/kerplunk/ai/prompts/templates/generation/invite_to_apply_follow_up_email.rb
|
37
40
|
- lib/kerplunk/ai/prompts/templates/generation/job_description.rb
|
38
41
|
- lib/kerplunk/ai/prompts/version.rb
|
39
42
|
- sig/kerplunk/ai/prompts.rbs
|
@@ -45,7 +48,7 @@ metadata:
|
|
45
48
|
homepage_uri: https://kerplunk.com
|
46
49
|
source_code_uri: https://kerplunk.com
|
47
50
|
changelog_uri: https://kerplunk.com/CHANGELOG.md
|
48
|
-
post_install_message:
|
51
|
+
post_install_message:
|
49
52
|
rdoc_options: []
|
50
53
|
require_paths:
|
51
54
|
- lib
|
@@ -61,7 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
64
|
version: '0'
|
62
65
|
requirements: []
|
63
66
|
rubygems_version: 3.5.11
|
64
|
-
signing_key:
|
67
|
+
signing_key:
|
65
68
|
specification_version: 4
|
66
69
|
summary: Kerplunk AI Prompt Templates
|
67
70
|
test_files: []
|