| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- """AI-related Pydantic schemas (P3-M1)."""
- from typing import Optional, List, Dict, Any
- from pydantic import BaseModel, Field
- class ChatMessage(BaseModel):
- """Single chat message."""
- role: str = Field(..., description="system/user/assistant")
- content: str
- class ChatRequest(BaseModel):
- """Request body for /api/ai/chat."""
- messages: List[ChatMessage]
- model: Optional[str] = None
- temperature: Optional[float] = None
- max_tokens: Optional[int] = Field(default=None, ge=1, le=8192, description="Max output tokens, capped at 8192")
- system_prompt: Optional[str] = None
- class ChatResponse(BaseModel):
- """Response from /api/ai/chat."""
- content: str
- reasoning_content: Optional[str] = None
- model: str
- usage: Dict[str, Any] = Field(default_factory=dict)
- finish_reason: Optional[str] = None
- class AIHealthResponse(BaseModel):
- """Response from /api/ai/health."""
- status: str
- configured: bool
- base_url: str
- default_model: str
- available_models: List[Dict[str, Any]] = Field(default_factory=list)
- error: Optional[str] = None
- class AICallLogResponse(BaseModel):
- """AI call log entry."""
- id: int
- endpoint: str
- model: str
- status: str
- duration_ms: int
- prompt_tokens: int
- completion_tokens: int
- total_tokens: int
- error: Optional[str] = None
- created_at: str
- class Config:
- from_attributes = True
- class AIUsageSummary(BaseModel):
- """AI usage summary."""
- total_calls: int
- success_calls: int
- failed_calls: int
- total_tokens: int
- total_prompt_tokens: int
- total_completion_tokens: int
- total_duration_ms: int
|