response.py 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. """
  2. 响应模型定义
  3. """
  4. from pydantic import BaseModel, Field
  5. from typing import Optional, List
  6. from .request import EntityInfo, PositionInfo
  7. class RelationInfo(BaseModel):
  8. """关系信息"""
  9. from_entity: str = Field(..., alias="fromEntity", description="源实体名称")
  10. from_entity_id: Optional[str] = Field(None, alias="fromEntityId", description="源实体临时ID")
  11. to_entity: str = Field(..., alias="toEntity", description="目标实体名称")
  12. to_entity_id: Optional[str] = Field(None, alias="toEntityId", description="目标实体临时ID")
  13. relation_type: str = Field(..., alias="relationType", description="关系类型")
  14. confidence: Optional[float] = Field(None, description="置信度")
  15. class Config:
  16. populate_by_name = True
  17. # 序列化时默认使用 alias (camelCase)
  18. by_alias = True
  19. class NerResponse(BaseModel):
  20. """NER 响应"""
  21. document_id: Optional[str] = Field(None, alias="documentId", description="文档ID")
  22. entities: List[EntityInfo] = Field(default_factory=list, description="提取的实体列表")
  23. relations: List[RelationInfo] = Field(default_factory=list, description="提取的关系列表")
  24. processing_time: Optional[int] = Field(None, alias="processingTime", description="处理耗时(毫秒)")
  25. entity_count: int = Field(0, alias="entityCount", description="实体数量")
  26. relation_count: int = Field(0, alias="relationCount", description="关系数量")
  27. success: bool = Field(True, description="是否成功")
  28. error_message: Optional[str] = Field(None, alias="errorMessage", description="错误信息")
  29. class Config:
  30. populate_by_name = True
  31. # 序列化时默认使用 alias (camelCase)
  32. by_alias = True
  33. @classmethod
  34. def success_response(cls, document_id: str, entities: List[EntityInfo],
  35. relations: List[RelationInfo], processing_time: int):
  36. return cls(
  37. document_id=document_id,
  38. entities=entities,
  39. relations=relations,
  40. processing_time=processing_time,
  41. entity_count=len(entities),
  42. relation_count=len(relations),
  43. success=True
  44. )
  45. @classmethod
  46. def error_response(cls, document_id: str, error_message: str):
  47. return cls(
  48. document_id=document_id,
  49. success=False,
  50. error_message=error_message
  51. )
  52. class RelationResponse(BaseModel):
  53. """关系抽取响应"""
  54. document_id: Optional[str] = Field(None, alias="documentId", description="文档ID")
  55. relations: List[RelationInfo] = Field(default_factory=list, description="提取的关系列表")
  56. processing_time: Optional[int] = Field(None, alias="processingTime", description="处理耗时(毫秒)")
  57. relation_count: int = Field(0, alias="relationCount", description="关系数量")
  58. success: bool = Field(True, description="是否成功")
  59. error_message: Optional[str] = Field(None, alias="errorMessage", description="错误信息")
  60. class Config:
  61. populate_by_name = True
  62. @classmethod
  63. def success_response(cls, document_id: str, relations: List[RelationInfo], processing_time: int):
  64. return cls(
  65. document_id=document_id,
  66. relations=relations,
  67. processing_time=processing_time,
  68. relation_count=len(relations),
  69. success=True
  70. )
  71. @classmethod
  72. def error_response(cls, document_id: str, error_message: str):
  73. return cls(
  74. document_id=document_id,
  75. success=False,
  76. error_message=error_message
  77. )
  78. class HealthResponse(BaseModel):
  79. """健康检查响应"""
  80. status: str = "ok"
  81. version: str
  82. ner_model: str