ai.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from __future__ import annotations
  2. import json
  3. from fastapi import APIRouter, Depends, Query
  4. from fastapi.responses import StreamingResponse
  5. from sqlalchemy.orm import Session
  6. from app.agents.runtime import get_agent_runtime
  7. from app.agents.workflows import run_workflow
  8. from app.db.session import get_db
  9. from app.schemas.ai import (
  10. AgentCapability,
  11. AgentChatRequest,
  12. AgentRunResponse,
  13. WorkflowRunRequest,
  14. )
  15. router = APIRouter(prefix="/ai", tags=["DeepAgent 智能体"])
  16. @router.get(
  17. "/capabilities",
  18. response_model=list[AgentCapability],
  19. summary="智能体与工作流能力",
  20. )
  21. def capabilities() -> list[AgentCapability]:
  22. runtime = get_agent_runtime()
  23. enabled = runtime.enabled
  24. return [
  25. AgentCapability(
  26. name="knowledge_qa",
  27. label="通防知识问答",
  28. enabled=enabled,
  29. description="基于知识库检索结果回答问题并返回依据。",
  30. ),
  31. AgentCapability(
  32. name="diagnosis",
  33. label="缺陷根因分析",
  34. enabled=enabled,
  35. description="增强诊断解释、耦合分析和处置建议。",
  36. ),
  37. AgentCapability(
  38. name="evaluation",
  39. label="评价解释与优化",
  40. enabled=enabled,
  41. description="解释评价结果并生成优化建议。",
  42. ),
  43. AgentCapability(
  44. name="document_analysis",
  45. label="业务资料分析",
  46. enabled=enabled,
  47. description="分析资料字段、缺失项和可沉淀知识。",
  48. ),
  49. ]
  50. @router.post(
  51. "/workflows/run",
  52. response_model=AgentRunResponse,
  53. summary="运行 DeepAgent 业务工作流",
  54. )
  55. async def run_business_workflow(
  56. payload: WorkflowRunRequest,
  57. db: Session = Depends(get_db),
  58. ) -> AgentRunResponse:
  59. result = await run_workflow(
  60. db,
  61. mine_id=payload.mine_id,
  62. workflow=payload.workflow,
  63. payload=payload.payload,
  64. requested_by=payload.requested_by,
  65. )
  66. return AgentRunResponse(**result)
  67. @router.post("/chat", summary="智能问答,支持 SSE")
  68. async def chat(
  69. payload: AgentChatRequest,
  70. stream: bool = Query(True),
  71. db: Session = Depends(get_db),
  72. ):
  73. workflow_payload = {
  74. "question": payload.message,
  75. "thread_id": payload.thread_id,
  76. **payload.context,
  77. }
  78. if not stream:
  79. result = await run_workflow(
  80. db,
  81. mine_id=payload.mine_id or "",
  82. workflow="knowledge_qa",
  83. payload=workflow_payload,
  84. requested_by="default",
  85. )
  86. return AgentRunResponse(**result)
  87. async def event_stream():
  88. yield f"data: {json.dumps({'event': 'start', 'workflow': 'knowledge_qa'}, ensure_ascii=False)}\n\n"
  89. result = await run_workflow(
  90. db,
  91. mine_id=payload.mine_id or "",
  92. workflow="knowledge_qa",
  93. payload=workflow_payload,
  94. requested_by="default",
  95. )
  96. yield f"data: {json.dumps({'event': 'message', 'content': result['output']}, ensure_ascii=False)}\n\n"
  97. yield f"data: {json.dumps({'event': 'done', 'run_id': result['run_id'], 'session_id': result['session_id']}, ensure_ascii=False)}\n\n"
  98. return StreamingResponse(
  99. event_stream(),
  100. media_type="text/event-stream",
  101. headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
  102. )