feat: revue de code, doc CODE_REVIEW, forfaits 2026, traduction LLM, providers avec modèle
Made-with: Cursor
This commit is contained in:
236
schemas/translation.py
Normal file
236
schemas/translation.py
Normal file
@@ -0,0 +1,236 @@
|
||||
"""
|
||||
Pydantic models for translation endpoints
|
||||
Story 3.6: Documentation OpenAPI (Swagger + ReDoc)
|
||||
"""
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from typing import Optional, Literal, List, Dict, Any
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class TranslateResponseData(BaseModel):
|
||||
"""Response data for translation request"""
|
||||
|
||||
id: str = Field(
|
||||
...,
|
||||
example="tr_abc123def456",
|
||||
description="Identifiant unique du job de traduction"
|
||||
)
|
||||
status: Literal["processing"] = Field(
|
||||
default="processing",
|
||||
description="Statut du job (toujours 'processing' à la création)"
|
||||
)
|
||||
file_name: Optional[str] = Field(
|
||||
None,
|
||||
example="rapport_financier.xlsx",
|
||||
description="Nom du fichier original"
|
||||
)
|
||||
source_lang: Optional[str] = Field(
|
||||
None,
|
||||
example="en",
|
||||
description="Code langue source (ISO 639-1)"
|
||||
)
|
||||
target_lang: str = Field(
|
||||
...,
|
||||
example="fr",
|
||||
description="Code langue cible (ISO 639-1)"
|
||||
)
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"id": "tr_abc123def456",
|
||||
"status": "processing",
|
||||
"file_name": "rapport_financier.xlsx",
|
||||
"source_lang": "en",
|
||||
"target_lang": "fr"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class TranslateResponseMeta(BaseModel):
|
||||
"""Metadata for translation response"""
|
||||
|
||||
rate_limit_remaining: int = Field(
|
||||
...,
|
||||
description="Nombre de traductions restantes aujourd'hui",
|
||||
example=4
|
||||
)
|
||||
estimated_time_seconds: Optional[int] = Field(
|
||||
None,
|
||||
description="Temps estimé pour la traduction en secondes",
|
||||
example=15
|
||||
)
|
||||
|
||||
|
||||
class TranslateResponse(BaseModel):
|
||||
"""Full response for translation request"""
|
||||
|
||||
data: TranslateResponseData
|
||||
meta: TranslateResponseMeta
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"data": {
|
||||
"id": "tr_abc123def456",
|
||||
"status": "processing",
|
||||
"file_name": "rapport_financier.xlsx",
|
||||
"source_lang": "en",
|
||||
"target_lang": "fr"
|
||||
},
|
||||
"meta": {
|
||||
"rate_limit_remaining": 4,
|
||||
"estimated_time_seconds": 15
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class TranslationStatusData(BaseModel):
|
||||
"""Response data for translation status endpoint"""
|
||||
|
||||
id: str = Field(
|
||||
...,
|
||||
description="Identifiant unique du job de traduction",
|
||||
example="tr_abc123def456"
|
||||
)
|
||||
status: Literal["queued", "processing", "completed", "failed"] = Field(
|
||||
...,
|
||||
description="Statut actuel du job"
|
||||
)
|
||||
progress_percent: int = Field(
|
||||
default=0,
|
||||
ge=0,
|
||||
le=100,
|
||||
description="Pourcentage de progression (0-100)",
|
||||
example=65
|
||||
)
|
||||
current_step: str = Field(
|
||||
default="Initializing",
|
||||
description="Description de l'opération en cours",
|
||||
example="Traduction de la diapositive 3/5"
|
||||
)
|
||||
file_name: Optional[str] = Field(
|
||||
None,
|
||||
description="Nom du fichier original",
|
||||
example="presentation.pptx"
|
||||
)
|
||||
source_lang: Optional[str] = Field(
|
||||
None,
|
||||
description="Code langue source",
|
||||
example="en"
|
||||
)
|
||||
target_lang: Optional[str] = Field(
|
||||
None,
|
||||
description="Code langue cible",
|
||||
example="fr"
|
||||
)
|
||||
created_at: Optional[str] = Field(
|
||||
None,
|
||||
description="Date de création (ISO 8601)",
|
||||
example="2024-01-15T10:30:00Z"
|
||||
)
|
||||
completed_at: Optional[str] = Field(
|
||||
None,
|
||||
description="Date de complétion (ISO 8601)",
|
||||
example="2024-01-15T10:35:00Z"
|
||||
)
|
||||
failed_at: Optional[str] = Field(
|
||||
None,
|
||||
description="Date d'échec (ISO 8601)",
|
||||
example=None
|
||||
)
|
||||
error_message: Optional[str] = Field(
|
||||
None,
|
||||
description="Message d'erreur si status='failed'",
|
||||
example=None
|
||||
)
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"id": "tr_abc123def456",
|
||||
"status": "processing",
|
||||
"progress_percent": 65,
|
||||
"current_step": "Traduction de la diapositive 3/5",
|
||||
"file_name": "presentation.pptx",
|
||||
"source_lang": "en",
|
||||
"target_lang": "fr",
|
||||
"created_at": "2024-01-15T10:30:00Z",
|
||||
"completed_at": None,
|
||||
"failed_at": None,
|
||||
"error_message": None
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class TranslationStatusMeta(BaseModel):
|
||||
"""Metadata for translation status response"""
|
||||
|
||||
estimated_remaining_seconds: Optional[int] = Field(
|
||||
default=None,
|
||||
description="Temps restant estimé en secondes",
|
||||
example=30
|
||||
)
|
||||
|
||||
|
||||
class TranslationStatusResponse(BaseModel):
|
||||
"""Full response for translation status endpoint"""
|
||||
|
||||
data: TranslationStatusData
|
||||
meta: Optional[TranslationStatusMeta] = None
|
||||
|
||||
class Config:
|
||||
json_schema_extra = {
|
||||
"example": {
|
||||
"data": {
|
||||
"id": "tr_abc123def456",
|
||||
"status": "processing",
|
||||
"progress_percent": 65,
|
||||
"current_step": "Traduction de la diapositive 3/5",
|
||||
"file_name": "presentation.pptx",
|
||||
"source_lang": "en",
|
||||
"target_lang": "fr",
|
||||
"created_at": "2024-01-15T10:30:00Z"
|
||||
},
|
||||
"meta": {
|
||||
"estimated_remaining_seconds": 30
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class LanguageItem(BaseModel):
|
||||
"""Single language entry"""
|
||||
|
||||
code: str = Field(
|
||||
...,
|
||||
description="Code langue ISO 639-1",
|
||||
example="fr"
|
||||
)
|
||||
name: str = Field(
|
||||
...,
|
||||
description="Nom de la langue en français",
|
||||
example="Français"
|
||||
)
|
||||
|
||||
|
||||
class LanguageResponse(BaseModel):
|
||||
"""Response model for supported languages"""
|
||||
|
||||
supported_languages: Dict[str, str] = Field(
|
||||
...,
|
||||
description="Dictionnaire des langues supportées (code -> nom)",
|
||||
example={
|
||||
"fr": "French",
|
||||
"de": "German",
|
||||
"es": "Spanish",
|
||||
"it": "Italian"
|
||||
}
|
||||
)
|
||||
note: Optional[str] = Field(
|
||||
None,
|
||||
description="Note sur la disponibilité des langues",
|
||||
example="Les langues supportées peuvent varier selon le service de traduction configuré"
|
||||
)
|
||||
Reference in New Issue
Block a user