{"record":{"id":"34431599d93d93d8","repo":"musistudio/claude-code-router","slug":"opencode-cli-api-key-was-not-found","errorCode":null,"errorMessage":"OpenCode CLI API key was not found.","messagePattern":"OpenCode CLI API key was not found\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/agents/local-providers/opencode.ts","lineNumber":133,"sourceCode":"        modelDisplayNames,\n        models,\n        name,\n        protocol,\n        sourceFile: credential.sourceFile,\n        status: \"available\"\n      };\n    }\n    return missingCandidate(\"opencode\", id, name, protocol, models, modelDisplayNames);\n  });\n}\n\nexport function importOpenCodeProvider(\n  candidate: LocalAgentProviderCandidate,\n  providerNames: string[]\n): LocalAgentProviderImportResult {\n  const credential = readOpenCodeCredential();\n  if (credential?.hasCredential && !credential.apiKey) {\n    throw new Error(\"OpenCode CLI API key was not found.\");\n  }\n  const publicOnly = !credential;\n  const catalog = readOpenCodeCatalog({ publicOnly });\n  if (!isOpenCodeProtocol(candidate.protocol)) {\n    throw new Error(`Unsupported OpenCode protocol: ${candidate.protocol}`);\n  }\n  const protocol = candidate.protocol;\n  if (publicOnly && !candidate.models.every((model) => catalog.models[protocol].includes(model))) {\n    throw new Error(\"OpenCode CLI public models were not found.\");\n  }\n  const provider = providerPayload(\n    candidate,\n    uniqueProviderName(providerNames, candidate.name),\n    catalog.baseUrl\n  );\n  if (publicOnly) {\n    return {\n      candidate,","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/core/src/agents/local-providers/opencode.ts#L115-L151","documentation":"readOpenCodeCredential() found an OpenCode auth credential entry (hasCredential) but its apiKey field is empty, so importOpenCodeProvider refuses to proceed. The credential store is half-written or corrupted.","triggerScenarios":"Calling importLocalAgentProvider with an OpenCode candidate while the OS keychain/credential entry for OpenCode exists but has no usable api key string.","commonSituations":"Interrupted `opencode auth login`, corrupted keychain entry, or a credential format change between OpenCode CLI versions.","solutions":["Re-run `opencode auth login` to rewrite the credential, then retry import.","Delete the stale OpenCode credential entry and re-authenticate.","Check OPENCODE_API_KEY env var if this build reads it as fallback."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const cred = readOpenCodeCredential?.();\nif (cred?.hasCredential && !cred.apiKey) await promptRelogin('opencode');","typeGuard":"function hasUsableOpenCodeKey(cred: {hasCredential: boolean; apiKey?: string} | null): boolean {\n  return !cred || (!cred.hasCredential || !!cred.apiKey);\n}","tryCatchPattern":"catch (e) { if ((e as Error).message === 'OpenCode CLI API key was not found.') await shell('opencode auth login'); }","preventionTips":["Re-auth after OpenCode CLI upgrades.","Verify keychain availability before import."],"tags":["opencode","api-key","credential","auth"],"backgroundTag":"missing-api-key","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}