{"record":{"id":"cb5ddcdff8de7e6c","repo":"alibaba/spring-ai-alibaba","slug":"provider-cb5ddc","errorCode":null,"errorMessage":"Provider不存在: {}","messagePattern":"Provider不存在: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ModelConfigBridgeServiceImpl.java","lineNumber":217,"sourceCode":"        } catch (Exception e) {\n            log.error(\"根据provider和modelId查找模型配置失败: provider={}, modelId={}\", provider, modelId, e);\n            return null;\n        }\n    }\n\n    /**\n     * 将ModelEntity转换为ModelConfigDO\n     */\n    private ModelConfigDO convertToModelConfigDO(ModelEntity modelEntity) {\n        if (modelEntity == null) {\n            return null;\n        }\n\n        try {\n            // 获取Provider的credential（包含apiKey和endpoint）\n            ProviderConfigInfo providerDetail = providerManager.getProviderDetail(modelEntity.getProvider(), false);\n            if (providerDetail == null) {\n                log.warn(\"Provider不存在: {}\", modelEntity.getProvider());\n                return null;\n            }\n\n            ModelCredential credential = providerDetail.getCredential();\n            if (credential == null) {\n                log.warn(\"Provider的credential不存在: {}\", modelEntity.getProvider());\n                return null;\n            }\n\n            // 解密apiKey\n            String apiKey = credential.getApiKey();\n            if (StringUtils.isNotBlank(apiKey)) {\n                try {\n                    apiKey = RSACryptUtils.decrypt(apiKey);\n                } catch (Exception e) {\n                    log.warn(\"解密apiKey失败，使用原始值: {}\", e.getMessage());\n                }\n            }","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ModelConfigBridgeServiceImpl.java#L199-L235","documentation":"convertToModelConfigDO fetches the provider's detail (including credentials) via providerManager.getProviderDetail; when the provider is unknown it logs this warning and returns null instead of a ModelConfigDO. It means the model entity references a provider that is not registered in the provider manager.","triggerScenarios":"findById or findByProviderAndModelId resolves a ModelEntity whose getProvider() value has no matching provider detail in providerManager (called with includeCredential=false).","commonSituations":"Provider was renamed or deleted after models were created under it; typo in provider name; provider plugin/config not loaded (e.g. Nacos config missing for that provider); using a custom provider never registered.","solutions":["Register the provider (add its configuration/credential) so providerManager.getProviderDetail returns non-null","Correct the ModelEntity.provider value to match an existing registered provider name","Check provider configuration loading (Nacos/config source) at startup — the provider list may not have been refreshed","Handle the null return from these bridge methods rather than assuming non-null"],"exampleFix":"// before\nProviderConfigInfo detail = providerManager.getProviderDetail(entity.getProvider(), false);\nuse(detail.getCredential());\n// after\nProviderConfigInfo detail = providerManager.getProviderDetail(entity.getProvider(), false);\nif (detail == null) { throw new IllegalStateException(\"Provider not registered: \" + entity.getProvider()); }","handlingStrategy":"validation","validationCode":"ProviderConfigInfo d = providerManager.getProviderDetail(provider, false); if (d == null) { registerProvider(provider); }","typeGuard":null,"tryCatchPattern":"ModelConfigDO c = bridge.findById(id); if (c == null) { throw new IllegalStateException(\"Provider missing: \" + provider); }","preventionTips":["Register all providers referenced by model entities","Audit model entities for orphaned provider names","Verify provider config sources load at startup"],"tags":["provider","missing-config","model-config"],"backgroundTag":"missing-config-value","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}