{"record":{"id":"4bebc50a4b8ff37c","repo":"alibaba/spring-ai-alibaba","slug":"openai","errorCode":null,"errorMessage":"未找到提供商 {} 对应的工厂，使用默认的 OpenAI 工厂","messagePattern":"未找到提供商 (.+?) 对应的工厂，使用默认的 OpenAI 工厂","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/client/ChatClientFactoryDelegate.java","lineNumber":98,"sourceCode":"            log.debug(\"桥接服务中未找到模型配置 id={}，尝试从 ModelConfigRepository 查找\", modelConfigId);\n            config = modelConfigRepository.findById(modelConfigId);\n        }\n        \n        if (config == null) {\n            throw new RuntimeException(\"模型配置不存在: \" + modelConfigId);\n        }\n        \n        if (config.getStatus() != 1) {\n            throw new RuntimeException(\"模型配置已禁用: \" + modelConfigId);\n        }\n\n        String provider = config.getProvider().toLowerCase();\n        log.info(\"创建模型客户端，提供商: {}, 模型: {}\", provider, config.getModelName());\n        \n        ChatClientFactory factory = chatClientFactories.get(provider);\n        if (factory == null) {\n            // 如果找不到对应的 provider factory，默认使用 OpenAI\n            log.warn(\"未找到提供商 {} 对应的工厂，使用默认的 OpenAI 工厂\", provider);\n            factory = chatClientFactories.get(OpenAiChatClientFactory.OPEN_AI_PROVIDER);\n            if (factory == null) {\n                throw new UnsupportedOperationException(\"不支持的模型提供商: \" + config.getProvider() + \"，且默认的 OpenAI 工厂也不可用\");\n            }\n        }\n        \n        ChatModel chatModel = factory.buildChatModel(config);\n        Map<String, Object> mergedParameters = mergeParameters(config, userParameters);\n        ChatOptions options = factory.buildChatOptions(config, mergedParameters, observationMetadata);\n        if (advisors != null) {\n            return ChatClient.builder(chatModel,observationRegistry,customObservationConvention,\n                            new DefaultAdvisorObservationConvention()).defaultOptions(options).defaultAdvisors(advisors)\n                    .build();\n        } else {\n            return ChatClient.builder(chatModel,observationRegistry,customObservationConvention\n                    ,new DefaultAdvisorObservationConvention()).defaultOptions(options).defaultAdvisors().build();\n\n        }","sourceCodeStart":80,"sourceCodeEnd":116,"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/client/ChatClientFactoryDelegate.java#L80-L116","documentation":"ChatClientFactoryDelegate looks up a ChatClientFactory by the model config's provider name. If no factory is registered for that provider, it warns and falls back to the OpenAI factory, translating the request to OpenAI-compatible semantics; if even the OpenAI factory is missing it throws UnsupportedOperationException.","triggerScenarios":"createChatClient is called with a ModelConfig whose provider string (lowercased) does not match any registered factory key — e.g. typo 'dashscope ' with whitespace, provider 'qwen' or 'deepseek' when the corresponding factory bean isn't on the classpath or not registered in chatClientFactories.","commonSituations":"Misspelled provider name in model config; provider-specific starter module not included as a dependency; provider constant mismatch after upgrade; extra whitespace/case differences in the config value.","solutions":["Fix the provider string in the model config to exactly match a registered factory key (e.g. 'openai', 'dashscope')","Add the missing provider module/dependency so its ChatClientFactory bean is registered","Log or dump chatClientFactories.keySet() to see which providers are actually available","Verify config normalization (toLowerCase/trim) matches how factories were registered"],"exampleFix":"// before\nprovider: \"DeepSeek-Chat\" // not a registered provider key\n// after\nprovider: \"deepseek\" // matches registered ChatClientFactory key","handlingStrategy":"validation","validationCode":"Set<String> supported = Set.of(\"openai\",\"dashscope\",\"deepseek\");\nif (config.getProvider() == null || !supported.contains(config.getProvider().trim().toLowerCase()))\n    throw new IllegalArgumentException(\"unsupported provider: \" + config.getProvider());","typeGuard":"boolean isSupportedProvider(String p) { return p != null && chatClientFactories.containsKey(p.trim().toLowerCase()); }","tryCatchPattern":"try { client = delegate.createChatClient(config); }\ncatch (UnsupportedOperationException e) { log.error(\"provider not available: {}\", config.getProvider(), e); throw e; }","preventionTips":["Copy provider names from the factory registry constants, not free text","Include the starter module for each provider you configure","Trim/lowercase provider strings before saving model configs"],"tags":["model-provider","factory","fallback","configuration"],"backgroundTag":"unsupported-operation","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"}