feat: 完成极简 LangGraph 架构迁移,添加 Baosi API 支持
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 6m36s
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:
@@ -5,11 +5,13 @@
|
||||
1. Local VLLM 服务:本地 gemma-4-E4B-it 模型
|
||||
2. Zhipu AI:智谱 glm-5.1 模型
|
||||
3. DeepSeek:deepseek-v4-pro 模型
|
||||
4. Baosi API:ops4.7 模型
|
||||
|
||||
主要功能:
|
||||
- LocalVLLMChatProvider:本地 VLLM 服务提供者
|
||||
- ZhipuChatProvider:智谱 API 服务提供者
|
||||
- DeepSeekChatProvider:DeepSeek API 服务提供者
|
||||
- BaosiChatProvider:Baosi 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)
|
||||
|
||||
Reference in New Issue
Block a user