Files

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 candidates name.

GetEmailTask

This task is built in to our framework. By default, it can collect and update emails and mark when a user doesnt 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 candidates 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 candidates 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.