settings_service.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. """Knowledge settings read/write sub-service."""
  2. from __future__ import annotations
  3. from typing import TYPE_CHECKING
  4. from core_shared import JSONValue
  5. from app.bootstrap.settings import KnowledgeServiceSettings
  6. from app.schemas.knowledge import (
  7. KnowledgeSettingsDto,
  8. KnowledgeSettingsUpdateRequestDto,
  9. )
  10. if TYPE_CHECKING:
  11. from app.domain.repositories import KnowledgeBaseRepository
  12. class KnowledgeSettingsService:
  13. def __init__(
  14. self,
  15. *,
  16. settings: KnowledgeServiceSettings,
  17. base_repository: KnowledgeBaseRepository,
  18. ) -> None:
  19. self.settings = settings
  20. self.base_repository = base_repository
  21. def read_settings(self, *, knowledge_base_id: str | None = None) -> KnowledgeSettingsDto:
  22. base_config: dict[str, JSONValue] = {}
  23. if knowledge_base_id:
  24. base = self.base_repository.get_by_id(knowledge_base_id=knowledge_base_id)
  25. if base is not None and isinstance(base.metadata_json, dict):
  26. value = base.metadata_json.get("retrieval_config")
  27. if isinstance(value, dict):
  28. base_config = value
  29. defaults = KnowledgeSettingsDto(
  30. knowledgeBaseId=knowledge_base_id,
  31. chunkSize=self.settings.default_chunk_size,
  32. chunkOverlap=self.settings.default_chunk_overlap,
  33. keywordWeight=self.settings.retrieval_keyword_weight,
  34. vectorWeight=self.settings.retrieval_vector_weight,
  35. rerankWeight=self.settings.retrieval_rerank_weight,
  36. queryRewrite=False,
  37. requireCitations=True,
  38. )
  39. return KnowledgeSettingsDto.model_validate({
  40. **defaults.model_dump(),
  41. **base_config,
  42. "knowledgeBaseId": knowledge_base_id,
  43. })
  44. def update_settings(
  45. self,
  46. payload: KnowledgeSettingsUpdateRequestDto,
  47. ) -> KnowledgeSettingsDto:
  48. settings = KnowledgeSettingsDto.model_validate({
  49. **payload.model_dump(),
  50. "knowledgeBaseId": payload.knowledgeBaseId,
  51. })
  52. if payload.knowledgeBaseId:
  53. base = self.base_repository.get_by_id(knowledge_base_id=payload.knowledgeBaseId)
  54. if base is not None:
  55. metadata = dict(base.metadata_json or {})
  56. metadata["retrieval_config"] = settings.model_dump(exclude={"knowledgeBaseId"})
  57. self.base_repository.update(
  58. knowledge_base_id=payload.knowledgeBaseId,
  59. metadata_json=metadata,
  60. )
  61. return settings