search_request_models.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """
  2. 搜索相关的Pydantic模型定义
  3. 该模块定义了用于图像和文本搜索的请求和响应模型。
  4. """
  5. from pydantic import BaseModel, Field, field_validator
  6. from typing import List, Optional
  7. class SearchRequest(BaseModel):
  8. """
  9. 搜索请求模型
  10. 支持通过图像URL或文本进行相似性搜索。
  11. 至少需要提供 image_url 或 matching_text 其中之一。
  12. Attributes:
  13. image_url: 用于图像搜索的图片URL (可选)
  14. matching_text: 用于文本匹配搜索的查询文本 (可选)
  15. topn: 返回的最大结果数量,默认为10,范围1-100
  16. """
  17. database_ids: List[str] = Field(
  18. default=[],
  19. description="知识库id",
  20. examples=["database_id1", "database_id2"]
  21. )
  22. database_ids_str: Optional[str] = Field(
  23. default=[],
  24. description="知识库id",
  25. examples=["database_id1", "database_id2"]
  26. )
  27. image_url: Optional[str] = Field(
  28. default=None,
  29. description="用于图像搜索的图片URL",
  30. examples=["https://example.com/image.jpg"]
  31. )
  32. matching_text: Optional[str] = Field(
  33. default=None,
  34. description="用于文本匹配搜索的查询文本",
  35. examples=["搜索关键词"]
  36. )
  37. topk: int = Field(
  38. default=10,
  39. ge=1,
  40. le=100,
  41. description="返回的最大结果数量"
  42. )
  43. score_threshold: float = Field(
  44. default=0.0,
  45. ge=0.0,
  46. le=1.0,
  47. description="相似度分数阈值"
  48. )
  49. kb_ids_str: Optional[str] = Field(
  50. default=None,
  51. description="知识库id",
  52. )
  53. kb_id: List[str] = Field(
  54. default=None,
  55. description="知识库id",
  56. examples=["kb_id1", "kb_id2"]
  57. )
  58. @field_validator('image_url')
  59. @classmethod
  60. def validate_image_url(cls, v: Optional[str]) -> Optional[str]:
  61. """验证图片URL格式"""
  62. if v is not None and v.strip() == "":
  63. return None
  64. return v
  65. @field_validator('matching_text')
  66. @classmethod
  67. def validate_matching_text(cls, v: Optional[str]) -> Optional[str]:
  68. """验证匹配文本"""
  69. if v is not None and v.strip() == "":
  70. return None
  71. return v
  72. def model_post_init(self, __context) -> None:
  73. """模型初始化后验证:确保至少提供一个搜索条件"""
  74. if self.image_url is None and self.matching_text is None:
  75. raise ValueError("必须提供 image_url 或 matching_text 其中至少一个")