Assistants and Workflows has own group/tags

This commit is contained in:
Xin Wang
2026-02-08 16:32:52 +08:00
parent c563b13fbf
commit 9410265a2b
4 changed files with 95 additions and 82 deletions

View File

@@ -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")

View File

@@ -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)

View File

@@ -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"}

View File

@@ -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"}