Передавайте владение только вместе с контрактом
Handoff меняет активного исполнителя. Поэтому он должен передавать не весь накопленный шум, а цель, нужные artifacts, ограничения и остаток бюджета. Handoff нужен, когда specialist должен продолжить взаимодействие напрямую: после triage техническая поддержка задаёт уточнения пользователю, а billing agent ведёт собственный процесс. Если specialist выполняет только фоновый анализ, лучше оставить его tool у manager.
import { Agent } from "@openai/agents";
const billing = new Agent({
name: "Billing specialist",
instructions: "Own billing requests after transfer."
});
const technical = new Agent({
name: "Technical specialist",
instructions: "Own technical support requests after transfer."
});
const triage = Agent.create({
name: "Triage",
instructions: "Classify the request and transfer it to exactly one specialist.",
handoffs: [billing, technical]
});В companion-проекте handoff - это провайдер-независимый envelope, который проверяет разрешённое ребро топологии, внятность цели и остаток бюджета до передачи.
import type { AgentContract, AgentId, HandoffEnvelope } from "./types.js";
export function createHandoff(
source: AgentContract,
target: AgentId,
input: Omit<HandoffEnvelope, "from" | "to">
): HandoffEnvelope {
if (!source.allowedHandoffs.includes(target)) {
throw new Error(`Handoff ${source.id} -> ${target} is not allowed`);
}
if (input.goal.trim().length < 8) {
throw new Error("Handoff goal is too vague");
}
if (input.remainingCalls < 1) {
throw new Error("Handoff has no remaining call budget");
}
return { from: source.id, to: target, ...input };
}Выбрать между manager, router и handoff по конкретному случаю помогает лаборатория.
Выберите manager, router или handoff
Router или обычный code switch: путь известен и ownership не меняется.
Context transfer не равен trust transfer. Summary от subagent остаётся недоверенным input. Подписывайте provenance, фильтруйте history и повторно проверяйте важные claims по исходным tool results - иначе prompt injection пройдёт через "своего" агента.
Владение передаётся с контрактом. Там же, где ветвей много и число их задаёт вход, работает orchestrator-workers.