"""Схемы для отчётов о плагиате и результатов поиска.""" from datetime import datetime from pydantic import BaseModel, Field class PlagiarismMatch(BaseModel): """Совпадение фрагмента с источником.""" fragment: str position_start: int position_end: int similarity: float = Field(ge=0.0, le=100.0, description="Схожесть в процентах") method: str = Field(description="Метод обнаружения: exact, fuzzy, semantic+llm") confidence: float | None = Field(default=None, ge=0.0, le=1.0) reason: str | None = None source_title: str source_url: str | None = None source_db: str = Field(description="База данных: openalex, cyberleninka, arxiv, и т.д.") class PlagiarismReport(BaseModel): """Полный отчёт о плагиате.""" task_id: str overall_similarity: float = Field(ge=0.0, le=100.0) matches: list[PlagiarismMatch] = Field(default_factory=list) total_fragments: int flagged_fragments: int checked_at: datetime class SearchResult(BaseModel): """Источник в результатах поиска.""" id: int title: str authors: list[dict] = Field(default_factory=list) year: int | None = None journal: str | None = None abstract: str | None = None url: str | None = None relevance_score: float = Field(ge=0.0, le=1.0) gost_citation: str = Field(description="Отформатированная ГОСТ-цитата") source_db: str