Survey Agent
Screen a candidate for a software engineer role to see if they meet the prerequisites and are an overall good fit. The responses, summary, and evaluation will be written to a CSV file.
For setup instructions and more details, see the main examples README.
Overview
The flow of this agent is flexibly structured, where the specified sequence is maintained but the user is able to regress to a previously visited task if needed. This is possible via TaskGroup, which is set up here: https://github.com/livekit/agents/blob/f8efe436afe2470104ce7587f1d89ae383ed619e/examples/survey/survey_agent.py#L285-L315
IntroTask
This stage facilitates introductions and collects the candidate’s name.
GetEmailTask
This task is built in to our framework. By default, it can collect and update emails and mark when a user doesn’t want to give their email. If the input modality is audio, emails are confirmed before the task is marked as complete. See the docs for GetEmailTask.
CommuteTask
This stage collects whether or not the candidate can commute to the office and their method of transportation. We define the possible commute methods here: https://github.com/livekit/agents/blob/8283a5a5c9863a07bcf030ee90e8ab780e1e569b/examples/survey/survey_agent.py#L32
And we pass this to a function tool like so: https://github.com/livekit/agents/blob/8283a5a5c9863a07bcf030ee90e8ab780e1e569b/examples/survey/survey_agent.py#L231-L237
ExperienceTask
This stage collects the candidate’s years of experience and a short description of their professional career. It follows a structure similar to IntroTask and CommuteTask.
BehavioralTask
For some tasks, you might not want a structured flow of questions. In this stage, we are collecting the candidate’s strengths, weaknesses, and work style. This task incrementally collects answers in no particular order. This allows for a more natural conversation.
After the candidate answers one of the questions, self._check_completion() is called to check if all 3 fields (”strengths”, “weaknesses”, “work_style”) have been collected. If so, then BehavioralTask is marked as complete. If not, then the agent will continue prompting for the rest of the answers.
In practice, this would ensure variability among candidates’ experiences.
Closing out
Once the interview is concluded and TaskGroup is completed, we extract the summary message (the last inserted message):
summary = self.chat_ctx.items[-1]
And we generate a candidate evaluation based off of the summary:
evaluation = await evaluate_candidate(llm_model=self.session.llm, summary=summary)
The session LLM evaluates the candidate from the given summary: https://github.com/livekit/agents/blob/8283a5a5c9863a07bcf030ee90e8ab780e1e569b/examples/survey/survey_agent.py#L76-L98
Finally, the agent hangs up and you can find the results, summary, and evaluation in results.csv!
Disqualification
In each stage after the first, the candidate may be disqualified for unsatisfactory answers or for refusing to answer. We create a function tool that will be passed to the tasks: https://github.com/livekit/agents/blob/8283a5a5c9863a07bcf030ee90e8ab780e1e569b/examples/survey/survey_agent.py#L101-L118
The candidate will be informed of the interview ending, and then the session will shut down.