from typing import Any from uuid import UUID from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator class RetrievalSetting(BaseModel): model_config = ConfigDict(extra="forbid") top_k: int = Field(ge=1) score_threshold: float = Field(ge=0, le=1) class MetadataCondition(BaseModel): model_config = ConfigDict(extra="forbid") logical_operator: str | None = None conditions: list[dict[str, Any]] = Field(default_factory=list) @model_validator(mode="after") def reject_nonempty_conditions(self) -> "MetadataCondition": if self.conditions: raise ValueError("metadata conditions are not supported") return self class RetrievalRequest(BaseModel): model_config = ConfigDict(extra="forbid") knowledge_id: UUID query: str retrieval_setting: RetrievalSetting metadata_condition: MetadataCondition | None = None @field_validator("query") @classmethod def strip_nonempty_query(cls, value: str) -> str: normalized = value.strip() if not normalized: raise ValueError("query must not be empty") return normalized class WeKnoraChunk(BaseModel): model_config = ConfigDict(extra="ignore", allow_inf_nan=False) id: UUID content: str score: float knowledge_base_id: UUID knowledge_id: UUID knowledge_title: str = "" knowledge_filename: str = "" chunk_index: int chunk_type: str image_info: str = ""