OpenAI Agents SDK 02 - 如何搭配 Agents 操作 Function Calling

更新 發佈閱讀 19 分鐘

書寫日期:2025/4/30

原始 OpenAI 官方文件請搭配:

目前 OpenAI Agents SDK 支援三種工具使用:

  1. OpenAI 既有的工具(Hosted tools):這些工具運作在 LLM 伺服器端(也就是 OpenAI),與 AI 模型並存。OpenAI 提供擷取、網路搜尋與電腦操作等託管工具。e.g. 檔案搜尋網路搜尋、電腦操作(Computer Use)等功能。
  2. 函式呼叫(Function calling):這類工具讓你可以將任何 Python 函式作為工具使用。
  3. Agents 作為工具(Agents as tools):這讓你可以將 Agent 作為工具來使用,使 Agent 能夠呼叫其他 Agent 而無須將控制權完全交給對方。


OpenAI 既有的工具(Hosted tools)

官方案例:

from agents import Agent, FileSearchTool, Runner, WebSearchTool

agent = Agent(
name="Assistant",
tools=[
WebSearchTool(),
FileSearchTool(
max_num_results=3,
vector_store_ids=["VECTOR_STORE_ID"],
),
],
)

async def main():
result = await Runner.run(agent, "Which coffee shop should I go to, taking into account my preferences and the weather today in SF?")
print(result.final_output)

在 tools= [] 中新增 WebSearchToolFileSearchToolComputerTool即可完成。

上述案例中,當使用者詢問一個問題(Which coffee shop should I go to, taking into account my preferences and the weather today in SF?)時,AI Agent 會選擇 tools 中的工具進行操作後,最終給予使用者回覆。

如果只有一個工具,它也可以使用。

from agents import Agent, Runner, WebSearchTool
from dotenv import load_dotenv # 使用 .env 的 OPENAI_API_KEY
import asyncio
load_dotenv() # 使用 .env 的 OPENAI_API_KEY



WebSearchagent = Agent(
name="Web search agent",
instructions="你是一個新聞編輯以繁體中文回覆。你需要搜尋新聞事件,並搜尋可靠的資訊來源,例如各大媒體新聞。盡你所能搜尋最新的資料。",
tools=[ WebSearchTool() ],
)



async def main():
result = await Runner.run(WebSearchagent, "基隆民政局長交保,理由為何?")
print(result.final_output)

if __name__ == "__main__":
asyncio.run(main())
(venv) chiatzuho@ChiadeMacBook-Pro agents_playground % python examples/example-web_search_agent.py

