{"record":{"id":"c8ee3926cfbe30b2","repo":"paperclipai/paperclip","slug":"opencode-requires-adapterconfig-model-in-provide","errorCode":null,"errorMessage":"OpenCode requires `adapterConfig.model` in provider/model format.","messagePattern":"OpenCode requires `adapterConfig\\.model` in provider/model format\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/adapters/opencode-local/src/server/models.ts","lineNumber":49,"sourceCode":"\nconst discoveryCache = new Map<\n  string,\n  { expiresAt: number; models: AdapterModel[] }\n>();\nconst VOLATILE_ENV_KEY_PREFIXES = [\"PAPERCLIP_\", \"npm_\", \"NPM_\"] as const;\nconst VOLATILE_ENV_KEY_EXACT = new Set([\n  \"PWD\",\n  \"OLDPWD\",\n  \"SHLVL\",\n  \"_\",\n  \"TERM_SESSION_ID\",\n  \"HOME\",\n]);\n\nexport function requireOpenCodeModelId(input: unknown): string {\n  const model = asString(input, \"\").trim();\n  if (!isValidOpenCodeModelId(model)) {\n    throw new Error(\n      \"OpenCode requires `adapterConfig.model` in provider/model format.\",\n    );\n  }\n  return model;\n}\n\nfunction dedupeModels(models: AdapterModel[]): AdapterModel[] {\n  const seen = new Set<string>();\n  const deduped: AdapterModel[] = [];\n  for (const model of models) {\n    const id = model.id.trim();\n    if (!id || seen.has(id)) continue;\n    seen.add(id);\n    deduped.push({ id, label: model.label.trim() || id });\n  }\n  return deduped;\n}\n","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/adapters/opencode-local/src/server/models.ts#L31-L67","documentation":"Validation guard in requireOpenCodeModelId: the configured model string is empty or not in the required `provider/model` format (e.g. `anthropic/claude-sonnet-4`). OpenCode routes models by provider-prefixed id, so a bare model name cannot be resolved; the input at fault is adapterConfig.model.","triggerScenarios":"Thrown at packages/adapters/opencode-local/src/server/models.ts:39 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set adapterConfig.model in provider/model format, e.g. \"anthropic/claude-sonnet-4-5\"."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}