Files
clientflow_backend/app/schemas.py

73 lines
1.8 KiB
Python

from typing import Any, Dict, Optional
from pydantic import BaseModel, Field, field_validator
class CurrentState(BaseModel):
last_action_code: str = "desconhecido"
last_route: str = "desconhecido"
last_task_status: str = "desconhecido"
metadata: Dict[str, Any] = Field(default_factory=dict)
class AnalyzeRequest(BaseModel):
last_customer_message: str = Field(..., min_length=1)
previous_context: str = ""
current_state: CurrentState = Field(default_factory=CurrentState)
source: Optional[str] = "manual"
conversation_id: Optional[str] = None
contact_id: Optional[str] = None
@field_validator("last_customer_message")
@classmethod
def _non_blank_customer_message(cls, value: str) -> str:
if not str(value or "").strip():
raise ValueError("last_customer_message não pode estar vazio")
return value
class ActionDecision(BaseModel):
action_code: str
note: str = ""
confidence: float = Field(ge=0.0, le=1.0, default=0.0)
customer_intent: str = ""
evidence: str = ""
needs_human_review: bool = False
history_used: bool = False
payment_intent: Optional[str] = None
class ActionResult(BaseModel):
action_code: str
route: str
action_required: bool = False
action: str
note: str = ""
safe_to_post: bool = False
class UsageInfo(BaseModel):
id: Optional[str] = None
model: Optional[str] = None
provider: Optional[str] = None
prompt_tokens: int = 0
completion_tokens: int = 0
total_tokens: int = 0
cost: float = 0.0
class AnalyzeResponse(BaseModel):
app: str = "ClientFlow"
model: str
action_decision: ActionDecision
action_result: ActionResult
usage: UsageInfo
needs_review: bool = False
action_run_id: Optional[str] = None
message_id: Optional[str] = None
task_id: Optional[str] = None