基隆地檢署偵辦罷免民進黨基隆市議員鄭文婷及張之豪案,發現提議人名冊中涉嫌有已故者連署的情況。經搜索、約談後,檢方於4月29日向法院聲請羈押基隆市政府民政處長張淵翔、鄭文婷案領銜人紀文荃及國民黨仁愛區黨部主任張金發。同時,國民黨基隆市黨部主委吳國勝以新台幣30萬元交保,鄭文婷案備補領銜人許紹業及張之豪案領銜人游正義,則分別以3萬元及15萬元交保。 ([rti.org.tw](https://www.rti.org.tw/news/view/id/2247592?utm_source=openai))

檢調懷疑,張淵翔利用戶政系統,協助查詢相關個人資料,介入罷免連署,違反行政中立。經檢察官複訊後,向基隆地方法院聲請羈押張淵翔、紀文荃、張金發3人。至於吳國勝、許紹業、游正義則分別以30萬元、3萬元、15萬元交保。 ([rti.org.tw](https://www.rti.org.tw/news/view/id/2247592?utm_source=openai))

目前尚未有進一步資訊說明法院對張淵翔的羈押聲請是否獲准,或其交保的具體理由。一般而言,法院在決定是否交保時,會考量被告的犯罪嫌疑、逃亡或串供之虞,以及對社會的危害程度等因素。

筆者書寫當下,民政局長已經交保的新聞已超過12小時,但似乎還無法網搜到。因此需注意,筆者書寫當下,OpenAI 的 WebSearchTool 似乎不夠即時!

函式呼叫

官方範例:

import json

from typing_extensions import TypedDict, Any

from agents import Agent, FunctionTool, RunContextWrapper, function_tool


class Location(TypedDict):
lat: float
long: float

@function_tool
async def fetch_weather(location: Location) -> str:

"""Fetch the weather for a given location.

Args:
location: The location to fetch the weather for.
"""
# In real life, we'd fetch the weather from a weather API
return "sunny"


@function_tool(name_override="fetch_data")
def read_file(ctx: RunContextWrapper[Any], path: str, directory: str | None = None) -> str:
"""Read the contents of a file.

Args:
path: The path to the file to read.
directory: The directory to read the file from.
"""
# In real life, we'd read the file from the file system
return "<file contents>"


agent = Agent(
name="Assistant",
tools=[fetch_weather, read_file],
)

for tool in agent.tools:
if isinstance(tool, FunctionTool):
print(tool.name)
print(tool.description)
print(json.dumps(tool.params_json_schema, indent=2))
print()

官方案例中,定義了兩個功能函式:「取得天氣資訊」、「讀檔案」。

接著,在定義一個 Agent,這樣當使用者詢問問題時,這個 Agent 會自動判斷應該使用哪個工具,並執行該工具後,最後回傳結果。

舉例而言,如果要問「今天台北天氣為何」?

LLM 會自動認知道你要查詢天氣,執行「取得天氣資訊」的函式,但以這份 code 為例,這個函式的 input 是需要緯度、經度,而這時 LLM 將自動轉換成符合函式需求的 input,並送進函式中執行,這大概就是 function calling 最重要的一部分了。

筆者寫的另一個範例:

from agents import Agent, Runner, FunctionTool, RunContextWrapper, function_tool
from typing_extensions import TypedDict, Any, NotRequired
import asyncio
from dotenv import load_dotenv
from datetime import datetime
import os
import requests
import json
from pprint import pprint as pp

load_dotenv()

class PhotoSearchParams(TypedDict):
key_word: str # 必須填寫的參數



# 一個搜尋圖片的 API 範例
@function_tool
async def search_photo(params: PhotoSearchParams) -> dict:
key_word = params['key_word'] # 必須提供

url = "API 連結"

headers = {
"Content-Type": "application/json",
}

# 請求體
payload = {
"KeyWord": key_word,
}

# 發送POST請求

response = requests.post(url, headers=headers, data=json.dumps(payload))

# 檢查響應

if response.status_code == 200:
return response.json()
else:
return {
"Result": "N",
"Message": f"請求失敗,狀態碼: {response.status_code}",
"ResultData": None
}


PhotoSearchAgent = Agent(
name="Photo Search Agent",
instructions="你是一個新聞編輯,使用者會給你新聞文章,你需負責使用一個最適合的關鍵字去尋找 API 並搜尋照片。這個關鍵字很重要,一定得是一個實體,一個適合拿來當關鍵字搜尋的實體,例如人名、地名、組織名稱、地方、活動名稱等,並拿去搜尋,這樣才會更有可能查詢的到對應照片且適合的照片。你需注意這些圖片的說明可能有很多文字,但要確定主體人物。如果使用者給的新聞文字有人物,盡量使用人物姓名直接搜尋。使用繁體中文直接去搜尋。提供至少四張圖片給我。",
model="gpt-4.1",
tools=[ search_photo ] )


async def main():
result = await Runner.run(PhotoSearchAgent, input="行政院長卓榮泰今天為「因應國際情勢強化經濟社會及國土安全韌性特別條例」草案拜會立法院朝野黨團")
print(result.final_output)


if __name__ == "__main__":
asyncio.run(main())

假設我有一個搜尋圖片的函式,定義一個專業的配圖 Agent,當我送入任何文字,他就會將這段文字轉化成關鍵字後送進這個配圖搜尋工具中搜尋,最後回傳搜尋結果。

需注意,「教導 LLM 這個函式有哪些 input 接口,讓 LLM 知道如何將自然語言轉化成格式化的內容送進函式」蠻重要的,可以透過 typing_extensionspydamic 這類套件包加以使用

個人認為寫超好的 Pydamic 指引:

另外幾個走過的雷(疑惑)也記錄在這邊:

函式說明 docstring

函式中的「'''說明'''」也挺重要,在官方文件稱為「docstring」,如果有寫的話,會用來讓LLM理解此函數功能與參數使用。

"""Fetch the weather for a given location.
Args:
location: The location to fetch the weather for.
"""

@functional tool 裝飾器

裝飾器,用於從函式創建 FunctionTool。預設情況下將會:

  1. 解析函式簽名以建立工具參數的 JSON 架構。
  2. 使用函式的 Docstring 來填寫工具的描述。
  3. 使用函式的 Docstring 來填寫參數描述。
  4. 文件字串的風格會自動偵測,但你也可以手動覆寫(override)。

所以可以寫成類似

@function_tool(name_override="fetch_data")

設定 name_override、description_override、docstring_style 等,可以避免 LLM 自行判斷,不設定的話就會讀取原始名稱。


代理作為工具(Agents as tools)

簡單來說,上述的「tools=[]」裡面不外乎放 OpenAI 既有工具、Python 函式,其實 tools 也可以包 Agents。直接來看官方範例:

from agents import Agent, Runner
import asyncio

spanish_agent = Agent(
name="Spanish agent",
instructions="You translate the user's message to Spanish",
)

french_agent = Agent(
name="French agent",
instructions="You translate the user's message to French",
)

orchestrator_agent = Agent(
name="orchestrator_agent",
instructions=(
"You are a translation agent. You use the tools given to you to translate."
"If asked for multiple translations, you call the relevant tools."
),
tools=[
spanish_agent.as_tool(
tool_name="translate_to_spanish",
tool_description="Translate the user's message to Spanish",
),
french_agent.as_tool(
tool_name="translate_to_french",
tool_description="Translate the user's message to French",
),
],
)

async def main():
result = await Runner.run(orchestrator_agent, input="Say 'Hello, how are you?' in Spanish.")
print(result.final_output)

應該也蠻好懂了!上述是一個「主腦」Agent,會根據使用者內容,決定要把任務給「法文 Agent」還是「西班牙文 Agent」並加以翻譯。

這個例子可能會讓人覺得「我根本可以直接翻譯就好」,但我們將格局放大,這個意義也代表著,如果我有更細緻的操作或分析,可以更能分層次在各個 Agent 做客製化,而不拘泥於通用任務。


Debug

在操作 OpenAI Agents 時,尤其是使用 Function Calling 更需注意實際 AI Agents 流程如何進行。官方推薦可以使用 API 後台的「Traces」加以查看:

vocus|新世代的創作平台


除了可以看整個工作流,還可以看到哪個階段時間花費為何,進而持續優化自己的 Agent 流程!




最後附上詳細 API reference 頁面參考:




留言
avatar-img
CT
99會員
93內容數
加入沙龍追蹤 CT 更多文章!
CT的其他內容
2025/04/27
本文介紹使用Python呼叫OpenAI模型進行新聞文章分類的四種方法,包含使用Requests套件、Chat Completions API、Response API以及最新的Agent SDK。
Thumbnail
2025/04/27
本文介紹使用Python呼叫OpenAI模型進行新聞文章分類的四種方法,包含使用Requests套件、Chat Completions API、Response API以及最新的Agent SDK。
Thumbnail
2025/04/24
Cursor和Windsurf兩款AI程式碼輔助工具的比較心得,從價格、介面、模型選擇、自動補全、速度等多方面進行評測,並分享個人使用經驗。
Thumbnail
2025/04/24
Cursor和Windsurf兩款AI程式碼輔助工具的比較心得,從價格、介面、模型選擇、自動補全、速度等多方面進行評測,並分享個人使用經驗。
Thumbnail
2024/10/29
在生成式 AI 的崛起中,Perplexity 作為一款強大的 AI 搜尋引擎,能夠即時搜尋網路資訊。本文將嘗試使用 Perplexity 完成事實查核任務 DEMO。
Thumbnail
2024/10/29
在生成式 AI 的崛起中,Perplexity 作為一款強大的 AI 搜尋引擎,能夠即時搜尋網路資訊。本文將嘗試使用 Perplexity 完成事實查核任務 DEMO。
Thumbnail
看更多
你可能也想看
Thumbnail
本文介紹如何設置OpenAI API密鑰並使用Whisper API轉寫音訊檔案。文章詳細說明了轉寫單個音訊檔案,以及將長音訊分割並轉寫的過程。透過範例演示,讀者可以學習如何將音訊轉寫為文字,提高工作效率。
Thumbnail
本文介紹如何設置OpenAI API密鑰並使用Whisper API轉寫音訊檔案。文章詳細說明了轉寫單個音訊檔案,以及將長音訊分割並轉寫的過程。透過範例演示,讀者可以學習如何將音訊轉寫為文字,提高工作效率。
Thumbnail
這篇文章整理了多種好用的AI工具,涵蓋了聲音與音樂相關的AI、影音、圖像生成編輯工具和AI搜尋引擎等領域,幫助你節省時間和解放創意與生產力。
Thumbnail
這篇文章整理了多種好用的AI工具,涵蓋了聲音與音樂相關的AI、影音、圖像生成編輯工具和AI搜尋引擎等領域,幫助你節省時間和解放創意與生產力。
Thumbnail
最新的AI趨勢讓人眼花撩亂,不知要如何開始學習?本文介紹了作者對AI的使用和體驗,以及各類AI工具以及推薦的選擇。最後強調了AI是一個很好用的工具,可以幫助人們節省時間並提高效率。鼓勵人們保持好奇心,不停止學習,並提出了對健康生活和開心生活的祝福。
Thumbnail
最新的AI趨勢讓人眼花撩亂,不知要如何開始學習?本文介紹了作者對AI的使用和體驗,以及各類AI工具以及推薦的選擇。最後強調了AI是一個很好用的工具,可以幫助人們節省時間並提高效率。鼓勵人們保持好奇心,不停止學習,並提出了對健康生活和開心生活的祝福。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
AI 工具雖能在短時間生成內容,但它不瞭解你的客戶,也無法取代你做現場互動交流。在合適的時機選擇使用適合的 AI 工具,幫助我們專注於最重要的人事物上。
Thumbnail
AI 工具雖能在短時間生成內容,但它不瞭解你的客戶,也無法取代你做現場互動交流。在合適的時機選擇使用適合的 AI 工具,幫助我們專注於最重要的人事物上。
Thumbnail
OpenAI 繼上週發表新的人工智慧模型「GPT-4o mini」,由 AI 驅動的搜尋引擎 SearchGPT 原型也隨之發布,該引擎能結合來自網路的即時資訊,讓使用者像與 ChatGPT 交談一樣搜尋。 透過 SearchGPT,用戶能以自然語言提出問題(與使用 ChatGPT 交談方式相同
Thumbnail
OpenAI 繼上週發表新的人工智慧模型「GPT-4o mini」,由 AI 驅動的搜尋引擎 SearchGPT 原型也隨之發布,該引擎能結合來自網路的即時資訊,讓使用者像與 ChatGPT 交談一樣搜尋。 透過 SearchGPT,用戶能以自然語言提出問題(與使用 ChatGPT 交談方式相同
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
OpenAI 正在開发兩種類型的 AI 助手,這些軟體將協助完成原本由人類執行的任務,而無須人類密切監督。其中一種類型的 AI 代理人可以透過接管使用者的設備來自動化某些複雜任務,例如 ChatGPT 助理將數據從文檔轉移到電子表格或填寫費用報告並將它們輸入到會計軟體中。此類 AI 助理將需要使用者
Thumbnail
OpenAI 正在開发兩種類型的 AI 助手,這些軟體將協助完成原本由人類執行的任務,而無須人類密切監督。其中一種類型的 AI 代理人可以透過接管使用者的設備來自動化某些複雜任務,例如 ChatGPT 助理將數據從文檔轉移到電子表格或填寫費用報告並將它們輸入到會計軟體中。此類 AI 助理將需要使用者
Thumbnail
SearchGPT 是由 OpenAI 開發的 AI 驅動搜尋引擎,結合了傳統搜尋引擎技術和最新的 AI 技術,能即時從互聯網獲取資訊。它與其他搜尋引擎相比,提供更相關的搜尋結果、更豐富的結果呈現、更快的速度和更好的生態合作基礎建設。
Thumbnail
SearchGPT 是由 OpenAI 開發的 AI 驅動搜尋引擎,結合了傳統搜尋引擎技術和最新的 AI 技術,能即時從互聯網獲取資訊。它與其他搜尋引擎相比,提供更相關的搜尋結果、更豐富的結果呈現、更快的速度和更好的生態合作基礎建設。
Thumbnail
據美聯社報導,OpenGPT.com 宣佈推出 OpenGPTs。用戶只需要發佈一個OpenGPTs,便能夠整合所有主要的 AI 引擎包括ChatGPT-4o, Google Imagen, Gemini Pro, 以及Claude 3.5等。
Thumbnail
據美聯社報導,OpenGPT.com 宣佈推出 OpenGPTs。用戶只需要發佈一個OpenGPTs,便能夠整合所有主要的 AI 引擎包括ChatGPT-4o, Google Imagen, Gemini Pro, 以及Claude 3.5等。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News