{"record":{"id":"8d16b20bec95bb32","repo":"tinyhumansai/openhuman","slug":"chat-factory-provider-string-for-role-8d16b2","errorCode":null,"errorMessage":"[chat-factory] provider string '{}' for role '{}' has an empty model — use 'claude-code:<model-id>'","messagePattern":"\\[chat-factory\\] provider string '(.+?)' for role '(.+?)' has an empty model — use 'claude-code:<model-id>'","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/inference/provider/factory.rs","lineNumber":1520,"sourceCode":"\nfn try_create_claude_code_chat_model_from_string(\n    role: &str,\n    provider: &str,\n    config: &Config,\n    model_override: Option<&str>,\n) -> OptionalChatModelResult {\n    let provider = provider.trim();\n    let model_with_temp = provider\n        .strip_prefix(crate::openhuman::inference::provider::claude_code::PROVIDER_PREFIX)?;\n    let (configured_model, temperature_override) = split_model_and_temperature(model_with_temp);\n    if temperature_override.is_some() {\n        log::warn!(\n            \"[providers][chat-factory] claude-code provider: per-model temperature override \\\n             is accepted but not wired through to the CLI — the @<temp> suffix is ignored\"\n        );\n    }\n    if configured_model.is_empty() {\n        return Some(Err(anyhow::anyhow!(\n            \"[chat-factory] provider string '{}' for role '{}' has an empty model — \\\n             use 'claude-code:<model-id>'\",\n            provider,\n            role\n        )));\n    }\n    if let Err(error) = enforce_local_only_inference(role, provider) {\n        return Some(Err(error));\n    }\n    #[cfg(not(test))]\n    if let Err(error) = verify_session_active(config) {\n        return Some(Err(error));\n    }\n    let workspace =\n        crate::openhuman::inference::provider::claude_code::workspace_dir_from_config(config);\n    let effective_model = model_override.unwrap_or(&configured_model).to_string();\n    emit_inference_egress(\n        role,","sourceCodeStart":1502,"sourceCodeEnd":1538,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/inference/provider/factory.rs#L1502-L1538","documentation":"Fires in try_create_claude_code_chat_model_from_string when a provider string starting with the claude-code prefix has no model id after the colon (e.g. 'claude-code:'). The split of prefix from model yielded an empty model, so no ChatModel can be constructed for the role.","triggerScenarios":"Thrown at src/openhuman/inference/provider/factory.rs:1520 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set the provider string to 'claude-code:<model-id>' (e.g. 'claude-code:claude-sonnet-4-5') in the role's provider config","Check for stray whitespace or a trailing colon that leaves the model segment empty after trimming"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}