指南
本指南將深入介紹如何利用 OpenAI Agents SDK 的即時(realtime)功能,打造具備語音能力的 AI 智能代理(AI agent)。
Beta feature
Realtime agents 目前為 beta 版本。在我們持續改進實作過程中,可能會有不相容的變更。
概覽
Realtime agents 支援即時的對話流程,能夠即時處理語音與文字輸入,並以即時語音回應。它們會與 OpenAI Realtime API 維持持久連線,實現低延遲的自然語音對話,並能優雅地處理用戶中斷。
架構
核心元件
即時系統包含以下幾個主要元件:
- RealtimeAgent:代理(Agent),可設定指令、工具(Tools)與交接(Handoffs)。
- RealtimeRunner:負責管理設定。你可以呼叫
runner.run()
來取得一個 session(會話)。 - RealtimeSession:單一互動 session。通常每當用戶開始對話時建立一個,並在對話結束前保持存活。
- RealtimeModel:底層模型介面(通常為 OpenAI 的 WebSocket 實作)
Session 流程
一般的即時 session 會遵循以下流程:
- 建立你的 RealtimeAgent,設定指令、工具與交接。
- 設置 RealtimeRunner,並提供 agent 與相關設定選項。
- 啟動 session,使用
await runner.run()
,這會回傳一個 RealtimeSession。 - 傳送語音或文字訊息到 session,使用
send_audio()
或send_message()
。 - 監聽事件,透過遍歷 session 來接收事件——事件包含語音輸出、逐字稿、工具呼叫、交接及錯誤等。
- 處理中斷,當用戶在 agent 說話時插話,系統會自動停止目前的語音產生。
session 會維護對話歷史,並管理與即時模型的持久連線。
Agent 設定
RealtimeAgent 的運作方式與一般 Agent 類似,但有幾項關鍵差異。完整 API 詳情請參閱 [RealtimeAgent
][agents.realtime.agent.RealtimeAgent] API 參考文件。
與一般 agent 的主要差異:
- 模型選擇是在 session 層級設定,而非 agent 層級。
- 不支援結構化輸出(
outputType
不支援)。 - 語音可於每個 agent 設定,但在第一個 agent 開口後無法更改。
- 其他功能如工具(Tools)、交接(Handoffs)與指令皆與一般 agent 相同。
Session 設定
模型設定
session 設定可讓你控制底層即時模型的行為。你可以設定模型名稱(例如 gpt-realtime
)、語音選擇(alloy、echo、fable、onyx、nova、shimmer),以及支援的模態(文字與/或語音)。音訊格式可分別設定輸入與輸出,預設為 PCM16。
音訊設定
音訊設定用於控制 session 如何處理語音輸入與輸出。你可以使用如 Whisper 等模型進行輸入語音轉錄,設定語言偏好,並提供轉錄提示詞(prompts)以提升領域專有詞彙的準確度。輪流偵測(turn detection)設定可控制 agent 何時開始與結束回應,包括語音活動偵測閾值、靜音時長與偵測語音前後的補白等選項。
工具(Tools)與函式
新增工具
與一般 agent 相同,realtime agents 也支援在對話過程中執行的函式工具(function tools):
from agents import function_tool
@function_tool
def get_weather(city: str) -> str:
"""Get current weather for a city."""
# Your weather API logic here
return f"The weather in {city} is sunny, 72°F"
@function_tool
def book_appointment(date: str, time: str, service: str) -> str:
"""Book an appointment."""
# Your booking logic here
return f"Appointment booked for {service} on {date} at {time}"
agent = RealtimeAgent(
name="Assistant",
instructions="You can help with weather and appointments.",
tools=[get_weather, book_appointment],
)
交接 (Handoffs)
建立交接 (Creating Handoffs)
交接 (Handoffs) 可用於在不同專業的代理 (Agents) 之間轉移對話。
from agents.realtime import realtime_handoff
# Specialized agents
billing_agent = RealtimeAgent(
name="Billing Support",
instructions="You specialize in billing and payment issues.",
)
technical_agent = RealtimeAgent(
name="Technical Support",
instructions="You handle technical troubleshooting.",
)
# Main agent with handoffs
main_agent = RealtimeAgent(
name="Customer Service",
instructions="You are the main customer service agent. Hand off to specialists when needed.",
handoffs=[
realtime_handoff(billing_agent, tool_description="Transfer to billing support"),
realtime_handoff(technical_agent, tool_description="Transfer to technical support"),
]
)
事件處理
Session 會串流事件,您可以透過對 session 物件進行迭代來監聽這些事件。事件類型包含語音回應音訊片段、語音辨識結果、工具 (Tools) 執行的開始與結束、代理 (Agent) 任務交接 (handoff) 以及錯誤等。建議特別處理以下重點事件:
- audio:來自代理 (Agent) 回應的原始音訊資料
- audio_end:代理 (Agent) 完成語音回應
- audio_interrupted:使用者中斷代理 (Agent)
- tool_start/tool_end:工具 (Tools) 執行生命週期
- handoff:發生代理 (Agent) 任務交接
- error:處理過程中發生錯誤
完整事件細節請參考 [RealtimeSessionEvent
][agents.realtime.events.RealtimeSessionEvent]。
Guardrails
即時代理 (Realtime agents) 僅支援輸出 guardrail。這些 guardrail 採用防彈跳 (debounce) 機制,並定期執行(非每個字都檢查),以避免即時生成時產生效能問題。預設的 debounce 長度為 100 個字元,但可自行設定。
Guardrail 可以直接附加在 RealtimeAgent
,或透過 session 的 run_config
提供。兩種來源的 guardrail 會一同執行。
from agents.guardrail import GuardrailFunctionOutput, OutputGuardrail
def sensitive_data_check(context, agent, output):
return GuardrailFunctionOutput(
tripwire_triggered="password" in output,
output_info=None,
)
agent = RealtimeAgent(
name="Assistant",
instructions="...",
output_guardrails=[OutputGuardrail(guardrail_function=sensitive_data_check)],
)
當 guardrail 被觸發時,會產生 guardrail_tripped
事件,並且可以中斷 Agent 當前的回應。debounce 行為有助於在安全性與即時效能需求之間取得平衡。與文字型 Agent 不同,Realtime agents 在 guardrail 被觸發時不會拋出 Exception。
音訊處理
請使用 [session.send_audio(audio_bytes)
][agents.realtime.session.RealtimeSession.send_audio] 傳送音訊至 session,或使用 [session.send_message()
][agents.realtime.session.RealtimeSession.send_message] 傳送文字。
對於音訊輸出,請監聽 audio
事件,並透過你偏好的音訊函式庫播放音訊資料。當使用者中斷 Agent 時,務必監聽 audio_interrupted
事件,立即停止播放並清除所有排隊中的音訊。
直接存取模型
你可以存取底層模型,以新增自訂監聽器或執行進階操作:
這讓你可以直接存取 [RealtimeModel
][agents.realtime.model.RealtimeModel] 介面,適用於需要更低階連線控制的進階應用情境。
範例
如需完整可運作的範例,請參考 examples/realtime directory,其中包含有 UI 元件與無 UI 元件的示範。