Coverage for src / lilbee / server / models.py: 100%
41 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-16 08:27 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-16 08:27 +0000
1"""Request and response models for the lilbee HTTP API.
3Typed pydantic models so Litestar's OpenAPI schema has field-level detail.
4"""
6from __future__ import annotations
8from typing import Any
10from pydantic import BaseModel
13class AskRequest(BaseModel):
14 """Request body for /api/ask."""
16 question: str
17 top_k: int = 0
18 options: dict[str, Any] | None = None
21class ChatRequest(BaseModel):
22 """Request body for /api/chat."""
24 question: str
25 history: list[ChatMessage] = []
26 top_k: int = 0
27 options: dict[str, Any] | None = None
30class SyncRequest(BaseModel):
31 """Request body for /api/sync."""
33 force_vision: bool = False
36class AddRequest(BaseModel):
37 """Request body for /api/add."""
39 paths: list[str]
40 force: bool = False
41 vision_model: str = ""
44class SetModelRequest(BaseModel):
45 """Request body for /api/models/chat and /api/models/vision."""
47 model: str
50class ChatMessage(BaseModel):
51 """A single message in a chat conversation."""
53 role: str
54 content: str
57class CleanedChunk(BaseModel):
58 """A search result chunk with vector stripped and distance renamed."""
60 source: str
61 content_type: str
62 chunk: str
63 distance: float
64 page_start: int = 0
65 page_end: int = 0
66 line_start: int = 0
67 line_end: int = 0
68 chunk_index: int = 0
71class HealthResponse(BaseModel):
72 """Response for /api/health."""
74 status: str
75 version: str
78class AskResponse(BaseModel):
79 """Response for /api/ask and /api/chat."""
81 answer: str
82 sources: list[CleanedChunk]
85class SetModelResponse(BaseModel):
86 """Response for /api/models/chat and /api/models/vision."""
88 model: str