{"record":{"id":"56def090fefc6aea","repo":"can1357/oh-my-pi","slug":"message-errormessage-provider-error","errorCode":null,"errorMessage":"${message.errorMessage ?? \"Provider error\"}","messagePattern":"\\$\\{message\\.errorMessage \\?\\? \"Provider error\"\\}","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/commit/conventional/inference.ts","lineNumber":132,"sourceCode":"\t\t\ttry {\n\t\t\t\tthis.#onProgress?.(request.progressLabel);\n\t\t\t\tconst timeout = AbortSignal.timeout(120_000);\n\t\t\t\tconst signal = this.#signal ? AbortSignal.any([this.#signal, timeout]) : timeout;\n\t\t\t\tconst message = await completeSimple(\n\t\t\t\t\ttarget.model,\n\t\t\t\t\t{\n\t\t\t\t\t\tsystemPrompt: request.systemPrompt.trim() ? [request.systemPrompt] : undefined,\n\t\t\t\t\t\tmessages: [{ role: \"user\", content: request.userPrompt, timestamp: Date.now() }],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tapiKey: target.apiKey,\n\t\t\t\t\t\tmaxTokens: 16_384,\n\t\t\t\t\t\treasoning,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tresponseText = extractAssistantText(message);\n\t\t\t\tif (message.stopReason === \"error\") throw new Error(message.errorMessage ?? \"Provider error\");\n\t\t\t\tif (!responseText.trim()) throw new Error(\"Empty model response\");\n\t\t\t\tconst raw = { text: responseText, stopReason: message.stopReason };\n\t\t\t\tconst parsed = parse(raw);\n\t\t\t\tif (request.cacheable !== false) {\n\t\t\t\t\tthis.#cache?.put({\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tmodel: modelKey,\n\t\t\t\t\t\toperation: request.operation,\n\t\t\t\t\t\trequest: requestJson,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\ttext: responseText,\n\t\t\t\t\t\t\tstopReason: message.stopReason,\n\t\t\t\t\t\t\tcostUsd: message.usage.cost.total,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.#cache?.recordUsage(modelKey, request.operation, message.usage);\n\t\t\t\treturn parsed;","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/commit/conventional/inference.ts#L114-L150","documentation":"The inference complete() method streams a model message and, if message.stopReason === \"error\", throws with the provider's errorMessage (defaulting to \"Provider error\"). This surfaces upstream LLM failures (auth, network, quota, malformed request) from the conventional-commit inference layer, where results are also cached only on success.","triggerScenarios":"Any complete() call whose underlying provider request ends in an error stop reason: invalid API key, unreachable endpoint, model id not found, context window exceeded (maxTokens: 16384 plus prompt), or provider-side 5xx.","commonSituations":"Missing/expired credentials in the environment; offline or proxied networks blocking the provider host; requesting a model the account cannot access; oversized diffs pushing the prompt past limits.","solutions":["Inspect the thrown errorMessage for the specific provider cause","Verify provider credentials and the configured model id","Retry on transient network/rate-limit errors; consider the built-in cache which avoids repeat calls","Reduce input size (smaller diff) if the error indicates context/token limits"],"exampleFix":"// before (no key in env)\nomp commit  # -> Provider error: 401 unauthorized\n// after\nexport ANTHROPIC_API_KEY=sk-... && omp commit","handlingStrategy":"retry","validationCode":"if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {\n  throw new Error(\"No provider credentials configured for inference\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  const result = await inference.complete(request);\n} catch (err) {\n  if (err.message === \"Provider error\" || /rate limit|timeout|5\\d\\d/i.test(err.message)) {\n    await Bun.sleep(backoffMs);\n    return inference.complete(request); // bounded retries\n  }\n  throw err;\n}","preventionTips":["Configure and rotate provider API keys before automation runs","Use bounded exponential backoff for transient provider failures","Keep prompts (diffs) within model context limits","Rely on the inference cache to avoid redundant paid calls"],"tags":["llm","provider","network","inference"],"backgroundTag":"llm-provider-error","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}