in src/app/agentConfigs/utils.ts [6:80]
export function injectTransferTools(agentDefs: AgentConfig[]): AgentConfig[] {
// Iterate over each agent definition
agentDefs.forEach((agentDef) => {
const downstreamAgents = agentDef.downstreamAgents || [];
// Only proceed if there are downstream agents
if (downstreamAgents.length > 0) {
// Build a list of downstream agents and their descriptions for the prompt
const availableAgentsList = downstreamAgents
.map(
(dAgent) =>
`- ${dAgent.name}: ${dAgent.publicDescription ?? "No description"}`
)
.join("\n");
// Create the transfer_agent tool specific to this agent
const transferAgentTool: Tool = {
type: "function",
name: "transferAgents",
description: `Triggers a transfer of the user to a more specialized agent.
Calls escalate to a more specialized LLM agent or to a human agent, with additional context.
Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.
Let the user know you're about to transfer them before doing so.
Available Agents:
${availableAgentsList}
`,
parameters: {
type: "object",
properties: {
rationale_for_transfer: {
type: "string",
description: "The reasoning why this transfer is needed.",
},
conversation_context: {
type: "string",
description:
"Relevant context from the conversation that will help the recipient perform the correct action.",
},
destination_agent: {
type: "string",
description:
"The more specialized destination_agent that should handle the user’s intended request.",
enum: downstreamAgents.map((dAgent) => dAgent.name),
},
},
required: [
"rationale_for_transfer",
"conversation_context",
"destination_agent",
],
},
};
// Ensure the agent has a tools array
if (!agentDef.tools) {
agentDef.tools = [];
}
// Add the newly created tool to the current agent's tools
agentDef.tools.push(transferAgentTool);
}
// so .stringify doesn't break with circular dependencies
agentDef.downstreamAgents = agentDef.downstreamAgents?.map(
({ name, publicDescription }) => ({
name,
publicDescription,
})
);
});
return agentDefs;
}