routes.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from sqlalchemy import text
  3. from sqlalchemy.orm import Session
  4. from core_domain import ServiceHealth
  5. from app.application.services import KnowledgeApplicationService
  6. from app.bootstrap.settings import KnowledgeServiceSettings
  7. from app.db.session import get_db
  8. from app.domain.repositories import (
  9. KnowledgeBaseRepository,
  10. KnowledgeChunkRepository,
  11. KnowledgeDocumentRepository,
  12. )
  13. from app.schemas.knowledge import (
  14. KnowledgeBaseCreateRequest,
  15. KnowledgeBaseResponse,
  16. KnowledgeBaseStatusUpdateRequest,
  17. KnowledgeChunkResponse,
  18. KnowledgeDocumentCreateRequest,
  19. KnowledgeDocumentIngestResponse,
  20. KnowledgeDocumentResponse,
  21. KnowledgeSearchRequest,
  22. KnowledgeSearchResultResponse,
  23. )
  24. router = APIRouter()
  25. def get_knowledge_settings() -> KnowledgeServiceSettings:
  26. return KnowledgeServiceSettings()
  27. def get_knowledge_application_service(
  28. db: Session = Depends(get_db),
  29. settings: KnowledgeServiceSettings = Depends(get_knowledge_settings),
  30. ) -> KnowledgeApplicationService:
  31. return KnowledgeApplicationService(
  32. settings=settings,
  33. base_repository=KnowledgeBaseRepository(db),
  34. document_repository=KnowledgeDocumentRepository(db),
  35. chunk_repository=KnowledgeChunkRepository(db),
  36. )
  37. @router.get("/health", response_model=ServiceHealth)
  38. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  39. db.execute(text("SELECT 1"))
  40. return ServiceHealth(service="knowledge-service", status="ok", database="ok")
  41. @router.post("/bases", response_model=KnowledgeBaseResponse)
  42. def create_base(
  43. payload: KnowledgeBaseCreateRequest,
  44. service: KnowledgeApplicationService = Depends(get_knowledge_application_service),
  45. ) -> KnowledgeBaseResponse:
  46. return KnowledgeBaseResponse.from_entity(service.create_base(payload))
  47. @router.get("/bases", response_model=list[KnowledgeBaseResponse])
  48. def list_bases(
  49. tenant_id: str = Query(...),
  50. service: KnowledgeApplicationService = Depends(get_knowledge_application_service),
  51. ) -> list[KnowledgeBaseResponse]:
  52. return [
  53. KnowledgeBaseResponse.from_entity(item)
  54. for item in service.list_bases(tenant_id=tenant_id)
  55. ]
  56. @router.patch("/bases/{knowledge_base_id}/status", response_model=KnowledgeBaseResponse)
  57. def update_base_status(
  58. knowledge_base_id: str,
  59. payload: KnowledgeBaseStatusUpdateRequest,
  60. service: KnowledgeApplicationService = Depends(get_knowledge_application_service),
  61. ) -> KnowledgeBaseResponse:
  62. entity = service.update_base_status(
  63. knowledge_base_id=knowledge_base_id,
  64. payload=payload,
  65. )
  66. if entity is None:
  67. raise HTTPException(
  68. status_code=404,
  69. detail=f"knowledge base not found: {knowledge_base_id}",
  70. )
  71. return KnowledgeBaseResponse.from_entity(entity)
  72. @router.post("/documents", response_model=KnowledgeDocumentIngestResponse)
  73. def create_document(
  74. payload: KnowledgeDocumentCreateRequest,
  75. service: KnowledgeApplicationService = Depends(get_knowledge_application_service),
  76. ) -> KnowledgeDocumentIngestResponse:
  77. try:
  78. document, chunks = service.create_document(payload)
  79. except ValueError as exc:
  80. raise HTTPException(status_code=422, detail=str(exc)) from exc
  81. return KnowledgeDocumentIngestResponse(
  82. document=KnowledgeDocumentResponse.from_entity(document),
  83. chunks=[KnowledgeChunkResponse.from_entity(item) for item in chunks],
  84. )
  85. @router.get("/documents", response_model=list[KnowledgeDocumentResponse])
  86. def list_documents(
  87. tenant_id: str = Query(...),
  88. knowledge_base_id: str = Query(...),
  89. service: KnowledgeApplicationService = Depends(get_knowledge_application_service),
  90. ) -> list[KnowledgeDocumentResponse]:
  91. return [
  92. KnowledgeDocumentResponse.from_entity(item)
  93. for item in service.list_documents(
  94. tenant_id=tenant_id,
  95. knowledge_base_id=knowledge_base_id,
  96. )
  97. ]
  98. @router.post("/search", response_model=list[KnowledgeSearchResultResponse])
  99. def search(
  100. payload: KnowledgeSearchRequest,
  101. service: KnowledgeApplicationService = Depends(get_knowledge_application_service),
  102. ) -> list[KnowledgeSearchResultResponse]:
  103. return [
  104. KnowledgeSearchResultResponse(
  105. chunk=KnowledgeChunkResponse.from_entity(chunk),
  106. document=KnowledgeDocumentResponse.from_entity(document),
  107. score=score,
  108. score_json=score_json,
  109. )
  110. for chunk, document, score, score_json in service.search(payload)
  111. ]