| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- """Knowledge settings read/write sub-service."""
- from __future__ import annotations
- from typing import TYPE_CHECKING
- from core_shared import JSONValue
- from app.bootstrap.settings import KnowledgeServiceSettings
- from app.schemas.knowledge import (
- KnowledgeSettingsDto,
- KnowledgeSettingsUpdateRequestDto,
- )
- if TYPE_CHECKING:
- from app.domain.repositories import KnowledgeBaseRepository
- class KnowledgeSettingsService:
- def __init__(
- self,
- *,
- settings: KnowledgeServiceSettings,
- base_repository: KnowledgeBaseRepository,
- ) -> None:
- self.settings = settings
- self.base_repository = base_repository
- def read_settings(self, *, knowledge_base_id: str | None = None) -> KnowledgeSettingsDto:
- base_config: dict[str, JSONValue] = {}
- if knowledge_base_id:
- base = self.base_repository.get_by_id(knowledge_base_id=knowledge_base_id)
- if base is not None and isinstance(base.metadata_json, dict):
- value = base.metadata_json.get("retrieval_config")
- if isinstance(value, dict):
- base_config = value
- defaults = KnowledgeSettingsDto(
- knowledgeBaseId=knowledge_base_id,
- chunkSize=self.settings.default_chunk_size,
- chunkOverlap=self.settings.default_chunk_overlap,
- keywordWeight=self.settings.retrieval_keyword_weight,
- vectorWeight=self.settings.retrieval_vector_weight,
- rerankWeight=self.settings.retrieval_rerank_weight,
- queryRewrite=False,
- requireCitations=True,
- )
- return KnowledgeSettingsDto.model_validate({
- **defaults.model_dump(),
- **base_config,
- "knowledgeBaseId": knowledge_base_id,
- })
- def update_settings(
- self,
- payload: KnowledgeSettingsUpdateRequestDto,
- ) -> KnowledgeSettingsDto:
- settings = KnowledgeSettingsDto.model_validate({
- **payload.model_dump(),
- "knowledgeBaseId": payload.knowledgeBaseId,
- })
- if payload.knowledgeBaseId:
- base = self.base_repository.get_by_id(knowledge_base_id=payload.knowledgeBaseId)
- if base is not None:
- metadata = dict(base.metadata_json or {})
- metadata["retrieval_config"] = settings.model_dump(exclude={"knowledgeBaseId"})
- self.base_repository.update(
- knowledge_base_id=payload.knowledgeBaseId,
- metadata_json=metadata,
- )
- return settings
|