From 9410265a2be89d37e460f90077e23fd37e326bff Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Sun, 8 Feb 2026 16:32:52 +0800 Subject: [PATCH] Assistants and Workflows has own group/tags --- api/app/main.py | 3 +- api/app/routers/__init__.py | 2 + api/app/routers/assistants.py | 90 ++++------------------------------- api/app/routers/workflows.py | 82 +++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 82 deletions(-) create mode 100644 api/app/routers/workflows.py diff --git a/api/app/main.py b/api/app/main.py index 34313c3..a193ff9 100644 --- a/api/app/main.py +++ b/api/app/main.py @@ -4,7 +4,7 @@ from contextlib import asynccontextmanager import os from .db import Base, engine -from .routers import assistants, voices, history, knowledge, llm, asr, tools +from .routers import assistants, voices, workflows, history, knowledge, llm, asr, tools @asynccontextmanager @@ -33,6 +33,7 @@ app.add_middleware( # 路由 app.include_router(assistants.router, prefix="/api") app.include_router(voices.router, prefix="/api") +app.include_router(workflows.router, prefix="/api") app.include_router(history.router, prefix="/api") app.include_router(knowledge.router, prefix="/api") app.include_router(llm.router, prefix="/api") diff --git a/api/app/routers/__init__.py b/api/app/routers/__init__.py index 87dc7ae..1f21a2f 100644 --- a/api/app/routers/__init__.py +++ b/api/app/routers/__init__.py @@ -2,6 +2,7 @@ from fastapi import APIRouter from . import assistants from . import voices +from . import workflows from . import history from . import knowledge from . import llm @@ -12,6 +13,7 @@ router = APIRouter() router.include_router(assistants.router) router.include_router(voices.router) +router.include_router(workflows.router) router.include_router(history.router) router.include_router(knowledge.router) router.include_router(llm.router) diff --git a/api/app/routers/assistants.py b/api/app/routers/assistants.py index 7d71d32..4949d06 100644 --- a/api/app/routers/assistants.py +++ b/api/app/routers/assistants.py @@ -1,17 +1,16 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session -from typing import List, Optional +from typing import Optional import uuid from datetime import datetime from ..db import get_db -from ..models import Assistant, Workflow +from ..models import Assistant from ..schemas import ( - AssistantCreate, AssistantUpdate, AssistantOut, - WorkflowCreate, WorkflowUpdate, WorkflowOut + AssistantCreate, AssistantUpdate, AssistantOut ) -router = APIRouter() +router = APIRouter(prefix="/assistants", tags=["Assistants"]) def assistant_to_dict(assistant: Assistant) -> dict: @@ -57,7 +56,7 @@ def _apply_assistant_update(assistant: Assistant, update_data: dict) -> None: # ============ Assistants ============ -@router.get("/assistants") +@router.get("") def list_assistants( page: int = 1, limit: int = 50, @@ -76,7 +75,7 @@ def list_assistants( } -@router.get("/assistants/{id}", response_model=AssistantOut) +@router.get("/{id}", response_model=AssistantOut) def get_assistant(id: str, db: Session = Depends(get_db)): """获取单个助手详情""" assistant = db.query(Assistant).filter(Assistant.id == id).first() @@ -85,7 +84,7 @@ def get_assistant(id: str, db: Session = Depends(get_db)): return assistant_to_dict(assistant) -@router.post("/assistants", response_model=AssistantOut) +@router.post("", response_model=AssistantOut) def create_assistant(data: AssistantCreate, db: Session = Depends(get_db)): """创建新助手""" assistant = Assistant( @@ -115,7 +114,7 @@ def create_assistant(data: AssistantCreate, db: Session = Depends(get_db)): return assistant_to_dict(assistant) -@router.put("/assistants/{id}") +@router.put("/{id}") def update_assistant(id: str, data: AssistantUpdate, db: Session = Depends(get_db)): """更新助手""" assistant = db.query(Assistant).filter(Assistant.id == id).first() @@ -131,7 +130,7 @@ def update_assistant(id: str, data: AssistantUpdate, db: Session = Depends(get_d return assistant_to_dict(assistant) -@router.delete("/assistants/{id}") +@router.delete("/{id}") def delete_assistant(id: str, db: Session = Depends(get_db)): """删除助手""" assistant = db.query(Assistant).filter(Assistant.id == id).first() @@ -141,74 +140,3 @@ def delete_assistant(id: str, db: Session = Depends(get_db)): db.commit() return {"message": "Deleted successfully"} - -# ============ Workflows ============ -@router.get("/workflows", response_model=List[WorkflowOut]) -def list_workflows( - page: int = 1, - limit: int = 50, - db: Session = Depends(get_db) -): - """获取工作流列表""" - query = db.query(Workflow) - total = query.count() - workflows = query.order_by(Workflow.created_at.desc()) \ - .offset((page-1)*limit).limit(limit).all() - return {"total": total, "page": page, "limit": limit, "list": workflows} - - -@router.post("/workflows", response_model=WorkflowOut) -def create_workflow(data: WorkflowCreate, db: Session = Depends(get_db)): - """创建工作流""" - workflow = Workflow( - id=str(uuid.uuid4())[:8], - user_id=1, - name=data.name, - node_count=data.nodeCount, - created_at=data.createdAt or datetime.utcnow().isoformat(), - updated_at=data.updatedAt or "", - global_prompt=data.globalPrompt, - nodes=data.nodes, - edges=data.edges, - ) - db.add(workflow) - db.commit() - db.refresh(workflow) - return workflow - - -@router.get("/workflows/{id}", response_model=WorkflowOut) -def get_workflow(id: str, db: Session = Depends(get_db)): - """获取单个工作流""" - workflow = db.query(Workflow).filter(Workflow.id == id).first() - if not workflow: - raise HTTPException(status_code=404, detail="Workflow not found") - return workflow - - -@router.put("/workflows/{id}", response_model=WorkflowOut) -def update_workflow(id: str, data: WorkflowUpdate, db: Session = Depends(get_db)): - """更新工作流""" - workflow = db.query(Workflow).filter(Workflow.id == id).first() - if not workflow: - raise HTTPException(status_code=404, detail="Workflow not found") - - update_data = data.model_dump(exclude_unset=True) - for field, value in update_data.items(): - setattr(workflow, field, value) - - workflow.updated_at = datetime.utcnow().isoformat() - db.commit() - db.refresh(workflow) - return workflow - - -@router.delete("/workflows/{id}") -def delete_workflow(id: str, db: Session = Depends(get_db)): - """删除工作流""" - workflow = db.query(Workflow).filter(Workflow.id == id).first() - if not workflow: - raise HTTPException(status_code=404, detail="Workflow not found") - db.delete(workflow) - db.commit() - return {"message": "Deleted successfully"} diff --git a/api/app/routers/workflows.py b/api/app/routers/workflows.py new file mode 100644 index 0000000..bdbc034 --- /dev/null +++ b/api/app/routers/workflows.py @@ -0,0 +1,82 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from typing import List +import uuid +from datetime import datetime + +from ..db import get_db +from ..models import Workflow +from ..schemas import WorkflowCreate, WorkflowUpdate, WorkflowOut + +router = APIRouter(prefix="/workflows", tags=["Workflows"]) + + +@router.get("", response_model=List[WorkflowOut]) +def list_workflows( + page: int = 1, + limit: int = 50, + db: Session = Depends(get_db) +): + """获取工作流列表""" + query = db.query(Workflow) + total = query.count() + workflows = query.order_by(Workflow.created_at.desc()) \ + .offset((page - 1) * limit).limit(limit).all() + return {"total": total, "page": page, "limit": limit, "list": workflows} + + +@router.post("", response_model=WorkflowOut) +def create_workflow(data: WorkflowCreate, db: Session = Depends(get_db)): + """创建工作流""" + workflow = Workflow( + id=str(uuid.uuid4())[:8], + user_id=1, + name=data.name, + node_count=data.nodeCount, + created_at=data.createdAt or datetime.utcnow().isoformat(), + updated_at=data.updatedAt or "", + global_prompt=data.globalPrompt, + nodes=data.nodes, + edges=data.edges, + ) + db.add(workflow) + db.commit() + db.refresh(workflow) + return workflow + + +@router.get("/{id}", response_model=WorkflowOut) +def get_workflow(id: str, db: Session = Depends(get_db)): + """获取单个工作流""" + workflow = db.query(Workflow).filter(Workflow.id == id).first() + if not workflow: + raise HTTPException(status_code=404, detail="Workflow not found") + return workflow + + +@router.put("/{id}", response_model=WorkflowOut) +def update_workflow(id: str, data: WorkflowUpdate, db: Session = Depends(get_db)): + """更新工作流""" + workflow = db.query(Workflow).filter(Workflow.id == id).first() + if not workflow: + raise HTTPException(status_code=404, detail="Workflow not found") + + update_data = data.model_dump(exclude_unset=True) + for field, value in update_data.items(): + setattr(workflow, field, value) + + workflow.updated_at = datetime.utcnow().isoformat() + db.commit() + db.refresh(workflow) + return workflow + + +@router.delete("/{id}") +def delete_workflow(id: str, db: Session = Depends(get_db)): + """删除工作流""" + workflow = db.query(Workflow).filter(Workflow.id == id).first() + if not workflow: + raise HTTPException(status_code=404, detail="Workflow not found") + db.delete(workflow) + db.commit() + return {"message": "Deleted successfully"}