hub-gif e60e8170f9 feat(llm): 增加 DeepSeek 纯文本适配器与 DEEPSEEK_*
MA_LLM_TEXT_PROVIDER=deepseek|deep_seek;.env.example 增加 ②-D;单测与 Kimi 同形。

Made-with: Cursor
2026-04-27 11:12:05 +08:00

62 lines
2.0 KiB
Python

"""
根据 `MA_LLM_TEXT_PROVIDER` 选择文本大模型实现;未设置时与历史行为一致(经 `openai_gateway` 与自建兼容网关)。
"""
from __future__ import annotations
import os
from .adapters.crawler_openai_compatible import CrawlerOpenAiCompatibleTextLlm
from .adapters.deepseek_text import DeepSeekTextLlm
from .adapters.kimi_moonshot_text import KimiMoonshotTextLlm
from .adapters.openai_official_chatgpt import OpenAiOfficialChatGptTextLlm
from .protocol import TextLlmClient
# 模块级单例:避免重复构造;测试可用 `reset_text_llm_client_for_tests` 切换实现。
_client: TextLlmClient | None = None
# 与历史默认行为一致
_DEFAULT_ID = "crawler_openai_compatible"
_ENV_KEY = "MA_LLM_TEXT_PROVIDER"
def _provider_id() -> str:
raw = (os.environ.get(_ENV_KEY) or _DEFAULT_ID).strip().lower()
return raw or _DEFAULT_ID
def _build_client(pid: str) -> TextLlmClient:
if pid in (
"crawler_openai_compatible",
"crawler",
"default",
"openai_compatible",
):
return CrawlerOpenAiCompatibleTextLlm()
if pid in ("openai_official", "openai_chatgpt", "chatgpt"):
return OpenAiOfficialChatGptTextLlm()
if pid in ("kimi", "moonshot", "kimi_moonshot", "moonshot_kimi"):
return KimiMoonshotTextLlm()
if pid in ("deepseek", "deep_seek"):
return DeepSeekTextLlm()
known = (
"crawler_openai_compatible, crawler, default, openai_compatible, "
"openai_official, openai_chatgpt, chatgpt, "
"kimi, moonshot, kimi_moonshot, deepseek, deep_seek"
)
raise ValueError(
f"不支持的 {_ENV_KEY}={pid!r};已知取值:{known}",
)
def get_text_llm() -> TextLlmClient:
global _client
if _client is None:
_client = _build_client(_provider_id())
return _client
def reset_text_llm_client_for_tests() -> None:
"""供 pytest/集成测试在修改环境变量后清空缓存的客户端。"""
global _client
_client = None