Skip to content

疑難排解:LLM 供應商

常見供應商錯誤

401 Unauthorized / 403 Forbidden

您的 API 金鑰無效、已過期或沒有足夠的權限。

修復方式:

bash
# 重新儲存 API 金鑰
triggerfish config set-secret provider:<name>:apiKey <your-key>

# 重新啟動 daemon
triggerfish stop && triggerfish start

各供應商注意事項:

供應商金鑰格式取得位置
Anthropicsk-ant-...console.anthropic.com
OpenAIsk-...platform.openai.com
GoogleAIza...aistudio.google.com
Fireworksfw_...fireworks.ai
OpenRoutersk-or-...openrouter.ai

429 Rate Limited

您已超過供應商的速率限制。Triggerfish 對大多數供應商不會自動在 429 時重試(Notion 除外,它有內建的退避機制)。

修復方式: 等待後重試。如果您持續遇到速率限制,請考慮:

  • 升級您的 API 方案以取得更高的限額
  • 新增備援供應商,當主要供應商被節流時請求可以降級處理
  • 如果排程任務是原因,減少觸發器頻率

500 / 502 / 503 伺服器錯誤

供應商的伺服器出現問題。這些通常是暫時性的。

如果您設定了備援鏈,Triggerfish 會自動嘗試下一個供應商。如果沒有備援,錯誤會傳遞給使用者。

「No response body for streaming」

供應商接受了請求但為串流呼叫回傳了空的回應本體。這可能發生在:

  • 供應商的基礎設施過載
  • 代理或防火牆剝離了回應本體
  • 模型暫時不可用

受影響的供應商:OpenRouter、Local(Ollama/LM Studio)、ZenMux、Z.AI、Fireworks。


供應商特定問題

Anthropic

工具格式轉換。 Triggerfish 在內部工具格式和 Anthropic 的原生工具格式之間進行轉換。如果您看到工具相關的錯誤,請檢查您的工具定義是否有有效的 JSON Schema。

系統提示詞處理。 Anthropic 要求系統提示詞作為獨立欄位,而非訊息。此轉換是自動的,但如果您看到「system」訊息出現在對話中,表示訊息格式有問題。

OpenAI

頻率懲罰。 Triggerfish 對所有 OpenAI 請求套用 0.3 的頻率懲罰以減少重複輸出。這是硬編碼的,無法透過設定更改。

圖片支援。 OpenAI 支援訊息內容中的 base64 編碼圖片。如果視覺功能不運作,請確認您設定了支援視覺的模型(例如 gpt-4o,而非 gpt-4o-mini)。

Google Gemini

查詢字串中的金鑰。 與其他供應商不同,Google 使用 API 金鑰作為查詢參數而非標頭。這會自動處理,但這表示如果您透過企業代理路由,金鑰可能會出現在代理/存取日誌中。

Ollama / LM Studio(本地)

伺服器必須在執行中。 本地供應商要求模型伺服器在 Triggerfish 啟動前就在執行。如果 Ollama 或 LM Studio 未在執行:

Local LLM request failed (connection refused)

啟動伺服器:

bash
# Ollama
ollama serve

# LM Studio
# 開啟 LM Studio 並啟動本地伺服器

模型未載入。 使用 Ollama 時,模型必須先拉取:

bash
ollama pull llama3.3:70b

端點覆寫。 如果您的本地伺服器不在預設連接埠上:

yaml
models:
  providers:
    local:
      model: llama3.3:70b
      endpoint: "http://localhost:11434"   # Ollama 預設
      # endpoint: "http://localhost:1234"  # LM Studio 預設

Fireworks

原生 API。 Triggerfish 使用 Fireworks 的原生 API,而非其 OpenAI 相容端點。模型 ID 可能與您在 OpenAI 相容文件中看到的不同。

模型 ID 格式。 Fireworks 接受多種模型 ID 格式。精靈會正規化常見格式,但如果驗證失敗,請在 Fireworks 模型庫查閱確切的 ID。

OpenRouter

模型路由。 OpenRouter 將請求路由到各種供應商。來自底層供應商的錯誤會被包裝在 OpenRouter 的錯誤格式中。實際的錯誤訊息會被提取並顯示。

API 錯誤格式。 OpenRouter 以 JSON 物件回傳錯誤。如果錯誤訊息看起來很籠統,原始錯誤會以 DEBUG 等級記錄。

ZenMux / Z.AI

串流支援。 兩個供應商都支援串流。如果串流失敗:

ZenMux stream failed (status): error text

檢查您的 API 金鑰是否具有串流權限(某些 API 層級限制串流存取)。


備援切換

備援切換如何運作

當主要供應商失敗時,Triggerfish 會依序嘗試 failover 清單中的每個模型:

yaml
models:
  failover:
    - openai/gpt-4o
    - google/gemini-2.5-pro

如果備援供應商成功,回應會記錄使用了哪個供應商。如果所有供應商都失敗,最後一個錯誤會回傳給使用者。

「All providers exhausted」

鏈中的每個供應商都失敗了。檢查:

  1. 所有 API 金鑰是否有效?逐個測試每個供應商。
  2. 所有供應商是否都在經歷停機?查看其狀態頁面。
  3. 您的網路是否阻擋了對任何供應商端點的 HTTPS 連線?

備援切換設定

yaml
models:
  failover_config:
    max_retries: 3          # 每個供應商在移至下一個之前的重試次數
    retry_delay_ms: 1000    # 重試之間的基礎延遲
    conditions:             # 哪些錯誤條件觸發備援切換
      - timeout
      - server_error
      - rate_limited

「Primary provider not found in registry」

models.primary.provider 中的供應商名稱與 models.providers 中任何已設定的供應商不匹配。請檢查拼寫。

「Classification model provider not configured」

您設定了一個 classification_models 覆寫,參照了 models.providers 中不存在的供應商:

yaml
models:
  classification_models:
    RESTRICTED:
      provider: local        # 此供應商必須存在於 models.providers 中
      model: llama3.3:70b
  providers:
    # "local" 必須在此定義
    local:
      model: llama3.3:70b
      endpoint: "http://localhost:11434"

重試行為

Triggerfish 在暫時性錯誤(網路逾時、5xx 回應)時重試供應商請求。重試邏輯:

  1. 在每次嘗試之間使用指數退避等待
  2. 以 WARN 等級記錄每次重試嘗試
  3. 對一個供應商的重試用盡後,移至備援鏈中的下一個
  4. 串流連線對連線建立和串流中斷有獨立的重試邏輯

您可以在日誌中看到重試嘗試:

Provider request failed with retryable error, retrying
Provider stream connection failed, retrying