feat: revue de code, doc CODE_REVIEW, forfaits 2026, traduction LLM, providers avec modèle
Made-with: Cursor
This commit is contained in:
79
schemas/prompt_schemas.py
Normal file
79
schemas/prompt_schemas.py
Normal file
@@ -0,0 +1,79 @@
|
||||
"""
|
||||
Pydantic schemas for custom prompt endpoints.
|
||||
Story 3.11: Custom Prompts - Endpoint CRUD
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from pydantic import BaseModel, Field, field_validator
|
||||
|
||||
|
||||
class PromptCreate(BaseModel):
|
||||
"""Schema for creating a prompt."""
|
||||
|
||||
name: str = Field(..., min_length=1, max_length=255, description="Nom du prompt")
|
||||
content: str = Field(
|
||||
..., min_length=1, max_length=10000, description="Contenu du prompt"
|
||||
)
|
||||
|
||||
@field_validator("name", "content")
|
||||
@classmethod
|
||||
def strip_whitespace(cls, v: str) -> str:
|
||||
return v.strip()
|
||||
|
||||
|
||||
class PromptUpdate(BaseModel):
|
||||
"""Schema for updating a prompt (at least one field required)."""
|
||||
|
||||
name: Optional[str] = Field(None, min_length=1, max_length=255)
|
||||
content: Optional[str] = Field(None, min_length=1, max_length=10000)
|
||||
|
||||
@field_validator("name", "content")
|
||||
@classmethod
|
||||
def strip_whitespace(cls, v: Optional[str]) -> Optional[str]:
|
||||
return v.strip() if v else None
|
||||
|
||||
def has_updates(self) -> bool:
|
||||
"""Check if at least one field is provided for update."""
|
||||
return self.name is not None or self.content is not None
|
||||
|
||||
|
||||
class PromptResponse(BaseModel):
|
||||
"""Schema for prompt in response."""
|
||||
|
||||
id: str
|
||||
name: str
|
||||
content: str
|
||||
created_at: Optional[datetime] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class PromptListItem(BaseModel):
|
||||
"""Schema for prompt in list (lighter version)."""
|
||||
|
||||
id: str
|
||||
name: str
|
||||
content_preview: str = Field(
|
||||
..., description="First 100 chars of content for list view"
|
||||
)
|
||||
created_at: Optional[datetime] = None
|
||||
updated_at: Optional[datetime] = None
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class PromptListResponse(BaseModel):
|
||||
"""Schema for prompts list response."""
|
||||
|
||||
data: list[PromptListItem] = []
|
||||
meta: dict = Field(default_factory=dict)
|
||||
|
||||
|
||||
class PromptDetailResponse(BaseModel):
|
||||
"""Schema for single prompt response."""
|
||||
|
||||
data: PromptResponse
|
||||
meta: dict = Field(default_factory=dict)
|
||||
Reference in New Issue
Block a user