OpenAI APIAPI TutorialFunction Calling

OpenAI API 教學 2026:從第一次呼叫到正式上線

閱讀 1 分鐘

OpenAI 的文件非常完整。但也分散在六份不同的 API 參考文件、三份移轉指南,以及一份每月更新的變更記錄裡。

2024 年的教學引用的都是已經被淘汰的模型、被刪除的參數。你搜尋「OpenAI streaming example」,找到四種不同寫法——其中只有兩種還能用。

這份教學涵蓋 2026 年 7 月為止 OpenAI API 的所有主要功能,按照你應該學習的順序排列,而且附上可以跑的程式碼。

沒有被淘汰的參數。沒有「請查最新文件」的推託之詞。每個範例都經過目前 API 的實際測試。

2026 年的 OpenAI API 版圖

OpenAI 目前維護三套主要的 API,知道該用哪一套,可以避免很多混亂。

Chat Completions API/v1/chat/completions):經典款。無狀態(stateless)、一問一答。送訊息出去,拿完成內容(completion)回來。支援 streaming、function calling、JSON mode 和 structured outputs。90% 的應用程式都在用它。如果你不確定要用哪一套,就用這個。

Responses API/v1/responses):比較新,有狀態(stateful)。由伺服器端維護對話狀態,你不用自己管理訊息陣列。內建工具支援 web search、file search 和 computer use。更適合複雜的 agent 工作流程——模型需要在多個回合中協調多個工具。代價是:對訊息歷史的控制比較少,而且 API 仍在演進中。

Agents SDK:最新加入的。一套用來打造持久性 AI agent 的框架,內建護欄(guardrails)、專門 agent 之間的交接(handoff)、以及 tracing。比起原始 API 更受限——你用彈性換取常見 agent 模式更快的開發速度。這裡不詳細介紹;Building AI Agents 指南有完整說明。

目前的模型陣容(2026 年 7 月):

模型Input $/MOutput $/MContext最適合
GPT-5.5$5.00$30.001M最高效能,複雜推理
GPT-5.4$2.50$15.001M效能強勁,性價比更高
GPT-5.4 Mini$0.75$4.50400K日常任務,成本與品質兼顧
GPT-5.4 Nano$0.20$1.25128K大量簡單任務
o4-mini$1.10$4.40200K數學、邏輯、程式題(推理特化)

身分驗證。 把 API Key 設定成 OPENAI_API_KEY 環境變數——絕對不要寫死在程式裡。正式環境的 Key 管理、輪換、權限範圍與虛擬 Key 架構,請見我們的 API Key 管理指南

Chat Completions API:地基

每一項 OpenAI 整合都是從這裡開始的。

基本聊天呼叫——Python:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.tokspan.com/v1",
    api_key="ts-your-key-here"
)

response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[
        {"role": "system", "content": "You are a software engineer. Answer with code when appropriate."},
        {"role": "user", "content": "Write a Python function to check if a string is a palindrome."}
    ],
    temperature=0.3,       # Low = deterministic, good for code
    max_tokens=500,        # Cap output length
    top_p=0.95             # Nucleus sampling —usually leave at default
)

print(response.choices[0].message.content)

每個關鍵參數:

  • model——要用哪台模型。正式環境請用日期版本 ID(gpt-5.5-2025-06-15),不要用別名(gpt-5.5)。別名會默默升級到新的 snapshot,可能改變你的提示詞行為。
  • messages——由帶有 role(「system」、「user」、「assistant」)與 content 的訊息物件組成的陣列。系統訊息設定行為。使用者訊息就是請求。assistant 訊息是先前模型的回應——要保留對話上下文就得一起帶上。
  • temperature——0 到 2。寫程式與事實型任務用 0~0.3。聊天與創作用 0.7~1.0。腦力激盪用 1.0 以上。
  • max_tokens——輸出長度的硬性上限。模型撞到這個上限就會停下來,就算是句子講到一半。大部分任務都設得寬鬆一點(500~4,000)。
  • top_p——temperature 的替代方案。通常保持預設值(1.0),只用 temperature 控制隨機性就好。

寫對系統訊息。 好的系統訊息要具體,不要講大道理。爛範例:「你是個好用的 AI 助理。」好範例:「你是 Python 程式碼審查員。針對每一段程式碼,找出:(1) 潛在 bug、(2) 效能問題、(3) 風格違規。用條列式格式回應。每個條目不超過 30 字。」

多回合對話。 API 是無狀態的。它不記得你先前呼叫過什麼。

