| from pydantic import BaseModel, Field, field_validator |
| from typing import Optional, List, Literal |
| import re |
|
|
| class ChatMessage(BaseModel): |
| role: str |
| content: str |
|
|
| class ChatCompletionRequest(BaseModel): |
| model: str |
| messages: List[ChatMessage] |
| stream: bool = False |
| temperature: Optional[float] = 1.0 |
| top_p: Optional[float] = 1.0 |
| |
| new_chat: Optional[bool] = False |
| session_id: Optional[str] = None |
| |
| @field_validator("session_id") |
| @classmethod |
| def validate_session_id(cls, v): |
| if v is None: |
| return None |
| v = v.strip().lower() |
| if not re.match(r'^[a-f0-9]{8,32}$', v): |
| raise ValueError("session_id must be a hexadecimal string between 8-32 characters") |
| return v |
|
|
| class PromptRequest(BaseModel): |
| prompt: str |
| system_prompt: Optional[str] = None |
| timeout: int = Field(default=300, ge=30, le=600) |
| stream: bool = False |
| new_chat: bool = Field(default=False, description="Force start a new chat") |
| provider: Literal["chatgpt", "gemini", "grok"] = Field(default="chatgpt", description="AI Provider to use") |
|
|
| @field_validator("prompt") |
| @classmethod |
| def validate_prompt_length(cls, v): |
| if not v.strip(): |
| raise ValueError("Prompt cannot be empty") |
| if len(v) > 32000: |
| raise ValueError("Prompt exceeds maximum length") |
| return v.strip() |
|
|
| class Message(BaseModel): |
| role: str |
| content: str |
|
|
| class Usage(BaseModel): |
| prompt_tokens: int |
| completion_tokens: int |
| total_tokens: int |
|
|
| class Choice(BaseModel): |
| index: int |
| message: Message |
| finish_reason: str |
|
|
| class APIResponse(BaseModel): |
| id: str |
| object: str = "chat.completion" |
| created: int |
| model: str |
| choices: List[Choice] |
| usage: Usage |
|
|
| class SimplePromptRequest(BaseModel): |
| prompt: str |
|
|
| class SimpleAPIResponse(BaseModel): |
| status: str = "success" |
| text: str |
|
|