Openai 新發布agent SDK輕量框架,方便開發通用AI整合,可做交接、搜尋、計算、串流媒體等等的分工。

OpenAI 最新發布 Agents SDK,這是一個輕量級但功能強大的框架,可以協助開發者構建、管理並優化 AI 代理(AI Agents),提升開發者跟公司自動化能力。 SDK 提供了一系列強大的功能,開發者能夠快速創建 AI 代理,執行複雜任務,並與其他工具和流程進行無縫整合。

如何使用?

設置 Python 環境

    python -m venv env
    source env/bin/activate

    安裝 Agents SDK

      pip install openai-agents

      Hello world 示例

      from agents import Agent, Runner
      
      agent = Agent(name="Assistant", instructions="You are a helpful assistant")
      
      result = Runner.run_sync(agent, "Write a haiku about recursion in programming.")
      print(result.final_output)
      
      # Code within the code,
      # Functions calling themselves,
      # Infinite loop's dance.

      (如果運行此命令,請確保設置 OPENAI_API_KEY 環境變數)

      切換示例

      from agents import Agent, Runner
      import asyncio
      
      spanish_agent = Agent(
          name="Spanish agent",
          instructions="You only speak Spanish.",
      )
      
      english_agent = Agent(
          name="English agent",
          instructions="You only speak English",
      )
      
      triage_agent = Agent(
          name="Triage agent",
          instructions="Handoff to the appropriate agent based on the language of the request.",
          handoffs=[spanish_agent, english_agent],
      )
      
      
      async def main():
          result = await Runner.run(triage_agent, input="Hola, ¿cómo estás?")
          print(result.final_output)
          # ¡Hola! Estoy bien, gracias por preguntar. ¿Y tú, cómo estás?
      
      
      if __name__ == "__main__":
          asyncio.run(main())


      函數示例

      import asyncio
      
      from agents import Agent, Runner, function_tool
      
      
      @function_tool
      def get_weather(city: str) -> str:
          return f"The weather in {city} is sunny."
      
      
      agent = Agent(
          name="Hello world",
          instructions="You are a helpful agent.",
          tools=[get_weather],
      )
      
      
      async def main():
          result = await Runner.run(agent, input="What's the weather in Tokyo?")
          print(result.final_output)
          # The weather in Tokyo is sunny.
      
      
      if __name__ == "__main__":
          asyncio.run(main())

      Key Concepts

      Agents SDK 基於以下核心概念:

      ComponentPurpose
      Agent一個配置了指令、工具、交接、保護機制等的 LLM。
      Tool代理可呼叫的函數(如 API、計算、文件存取)。
      Context可變物件,可用來儲存狀態或共享資源。
      Output Types允許指定結構化的最終輸出,或預設為自由文本。
      Handoffs可將對話委派或切換給其他代理的機制。
      Streaming代理在思考或使用工具時,可以即時輸出部分或增量結果(適用於即時 UI)。
      Tracing自動記錄每次 "代理運行" 的詳細跟蹤資訊,用於偵錯、分析或記錄。
      Guardrails驗證輸入或輸出,檢查策略,或在違規時終止執行。

      這些功能,開發者可以構建強大的多步驟或對話式工作流程,確保準確且可驗證的結果,並在必要時劃分任務或調用專門的子代理來處理特定功能。

      Agents

      Agents 將大型語言模型(LLM)封裝為具有所有必要配置的單元,包括系統指令、可用工具、交接目標等,還可以包含輸入或輸出驗證機制,以及進階模型設定。

      核心概念

      一個 Agent 本質上是配置了以下內容的 LLM:

      • 指令(靜態或動態)
      • 工具(可以呼叫的函數)
      • 交接(可以將對話轉移給其他代理)
      • 可選的保護機制(輸入或輸出驗證)
      • 其他設定(如模型參數、輸出類型、回調函數等)

      Agent 執行流程

      當代理接收到使用者輸入後,會進入執行循環:

      1. 代理查看目前的對話歷程(包括使用者輸入、先前的工具結果、系統訊息)。
      2. LLM 決定下一步行動:
        • 直接產生最終回應(結束循環)。
        • 呼叫工具(可能是多次連續執行)。
        • 轉交至其他代理
      3. 當代理產生最終回應或轉交時,循環結束。

      Agent 例子

      from agents import Agent, AgentRunner
      
      agent = Agent(
          name="basic_agent",
          instructions="You are a helpful agent."
      )
      
      result = await AgentRunner.run(agent, ["What's the capital of the USA?"])
      print(result.agent_output)  # The capital of the United States is Washington, D.C.

      代理的主要欄位

      欄位作用
      name代理的名稱識別符。
      instructions代理的靜態指令或動態指令函數。
      description代理的描述(通常用於子代理或工具)。
      tools代理可調用的工具列表。
      handoffs可轉交的其他代理列表。
      model_settingsLLM 的相關參數(模型類型、溫度等)。
      output_type預設為自由格式文本,也可指定結構化輸出。
      context_type設定 Context 物件的 Python 類型。

      工具(Tools)

      工具讓代理可以在運行時決定調用外部函數,如 API 存取、數據查詢、數學計算等。

      定義工具

      使用 @function_tool 裝飾器將函數註冊為工具。

      from agents.tool import function_tool
      
      @function_tool
      def get_weather(location: str, unit: str = "C") -> str:
          """
          根據位置獲取天氣資訊。
          """
          return f"The weather in {location} is 22 degrees {unit}."

      將工具附加到代理:

      agent.tools.append(get_weather)

      Context(上下文管理)

      有時候,代理需要在多個步驟之間保留狀態,例如會話數據、用戶 ID、請求歷史等。

      from agents.run_context import AgentContextWrapper
      from agents.tool import function_tool
      
      class MyContext:
        def __init__(self, user_id: str):
            self.user_id = user_id
            self.seen_messages = []
      
      @function_tool
      def greet_user(context: AgentContextWrapper[MyContext], greeting: str) -> str:
        user_id = context.agent_context.user_id
        return f"Hello {user_id}, you said: {greeting}"

      Output Types(輸出類型)

      Output Types 允許開發者指定代理的最終輸出格式,確保其符合應用需求。預設情況下,代理會產生自由格式的文本,但開發者可以使用 結構化輸出 來確保回應符合 JSON 格式。

      示例:指定結構化輸出

      from pydantic import BaseModel
      from agents import Agent, AgentRunner
      
      class WeatherResponse(BaseModel):
          location: str
          temperature_c: float
          summary: str
      
      agent = Agent(
          name="weather_agent",
          instructions="請提供結構化的天氣資訊。",
          output_type=WeatherResponse,
      )
      
      result = await AgentRunner.run(agent, ["巴黎的天氣如何?"])
      print(result.agent_output)

      如果代理返回的 JSON 格式不符合 WeatherResponse,則會觸發錯誤,確保輸出符合預期。

      Handoffs(交接機制)

      Handoffs 允許代理將對話委派給其他代理,這在多語言客服、不同領域專業代理等場景中特別實用。

      示例:多語言客服代理

      from agents import Agent, AgentRunner, handoff
      
      english_agent = Agent(name="english_agent", instructions="回應使用英文。")
      spanish_agent = Agent(name="spanish_agent", instructions="回應使用西班牙文。")
      
      triage_agent = Agent(
          name="triage_agent",
          instructions="根據用戶語言選擇適當的代理。",
          handoffs=[handoff(english_agent), handoff(spanish_agent)],
      )
      
      result = await AgentRunner.run(triage_agent, ["Hola, ¿cómo estás?"])
      print(result.agent_output)  # 會被交接給 spanish_agent。

      Streaming(即時流式輸出)

      Streaming 允許代理在思考或使用工具時,逐步輸出回應,適用於 即時交互 UI,如聊天機器人或語音助手。

      示例:流式輸出

      from agents import Agent, AgentRunner
      
      stream = AgentRunner.run_streamed(agent, ["請講一個故事"])
      
      async for event in stream.stream_events():
          print(event.delta, end="", flush=True)
      print("\n--- done ---")

      在流式模式下,代理可以逐步輸出內容,而不需要等到完整結果產生。

      Tracing(追蹤與記錄)

      Tracing 允許開發者 記錄代理的完整執行歷程,包括:

      • 使用者輸入
      • 系統指令
      • 工具呼叫與結果
      • 代理決策與最終回應

      這對於 偵錯、分析及行為監控 特別有幫助。

      示例:啟用追蹤

      from agents import AgentRunner, AgentRunConfig
      
      config = AgentRunConfig(
          run_name="CustomerSupportFlow",
          tracing_disabled=False,
          trace_non_openai_generations=True,
      )
      
      result = await AgentRunner.run(my_agent, ["Hello?"], run_config=config)

      Guardrails(安全限制與驗證)

      Guardrails 允許開發者 定義輸入與輸出的規則,確保代理不會處理或返回不合規的內容。

      示例:禁止不當內容輸入

      from agents.guardrails import CustomGuardrail
      
      async def is_not_swearing(msgs, context) -> bool:
          content = " ".join(m["content"] for m in msgs if "content" in m)
          return "badword" not in content.lower()
      
      my_guardrail = CustomGuardrail(
          guardrail_function=is_not_swearing,
          tripwire_config=lambda output: not output  # 如果返回 False,則拋出錯誤
      )
      
      agent = Agent(
          name="safe_agent",
          input_guardrails=[my_guardrail]
      )
      
      out = await AgentRunner.run(agent, ["some text"])
      # 若輸入含有 "badword",則會觸發 GuardrailTripwireTriggered。

      OpenAI 的 Agents SDK 提供了一個強大的開源平台,使開發者能夠更輕鬆地構建和管理 AI 代理,進而推動企業的自動化進程。隨著 AI 技術的快速發展,這類工具將在未來商業環境中發揮 越來越關鍵的作用

      開發者現在即可透過 OpenAI 官方文件和 API Playground 開始構建 AI 代理,體驗 Agents SDK 的強大功能!

      參考來源:

      Agents SDK - OpenAI API

      openai/openai-agents-python: A lightweight, powerful framework for multi-agent workflows