iT邦幫忙

0

用 40 行 Python 處理 LLM API 的逾時、重試與模型備援(OpenAI 相容介面通用)

  • 分享至 

  • xImage
  •  

揭露:我在 APIGOTO 團隊工作。APIGOTO 是獨立的 OpenAI 相容 API 閘道,與 OpenAI、Anthropic、Google 無關。下面的寫法適用於任何 OpenAI 相容端點,不限我們家。

原型接上 LLM API 之後,最先遇到的問題通常不是 prompt,而是 429、請求卡住不回、或某個模型暫時不可用。以下是我常用的小封裝,一次處理這三件事。

思路

  1. 每個請求都設硬性逾時。
  2. 遇到限流(429)和 5xx 用指數退避重試。
  3. 同一個模型持續失敗,就換清單裡的下一個模型。

程式碼

import os, time
from openai import OpenAI, APIStatusError, APITimeoutError, APIConnectionError

client = OpenAI(
    base_url=os.getenv("LLM_BASE_URL", "https://api.china-aiapi.com/v1"),
    api_key=os.environ["LLM_API_KEY"],
    timeout=30,      # 不要無限等待
    max_retries=0,   # 重試自己控制
)

RETRYABLE = {429, 500, 502, 503, 504}

def chat(messages, models, attempts=3):
    last_err = None
    for model in models:
        for i in range(attempts):
            try:
                r = client.chat.completions.create(model=model, messages=messages)
                return model, r.choices[0].message.content
            except APIStatusError as e:
                last_err = e
                if e.status_code not in RETRYABLE:
                    break          # 400/401/404 重試沒用,直接換下一個模型
            except (APITimeoutError, APIConnectionError) as e:
                last_err = e
            time.sleep(min(2 ** i, 8))
    raise RuntimeError(f"all models failed: {last_err}")

model, text = chat(
    [{"role": "user", "content": "用一句話解釋 HTTP 429。"}],
    models=["your-primary-model", "your-backup-model"],
)
print(model, text)

幾個重點

  • 模型 ID 請用服務商實際列出的(client.models.list()),不要自己猜。
  • 401、404 代表金鑰或模型名稱有誤,不要重試。
  • 記錄是哪個模型回答的;備援常被觸發時你會想知道。
  • 因為只換 base_url 和金鑰,這段程式可以直接指向 OpenAI、自架服務或任何閘道。

想用我們的閘道試試的話,Base URL 是 https://api.china-aiapi.com/v1,按量計費:www.china-aiapi.com。歡迎在留言討論這個寫法的改進。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言