File size: 3,214 Bytes
75bea1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations
"""Pydantic schemas for API requests and responses."""

from datetime import datetime
from typing import Any, List, Optional, Dict

from pydantic import BaseModel, Field


class QueryRequest(BaseModel):
    """Request schema for query endpoint."""

    query: str = Field(..., description="The user's question", min_length=1, max_length=2000)
    enable_search: bool = Field(True, description="Enable web search")
    enable_scraping: bool = Field(True, description="Enable web scraping for deep content")
    max_sources: int = Field(5, description="Maximum number of sources to use", ge=1, le=20)
    stream: bool = Field(False, description="Enable streaming response")
    conversation_id: Optional[str] = Field(None, description="Conversation ID for context")


class SourceInfo(BaseModel):
    """Source citation information."""

    title: str
    url: str
    snippet: str = ""


class QueryResponse(BaseModel):
    """Response schema for query endpoint."""

    answer: str = Field(..., description="The generated answer")
    sources: List[SourceInfo] = Field(default_factory=list, description="Sources used")
    follow_up_questions: List[str] = Field(default_factory=list, description="Suggested follow-up questions")
    confidence: float = Field(..., description="Confidence score", ge=0, le=1)
    conversation_id: Optional[str] = Field(None, description="Conversation ID for follow-up")
    processing_time_ms: int = Field(..., description="Processing time in milliseconds")
    metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")


class StreamingChunk(BaseModel):
    """Schema for streaming response chunks."""

    type: str = Field(..., description="Chunk type: 'start', 'content', 'source', 'done'")
    content: str = Field("", description="Content for this chunk")
    source: Optional[SourceInfo] = Field(None, description="Source info (for source chunks)")
    metadata: Dict[str, Any] = Field(default_factory=dict, description="Chunk metadata")


class ErrorResponse(BaseModel):
    """Error response schema."""

    error: str = Field(..., description="Error message")
    error_code: str = Field(..., description="Error code")
    details: Dict[str, Any] = Field(default_factory=dict, description="Error details")


class HealthResponse(BaseModel):
    """Health check response."""

    status: str = Field(..., description="Service status")
    version: str = Field(..., description="API version")
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Response timestamp")
    components: Dict[str, bool] = Field(default_factory=dict, description="Component health status")


class ConversationMessage(BaseModel):
    """A message in a conversation."""

    role: str = Field(..., description="Message role: 'user' or 'assistant'")
    content: str = Field(..., description="Message content")
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Message timestamp")


class ConversationHistory(BaseModel):
    """Conversation history response."""

    conversation_id: str
    messages: List[ConversationMessage]
    created_at: datetime
    updated_at: datetime