musistudio/claude-code-router · error · Error

OpenAI resolve retrieval returned no assistant content or to

Error message

OpenAI resolve retrieval returned no assistant content or tool calls.

What it means

Thrown when the resolver's assistant message exists but has neither string content nor any valid tool calls (all tool_calls with empty function names are filtered out). The model returned a structurally present but substantively empty answer.

Source

Thrown at packages/core/src/mcp/toolhub-mcp.ts:1702

      throw new Error("OpenAI resolve retrieval returned no assistant message.");
    }
    const content = typeof message.content === "string" ? message.content : "";
    const toolCalls = (message.tool_calls ?? [])
      .map((toolCall, index) => {
        const rawToolCall = toolCall as unknown as { function?: unknown };
        const functionCall = isRecord(rawToolCall.function) ? rawToolCall.function : {};
        return {
          id: toolCall.id || `tool_call_${index}`,
          type: "function" as const,
          function: {
            arguments: typeof functionCall.arguments === "string" ? functionCall.arguments : "",
            name: typeof functionCall.name === "string" ? functionCall.name : ""
          }
        };
      })
      .filter((toolCall) => toolCall.function.name.length > 0);
    if (!content && toolCalls.length === 0) {
      throw new Error("OpenAI resolve retrieval returned no assistant content or tool calls.");
    }
    return {
      role: "assistant",
      content,
      tool_calls: toolCalls
    };
  }
}

async function waitForLocalResolverEndpoint(baseURL: string, apiKey: string, timeoutMs: number): Promise<void> {
  const readinessUrl = localResolverReadinessUrl(baseURL);
  if (!readinessUrl) {
    return;
  }
  const deadline = Date.now() + Math.min(Math.max(timeoutMs, 1000), 30_000);
  let lastError: unknown;
  while (Date.now() < deadline) {
    const controller = new AbortController();

View on GitHub (pinned to 99f24806c6)

Solutions

  1. Retry once — transient empty model outputs happen
  2. Verify tool definitions are passed in the resolve request and the endpoint supports function/tool calling
  3. Try a different TOOLHUB_OPENAI_MODEL known to support tool calling
  4. Shorten/simplify the query to avoid truncation or filter triggers
Defensive patterns

Strategy: retry

Try / catch

for (let i = 0; i < 2; i++) {
  try {
    return await toolhub.resolve({ query });
  } catch (e) {
    if (!(e instanceof Error && e.message.includes("no assistant content"))) throw e;
  }
}
throw new Error("Resolver returned empty responses repeatedly");

Prevention

When it happens

Trigger: The chat completion returns a message with content: null/empty and tool_calls that are empty or all have blank function names.

Common situations: Model declining or hitting content filters; gateway stripping tool_calls; mismatch between tools parameter format and a non-OpenAI provider; edge-case finish_reason=length truncation.

Related errors


AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27). Data as JSON: /api/errors/80427ad3189d4720. Report an issue: GitHub.