diff --git a/docker/api.Dockerfile b/docker/api.Dockerfile index 9b988881..c1cfd7cf 100644 --- a/docker/api.Dockerfile +++ b/docker/api.Dockerfile @@ -29,6 +29,7 @@ RUN set -ex \ && apt-get install -y --no-install-recommends --fix-missing \ curl \ ffmpeg \ + libpq5 \ libsm6 \ libxext6 \ # (D) 清理垃圾,减小体积 diff --git a/docs/latest/advanced/configuration.md b/docs/latest/advanced/configuration.md index 456fdb77..f77a7089 100644 --- a/docs/latest/advanced/configuration.md +++ b/docs/latest/advanced/configuration.md @@ -37,7 +37,7 @@ class Config(BaseModel): enable_content_guard: bool = Field(default=False, description="是否启用内容审查") # 模型配置 - default_model: str = Field(default="siliconflow/deepseek-ai/DeepSeek-V3.2") + default_model: str = Field(default="default="siliconflow/Pro/deepseek-ai/DeepSeek-V3.2") embed_model: str = Field(default="siliconflow/BAAI/bge-m3") # 运行时状态 (不持久化) diff --git a/docs/latest/intro/model-config.md b/docs/latest/intro/model-config.md index b7afba61..5bcfbbb6 100644 --- a/docs/latest/intro/model-config.md +++ b/docs/latest/intro/model-config.md @@ -32,7 +32,7 @@ 系统的默认对话模型可以在设置页面配置,也可以通过配置项 `default_model` 指定,格式统一为 `模型提供商/模型名称`,例如: ```yaml -default_model: siliconflow/deepseek-ai/DeepSeek-V3.2 +default_model: default="siliconflow/Pro/deepseek-ai/DeepSeek-V3.2 ``` ## 自定义模型供应商 diff --git a/src/agents/common/base.py b/src/agents/common/base.py index 527050f9..4de16af3 100644 --- a/src/agents/common/base.py +++ b/src/agents/common/base.py @@ -1,9 +1,11 @@ from __future__ import annotations +import asyncio import importlib.util import os import tomllib as tomli from abc import abstractmethod +from inspect import isawaitable from pathlib import Path from langgraph.checkpoint.memory import InMemorySaver @@ -28,6 +30,7 @@ class BaseAgent: def __init__(self, **kwargs): self.graph = None # will be covered by get_graph self.checkpointer = None + self._checkpointer_cm = None self._async_conn = None self.workdir = Path(sys_config.save_dir) / "agents" / self.module_name self.workdir.mkdir(parents=True, exist_ok=True) @@ -156,6 +159,15 @@ class BaseAgent: def reload_graph(self): """重置 graph 缓存,强制下次调用 get_graph 时重新构建""" self.graph = None + self.checkpointer = None + if self._checkpointer_cm is not None: + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = None + + if loop is not None: + loop.create_task(self._close_checkpointer_context()) logger.info(f"{self.name} graph 缓存已清空,将在下次调用时重新构建") @abstractmethod @@ -207,10 +219,14 @@ class BaseAgent: else: saver = AsyncPostgresSaver(conn_str) # type: ignore[call-arg] + if hasattr(saver, "__aenter__") and hasattr(saver, "__aexit__"): + self._checkpointer_cm = saver + saver = await saver.__aenter__() + setup_fn = getattr(saver, "setup", None) if callable(setup_fn): result = setup_fn() - if hasattr(result, "__await__"): + if isawaitable(result): await result logger.info(f"{self.name} 使用 postgres checkpointer") return saver @@ -218,6 +234,17 @@ class BaseAgent: logger.warning(f"初始化 postgres checkpointer 失败,回退 sqlite: {e}") return None + async def _close_checkpointer_context(self): + if self._checkpointer_cm is None: + return + + cm = self._checkpointer_cm + self._checkpointer_cm = None + try: + await cm.__aexit__(None, None, None) + except Exception as e: + logger.warning(f"关闭 postgres checkpointer 失败: {e}") + async def get_async_conn(self) -> aiosqlite.Connection: """获取异步数据库连接""" if self._async_conn is not None: diff --git a/src/agents/deep_agent/context.py b/src/agents/deep_agent/context.py index bf39035e..2fae508d 100644 --- a/src/agents/deep_agent/context.py +++ b/src/agents/deep_agent/context.py @@ -101,7 +101,7 @@ class DeepContext(BaseContext): ) subagents_model: Annotated[str, {"__template_metadata__": {"kind": "llm"}}] = field( - default="siliconflow/deepseek-ai/DeepSeek-V3.2", + default="siliconflow/Pro/deepseek-ai/DeepSeek-V3.2", metadata={ "name": "Sub-agent Model", "description": "The model used by sub-agents (e.g., critique-agent, research-agent).", diff --git a/src/config/app.py b/src/config/app.py index e42e243c..5e638959 100644 --- a/src/config/app.py +++ b/src/config/app.py @@ -47,23 +47,23 @@ class Config(BaseModel): # 模型配置 # ============================================================ default_model: str = Field( - default="siliconflow/deepseek-ai/DeepSeek-V3.2", + default="siliconflow/Pro/deepseek-ai/DeepSeek-V3.2", description="默认对话模型", ) fast_model: str = Field( - default="siliconflow/THUDM/GLM-4-9B-0414", + default="siliconflow/Qwen/Qwen3.5-9B", description="快速响应模型", ) embed_model: str = Field( - default="siliconflow/BAAI/bge-m3", + default="siliconflow/Pro/BAAI/bge-m3", description="默认 Embedding 模型", ) reranker: str = Field( - default="siliconflow/BAAI/bge-reranker-v2-m3", + default="siliconflow/Pro/BAAI/bge-reranker-v2-m3", description="默认 Re-Ranker 模型", ) content_guard_llm_model: str = Field( - default="siliconflow/Qwen/Qwen3-235B-A22B-Instruct-2507", + default="siliconflow/Qwen/Qwen3.5-9B", description="内容审查LLM模型", )