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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user