| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- from __future__ import annotations
- import json
- from fastapi import APIRouter, Depends, Query
- from fastapi.responses import StreamingResponse
- from sqlalchemy.orm import Session
- from app.agents.runtime import get_agent_runtime
- from app.agents.workflows import run_workflow
- from app.db.session import get_db
- from app.schemas.ai import (
- AgentCapability,
- AgentChatRequest,
- AgentRunResponse,
- WorkflowRunRequest,
- )
- router = APIRouter(prefix="/ai", tags=["DeepAgent 智能体"])
- @router.get(
- "/capabilities",
- response_model=list[AgentCapability],
- summary="智能体与工作流能力",
- )
- def capabilities() -> list[AgentCapability]:
- runtime = get_agent_runtime()
- enabled = runtime.enabled
- return [
- AgentCapability(
- name="knowledge_qa",
- label="通防知识问答",
- enabled=enabled,
- description="基于知识库检索结果回答问题并返回依据。",
- ),
- AgentCapability(
- name="diagnosis",
- label="缺陷根因分析",
- enabled=enabled,
- description="增强诊断解释、耦合分析和处置建议。",
- ),
- AgentCapability(
- name="evaluation",
- label="评价解释与优化",
- enabled=enabled,
- description="解释评价结果并生成优化建议。",
- ),
- AgentCapability(
- name="document_analysis",
- label="业务资料分析",
- enabled=enabled,
- description="分析资料字段、缺失项和可沉淀知识。",
- ),
- ]
- @router.post(
- "/workflows/run",
- response_model=AgentRunResponse,
- summary="运行 DeepAgent 业务工作流",
- )
- async def run_business_workflow(
- payload: WorkflowRunRequest,
- db: Session = Depends(get_db),
- ) -> AgentRunResponse:
- result = await run_workflow(
- db,
- mine_id=payload.mine_id,
- workflow=payload.workflow,
- payload=payload.payload,
- requested_by=payload.requested_by,
- )
- return AgentRunResponse(**result)
- @router.post("/chat", summary="智能问答,支持 SSE")
- async def chat(
- payload: AgentChatRequest,
- stream: bool = Query(True),
- db: Session = Depends(get_db),
- ):
- workflow_payload = {
- "question": payload.message,
- "thread_id": payload.thread_id,
- **payload.context,
- }
- if not stream:
- result = await run_workflow(
- db,
- mine_id=payload.mine_id or "",
- workflow="knowledge_qa",
- payload=workflow_payload,
- requested_by="default",
- )
- return AgentRunResponse(**result)
- async def event_stream():
- yield f"data: {json.dumps({'event': 'start', 'workflow': 'knowledge_qa'}, ensure_ascii=False)}\n\n"
- result = await run_workflow(
- db,
- mine_id=payload.mine_id or "",
- workflow="knowledge_qa",
- payload=workflow_payload,
- requested_by="default",
- )
- yield f"data: {json.dumps({'event': 'message', 'content': result['output']}, ensure_ascii=False)}\n\n"
- yield f"data: {json.dumps({'event': 'done', 'run_id': result['run_id'], 'session_id': result['session_id']}, ensure_ascii=False)}\n\n"
- return StreamingResponse(
- event_stream(),
- media_type="text/event-stream",
- headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
- )
|