File size: 2,643 Bytes
42f5b98
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Pydantic schemas for REST API."""

from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field, HttpUrl


class IndexRepositoryRequest(BaseModel):
    """Request to index a repository."""

    url: str = Field(..., description="GitHub repository URL")
    branch: Optional[str] = Field(None, description="Branch name (default: main)")
    include_patterns: Optional[list[str]] = Field(None, description="File patterns to include")
    exclude_patterns: Optional[list[str]] = Field(None, description="File patterns to exclude")


class IndexRepositoryResponse(BaseModel):
    """Response from indexing request."""

    repo_id: str = Field(..., description="Repository ID")
    status: str = Field(..., description="Indexing status")
    message: str = Field(..., description="Status message")


class QueryRequest(BaseModel):
    """Request to query a repository."""

    question: str = Field(..., description="Question about the repository")
    repo_id: str = Field(..., description="Repository ID to query")
    top_k: int = Field(5, ge=1, le=20, description="Number of chunks to retrieve")


class CitationResponse(BaseModel):
    """Citation information."""

    file_path: str
    start_line: int
    end_line: int

    class Config:
        from_attributes = True


class RetrievedChunkResponse(BaseModel):
    """Retrieved chunk information."""

    chunk_id: str
    file_path: str
    start_line: int
    end_line: int
    relevance_score: float
    chunk_type: str
    name: Optional[str] = None
    content: str

    class Config:
        from_attributes = True


class QueryResponse(BaseModel):
    """Response from a query."""

    answer: str = Field(..., description="Generated answer")
    citations: list[CitationResponse] = Field(..., description="Citations in the answer")
    retrieved_chunks: list[RetrievedChunkResponse] = Field(..., description="Evidence chunks")
    grounded: bool = Field(..., description="Whether response is grounded in evidence")
    query_id: str = Field(..., description="Query ID")


class RepositoryInfo(BaseModel):
    """Repository information."""

    id: str
    url: str
    branch: str
    chunk_count: int
    status: str
    indexed_at: Optional[datetime] = None
    error_message: Optional[str] = None


class ListRepositoriesResponse(BaseModel):
    """List of repositories."""

    repositories: list[RepositoryInfo]


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

    status: str
    app: str
    version: str


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

    error: str
    detail: Optional[str] = None