{"record":{"id":"9b16eed1da732502","repo":"hsliuping/TradingAgents-CN","slug":"openai-provider","errorCode":null,"errorMessage":"不支持的OpenAI兼容提供商: {provider}","messagePattern":"不支持的OpenAI兼容提供商: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"tradingagents/llm_adapters/openai_compatible_base.py","lineNumber":512,"sourceCode":"            \"custom-model\": {\"context_length\": 32768, \"supports_function_calling\": True}\n        }\n    }\n}\n\n\ndef create_openai_compatible_llm(\n    provider: str,\n    model: str,\n    api_key: Optional[str] = None,\n    temperature: float = 0.1,\n    max_tokens: Optional[int] = None,\n    base_url: Optional[str] = None,\n    **kwargs\n) -> OpenAICompatibleBase:\n    \"\"\"创建OpenAI兼容LLM实例的统一工厂函数\"\"\"\n    provider_info = OPENAI_COMPATIBLE_PROVIDERS.get(provider)\n    if not provider_info:\n        raise ValueError(f\"不支持的OpenAI兼容提供商: {provider}\")\n\n    adapter_class = provider_info[\"adapter_class\"]\n\n    # 如果调用未提供 base_url，则采用 provider 的默认值（可能为 None）\n    if base_url is None:\n        base_url = provider_info.get(\"base_url\")\n\n    # 仅当 provider 未内置 base_url（如 custom_openai）时，才将 base_url 传递给适配器，\n    # 避免与适配器内部的 super().__init__(..., base_url=...) 冲突导致 \"multiple values\" 错误。\n    init_kwargs = dict(\n        model=model,\n        api_key=api_key,\n        temperature=temperature,\n        max_tokens=max_tokens,\n        **kwargs,\n    )\n    if provider_info.get(\"base_url\") is None and base_url:\n        init_kwargs[\"base_url\"] = base_url","sourceCodeStart":494,"sourceCodeEnd":530,"githubUrl":"https://github.com/hsliuping/TradingAgents-CN/blob/74783e8817d6cf6de29867880631cc555153f36b/tradingagents/llm_adapters/openai_compatible_base.py#L494-L530","documentation":"create_openai_compatible_llm is a factory that only accepts providers registered in the OPENAI_COMPATIBLE_PROVIDERS registry; an unregistered name raises this immediately. The registry maps provider slugs to adapter classes and optional default base URLs, so unknown slugs cannot be dispatched. This is a typo/registration error, not a runtime environment issue.","triggerScenarios":"Calling create_openai_compatible_llm(provider=\"openai\") or any slug not in OPENAI_COMPATIBLE_PROVIDERS (e.g. 'gpt', 'azure', 'googl'), or a custom provider that was never registered.","commonSituations":"Provider string from user input or config passed unsanitized; provider slug renamed between versions; new adapter written but not added to the registry dict; case mismatch ('DeepSeek' vs 'deepseek').","solutions":["Check valid slugs via list(OPENAI_COMPATIBLE_PROVIDERS) in openai_compatible_base.py and use an exact match (lowercase)","Register your custom adapter: OPENAI_COMPATIBLE_PROVIDERS['myprov'] = {'adapter_class': MyProvAdapter, 'base_url': '...'}","Normalize/validate provider strings from config or UI before calling the factory"],"exampleFix":"# before\nllm = create_openai_compatible_llm(provider=\"DeepSeek\", model=\"deepseek-chat\")  # case mismatch\n\n# after\nllm = create_openai_compatible_llm(provider=\"deepseek\", model=\"deepseek-chat\")  # exact registry slug","handlingStrategy":"type-guard","validationCode":"from tradingagents.llm_adapters.openai_compatible_base import OPENAI_COMPATIBLE_PROVIDERS\nprovider = provider.strip().lower()\nif provider not in OPENAI_COMPATIBLE_PROVIDERS:\n    raise SystemExit(f\"Unknown provider '{provider}'. Valid: {sorted(OPENAI_COMPATIBLE_PROVIDERS)}\")","typeGuard":"def is_supported_provider(provider: str) -> bool:\n    from tradingagents.llm_adapters.openai_compatible_base import OPENAI_COMPATIBLE_PROVIDERS\n    return provider.strip().lower() in OPENAI_COMPATIBLE_PROVIDERS","tryCatchPattern":"try:\n    llm = create_openai_compatible_llm(provider=p, model=m)\nexcept ValueError as e:\n    if \"不支持的OpenAI兼容提供商\" in str(e):\n        raise SystemExit(f\"Unknown provider '{p}'; check registry\") from e\n    raise","preventionTips":["Normalize provider strings (strip + lower) at config boundaries","Constrain UI/provider dropdowns to registry keys","Register new adapters in OPENAI_COMPATIBLE_PROVIDERS as part of the adapter checklist"],"tags":["provider-registry","unknown-provider","factory","validation","typo"],"backgroundTag":"unknown-provider-value","analyzedSha":"74783e8817d6cf6de29867880631cc555153f36b","analyzedAt":"2026-08-28T11:39:07.729Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}