{"record":{"id":"bea3a06649cfce81","repo":"diegosouzapw/OmniRoute","slug":"no-user-message-found-in-request","errorCode":null,"errorMessage":"No user message found in request","messagePattern":"No user message found in request","errorType":"validation","errorClass":"Error","httpStatus":400,"severity":"error","filePath":"open-sse/executors/claude-web/payload.ts","lineNumber":330,"sourceCode":"}\n\n/**\n * Transform OpenAI format to Claude Web format\n */\nexport function transformToClaude(\n  body: Record<string, unknown>,\n  model: string,\n  turn?: ClaudeWebTurnFields\n): ClaudeWebRequestPayload {\n  const messages = Array.isArray(body.messages) ? body.messages : [];\n  const reasoningEffort = resolveClaudeWebReasoningEffort(body);\n  const resolvedModel = model || DEFAULT_CLAUDE_MODEL;\n  const prompt =\n    turn?.prompt ?? (buildPromptFromMessages(messages) || latestUserPrompt(messages));\n  const resolvedTurn = turn ?? defaultTurn(prompt);\n\n  if (resolvedTurn.operation === \"completion\" && !resolvedTurn.prompt.trim()) {\n    throw new Error(\"No user message found in request\");\n  }\n\n  return buildClaudeWebPayload(body, resolvedModel, reasoningEffort, resolvedTurn);\n}\n\n/**\n * Transform Claude Web response to OpenAI format.\n *\n * `kind` selects which delta field carries `claudeContent`: `\"content\"`\n * (default, preserves the original call sites) or `\"reasoning\"` — the\n * latter maps Claude's `thinking_delta` text onto `delta.reasoning_content`,\n * the same field the real-Anthropic-API translator uses\n * (open-sse/translator/response/claude-to-openai.ts) so downstream clients\n * (Claude Code, Cursor, etc.) render it as the thinking panel instead of\n * silently dropping it (#6662).\n */\nexport function transformFromClaude(\n  claudeContent: string,","sourceCodeStart":312,"sourceCodeEnd":348,"githubUrl":"https://github.com/diegosouzapw/OmniRoute/blob/a179ffed5bb2e0b883b9ae7214ce8717b2a94c4d/open-sse/executors/claude-web/payload.ts#L312-L348","documentation":"Validation in transformToClaude: no usable prompt could be derived. Neither buildPromptFromMessages nor latestUserPrompt produced a prompt for the Claude Web payload (and no turn.prompt override was supplied), meaning the incoming OpenAI-format body contains no extractable user text — e.g. messages is empty, only assistant messages, or all user contents are empty/non-text.","triggerScenarios":"Thrown at open-sse/executors/claude-web/payload.ts:330 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reject the client request with a 400 explaining a non-empty user message is required","If using a stored turn, pass turn.prompt when the conversation history has no new user text"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a179ffed5bb2e0b883b9ae7214ce8717b2a94c4d","analyzedAt":"2026-08-25T18:35:09.898Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}