""" 场景模板 API(独立路由,避免与 /api/v1/agents/{agent_id} 在部分部署中的匹配顺序问题)。 """ from fastapi import APIRouter, Depends, status from sqlalchemy.orm import Session from typing import List import logging from app.core.database import get_db from app.api.auth import get_current_user from app.models.user import User from app.models.agent import Agent from app.core.exceptions import ValidationError, ConflictError from app.services.workflow_validator import validate_workflow from app.services.scene_templates import build_workflow_for_template, list_scene_template_meta from app.api.agents import AgentResponse, SceneTemplateItem, AgentFromSceneTemplateCreate logger = logging.getLogger(__name__) router = APIRouter(prefix="/api/v1/platform", tags=["platform-templates"]) @router.get("/scene-templates", response_model=List[SceneTemplateItem]) async def list_scene_templates_v1(current_user: User = Depends(get_current_user)): _ = current_user return list_scene_template_meta() @router.post("/agents/from-template", response_model=AgentResponse, status_code=status.HTTP_201_CREATED) async def create_agent_from_template_v1( body: AgentFromSceneTemplateCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): try: workflow_config = build_workflow_for_template( body.template_id, body.parameters or {} ) except ValueError as e: raise ValidationError(str(e)) validation_result = validate_workflow( workflow_config.get("nodes", []), workflow_config.get("edges", []) ) if not validation_result["valid"]: raise ValidationError( "工作流配置验证失败: " + ", ".join(validation_result["errors"]) ) existing_agent = db.query(Agent).filter( Agent.name == body.name, Agent.user_id == current_user.id, ).first() if existing_agent: raise ConflictError(f"Agent名称 '{body.name}' 已存在") desc = body.description or f"自场景模板 {body.template_id} 创建" agent = Agent( name=body.name, description=desc, workflow_config=workflow_config, budget_config=body.budget_config, user_id=current_user.id, status="draft", ) db.add(agent) db.commit() db.refresh(agent) logger.info( f"用户 {current_user.username} 从模板 {body.template_id} 创建 Agent: {agent.name} ({agent.id})" ) return agent