65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
/**
|
|
* Example 16 — Synchronous agent handoff via `delegate_to_agent`
|
|
*
|
|
* During `runTeam` / `runTasks`, pool agents register the built-in
|
|
* `delegate_to_agent` tool so one specialist can run a sub-prompt on another
|
|
* roster agent and read the answer in the same conversation turn.
|
|
*
|
|
* Whitelist `delegate_to_agent` in `tools` when you want the model to see it;
|
|
* standalone `runAgent()` does not register this tool by default.
|
|
*
|
|
* Run:
|
|
* npx tsx examples/16-agent-handoff.ts
|
|
*
|
|
* Prerequisites:
|
|
* ANTHROPIC_API_KEY
|
|
*/
|
|
|
|
import { OpenMultiAgent } from '../src/index.js'
|
|
import type { AgentConfig } from '../src/types.js'
|
|
|
|
const researcher: AgentConfig = {
|
|
name: 'researcher',
|
|
model: 'claude-sonnet-4-6',
|
|
provider: 'anthropic',
|
|
systemPrompt:
|
|
'You answer factual questions briefly. When the user asks for a second opinion ' +
|
|
'from the analyst, use delegate_to_agent to ask the analyst agent, then summarize both views.',
|
|
tools: ['delegate_to_agent'],
|
|
maxTurns: 6,
|
|
}
|
|
|
|
const analyst: AgentConfig = {
|
|
name: 'analyst',
|
|
model: 'claude-sonnet-4-6',
|
|
provider: 'anthropic',
|
|
systemPrompt: 'You give short, skeptical analysis of claims. Push back when evidence is weak.',
|
|
tools: [],
|
|
maxTurns: 4,
|
|
}
|
|
|
|
async function main(): Promise<void> {
|
|
const orchestrator = new OpenMultiAgent({ maxConcurrency: 2 })
|
|
const team = orchestrator.createTeam('handoff-demo', {
|
|
name: 'handoff-demo',
|
|
agents: [researcher, analyst],
|
|
sharedMemory: true,
|
|
})
|
|
|
|
const goal =
|
|
'In one paragraph: state a simple fact about photosynthesis. ' +
|
|
'Then ask the analyst (via delegate_to_agent) for a one-sentence critique of overstated claims in popular science. ' +
|
|
'Merge both into a final short answer.'
|
|
|
|
const result = await orchestrator.runTeam(team, goal)
|
|
console.log('Success:', result.success)
|
|
for (const [name, ar] of result.agentResults) {
|
|
console.log(`\n--- ${name} ---\n${ar.output.slice(0, 2000)}`)
|
|
}
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error(err)
|
|
process.exit(1)
|
|
})
|