feat: 新增外部工具 API 及回调功能(计费)

主要更新:
- 新增 external_tool_api.py: 外部工具管理 API
- 新增 tool_storage.py: 工具存储管理器
- 新增回调功能用于计费 (agent_callback_utils)
- 支持多工具创建 Agent
- 新增 CI/CD 构建状态查询 API
- 新增部署信息查询 API
- 更新文档 (EXTERNAL_TOOL_API.md v2.0)
- 更新 Dockerfile 添加新模块
- 更新 app.py 集成外部工具路由
This commit is contained in:
zhanggangyong
2026-01-29 12:00:16 +00:00
parent 4b09912806
commit 8cb166fb58
12 changed files with 3777 additions and 442 deletions
+41
View File
@@ -16,6 +16,8 @@ from database import (
)
from template_manager import template_manager
from tool_generator_api import router as tool_generator_router
from external_tool_api import router as external_tool_router
from tool_storage import tool_storage
import os
# 配置日志
@@ -32,6 +34,9 @@ app = FastAPI(
# 注册动态工具生成 Router
app.include_router(tool_generator_router)
# 注册外部工具 API Router(符合 MCP-Server 规范)
app.include_router(external_tool_router)
# 初始化K8s管理器
NAMESPACE = os.getenv("NAMESPACE", "ai-agents")
KUBECONFIG_PATH = os.getenv("KUBECONFIG_PATH", None) # 可选:指定kubeconfig路径
@@ -207,6 +212,7 @@ class CreateAgentRequest(BaseModel):
config: Dict = Field(default_factory=dict, description="配置信息")
env: Optional[Dict[str, str]] = Field(default_factory=dict, description="环境变量")
namespace: Optional[str] = Field(default=None, description="Kubernetes命名空间,默认使用环境变量NAMESPACE的值")
tool_refs: Optional[List[str]] = Field(default=None, description="外部数据工具标识列表(符合MCP-Server规范)")
class AgentResponse(BaseModel):
@@ -224,6 +230,7 @@ class AgentResponse(BaseModel):
host_ip: Optional[str] = None
node_name: Optional[str] = None
owner_info: Optional[Dict] = None
tools_attached: Optional[int] = Field(default=0, description="附加的外部工具数量")
class ResourceUsage(BaseModel):
@@ -328,6 +335,36 @@ async def create_agent(request: CreateAgentRequest, db: Session = Depends(get_db
config_data["env"] = request.env
logger.info(f"环境变量: {list(request.env.keys())}")
# 处理 tool_refs(符合 MCP-Server 规范)
attached_tools = []
if request.tool_refs:
logger.info(f"📦 处理外部工具引用: {request.tool_refs}")
# 验证所有工具存在
missing_tools = []
for ref in request.tool_refs:
tool = tool_storage.get_tool(ref)
if tool:
attached_tools.append(tool)
else:
missing_tools.append(ref)
if missing_tools:
raise HTTPException(
status_code=404,
detail=f"以下工具不存在: {', '.join(missing_tools)}"
)
# 将工具配置添加到 config
config_data["tool_refs"] = request.tool_refs
config_data["tools_count"] = len(attached_tools)
# 标记工具被使用
for ref in request.tool_refs:
tool_storage.mark_tool_in_use(ref, request.name)
logger.info(f"✅ 已附加 {len(attached_tools)} 个外部工具")
# 添加 user_id 标签
user_id = config_data.get("user_id", "default")
if "labels" not in config_data:
@@ -516,6 +553,10 @@ async def create_agent(request: CreateAgentRequest, db: Session = Depends(get_db
if "status" not in result:
result["status"] = "Pending"
# 添加外部工具信息
if attached_tools:
result["tools_attached"] = len(attached_tools)
try:
return AgentResponse(**result)
except Exception as validation_error: