feat(backend): 内置 Claude Code 后端切换——DeepSeek / Kimi / Kimi Code
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
"""Tests for myagents.backends."""
|
||||
|
||||
import pytest
|
||||
|
||||
from myagents import backends as backends_mod
|
||||
from myagents.backends import (
|
||||
Provider,
|
||||
build_provider_env,
|
||||
detect_provider,
|
||||
get_provider,
|
||||
is_third_party,
|
||||
list_providers,
|
||||
normalize_provider_id,
|
||||
)
|
||||
|
||||
|
||||
class TestProviderRegistry:
|
||||
def test_list_providers_includes_all(self) -> None:
|
||||
ids = {p.id for p in list_providers()}
|
||||
assert ids == {"deepseek", "kimi", "kimi-code", "claude"}
|
||||
|
||||
def test_get_provider_by_id(self) -> None:
|
||||
provider = get_provider("kimi")
|
||||
assert provider.id == "kimi"
|
||||
assert provider.base_url == "https://api.moonshot.ai/anthropic"
|
||||
|
||||
def test_get_provider_normalizes_name(self) -> None:
|
||||
assert get_provider("Kimi").id == "kimi"
|
||||
assert get_provider("kimi_code").id == "kimi-code"
|
||||
|
||||
def test_unknown_provider_raises(self) -> None:
|
||||
with pytest.raises(KeyError):
|
||||
get_provider("openai")
|
||||
|
||||
|
||||
class TestNormalizeProviderId:
|
||||
def test_hyphenates_underscores(self) -> None:
|
||||
assert normalize_provider_id("kimi_code") == "kimi-code"
|
||||
|
||||
def test_lowercases(self) -> None:
|
||||
assert normalize_provider_id("DeepSeek") == "deepseek"
|
||||
|
||||
|
||||
class TestBuildProviderEnv:
|
||||
def test_deepseek_env(self) -> None:
|
||||
provider = get_provider("deepseek")
|
||||
env = build_provider_env(provider, "sk-test")
|
||||
assert env["ANTHROPIC_AUTH_TOKEN"] == "sk-test"
|
||||
assert env["ANTHROPIC_BASE_URL"] == "https://api.deepseek.com/anthropic"
|
||||
assert env["ANTHROPIC_MODEL"] == "deepseek-v4-pro"
|
||||
assert env["ANTHROPIC_DEFAULT_FABLE_MODEL"] == "deepseek-v4-pro"
|
||||
|
||||
def test_kimi_code_env(self) -> None:
|
||||
provider = get_provider("kimi-code")
|
||||
env = build_provider_env(provider, "sk-test")
|
||||
assert env["ANTHROPIC_BASE_URL"] == "https://api.kimi.com/coding"
|
||||
assert env["ANTHROPIC_MODEL"] == "kimi-for-coding"
|
||||
|
||||
def test_model_override(self) -> None:
|
||||
provider = get_provider("kimi")
|
||||
env = build_provider_env(provider, "sk-test", model="kimi-k2.5")
|
||||
assert env["ANTHROPIC_MODEL"] == "kimi-k2.5"
|
||||
|
||||
def test_official_claude_returns_empty(self) -> None:
|
||||
provider = get_provider("claude")
|
||||
assert build_provider_env(provider, "sk-test") == {}
|
||||
|
||||
|
||||
class TestDetectProvider:
|
||||
def test_detects_deepseek(self) -> None:
|
||||
env = {"ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic"}
|
||||
assert detect_provider(env) == get_provider("deepseek")
|
||||
|
||||
def test_detects_kimi_code(self) -> None:
|
||||
env = {"ANTHROPIC_BASE_URL": "https://api.kimi.com/coding"}
|
||||
assert detect_provider(env) == get_provider("kimi-code")
|
||||
|
||||
def test_no_base_url_with_api_key_is_claude(self) -> None:
|
||||
env = {"ANTHROPIC_API_KEY": "sk-test"}
|
||||
assert detect_provider(env) == get_provider("claude")
|
||||
|
||||
def test_empty_env_returns_none(self) -> None:
|
||||
assert detect_provider({}) is None
|
||||
|
||||
def test_unknown_base_url_returns_none(self) -> None:
|
||||
assert detect_provider({"ANTHROPIC_BASE_URL": "https://example.com"}) is None
|
||||
|
||||
|
||||
class TestIsThirdParty:
|
||||
def test_third_party_providers(self) -> None:
|
||||
assert is_third_party(get_provider("deepseek"))
|
||||
assert is_third_party(get_provider("kimi"))
|
||||
assert is_third_party(get_provider("kimi-code"))
|
||||
|
||||
def test_claude_is_not_third_party(self) -> None:
|
||||
assert not is_third_party(get_provider("claude"))
|
||||
Reference in New Issue
Block a user