handler_registry.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """
  2. 业务处理器注册表:意图 -> 处理器、参数校验、执行器
  3. 新增二级Agent仅需在此注册,路由零改动
  4. """
  5. from typing import Callable, Awaitable, Optional
  6. from fastapi import UploadFile, HTTPException
  7. from service.stream_service import stream_calculation_sync, stream_review_sync, stream_comparison_sync
  8. # 定义处理器结构体
  9. class IntentHandler:
  10. def __init__(
  11. self,
  12. need_file: bool, # 是否需要上传PDF文件
  13. stream_func: Callable, # 流式生成函数
  14. validate: Callable[[Optional[UploadFile]], None] # 自定义参数校验
  15. ):
  16. self.need_file = need_file
  17. self.stream_func = stream_func
  18. self.validate = validate
  19. # -------------------------- 校验规则 --------------------------
  20. def validate_no_file(file: Optional[UploadFile]) -> None:
  21. """计算需风量:禁止上传文件"""
  22. if file:
  23. raise HTTPException(status_code=400, detail="需风量计算无需上传文件")
  24. def validate_pdf_file(file: Optional[UploadFile]) -> None:
  25. """配风审查:必须上传PDF文件"""
  26. if not file or not file.filename.endswith(".pdf"):
  27. raise HTTPException(status_code=400, detail="配风审查仅支持上传PDF文件")
  28. # -------------------------- 全局注册表 --------------------------
  29. HANDLER_REGISTRY = {
  30. # 意图标识 : 对应处理器
  31. "calc_ventilation": IntentHandler(
  32. need_file=False,
  33. stream_func=stream_calculation_sync,
  34. validate=validate_no_file
  35. ),
  36. "review_plan": IntentHandler(
  37. need_file=True,
  38. stream_func=stream_review_sync,
  39. validate=validate_pdf_file
  40. ),
  41. "check_vent_comparison": IntentHandler(
  42. need_file=True,
  43. stream_func=stream_comparison_sync,
  44. validate=validate_pdf_file
  45. )
  46. }