File size: 3,768 Bytes
266d7bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from pydantic import BaseModel, Field


# -----------------------
# Core search result model
# -----------------------
class SearchResult(BaseModel):
    title: str = Field(default="", description="Title of the article")
    feed_author: str | None = Field(default=None, description="Author of the article")
    feed_name: str | None = Field(default=None, description="Name of the feed/newsletter")
    article_author: list[str] | None = Field(default=None, description="List of article authors")
    url: str | None = Field(default=None, description="URL of the article")
    chunk_text: str | None = Field(default=None, description="Text content of the article chunk")
    score: float = Field(default=0.0, description="Relevance score of the article")


# -----------------------
# Unique titles request/response
# -----------------------
class UniqueTitleRequest(BaseModel):
    query_text: str = Field(default="", description="The user query text")
    feed_author: str | None = Field(default=None, description="Filter by author name")
    feed_name: str | None = Field(default=None, description="Filter by feed/newsletter name")
    article_author: list[str] | None = Field(default=None, description="List of article authors")
    title_keywords: str | None = Field(
        default=None, description="Keywords or phrase to match in title"
    )
    limit: int = Field(default=5, description="Number of results to return")


class UniqueTitleResponse(BaseModel):
    results: list[SearchResult] = Field(
        default_factory=list, description="List of unique title search results"
    )


# -----------------------
# Ask request model
# -----------------------
class AskRequest(BaseModel):
    query_text: str = Field(default="", description="The user query text")
    feed_author: str | None = Field(default=None, description="Filter by author name")
    feed_name: str | None = Field(default=None, description="Filter by feed/newsletter name")
    article_author: list[str] | None = Field(default=None, description="List of article authors")
    title_keywords: str | None = Field(
        default=None, description="Keywords or phrase to match in title"
    )
    limit: int = Field(default=5, description="Number of results to return")
    provider: str = Field(default="OpenRouter", description="The provider to use for the query")
    model: str | None = Field(
        default=None, description="The specific model to use for the provider, if applicable"
    )


# -----------------------
# Ask response model
# -----------------------
class AskResponse(BaseModel):
    query: str = Field(default="", description="The original query text")
    provider: str = Field(default="", description="The LLM provider used for generation")
    answer: str = Field(default="", description="Generated answer from the LLM")
    sources: list[SearchResult] = Field(
        default_factory=list, description="List of source documents used in generation"
    )
    model: str | None = Field(
        default=None, description="The specific model used by the provider, if available"
    )
    finish_reason: str | None = Field(
        default=None, description="The reason why the generation finished, if available"
    )


# -----------------------
# Streaming "response" documentation
# -----------------------
class AskStreamingChunk(BaseModel):
    delta: str = Field(default="", description="Partial text generated by the LLM")


class AskStreamingResponse(BaseModel):
    query: str = Field(default="", description="The original query text")
    provider: str = Field(default="", description="The LLM provider used for generation")
    chunks: list[AskStreamingChunk] = Field(
        default_factory=list, description="Streamed chunks of generated text"
    )