""" 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" )