Files
agent_management/agent_templates/docs/CALLBACK_IMPLEMENTATION_SUMMARY.md
T
2026-01-15 17:30:48 +00:00

6.3 KiB
Raw Blame History

Agent 回调功能实现总结

概述

根据 /home/taiji/tools/agent-manager/plans/LiteLLM和AgentManager回调接口文档.md 的要求,已为所有 agent 模板添加了运行时长回调功能。

修改内容

1. 新增工具模块

文件: agent_callback_utils.py

提供两个核心类:

  • AgentCallbackHandler: 回调处理器,负责记录请求开始/结束时间、使用的工具、并发送回调到 Agent Manager
  • CallbackContextManager: 上下文管理器,支持 with 语句自动处理回调的开始和结束

关键功能:

  • 自动记录运行时长(Pod running time)
  • 记录使用的工具列表
  • 向回调接口发送 POST 请求:http://mcp-server:8002/api/v1/billing/agent-callback
  • 支持用户ID、请求ID追踪

2. API Key 传递方式改进

之前: 所有配置包括 API key 都从环境变量获取

现在:

  • API key: 从用户请求中传入(每次请求携带)
  • 其他配置: 依然从环境变量获取(数据库连接信息、服务端口等)

3. 修改的 Agent 文件

3.1 search_agent.py

请求模型修改:

class SearchRequest(BaseModel):
    query: str
    llm_api_key: str  # 新增:从请求传入
    user_id: Optional[str]  # 新增:用于计费回调
    auto_configure: bool

回调集成:

  • 使用 CallbackContextManager 自动处理回调
  • 记录使用的工具:web_search, content_reader
  • 临时更新 API key 后执行搜索,完成后恢复原值

3.2 jina_search_agent.py

请求模型修改:

class SearchRequest(BaseModel):
    url: str
    jina_api_key: str  # 新增:从请求传入
    user_id: Optional[str]  # 新增
    timeout: int

回调集成:

  • 使用 CallbackContextManager 自动处理回调
  • 记录使用的工具:jina_reader
  • 移除了全局 JINA_API_KEY 环境变量依赖

3.3 mysql_agent.py

重大改动: 从循环示例查询模式改为 FastAPI HTTP 服务

请求模型:

class QueryRequest(BaseModel):
    query: str
    openai_api_key: str  # 从请求传入
    user_id: Optional[str]  # 用于计费回调
    model: str = "gpt-3.5-turbo"

新增端点:

  • GET /health - 健康检查
  • POST /query - 执行SQL查询(带回调)
  • GET / - 服务信息

回调集成:

  • 使用 CallbackContextManager
  • 记录使用的工具:sql_database

3.4 postgresql_agent.py

修改内容与 mysql_agent.py 类似

请求模型:

class QueryRequest(BaseModel):
    query: str
    openai_api_key: str  # 从请求传入
    user_id: Optional[str]  # 用于计费回调
    model: str = "gpt-3.5-turbo"

回调集成: 同 MySQL Agent

回调接口规范

根据文档,每次请求结束后自动发送以下回调:

{
  "agentName": "pod-name",
  "userId": "user-123",
  "podRunningTimeSeconds": 120,
  "toolsUsed": ["web_search", "content_reader"],
  "startTime": "2026-01-15T10:00:00Z",
  "endTime": "2026-01-15T10:02:00Z",
  "requestId": "search-1737801600"
}

回调地址:

  • 默认: http://mcp-server:8002/api/v1/billing/agent-callback
  • 可通过环境变量 AGENT_CALLBACK_URL 覆盖

环境变量配置

必需环境变量(所有 Agent)

POD_NAME=agent-name          # Pod 名称(用于回调)
USER_ID=default-user-id      # 默认用户ID(可被请求中的user_id覆盖)

可选环境变量

AGENT_CALLBACK_URL=http://mcp-server:8002/api/v1/billing/agent-callback  # 回调地址

Agent 特定环境变量

Search Agent:

SERPER_API_KEY=xxx           # Serper API(从环境变量)
JINA_API_KEY=xxx             # Jina API(从环境变量,可被请求覆盖)
LLM_BASE_URL=xxx             # LLM API基础URL

Jina Search Agent:

SERVICE_HOST=0.0.0.0
SERVICE_PORT=8080

MySQL Agent:

MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=password
MYSQL_DATABASE=test
SERVICE_HOST=0.0.0.0
SERVICE_PORT=8080

PostgreSQL Agent:

POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_DATABASE=postgres
SERVICE_HOST=0.0.0.0
SERVICE_PORT=8080

使用示例

Search Agent

curl -X POST http://agent-ip:8080/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "什么是人工智能?",
    "llm_api_key": "sk-xxx",
    "user_id": "user-123"
  }'

Jina Search Agent

curl -X POST http://agent-ip:8080/search \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com",
    "jina_api_key": "jina_xxx",
    "user_id": "user-123"
  }'

MySQL/PostgreSQL Agent

curl -X POST http://agent-ip:8080/query \
  -H "Content-Type: application/json" \
  -d '{
    "query": "列出所有表",
    "openai_api_key": "sk-xxx",
    "user_id": "user-123",
    "model": "gpt-3.5-turbo"
  }'

回调流程

  1. 请求开始:

    • 创建 CallbackContextManager 上下文
    • 记录开始时间
    • 设置 user_id 和 request_id
  2. 执行过程:

    • 临时更新 API key(如需要)
    • 执行 Agent 逻辑
    • 记录使用的工具(通过 ctx.add_tool())
  3. 请求结束:

    • 自动计算运行时长
    • 发送 POST 请求到回调接口
    • 包含所有必需字段(agentName, userId, podRunningTimeSeconds, toolsUsed, startTime, endTime, requestId)
  4. 错误处理:

    • 回调失败不影响主流程
    • 错误日志记录

注意事项

  1. API Key 安全: API key 仅在请求期间临时使用,不持久化
  2. 回调可选: 如果 user_id 未提供,回调处理器会跳过发送
  3. 幂等性: 使用 request_id 确保回调幂等性
  4. 时区: 所有时间戳使用 UTC 时区
  5. 兼容性: 保持向后兼容,不强制要求 user_id

依赖要求

所有 Agent 需要添加以下 Python 包依赖:

fastapi
uvicorn
requests
pydantic

已有依赖的 Agent 无需额外安装。

测试建议

  1. 单元测试: 测试回调函数的正确性
  2. 集成测试: 验证回调接口能正常接收数据
  3. 压力测试: 确保回调不影响 Agent 性能
  4. 错误测试: 验证回调失败时 Agent 仍能正常工作

修改完成时间: 2026-01-15
修改人: GitHub Copilot
版本: v1.0