Глава 10

Передавайте владение только вместе с контрактом

Handoff меняет активного исполнителя. Поэтому он должен передавать не весь накопленный шум, а цель, нужные artifacts, ограничения и остаток бюджета. Handoff нужен, когда specialist должен продолжить взаимодействие напрямую: после triage техническая поддержка задаёт уточнения пользователю, а billing agent ведёт собственный процесс. Если specialist выполняет только фоновый анализ, лучше оставить его tool у manager.

TypeScript
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, который проверяет разрешённое ребро топологии, внятность цели и остаток бюджета до передачи.

TypeScript
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 по конкретному случаю помогает лаборатория.

Интерактивная лаборатория 2

Выберите manager, router или handoff

Router или обычный code switch: путь известен и ownership не меняется.
Context transfer не равен trust transfer. Summary от subagent остаётся недоверенным input. Подписывайте provenance, фильтруйте history и повторно проверяйте важные claims по исходным tool results - иначе prompt injection пройдёт через "своего" агента.

Владение передаётся с контрактом. Там же, где ветвей много и число их задаёт вход, работает orchestrator-workers.

Ссылки