File size: 2,618 Bytes
d44b33d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | """Pydantic response models returned by FastAPI routes.
Shared shape: :class:`SourceCitation` appears on ask, summarise, and audit detail responses.
"""
from datetime import datetime
from pydantic import BaseModel, Field
# --- Shared citations (spec-shaped) ---
class SourceCitation(BaseModel):
document_name: str
page_number: int
chunk_text: str
relevance_score: float
# --- Query: ask ---
class AskQueryResponse(BaseModel):
query_id: str
question: str
answer: str
sources: list[SourceCitation] = Field(default_factory=list)
model_used: str
tokens_used: int
response_time_ms: int
timestamp: datetime
# --- Query: summarise ---
class SummariseQueryResponse(BaseModel):
query_id: str
summary: str
document_count: int
sources: list[SourceCitation] = Field(default_factory=list)
timestamp: datetime
# --- Ingest ---
class IngestUploadResponse(BaseModel):
job_id: str
status: str
total_files: int
filenames: list[str]
message: str
class UrlIngestResponse(BaseModel):
job_id: str
status: str
total_urls: int
message: str
class CollectionItem(BaseModel):
name: str
document_count: int
created_at: datetime | None = None
class IngestCollectionsResponse(BaseModel):
collections: list[CollectionItem] = Field(default_factory=list)
total: int
class IngestDeleteCollectionResponse(BaseModel):
message: str
documents_removed: int
# --- Jobs ---
class JobStatusResponse(BaseModel):
job_id: str
status: str
total_files: int
processed_files: int
failed_files: int
progress_percent: int
started_at: datetime | None
completed_at: datetime | None
errors: list[str] = Field(default_factory=list)
class JobListItem(BaseModel):
job_id: str
status: str
total_files: int
completed_at: datetime | None = None
class JobListResponse(BaseModel):
jobs: list[JobListItem] = Field(default_factory=list)
total: int
# --- Audit ---
class AuditLogEntry(BaseModel):
query_id: str
user_id: str
question: str
answer_summary: str
sources_count: int
model_used: str | None
timestamp: datetime
class AuditLogsResponse(BaseModel):
logs: list[AuditLogEntry] = Field(default_factory=list)
total: int
limit: int
offset: int
class AuditLogDetailResponse(BaseModel):
query_id: str
user_id: str
question: str
full_answer: str
sources: list[SourceCitation] = Field(default_factory=list)
model_used: str | None
tokens_used: int | None
timestamp: datetime
|