Skip to content

交接 (Handoffs)

交接 (Handoffs) 允許代理 (Agent) 將任務委派給其他代理。這在不同代理各自專精於不同領域的情境中特別有用。例如,一個客戶支援應用程式可能會有專門處理訂單狀態、退款、常見問題等任務的代理。

對於大型語言模型 (LLM) 來說,交接會被表示為一個工具 (Tool)。因此,如果有一個交接要給名為 Refund Agent 的代理,這個工具就會被稱為 transfer_to_refund_agent

建立交接

所有代理 (Agent) 都有一個 [handoffs][agents.agent.Agent.handoffs] 參數,這個參數可以直接接受 Agent,或是一個可自訂 Handoff 的 Handoff 物件。

你可以使用 Agents SDK 提供的 [handoff()][agents.handoffs.handoff] 函式來建立交接。這個函式允許你指定要交接給哪個代理,並可選擇性地覆寫參數或加入輸入過濾條件。

基本用法

以下是如何建立一個簡單交接的方法:

from agents import Agent, handoff

billing_agent = Agent(name="Billing agent")
refund_agent = Agent(name="Refund agent")

# (1)!
triage_agent = Agent(name="Triage agent", handoffs=[billing_agent, handoff(refund_agent)])
  1. 你可以直接使用 agent(如 billing_agent),或是使用 handoff() 函式。

透過 handoff() 函式自訂交接(handoffs)

[handoff()][agents.handoffs.handoff] 函式讓你可以自訂相關行為。

  • agent:這是交接目標的 agent。
  • tool_name_override:預設會使用 Handoff.default_tool_name() 函式,該函式會解析為 transfer_to_<agent_name>。你可以自行覆寫這個行為。
  • tool_description_override:覆寫來自 Handoff.default_tool_description() 的預設工具(Tool)描述。
  • on_handoff:當交接被觸發時執行的 callback 函式。這在你得知交接即將發生時,想要立即啟動某些資料擷取等操作時非常有用。此函式會接收 agent context,並可選擇性地接收大型語言模型 (LLM) 產生的輸入。輸入資料由 input_type 參數控制。
  • input_type:交接所預期的輸入型別(可選)。
  • input_filter:可用來過濾下一個 agent 所接收的輸入。詳情請見下方說明。
  • is_enabled:用來設定交接是否啟用。這可以是布林值,或是一個回傳布林值的函式,讓你可以在執行階段動態啟用或停用交接。
from agents import Agent, handoff, RunContextWrapper

def on_handoff(ctx: RunContextWrapper[None]):
    print("Handoff called")

agent = Agent(name="My agent")

handoff_obj = handoff(
    agent=agent,
    on_handoff=on_handoff,
    tool_name_override="custom_handoff_tool",
    tool_description_override="Custom description",
)

交接 (Handoffs) 輸入

在某些情境下,您可能希望大型語言模型 (LLM) 在呼叫交接 (handoff) 時提供一些資料。例如,假設要交接給「升級處理代理 (Escalation agent)」。您可能會希望提供一個原因,以便進行記錄。

from pydantic import BaseModel

from agents import Agent, handoff, RunContextWrapper

class EscalationData(BaseModel):
    reason: str

async def on_handoff(ctx: RunContextWrapper[None], input_data: EscalationData):
    print(f"Escalation agent called with reason: {input_data.reason}")

agent = Agent(name="Escalation agent")

handoff_obj = handoff(
    agent=agent,
    on_handoff=on_handoff,
    input_type=EscalationData,
)

輸入過濾器

當發生交接(handoff)時,就像是新的 Agent 接手對話,並且可以看到整個先前的對話歷史。如果你想要改變這個行為,你可以設定一個 [input_filter][agents.handoffs.Handoff.input_filter]。輸入過濾器(input filter)是一個函式,會透過 [HandoffInputData][agents.handoffs.HandoffInputData] 接收現有的輸入,並且必須回傳一個新的 HandoffInputData

有一些常見的模式(例如從歷史紀錄中移除所有工具(Tools)呼叫),這些都已經在 [agents.extensions.handoff_filters][] 中為你實作好了。

from agents import Agent, handoff
from agents.extensions import handoff_filters

agent = Agent(name="FAQ agent")

handoff_obj = handoff(
    agent=agent,
    input_filter=handoff_filters.remove_all_tools, # (1)!
)
  1. 當呼叫 FAQ agent 時,這將自動從歷史紀錄中移除所有工具 (Tools)。

建議提示詞 (prompts)

為了確保大型語言模型 (LLM) 能正確理解交接 (Handoffs),我們建議在你的代理 (Agents) 中加入有關交接的資訊。我們在 [agents.extensions.handoff_prompt.RECOMMENDED_PROMPT_PREFIX][] 中提供了建議的前綴詞,或者你也可以呼叫 [agents.extensions.handoff_prompt.prompt_with_handoff_instructions][],自動將建議的資料加入你的提示詞 (prompts) 中。

from agents import Agent
from agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX

billing_agent = Agent(
    name="Billing agent",
    instructions=f"""{RECOMMENDED_PROMPT_PREFIX}
    <Fill in the rest of your prompt here>.""",
)