feat: 完成极简 LangGraph 架构迁移,添加 Baosi API 支持
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 6m36s

主要变更:
- 迁移到极简 LangGraph 标准架构(START → init_state → 记忆 → Agent ⇄ Tools → finalize → END)
- 添加 Baosi API 支持,配置 ops4.7 模型
- 保留本地模型作为默认首选,Baosi 作为备选
- 新架构使用 LangGraph 原生 ToolNode 和 bind_tools
- 移除旧的混合路由、JSON 解析等复杂逻辑
- 把旧代码移到 deprecated/ 目录
- 添加新的 Agent 节点和 Tools 模块
- 添加测试脚本验证新架构
- 所有测试通过 ✓
This commit is contained in:
2026-05-07 00:48:17 +08:00
parent 5e762da740
commit 22fdb625a4
23 changed files with 1232 additions and 494 deletions

View File

@@ -5,11 +5,13 @@
1. Local VLLM 服务:本地 gemma-4-E4B-it 模型
2. Zhipu AI智谱 glm-5.1 模型
3. DeepSeekdeepseek-v4-pro 模型
4. Baosi APIops4.7 模型
主要功能:
- LocalVLLMChatProvider本地 VLLM 服务提供者
- ZhipuChatProvider智谱 API 服务提供者
- DeepSeekChatProviderDeepSeek API 服务提供者
- BaosiChatProviderBaosi API 服务提供者
- get_chat_service():获取默认服务(带自动降级)
- get_all_chat_services():获取所有可用模型服务(用于多模型切换)
"""
@@ -28,6 +30,9 @@ from backend.app.config import (
LLM_API_KEY,
ZHIPUAI_API_KEY,
DEEPSEEK_API_KEY,
BAOSI_API_KEY,
BAOSI_API_BASE,
BAOSI_MODEL,
LOCAL_MODEL_NAME
)
@@ -194,6 +199,59 @@ class DeepSeekChatProvider(BaseServiceProvider[BaseChatModel]):
return self._service_instance
class BaosiChatProvider(BaseServiceProvider[BaseChatModel]):
"""
Baosi API 生成式大模型服务提供者
"""
def __init__(self, model: str = None):
super().__init__("baosi_chat")
self._model = model or BAOSI_MODEL
self._base_url = BAOSI_API_BASE
self._api_key = BAOSI_API_KEY
def is_available(self) -> bool:
"""
检查 Baosi API 服务是否可用
Returns:
bool: 服务是否可用
"""
if not self._api_key:
logger.warning("BAOSI_API_KEY 未配置")
return False
try:
logger.info(f"Baosi API 服务配置正确,准备使用: {self._model}")
return True
except Exception as e:
logger.warning(f"Baosi API 服务不可用: {e}")
return False
def get_service(self) -> BaseChatModel:
"""
获取 Baosi API 服务
Returns:
BaseChatModel: LangChain 兼容的 ChatModel 实例
"""
if self._service_instance is None:
from langchain_openai import ChatOpenAI
from pydantic import SecretStr
self._service_instance = ChatOpenAI(
base_url=self._base_url,
api_key=SecretStr(self._api_key) if self._api_key else SecretStr(""),
model=self._model,
temperature=0.1,
max_tokens=4096,
timeout=120.0,
max_retries=2,
streaming=False, # Baosi API 可能不兼容 streaming设置为 False
)
return self._service_instance
# ========== 轻量级模型 Provider ==========
class LocalSmallModelProvider(BaseServiceProvider[BaseChatModel]):
@@ -276,6 +334,7 @@ class DeepSeekSmallModelProvider(BaseServiceProvider[BaseChatModel]):
# 全局服务映射表 - 名称 -> Provider
CHAT_PROVIDERS: Dict[str, Callable[[], BaseServiceProvider[BaseChatModel]]] = {
"local": lambda: LocalVLLMChatProvider(),
"baosi": lambda: BaosiChatProvider(),
"zhipu": lambda: ZhipuChatProvider(),
"deepseek": lambda: DeepSeekChatProvider(),
}
@@ -284,14 +343,14 @@ CHAT_PROVIDERS: Dict[str, Callable[[], BaseServiceProvider[BaseChatModel]]] = {
def get_chat_service() -> BaseChatModel:
"""
获取默认的生成式大模型服务(带自动降级)
优先顺序: local -> zhipu -> deepseek
优先顺序: local → baosi → zhipu deepseek
Returns:
BaseChatModel: LangChain 兼容的 ChatModel 实例
"""
def _create_chain():
primary = LocalVLLMChatProvider()
fallbacks = [ZhipuChatProvider(), DeepSeekChatProvider()]
fallbacks = [BaosiChatProvider(), ZhipuChatProvider(), DeepSeekChatProvider()]
return FallbackServiceChain(primary, fallbacks)
chain = SingletonServiceManager.get_or_create("chat_service_chain", _create_chain)