{"record":{"id":"f658a9545dedd699","repo":"tinyhumansai/openhuman","slug":"chat-factory-byok-incomplete-inference-url-is-s","errorCode":null,"errorMessage":"[chat-factory] BYOK_INCOMPLETE: inference_url is set to a custom/direct endpoint ({inference_url}) but no matching cloud_providers entry was found for role '{role}'. To complete BYOK setup add a cloud_providers entry whose endpoint matches {inference_url} (or use a workload-specific route). To use the OpenHuman managed backend instead, clear inference_url from config.","messagePattern":"\\[chat-factory\\] BYOK_INCOMPLETE: inference_url is set to a custom/direct endpoint \\((.+?)\\) but no matching cloud_providers entry was found for role '(.+?)'\\. To complete BYOK setup add a cloud_providers entry whose endpoint matches (.+?) \\(or use a workload-specific route\\)\\. To use the OpenHuman managed backend instead, clear inference_url from config\\.","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/inference/provider/factory.rs","lineNumber":986,"sourceCode":"/// provider string that none of the crate-native model constructors accepted.\n///\n/// Successful production routes never reach this function. Keeping error\n/// resolution separate means `create_chat_model*` no longer constructs a\n/// legacy `Provider` merely to discover that a route is invalid.\nfn unresolved_chat_model_error(role: &str, provider: &str, config: &Config) -> anyhow::Error {\n    let p = provider.trim();\n\n    if let Err(error) = enforce_local_only_inference(role, p) {\n        return error;\n    }\n\n    if p == BYOK_INCOMPLETE_SENTINEL {\n        let inference_url = config\n            .inference_url\n            .as_deref()\n            .filter(|value| !value.trim().is_empty())\n            .unwrap_or(\"<unset>\");\n        return anyhow::anyhow!(\n            \"[chat-factory] BYOK_INCOMPLETE: inference_url is set to a custom/direct endpoint \\\n             ({inference_url}) but no matching cloud_providers entry was found for role '{role}'. \\\n             To complete BYOK setup add a cloud_providers entry whose endpoint matches \\\n             {inference_url} (or use a workload-specific route). \\\n             To use the OpenHuman managed backend instead, clear inference_url from config.\"\n        );\n    }\n\n    if p.is_empty() || p == \"cloud\" {\n        return unresolved_chat_model_error(\n            role,\n            &resolve_primary_cloud_provider_string(config),\n            config,\n        );\n    }\n\n    #[cfg(not(test))]\n    if let Err(error) = verify_session_active(config) {","sourceCodeStart":968,"sourceCodeEnd":1004,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/inference/provider/factory.rs#L968-L1004","documentation":"Error \"[chat-factory] BYOK_INCOMPLETE: inference_url is set to a custom/direct endpoint ({inference_url}) but no matching cloud_providers entry was found for role '{role}'. To complete BYOK setup add a cloud_providers entry whose endpoint matches {inference_url} (or use a workload-specific route). To use the OpenHuman managed backend instead, clear inference_url from config.\" thrown in tinyhumansai/openhuman.","triggerScenarios":"Thrown at src/openhuman/inference/provider/factory.rs:986 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add a cloud_providers entry whose endpoint matches the configured inference_url","Or clear inference_url from config to use the managed backend","Or route that workload to a workload-specific inference route"],"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"}