要對話,就得每次把整段訊息歷史都送過去——系統訊息+先前所有使用者與 assistant 訊息+新的使用者訊息。當歷史接近模型的上下文上限時,就刪掉最舊的訊息,或把對話做摘要。截斷比出錯好;摘要又比截斷好。

Streaming:即時回應

非串流模式:使用者要等 3~8 秒,然後一次看到完整回應。串流模式:使用者從約 0.4 秒開始,即時看到文字出現。UI 上的差別,就是「覺得好慢」跟「覺得秒回」的差別。

Python 的串流實作:

stream = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "Explain recursion."}],
    stream=True
)

for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Node.js 的串流實作:

const stream = await client.chat.completions.create({
    model: "gpt-5.5",
    messages: [{ role: "user", content: "Explain recursion." }],
    stream: true
});

for await (const chunk of stream) {
    if (chunk.choices[0]?.delta?.content) {
        process.stdout.write(chunk.choices[0].delta.content);
    }
}

需要處理的邊緣情況: 空白 chunk(串流開頭的前幾個 chunk 常常沒有內容——API 還在處理中)。連線中斷(把串流包進 try/except,中途失敗就用同一組訊息重試)。追蹤 finish_reason(最後一個 chunk 會包含 finish_reason——檢查它,才能知道模型是自然結束,還是撞到了上限)。

Function Calling:給你的 LLM 工具

模型不會執行程式。它會產生一段 JSON,描述該呼叫哪個函式、帶哪些參數。執行函式的是你的程式碼。

你把結果送回給模型。模型用這個結果產生最終回應。這就是所有 AI agent 背後共同的架構。

完整的天氣 agent 範例:

import json

# Step 1: Define the tool
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get current weather for a city. Returns temperature in Celsius and conditions.",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "City name, e.g. 'Tokyo'"}
            },
            "required": ["city"]
        }
    }
}]

# Step 2: User asks a question that needs the tool
response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
    tools=tools,
    tool_choice="auto"  # Model decides whether to use a tool
)

# Step 3: Check if model wants to call a tool
msg = response.choices[0].message
if msg.tool_calls:
    tool_call = msg.tool_calls[0]
    args = json.loads(tool_call.function.arguments)

    # Step 4: Execute the function (in reality, call a weather API)
    weather_result = get_actual_weather(args["city"])

    # Step 5: Send the result back
    messages = [
        {"role": "user", "content": "What's the weather in Tokyo?"},
        msg,  # The assistant's tool_call message
        {"role": "tool", "tool_call_id": tool_call.id, "content": str(weather_result)}
    ]

    final_response = client.chat.completions.create(
        model="gpt-5.5",
        messages=messages
    )
    print(final_response.choices[0].message.content)

平行 function calling。 定義多個工具。如果這些工具彼此獨立,模型可能一次要求好幾個——「取得東京 AND 大阪的天氣」。你的程式碼要能處理回應裡的多個 tool_calls,平行執行它們(asyncio.gather),再把所有結果一起送回去。

Function calling 最佳做法。 工具描述就是提示詞——寫得清楚一點,並附上每個工具該在什麼時候用的範例。參數要嚴格限制——用 enum,不要用自由文字字串。OpenAI 的 function calling 指南 詳細涵蓋了串流 tool calls、平行執行等邊緣情況。

讓工具保持冪等(idempotent)。工具執行失敗時,把錯誤訊息送回給模型——它常常可以靠嘗試不同參數來恢復。

跨供應商的 function calling 比較——OpenAI、Anthropic、Google、DeepSeek——包括哪些功能在轉成 OpenAI 相容格式後還能存活,完整的比較請見 tool calling 比較

Structured Outputs:保證是 JSON

JSON mode(response_format={"type": "json_object"})是「暗示」你要 JSON。模型通常會照做。Structured Outputs(response_format={"type": "json_schema", ...})則是「保證」——模型的 token 取樣會被限制成只會產生符合你 schema 的有效 JSON。

什麼時候用哪一種。 JSON mode:快速 prototyping、內部工具、偶爾遇到壞掉的 JSON 也沒關係的情況。Structured Outputs:正式環境 API、面向客戶的功能、任何無效 JSON 會引發連鎖失敗的情況。OpenAI 的 Structured Outputs 文件 涵蓋完整的 schema 定義語法與支援的模型。

定義 schema——履歷解析器範例:

response = client.chat.completions.create(
    model="gpt-5.4",  # Structured Outputs supported on GPT-5.4+
    messages=[{"role": "user", "content": f"Extract information from this resume:\n\n{resume_text}"}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "resume_extraction",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "skills": {"type": "array", "items": {"type": "string"}},
                    "years_experience": {"type": "integer"},
                    "current_role": {"type": "string"}
                },
                "required": ["name", "skills", "years_experience"]
            }
        }
    }
)

