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
- Retry once — transient empty model outputs happen
- Verify tool definitions are passed in the resolve request and the endpoint supports function/tool calling
- Try a different TOOLHUB_OPENAI_MODEL known to support tool calling
- 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
- Retry once on empty model responses
- Use models with reliable tool-calling
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
- OpenAI resolve retrieval returned no assistant message.
- ToolHub resolver requires TOOLHUB_OPENAI_API_KEY and TOOLHUB
- Resolve retrieval did not converge on any valid catalog tool
- Resolve retrieval did not converge on any valid catalog tool
- ToolHub resolve query must be non-empty.
AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27).
Data as JSON: /api/errors/80427ad3189d4720.
Report an issue: GitHub.