PARA.AI / api /models /requests.py
Carlex22's picture
Revert "ParaAIV3.1"
1f24745
"""
Request models para para.AI API v3.0
Define estrutura de requests para todos os endpoints
CORRIGIDO: Adicionado model_config para resolver warning Pydantic
"""
from typing import Optional, List
from pydantic import BaseModel, Field, field_validator, ConfigDict
# ============================================================================
# PROCESSING
# ============================================================================
class ProcessingOptionsRequest(BaseModel):
"""
Opções de processamento.
CORRIGIDO: model_config adicionado para resolver warning de namespace
"""
# ✅ Configuração para permitir campos "model_*"
model_config = ConfigDict(protected_namespaces=())
llm_provider: str = Field(
default="groq",
description="Provedor LLM (groq/openai/anthropic)"
)
model_type: str = Field(
default="balanced",
description="Tipo de modelo (fast/balanced/quality)"
)
enable_parallel: bool = Field(
default=True,
description="Habilitar processamento paralelo"
)
max_workers: int = Field(
default=3,
ge=1,
le=10,
description="Número de workers paralelos"
)
save_to_db: bool = Field(
default=True,
description="Salvar resultados no banco"
)
@field_validator("llm_provider")
@classmethod
def validate_provider(cls, v):
allowed = ["groq", "openai", "anthropic"]
if v not in allowed:
raise ValueError(f"Provider deve ser um de: {allowed}")
return v
@field_validator("model_type")
@classmethod
def validate_model_type(cls, v):
allowed = ["fast", "balanced", "quality"]
if v not in allowed:
raise ValueError(f"Model type deve ser um de: {allowed}")
return v
# ============================================================================
# LLM TESTING
# ============================================================================
class LLMGenerateRequest(BaseModel):
"""Request para gerar texto com LLM."""
prompt: str = Field(
...,
description="Prompt para o LLM",
min_length=1
)
provider: str = Field(
default="groq",
description="Provedor LLM"
)
model: Optional[str] = Field(
default=None,
description="Model específico (opcional)"
)
temperature: float = Field(
default=0.7,
ge=0.0,
le=2.0,
description="Temperatura"
)
max_tokens: int = Field(
default=8024,
ge=1,
le=4096,
description="Máximo de tokens"
)
# ============================================================================
# PROCESSOR TESTING
# ============================================================================
class ProcessorTestRequest(BaseModel):
"""Request para testar processador."""
processor_name: str = Field(
...,
description="Nome do processador (1-9 ou nome completo)"
)
ementa: str = Field(
...,
description="Texto da ementa",
min_length=10
)
integra: str = Field(
...,
description="Texto da íntegra",
min_length=10
)
tribunal: str = Field(
default="TJPR",
description="Sigla do tribunal"
)
llm_provider: str = Field(
default="groq",
description="Provedor LLM"
)
# ============================================================================
# FILE OPERATIONS
# ============================================================================
class FileCreateRequest(BaseModel):
"""Request para criar arquivo."""
content: str = Field(
...,
description="Conteúdo do arquivo"
)
filename: str = Field(
...,
description="Nome do arquivo"
)
acordao_id: Optional[str] = Field(
default=None,
description="ID do acórdão relacionado"
)
class FileListRequest(BaseModel):
"""Request para listar arquivos."""
acordao_id: Optional[str] = Field(
default=None,
description="Filtrar por acórdão"
)
limit: int = Field(
default=100,
ge=1,
le=1000,
description="Limite de resultados"
)
offset: int = Field(
default=0,
ge=0,
description="Offset para paginação"
)