Skip to content

故障排除:LLM 提供商 ​

常见提供商错误 ​

401 Unauthorized / 403 Forbidden ​

您的 API 密钥无效、已过期或权限不足。

修复方法:

bash
# 重新存储 API 密钥
triggerfish config set-secret provider:<name>:apiKey <your-key>

# 重启守护进程
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 速率受限 ​

您已超过提供商的速率限制。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