{"record":{"id":"4fe987430cf9ede8","repo":"can1357/oh-my-pi","slug":"no-model-available-for-commit-generation","errorCode":null,"errorMessage":"No model available for commit generation","messagePattern":"No model available for commit generation","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"packages/coding-agent/src/commit/model-selection.ts","lineNumber":49,"sourceCode":"\ntype CommitModelRegistry = ModelLookupRegistry &\n\tApiKeyResolverRegistry & {\n\t\tgetApiKey: (model: Model<Api>) => Promise<string | undefined>;\n\t};\n\nexport async function resolvePrimaryModel(\n\toverride: string | undefined,\n\tsettings: Settings,\n\tmodelRegistry: CommitModelRegistry,\n): Promise<ResolvedCommitModel> {\n\tconst available = modelRegistry.getAvailable();\n\tconst matchPreferences = getModelMatchPreferences(settings);\n\tconst resolved = override\n\t\t? resolveModelRoleValue(override, available, { settings, matchPreferences })\n\t\t: resolveRoleSelection([\"commit\", \"smol\", ...MODEL_ROLE_IDS], settings, available);\n\tconst model = resolved?.model;\n\tif (!model) {\n\t\tthrow new Error(\"No model available for commit generation\");\n\t}\n\tconst apiKey = await modelRegistry.getApiKey(model);\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key available for model ${model.provider}/${model.id}`);\n\t}\n\treturn {\n\t\tmodel,\n\t\tapiKey: modelRegistry.resolver(model),\n\t\tthinkingLevel: concreteThinkingLevel(resolved?.thinkingLevel),\n\t};\n}\n\nexport async function resolveSmolModel(\n\tsettings: Settings,\n\tmodelRegistry: CommitModelRegistry,\n\tfallbackModel: Model<Api>,\n\tfallbackApiKey: ApiKey,\n): Promise<ResolvedCommitModel> {","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/commit/model-selection.ts#L31-L67","documentation":"resolvePrimaryModel resolves which LLM to use for commit generation: an explicit override, else a role-based selection trying 'commit', 'smol', then the standard model roles. If no configured role matches any available model, it throws because commit generation cannot run without a model. (A sibling error follows if a model resolves but has no API key.)","triggerScenarios":"Calling resolvePrimaryModel (via primaryModelPromise/primary) when: no model override is set and none of the 'commit'/'smol'/default roles match an available/provider-registered model; available models list is empty (no providers configured); or the override string doesn't resolve to any known model.","commonSituations":"Fresh install with no models configured, all providers disabled by config, typo in the commit model override id, model renamed/removed after a provider update, or settings that filter out every candidate (e.g. role pinned to an unavailable model).","solutions":["Configure a valid model for the 'commit' role in settings (e.g. a small instruct model)","Check that at least one provider is configured and enabled with models available","Fix or clear the model override if it references a nonexistent model id","Update provider credentials/registry so models become available"],"exampleFix":"// before: throws with no commit model configured\nconst model = await resolvePrimaryModel();\n// after: resolve with an explicit override\nconst model = await resolvePrimaryModel({ override: \"anthropic/claude-haiku-4-5\" });\n// or in settings: { commit: { model: \"anthropic/claude-haiku-4-5\" } }","handlingStrategy":"validation","validationCode":"const roles = [\"commit\", \"smol\", ...MODEL_ROLE_IDS];\nif (!roles.some((r) => getRoleModel(r))) {\n  throw new Error(\"Configure a commit model before generating\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  const model = await resolvePrimaryModel(override);\n} catch (err) {\n  if (err instanceof Error && err.message === \"No model available for commit generation\") {\n    // prompt the user to configure a model / provider\n  }\n  throw err;\n}","preventionTips":["Configure the 'commit' role in settings during setup","Verify providers are enabled and report available models before generation","Validate any model override id against the registry (typos fail silently until here)"],"tags":["model-selection","configuration","llm"],"backgroundTag":"no-model-configured","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}