- A1 业务层统一 async:gencode 表内省改 run_sync 异步(不再阻塞事件循环)、 check_db 改 async_engine、dict_util 启动预热异步载入;psycopg 降为 APScheduler SQLAlchemyJobStore 专用同步孤岛(注释标注) - A2 测试真 PG 化:conftest 弃 SQLite + mock Redis,改连真实 PG16(dpb_test)+ Redis(number_gen advisory lock 路径真被测);新增 docker/test-compose.yaml 测试依赖栈(postgres:16:5433 + redis:7:6380);run_ci 前置探测 + 容器兜底, pytest -m pg 10 套正式 tc 全过(真实 PG16 + Redis) - B1 Redis 启动不强依赖:redis_connect 失败降级启动,缓存类回源 DB、存储类 (会话/AI 配置/调度)经 require_redis 守卫返回 503;真机 3 阶段降级测试 PASS=11 FAIL=0(独立 Redis 6390 + 后端 8091,不动共享 dev 服务) - C 扶正 DPB:后端横幅/日志(dpb.log)/README/pyproject/ai_factory agent 名、 前端 package.json/署名注释/链接文案/deploy.sh/docker 注释全部去 fastapiadmin; grep backend/app + frontend/web/src 零残留 - 验证:全量回归 pass=72 fail=0
92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
from typing import Any
|
|
|
|
from agno.agent import Agent
|
|
from agno.models.openai.like import OpenAILike
|
|
from agno.team import Team
|
|
|
|
from app.config.setting import settings
|
|
|
|
|
|
class AgnoFactory:
|
|
"""Agno 工厂类 - 统一管理 Agent、Team 创建逻辑"""
|
|
|
|
# 配置常量
|
|
AGENT_DESCRIPTION = "你是一个有用的AI助手,可以帮助用户回答问题和提供帮助。"
|
|
AGENT_INSTRUCTIONS = ["保持回答简洁明了", "如果不确定,请说明"]
|
|
AGENT_EXPECTED_OUTPUT = "中文回答"
|
|
AGENT_TEMPERATURE = 0.7
|
|
NUM_HISTORY_RUNS = 3
|
|
REQUEST_TIMEOUT = 60.0 # LLM 请求总超时(秒),流式响应需放长
|
|
CONNECT_TIMEOUT = 10.0 # TCP 连接超时(秒)
|
|
|
|
def create_agent(
|
|
self,
|
|
user_id: str,
|
|
team_id: str,
|
|
session_id: str,
|
|
db: Any | None = None,
|
|
model_config: dict[str, Any] | None = None,
|
|
) -> Team:
|
|
"""创建带 Agent 的 Team 实例。
|
|
|
|
参数:
|
|
- user_id (str): 用户标识。
|
|
- team_id (str): 团队标识。
|
|
- session_id (str): 会话 ID。
|
|
- db (Any | None): Agno 持久化数据库实例,可选。
|
|
- model_config (dict | None): 运行时模型配置,覆盖系统默认。
|
|
支持字段:base_url, api_key, model_id, temperature。
|
|
|
|
返回:
|
|
- Team: 配置好的 Team。
|
|
"""
|
|
# 优先使用运行时配置,否则 fallback 到系统 settings
|
|
base_url = settings.OPENAI_BASE_URL
|
|
api_key = settings.OPENAI_API_KEY
|
|
model_id = settings.OPENAI_MODEL
|
|
temperature = self.AGENT_TEMPERATURE
|
|
|
|
if model_config:
|
|
base_url = model_config.get("base_url") or base_url
|
|
api_key = model_config.get("api_key") or api_key
|
|
model_id = model_config.get("model_id") or model_id
|
|
if isinstance(model_config.get("temperature"), (int, float)):
|
|
temperature = float(model_config["temperature"])
|
|
|
|
# 创建 Agent
|
|
dpb_agent = Agent(
|
|
id=user_id,
|
|
name="dpb_agent",
|
|
role="You are a helpful AI assistant",
|
|
description=self.AGENT_DESCRIPTION,
|
|
tools=[],
|
|
)
|
|
|
|
# 创建 Team
|
|
dpb_team = Team(
|
|
id=team_id,
|
|
user_id=user_id,
|
|
session_id=session_id,
|
|
model=OpenAILike(
|
|
id=model_id,
|
|
api_key=api_key,
|
|
base_url=base_url,
|
|
temperature=temperature,
|
|
timeout=self.REQUEST_TIMEOUT,
|
|
),
|
|
members=[dpb_agent],
|
|
instructions=self.AGENT_INSTRUCTIONS,
|
|
expected_output=self.AGENT_EXPECTED_OUTPUT,
|
|
add_datetime_to_context=True,
|
|
add_history_to_context=True,
|
|
markdown=True,
|
|
num_history_runs=self.NUM_HISTORY_RUNS,
|
|
input_schema=None,
|
|
output_schema=None,
|
|
parse_response=True,
|
|
read_chat_history=True,
|
|
db=db,
|
|
)
|
|
|
|
return dpb_team
|