fix: preserve dynamic custom provider semantics

maintainer edit: treat arbitrary custom provider names as direct OpenAI-compatible providers, validate their api_type consistently, and avoid Pydantic instance-field warnings in fallback routing.
This commit is contained in:
chengyongru
2026-06-13 00:04:13 +08:00
committed by Xubin Ren
parent e9e1489cee
commit 68c6844c0b
4 changed files with 71 additions and 14 deletions
+13 -13
View File
@@ -241,6 +241,15 @@ class ProvidersConfig(Base):
qianfan: ProviderConfig = Field(default_factory=ProviderConfig) # Qianfan (百度千帆)
nvidia: ProviderConfig = Field(default_factory=ProviderConfig) # NVIDIA NIM (nvapi- keys)
@model_validator(mode="after")
def convert_extra_providers(self):
"""Convert extra fields (custom providers) to ProviderConfig objects."""
if self.model_extra:
for key, value in self.model_extra.items():
if isinstance(value, dict):
self.model_extra[key] = ProviderConfig.model_validate(value)
return self
@model_validator(mode="after")
def _validate_api_type_scope(self) -> "ProvidersConfig":
for name in self.__class__.model_fields:
@@ -249,15 +258,9 @@ class ProvidersConfig(Base):
provider = getattr(self, name, None)
if isinstance(provider, ProviderConfig) and provider.api_type != "auto":
raise ValueError("providers.<name>.api_type is only supported for providers.openai")
return self
@model_validator(mode="after")
def convert_extra_providers(self):
"""Convert extra fields (custom providers) to ProviderConfig objects."""
if self.model_extra:
for key, value in self.model_extra.items():
if isinstance(value, dict):
self.model_extra[key] = ProviderConfig.model_validate(value)
for provider in (self.model_extra or {}).values():
if isinstance(provider, ProviderConfig) and provider.api_type != "auto":
raise ValueError("providers.<name>.api_type is only supported for providers.openai")
return self
@@ -478,10 +481,7 @@ class Config(BaseSettings):
return p, spec.name
# Final fallback: check for any configured custom provider
for attr_name in dir(self.providers):
if attr_name.startswith("_"):
continue
p = getattr(self.providers, attr_name, None)
for attr_name, p in (self.providers.model_extra or {}).items():
if isinstance(p, ProviderConfig) and p.api_base:
return p, attr_name