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 import os
from .db import Base, engine 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 @asynccontextmanager
@@ -33,6 +33,7 @@ app.add_middleware(
# 路由 # 路由
app.include_router(assistants.router, prefix="/api") app.include_router(assistants.router, prefix="/api")
app.include_router(voices.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(history.router, prefix="/api")
app.include_router(knowledge.router, prefix="/api") app.include_router(knowledge.router, prefix="/api")
app.include_router(llm.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 assistants
from . import voices from . import voices
from . import workflows
from . import history from . import history
from . import knowledge from . import knowledge
from . import llm from . import llm
@@ -12,6 +13,7 @@ router = APIRouter()
router.include_router(assistants.router) router.include_router(assistants.router)
router.include_router(voices.router) router.include_router(voices.router)
router.include_router(workflows.router)
router.include_router(history.router) router.include_router(history.router)
router.include_router(knowledge.router) router.include_router(knowledge.router)
router.include_router(llm.router) router.include_router(llm.router)

View File

@@ -1,17 +1,16 @@
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import List, Optional from typing import Optional
import uuid import uuid
from datetime import datetime from datetime import datetime
from ..db import get_db from ..db import get_db
from ..models import Assistant, Workflow from ..models import Assistant
from ..schemas import ( from ..schemas import (
AssistantCreate, AssistantUpdate, AssistantOut, AssistantCreate, AssistantUpdate, AssistantOut
WorkflowCreate, WorkflowUpdate, WorkflowOut
) )
router = APIRouter() router = APIRouter(prefix="/assistants", tags=["Assistants"])
def assistant_to_dict(assistant: Assistant) -> dict: def assistant_to_dict(assistant: Assistant) -> dict:
@@ -57,7 +56,7 @@ def _apply_assistant_update(assistant: Assistant, update_data: dict) -> None:
# ============ Assistants ============ # ============ Assistants ============
@router.get("/assistants") @router.get("")
def list_assistants( def list_assistants(
page: int = 1, page: int = 1,
limit: int = 50, 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)): def get_assistant(id: str, db: Session = Depends(get_db)):
"""获取单个助手详情""" """获取单个助手详情"""
assistant = db.query(Assistant).filter(Assistant.id == id).first() 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) 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)): def create_assistant(data: AssistantCreate, db: Session = Depends(get_db)):
"""创建新助手""" """创建新助手"""
assistant = Assistant( assistant = Assistant(
@@ -115,7 +114,7 @@ def create_assistant(data: AssistantCreate, db: Session = Depends(get_db)):
return assistant_to_dict(assistant) return assistant_to_dict(assistant)
@router.put("/assistants/{id}") @router.put("/{id}")
def update_assistant(id: str, data: AssistantUpdate, db: Session = Depends(get_db)): def update_assistant(id: str, data: AssistantUpdate, db: Session = Depends(get_db)):
"""更新助手""" """更新助手"""
assistant = db.query(Assistant).filter(Assistant.id == id).first() 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) return assistant_to_dict(assistant)
@router.delete("/assistants/{id}") @router.delete("/{id}")
def delete_assistant(id: str, db: Session = Depends(get_db)): def delete_assistant(id: str, db: Session = Depends(get_db)):
"""删除助手""" """删除助手"""
assistant = db.query(Assistant).filter(Assistant.id == id).first() 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() db.commit()
return {"message": "Deleted successfully"} 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"}