OpenAI API 最容易寫錯的地方,不是帳號申請,而是教學版本過時。很多文章還停在舊的 chat.completions.create 寫法,或直接把 API key 寫死在程式裡。這篇我直接對照 OpenAI 官方 quickstart,所以會以目前官方主推的 Responses API 流程為主。
除了基本環境建置,這篇會深入 Responses API 的進階用法,包含 tool use(讓 AI 呼叫你的工具)、streaming(串流回應)、structured outputs(結構化輸出),以及在 VPS 上長期運行 AI 工作流的實務建議。
你會學到什麼
- 用 OpenAI 官方 Python SDK 建立最小可用環境
- 正確設定
OPENAI_API_KEY,避免把金鑰硬寫死在程式裡 - 使用官方目前主推的 Responses API 跑出第一個請求
- 掌握 tool use、streaming 和 structured outputs 的實際用法
- 在 VPS 上建立穩定的 AI 自動化工作流
什麼情況最適合先看這篇
- 想在 VPS 上建立 AI 開發環境、工具鏈或自動化流程的開發者
- 想先用 Python 把 OpenAI API 串起來,再慢慢擴成正式服務的人
- 不想再被舊版 SDK 寫法和過時模型名稱誤導的人
- 想用 tool use 讓 AI 呼叫自己的 API 和工具的人
開始前先確認
- 你已有一組 OpenAI API key
- VPS 或本機已有 Python 3 與
python3-venv/pip可用環境 - 你準備把金鑰放進環境變數,而不是直接寫進測試檔
先提醒你一件事
OpenAI 官方 quickstart 現在強調的是先把 OPENAI_API_KEY 匯出成環境變數,再讓 SDK 自動讀取,而且示範 API 是 client.responses.create(...)。如果你看到教學還在把 key 直接塞進 OpenAI(api_key="..."),那多半已經不是官方現在最推薦的寫法。
詳細教學與操作步驟
根據 OpenAI 官方 quickstart,Python 環境的標準起手式是:先建立 API key,匯出成環境變數,再安裝官方 SDK,最後用 Responses API 跑一個最小可用請求。
為什麼在 VPS 上開發 OpenAI 應用?
在 VPS 上運行 AI 工作流,能讓你的應用程式 24/7 不間斷運作。無論是自動分析伺服器日誌、建構智能機器人還是處理大規模資料,結合 侃瑞科技的高性能 VPS 與 OpenAI API 都是當前的最佳開發配置。
步驟一:確認 Python 環境
大多數 Ubuntu 系統已內建 Python 3。請執行指令確認版本:
python3 --version
接著,安裝 Python 套件管理工具 pip 與虛擬環境工具:
sudo apt update
sudo apt install python3-pip python3-venv -y
步驟二:建立虛擬環境
為了避免不同專案之間的套件衝突,建議建立虛擬環境:
mkdir my-ai-app && cd my-ai-app
python3 -m venv venv
source venv/bin/activate
步驟三:安裝 OpenAI SDK
在虛擬環境中安裝 openai 套件:
pip install openai
步驟四:匯出 API Key 環境變數
OpenAI 官方 quickstart 建議先把金鑰匯出成環境變數,SDK 會自動讀取:
export OPENAI_API_KEY="your_api_key_here"
如果你要長期使用,請把這行放進你的 shell 設定檔,而不是每次手動輸入:
# ~/.bashrc 或 ~/.zshrc
export OPENAI_API_KEY="your_api_key_here"
重新載入設定:
source ~/.bashrc
步驟五:建立最小可用測試程式
建立 test_ai.py,填入官方現在較接近 quickstart 的 Responses API 寫法:
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-4.1",
input="請用一句話介紹侃瑞科技 VPS 的優點。"
)
print(response.output_text)
執行測試:
python3 test_ai.py
如果成功顯示模型回應,就代表你的 Python 環境、SDK 與 API key 都已經接好了。
步驟六:Streaming — 串流回應
跟 Gemini 一樣,串流回應讓你的應用可以即時顯示 AI 正在產生的文字:
from openai import OpenAI
client = OpenAI()
stream = client.responses.create(
model="gpt-4.1",
input="寫一篇 300 字的 VPS 選購指南。",
stream=True
)
for event in stream:
if hasattr(event, "delta") and event.delta:
print(event.delta, end="", flush=True)
print() # 換行
串流回應特別適合:
- 即時聊天介面 — 讓使用者看到 AI 正在「打字」
- 長文生成 — 不用等 30 秒才看到完整結果
- 命令列工具 — 即時顯示分析進度
步驟七:Tool Use — 讓 AI 呼叫你的工具
Tool use 是 Responses API 的核心功能之一,讓 AI 可以呼叫你定義的函式來取得資訊或執行動作:
from openai import OpenAI
import json
client = OpenAI()
# 定義工具
tools = [
{
"type": "function",
"function": {
"name": "get_server_status",
"description": "查詢指定伺服器的目前狀態",
"parameters": {
"type": "object",
"properties": {
"server_id": {
"type": "string",
"description": "伺服器 ID,例如 vps-001"
}
},
"required": ["server_id"]
}
}
},
{
"type": "function",
"function": {
"name": "get_pricing",
"description": "查詢 VPS 方案的價格",
"parameters": {
"type": "object",
"properties": {
"plan": {
"type": "string",
"enum": ["nano", "xs", "s", "m", "l", "xl"],
"description": "VPS 方案名稱"
}
},
"required": ["plan"]
}
}
}
]
# 實際的函式實作
def get_server_status(server_id):
return {"status": "running", "uptime": "99.9%", "cpu": "12%"}
def get_pricing(plan):
prices = {"nano": 900, "xs": 1500, "s": 2200,
"m": 4500, "l": 9000, "xl": 18000}
return {"plan": plan, "monthly": prices.get(plan), "currency": "TWD"}
response = client.responses.create(
model="gpt-4.1",
input="我想知道 M 方案的價格,還有 vps-001 的狀態",
tools=tools
)
# 處理 tool calls
for output in response.output:
if output.type == "function_call":
name = output.name
args = json.loads(output.arguments)
if name == "get_server_status":
result = get_server_status(args["server_id"])
elif name == "get_pricing":
result = get_pricing(args["plan"])
print(f"Tool {name}: {result}")
Tool use 的實際應用場景:
- 客服機器人 — 查訂單狀態、帳單、方案資訊
- DevOps 助手 — 查伺服器狀態、重啟服務、檢查日誌
- 資料分析 — 讓 AI 查詢資料庫、呼叫分析 API
步驟八:Structured Outputs — 讓 AI 輸出結構化資料
如果你需要 AI 輸出固定格式的 JSON,structured outputs 會比「請你輸出 JSON 格式」這種 prompt 更可靠:
from openai import OpenAI
from pydantic import BaseModel
client = OpenAI()
class ServerAnalysis(BaseModel):
server_id: str
health_score: int
issues: list[str]
recommendations: list[str]
response = client.responses.parse(
model="gpt-4.1",
input="分析伺服器 vps-001 的健康狀態:CPU 95%、記憶體 80%、磁碟 60%",
text_format=ServerAnalysis,
)
analysis = response.output_parsed
print(f"健康分數: {analysis.health_score}")
print(f"問題: {analysis.issues}")
print(f"建議: {analysis.recommendations}")
Structured outputs 特別適合:
- 資料管線 — 讓 AI 輸出的資料可以直接寫入資料庫
- API 回應 — 保證回傳格式一致
- 報表生成 — 產出固定欄位的分析結果
步驟九:Web Search — 讓 AI 搜尋最新資訊
Responses API 也支援內建的 web search 工具,讓 AI 可以搜尋即時資訊:
response = client.responses.create(
model="gpt-4.1",
input="目前台灣最新的資安事件有哪些?",
tools=[{"type": "web_search_preview"}]
)
print(response.output_text)
步驟十:錯誤處理與重試機制
在正式環境中,API 呼叫可能因為各種原因失敗。建立良好的錯誤處理很重要:
from openai import OpenAI, APIError, RateLimitError
import time
client = OpenAI()
def safe_api_call(prompt, max_retries=3):
for attempt in range(max_retries):
try:
response = client.responses.create(
model="gpt-4.1",
input=prompt
)
return response.output_text
except RateLimitError:
wait = 2 ** attempt # 指數退避
print(f"Rate limit,等待 {wait} 秒後重試...")
time.sleep(wait)
except APIError as e:
print(f"API 錯誤: {e}")
if attempt == max_retries - 1:
raise
return None
result = safe_api_call("分析這台伺服器的效能")
常見問題
Q:為什麼我照舊教學寫 chat.completions.create 還是能跑?
有些舊寫法在某些場景仍可能可用,但 OpenAI 官方 quickstart 現在已經主推 Responses API。你如果是新專案,建議直接從官方目前推薦的介面開始,後面功能擴充會更一致。
Q:可以讓 AI 直接管理我的伺服器嗎? 技術上做得到,但你應該先把 shell 權限、允許操作範圍、費用上限與日誌追蹤想清楚,再把它接進正式環境。否則最先出問題的通常不是模型能力,而是權限邊界。
Q:tool use 跟 function calling 有什麼不同? 在 Responses API 中,tool use 是更廣的概念,包含 function calling、web search 等。Function calling 是 tool use 的一種。
Q:streaming 和 structured outputs 可以同時用嗎? 目前部分模型和 API 版本支援串流結構化輸出,但實作上會比較複雜。建議先分開使用,確認各自正常後再嘗試組合。
做完後怎麼確認自己真的有設對
- 用目前 shell 執行
echo $OPENAI_API_KEY,確認環境變數真的存在 - 實際跑一次測試程式,確認有拿到
response.output_text - 測試串流回應,確認可以即時收到 chunk
- 測試 tool use,確認 AI 會正確呼叫你定義的工具
- 如果你換 shell、換 session 或重開 VPS,記得再驗一次環境變數有沒有跟著載入
這一題最常踩的坑
- API key 還是寫死在程式裡,後面很容易外洩
- 一直照舊版文章寫舊 API,結果和官方新文件越差越遠
- 測試成功一次後就不管環境變數,之後換 shell 或排程時又壞掉
- Tool use 的工具定義 description 寫太模糊,AI 搞不清楚什麼時候該呼叫
- 沒有做錯誤處理和重試,API 偶爾 timeout 整個服務就掛了
- Structured outputs 的 schema 太複雜,反而增加出錯機率
如果你要往下一步走
如果你接下來要在同一台機器上用 Codex 直接協助寫程式或維護 repo,可以接著看 OpenAI Codex CLI 工具安裝教學。如果你只是要先把 Node / Python 開發底座打好,則可以搭配 VPS Node.js 安裝教學 一起整理。想同時了解其他 AI API,也可以參考 Gemini API Node.js 教學。