resume_data = json.loads(response.choices[0].message.content)
# Guaranteed to match your schema. No try/except json.loads needed.

正式環境部署檢查清單

環境管理。 API Key 放進機密保管庫(AWS Secrets Manager、HashiCorp Vault、Doppler),不要放在 .env 檔裡。每 90 天輪換一次 Key。開發、測試、正式環境三種環境用不同的 Key,並配上不同的預算上限與模型許可清單。

正式環境的錯誤處理。 每一次 API 呼叫都要包上「指數退避+抖動」的重試。對持續失敗的供應商設定斷路器(circuit breaker)——暫停對它路由 30 秒、探測、恢復健康就重新啟用。永遠不要把原始的 API 錯誤直接丟給使用者——轉成友善的訊息,細節留在內部記錄。

成本監控。 分別追蹤每個使用者、每項功能、每台模型的成本。在正常每日支出的 2 倍設定異常警示。

那張 $500 的驚人帳單,通常發生在沒人盯著的時刻。每日成本摘要 10 秒就能掃完。

速率限制管理。 搞清楚自己等級的 RPM 與 TPM 上限。每個回應都要讀 x-ratelimit-remaining-* 標頭。剩下 30% 就放慢。剩下 10% 就停下來。

從反應式退避到預測性節流,完整的速率限制架構請見我們的正式環境速率限制處理指南

另一條路。 聚合平台在基礎設施層級替你處理身分驗證、錯誤復原、成本記錄與速率限制管理。你只要專心寫應用程式邏輯。

代價是對請求路徑的控制變少。對大部分團隊來說,省下來的時間勝過放棄的控制權。

常見問題

GPT-5.5 跟 o4-mini 差在哪?

GPT-5.5 是通用模型,適合聊天、寫程式、分析與生成。o4-mini 是推理特化模型——回應前思考更久,因此在數學、邏輯題與形式推理上更強,但更慢,每個 token 也更貴。

日常任務用 GPT-5.5。平常會拿出計算機或寫形式證明的任務,用 o4-mini。

我需要改用 Responses API 取代 Chat Completions 嗎?

還不需要。Chat Completions 穩定、支援最廣,能處理 90% 的使用情境。Responses API 多了狀態管理與內建工具(web search、file search),但比較新,還在演進。

先從 Chat Completions 開始。當你需要它的特定功能時,再移轉到 Responses API。

怎麼降低 OpenAI API 的成本?

簡單任務用 GPT-5.4 Mini($0.75/$4.50)代替 GPT-5.5($5/$30)。啟用 prompt caching——被快取的輸入打 5 折。不急的工作用 batch API——24 小時內回覆打 5 折。

或者用聚合平台——用量合併計價加上自動模型路由,不用手動切換模型就能降低成本。砍帳單技巧指南 逐一講解每種策略。

可以把 OpenAI SDK 用在非 OpenAI 的模型上嗎?

可以。大部分供應商都提供 OpenAI 相容的 endpoint。

base_urlapi_key 就行。你的程式碼完全不動。這就是 OpenAI 相容標準最大的優勢——你不會被綁死在任何一家供應商。

OpenAI 把我正在用的模型淘汰了怎麼辦?

OpenAI 通常會提前 1~3 個月通知。固定用日期版本 ID(gpt-5.5-2025-06-15),不要用別名(gpt-5.5),才能控制自己何時移轉。

在淘汰日期前,用你的提示詞測過替代模型。設定一台非 OpenAI 的備援模型,這樣你就不必配合 OpenAI 的時間表被迫移轉。

OpenAI API 會成為業界標準不是沒有理由:成熟的 SDK、完整的文件、優先支援它的生態系。但 2026 年是這套標準開始出現裂痕的第一年——Anthropic 的原生協定、Google 的自動 function calling、DeepSeek 的價格壓力,各自把開發者往那些「轉成 /v1/chat/completions 之後就活不下來」的功能拉去。值得追蹤的問題:OpenAI 的 Agents SDK 會成為重新統一生態系的下一代業界標準,還是會透過推出只能在 OpenAI 自家基礎設施上用的功能,加速生態系的分裂?

開始寫程式——用你自己的方式駕馭 OpenAI 的 API。準備好之後,再用同一支 SDK 加上 Claude、Gemini 和 DeepSeek——因為 2026 年唯一安全的賭注,就是能在每一家供應商上跑的程式碼。