feat(providers): add Qianfan support

This commit is contained in:
jimmyzhuu 2026-04-25 13:55:47 +08:00
parent 938f9c4bdf
commit e3911a2f43
9 changed files with 147 additions and 0 deletions

View file

@ -23,6 +23,7 @@ SUPPORTED_PROVIDERS_WITHOUT_BASE_URL = [
"mistral",
"openai",
"xiaomi",
"qianfan",
"gemini",
"anthropic",
"together_ai",

View file

@ -66,6 +66,12 @@ PROVIDER_DEFAULTS: list[ProviderDefault] = [
base_url="https://api.deepseek.com/v1",
model_pattern="deepseek/*",
),
ProviderDefault(
name="qianfan",
env_var="QIANFAN_API_KEY",
base_url="https://qianfan.baidubce.com/v2",
model_pattern="qianfan/*",
),
ProviderDefault(
name="mistral",
env_var="MISTRAL_API_KEY",

View file

@ -293,6 +293,24 @@ model_providers:
base_url: https://openrouter.ai/api/v1
passthrough_auth: true
""",
},
{
"id": "qianfan_is_supported_provider",
"expected_error": None,
"plano_config": """
version: v0.4.0
listeners:
- name: llm
type: model
port: 12000
model_providers:
- model: qianfan/*
base_url: https://qianfan.baidubce.com/v2
passthrough_auth: true
""",
},
{

View file

@ -27,6 +27,7 @@ def test_zero_env_vars_produces_pure_passthrough():
assert provider.get("default") is not True
# All known providers should be listed.
names = {p["name"] for p in cfg["model_providers"]}
assert "qianfan" in names
assert "digitalocean" in names
assert "vercel" in names
assert "openrouter" in names
@ -80,6 +81,11 @@ def test_synthesized_config_validates_against_schema():
jsonschema.validate(cfg, _schema())
def test_synthesized_config_with_qianfan_validates_against_schema():
cfg = synthesize_default_config(env={"QIANFAN_API_KEY": "qf-1"})
jsonschema.validate(cfg, _schema())
def test_provider_defaults_digitalocean_is_configured():
by_name = {p.name: p for p in PROVIDER_DEFAULTS}
assert "digitalocean" in by_name
@ -104,6 +110,21 @@ def test_provider_defaults_openrouter_is_configured():
assert by_name["openrouter"].model_pattern == "openrouter/*"
def test_provider_defaults_qianfan_is_configured():
by_name = {p.name: p for p in PROVIDER_DEFAULTS}
assert "qianfan" in by_name
assert by_name["qianfan"].env_var == "QIANFAN_API_KEY"
assert by_name["qianfan"].base_url == "https://qianfan.baidubce.com/v2"
assert by_name["qianfan"].model_pattern == "qianfan/*"
def test_qianfan_env_key_promotes_to_env_keyed():
cfg = synthesize_default_config(env={"QIANFAN_API_KEY": "qf-1"})
by_name = {p["name"]: p for p in cfg["model_providers"]}
assert by_name["qianfan"].get("access_key") == "$QIANFAN_API_KEY"
assert by_name["qianfan"].get("passthrough_auth") is None
def test_openrouter_env_key_promotes_to_env_keyed():
cfg = synthesize_default_config(env={"OPENROUTER_API_KEY": "or-1"})
by_name = {p["name"]: p for p in cfg["model_providers"]}