EN: [Bug] Via Manifest: OpenRouter free models return HTTP 200 with 0 input/output tokens — should trigger autofix or fallback 中文: [Bug] 通过 Manifest 调用 OpenRouter 免费模型:返回 HTTP 200 但 input/output tokens 均为 0 —— 应触发 autofix 或 fallback
Description / 问题描述 EN:
When calling OpenRouter's free-tier models (e.g. nvidia/nemotron-3-ultra-550b-a55b:free) through Manifest (invoked by nanobot), the request returns an HTTP status code of 200 (Success), but both Input tokens and Output tokens are 0. This indicates that no actual content was generated or consumed, yet Manifest marks the request as successful and passes it through to the client.
Call chain: nanobot → Manifest → OpenRouter (free model)
Manifest's core responsibility is to transparently handle upstream failures via autofix or fallback, so that clients never experience a broken call. However, in this case Manifest neither detects the anomaly nor triggers any recovery — it simply forwards the empty 200 response to nanobot as if everything succeeded.
This is particularly common with OpenRouter's free-tier models which may silently fail due to rate-limiting or upstream capacity issues while still returning a 200.
中文:
当通过 Manifest(由 nanobot 发起调用)请求 OpenRouter 的免费层级模型(例如 nvidia/nemotron-3-ultra-550b-a55b:free)时,请求返回 HTTP 状态码 200(Success),但 Input tokens 和 Output tokens 均为 0。这表明实际上没有生成或消耗任何内容,但 Manifest 将请求标记为成功并直接透传给客户端。
调用链路:nanobot → Manifest → OpenRouter(免费模型)
Manifest 的核心职责是透明地处理上游故障(通过 autofix 或 fallback),使客户端永远不会感知到调用失败。然而在此场景中,Manifest 既没有检测到异常,也没有触发任何恢复机制——它只是将这个空的 200 响应当作一切正常一样转发给了 nanobot。
这种情况在 OpenRouter 免费层级模型中尤为常见——它们可能因限流或上游容量问题而静默失败,但仍返回 200。
Steps to Reproduce / 复现步骤 EN:
Set up nanobot to route LLM requests through Manifest. In Manifest, configure a provider pointing to OpenRouter with a valid API key. Select a free-tier model, e.g. nvidia/nemotron-3-ultra-550b-a55b:free. Send a chat completion request via nanobot. Check the request details in Manifest's dashboard — status shows Success (200) but tokens are all 0. The client (nanobot) receives an empty response with no error indication. 中文:
配置 nanobot,使其 LLM 请求通过 Manifest 路由。 在 Manifest 中配置一个指向 OpenRouter 的 provider,并填入有效的 API Key。 选择一个免费层级模型,例如 nvidia/nemotron-3-ultra-550b-a55b:free。 通过 nanobot 发送一次聊天补全请求。 在 Manifest 的仪表盘中查看请求详情 —— 状态显示 Success (200),但 token 数全部为 0。 客户端(nanobot)收到空响应,且没有任何错误提示。 ✅ Expected Behavior / 期望行为 EN:
Manifest should transparently detect and recover from this anomaly so that the client (nanobot) always receives a valid response:
Detect: Treat a 200 response with input_tokens == 0 && output_tokens == 0 as an upstream failure, not a success. Autofix: Automatically retry the same request (with backoff) to rule out transient upstream glitches. Fallback: If the retry also yields 0 tokens, automatically switch to another available model or provider (e.g. a paid-tier model on the same provider, or a different provider entirely). Transparent to client: The client should receive a normal, valid response without knowing a failure occurred internally. No extra error signal or notification should be sent to the client unless all recovery options are exhausted. Log internally: Record the detection, retry, and fallback steps in Manifest's own logs for observability and tuning. The design principle: the client should never see a broken call as long as any working fallback exists.
中文:
Manifest 应透明地检测并恢复此类异常,确保客户端(nanobot)始终收到有效响应:
检测:将 200 响应中 input_tokens == 0 && output_tokens == 0 的情况视为上游故障,而非成功。 Autofix(自动修复):自动重试同一请求(带退避策略),以排除上游瞬时故障。 Fallback(回退):如果重试后仍返回 0 tokens,自动切换到其他可用的模型或供应商(例如同一 provider 的付费层级模型,或完全不同的 provider)。 对客户端透明:客户端应收到正常的、有效的响应,无需知晓内部曾发生故障。除非所有恢复选项均耗尽,否则不应向客户端发送任何额外错误信号或通知。 内部记录:在 Manifest 自身的日志中记录检测、重试和回退步骤,用于可观测性和策略调优。 设计原则:只要存在可用的 fallback,客户端就不应看到任何失败的调用。
❌ Actual Behavior / 实际行为 EN:
The request is marked as Success (200) in Manifest despite having 0 input tokens and 0 output tokens. No autofix/retry is performed, no fallback is triggered. The empty response is passed through to nanobot as-is, resulting in a broken agent with no explanation.
中文:
尽管 input tokens 和 output tokens 均为 0,Manifest 仍将请求标记为 Success (200)。没有执行 autofix/重试,没有触发 fallback。空响应被原样透传给 nanobot,导致 agent 失效且无任何解释。
Source: mnfst/manifest