knowledge.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from typing import Any
  4. from pydantic import BaseModel, Field
  5. from app.schemas.common import ORMModel
  6. class KnowledgeItemCreate(BaseModel):
  7. mine_id: str | None = None
  8. document_id: str | None = None
  9. code: str | None = None
  10. title: str
  11. knowledge_type: str
  12. category: str = ""
  13. source_type: str = "manual"
  14. source_ref: str = ""
  15. content: str
  16. summary: str = ""
  17. tags: list[str] = Field(default_factory=list)
  18. status: str = "published"
  19. version: str = "V1.0"
  20. confidence: float | None = None
  21. metadata: dict = Field(default_factory=dict)
  22. class KnowledgeItemRead(ORMModel):
  23. id: str
  24. mine_id: str | None
  25. document_id: str | None
  26. code: str | None
  27. title: str
  28. knowledge_type: str
  29. category: str
  30. source_type: str
  31. source_ref: str
  32. content: str
  33. summary: str
  34. tags: list
  35. status: str
  36. version: str
  37. confidence: float | None
  38. is_verified: bool
  39. verified_by: str
  40. metadata: dict = Field(validation_alias="metadata_json")
  41. created_at: datetime
  42. updated_at: datetime
  43. class KnowledgeSearchRequest(BaseModel):
  44. query: str
  45. mine_id: str | None = None
  46. knowledge_type: str | None = None
  47. category: str | None = None
  48. limit: int = Field(default=10, ge=1, le=50)
  49. class KnowledgeSearchHit(BaseModel):
  50. item: KnowledgeItemRead
  51. score: float = 0
  52. highlight: str = ""
  53. class KnowledgeSearchResponse(BaseModel):
  54. query: str
  55. total: int
  56. items: list[KnowledgeSearchHit]
  57. class KnowledgeServiceStatus(BaseModel):
  58. available: bool = False
  59. base_url: str = ""
  60. version: str = ""
  61. mode: str = ""
  62. status: str = ""
  63. total_notes: int = 0
  64. total_chunks: int = 0
  65. embedding_model: str = ""
  66. semantic_enabled: bool = False
  67. last_indexed: str | None = None
  68. error: str = ""
  69. class KnowledgeCategoryStat(BaseModel):
  70. key: str
  71. name: str
  72. count: int = 0
  73. description: str = ""
  74. available: bool = True
  75. class KnowledgeOverviewResponse(BaseModel):
  76. service: KnowledgeServiceStatus
  77. total_notes: int = 0
  78. total_chunks: int = 0
  79. category_counts: list[KnowledgeCategoryStat] = Field(default_factory=list)
  80. search_mode: str = "keyword"
  81. min_score: float = 0
  82. min_match_ratio: float = 0
  83. last_indexed: str | None = None
  84. average_response_ms: float | None = None
  85. class KnowledgeCatalogItem(BaseModel):
  86. note_id: str
  87. title: str
  88. category: str = "other"
  89. category_name: str = "其他"
  90. tags: list[str] = Field(default_factory=list)
  91. aliases: list[str] = Field(default_factory=list)
  92. file_path: str = ""
  93. updated: str = ""
  94. chunk_count: int = 0
  95. confidence: str = ""
  96. status: str = ""
  97. version: str = ""
  98. class KnowledgeCatalogResponse(BaseModel):
  99. items: list[KnowledgeCatalogItem]
  100. total: int
  101. page: int
  102. page_size: int
  103. service: KnowledgeServiceStatus
  104. class KnowledgeNoteChunk(BaseModel):
  105. chunk_id: str = ""
  106. heading: str = ""
  107. content: str = ""
  108. class KnowledgeNoteDetail(KnowledgeCatalogItem):
  109. full_content: str = ""
  110. links: list[Any] = Field(default_factory=list)
  111. chunks: list[KnowledgeNoteChunk] = Field(default_factory=list)
  112. class KnowledgeAskRequest(BaseModel):
  113. question: str = Field(min_length=1)
  114. top_k: int = Field(default=5, ge=1, le=20)
  115. search_mode: str | None = None
  116. category: str | None = None
  117. tag: str | None = None
  118. generate_answer: bool = True
  119. class KnowledgeSource(BaseModel):
  120. citation_index: int = 0
  121. note_id: str = ""
  122. title: str
  123. file_path: str = ""
  124. score: float = 0
  125. heading: str = ""
  126. snippet: str = ""
  127. category: str = "other"
  128. category_name: str = "其他"
  129. class KnowledgeAskResponse(BaseModel):
  130. question: str
  131. answer: str
  132. answer_status: str
  133. answer_model: str = ""
  134. generation_enabled: bool = True
  135. steps: list[str] = Field(default_factory=list)
  136. sources: list[KnowledgeSource] = Field(default_factory=list)
  137. requested_mode: str = "keyword"
  138. search_mode: str = "keyword"
  139. retrieval_ms: float = 0
  140. generation_ms: float = 0
  141. context_chars: int = 0
  142. latency_ms: float = 0
  143. total_candidates: int = 0
  144. degraded: bool = False
  145. class KnowledgeGraphNode(BaseModel):
  146. id: str
  147. label: str
  148. sub_label: str = ""
  149. node_type: str
  150. value: int = 0
  151. sample_notes: list[str] = Field(default_factory=list)
  152. x: float
  153. y: float
  154. class KnowledgeGraphEdge(BaseModel):
  155. source: str
  156. target: str
  157. relation: str = ""
  158. weight: int = 1
  159. class KnowledgeGraphResponse(BaseModel):
  160. topic: str
  161. nodes: list[KnowledgeGraphNode] = Field(default_factory=list)
  162. edges: list[KnowledgeGraphEdge] = Field(default_factory=list)