Files
aisou/ai_search_agent/models.py
T

70 lines
1.9 KiB
Python

from __future__ import annotations
from pydantic import BaseModel, Field
class SearchRequest(BaseModel):
query: str = Field(min_length=1, description="User search query")
top_k_pages: int | None = Field(default=None, ge=1, le=10)
max_page_chars: int | None = Field(default=None, ge=500, le=20000)
callback_url: str | None = None
class SearchResult(BaseModel):
url: str
title: str = ""
snippet: str = ""
rank: int = 0
class PageContent(BaseModel):
url: str
title: str = ""
content: str = ""
fetched: bool = True
usable: bool = True
error: str | None = None
class Citation(BaseModel):
title: str = ""
url: str
trust_score: float = Field(default=0.6, ge=0.0, le=1.0)
class KnowledgeTriple(BaseModel):
subject: str
predicate: str
object: str
class AnswerPayload(BaseModel):
summary: str
key_points: list[str] = Field(default_factory=list)
caveats: list[str] = Field(default_factory=list)
citations: list[Citation] = Field(default_factory=list)
follow_up_questions: list[str] = Field(default_factory=list)
confidence: float = Field(default=0.8, ge=0.0, le=1.0)
class SearchRoundTrace(BaseModel):
round_index: int
query: str
queries: list[str] = Field(default_factory=list)
result_count: int = 0
fetched_page_count: int = 0
usable_page_count: int = 0
reflection: str = ""
class SearchResponse(BaseModel):
query: str
answer: AnswerPayload
search_results: list[SearchResult] = Field(default_factory=list)
pages: list[PageContent] = Field(default_factory=list)
search_rounds: list[SearchRoundTrace] = Field(default_factory=list)
knowledge_triples: list[KnowledgeTriple] = Field(default_factory=list)
content_ready: bool = True
llm_called: bool = False
cache_hit: bool = False
error: str | None = None
audit_id: str | None = None