from dataclasses import dataclass, field from typing import Any, Literal SenderType = Literal["customer", "assistant", "driver", "system"] UserMode = Literal["new_user", "driver", "passenger"] @dataclass(slots=True) class WhatsAppInboundMessage: message_id: str remoteJid: str text: str timestamp: str | None = None profile_name: str | None = None phone_number_id: str | None = None message_type: str = "text" interactive_reply_id: str | None = None context_message_id: str | None = None phone_number: str | None = None is_group: bool = False raw: dict[str, Any] = field(default_factory=dict) @dataclass(slots=True) class ExtractedTrip: is_trip_ad: bool departure: str | None = None destination: str | None = None departure_date: str | None = None departure_time: str | None = None available_seats: int | None = None total_seats: int | None = None price: float | None = None car_type: str | None = None driver_name: str | None = None driver_phone: str | None = None @dataclass(slots=True) class ToolCall: id: str name: str arguments: str @dataclass(slots=True) class AIProviderResponse: content: str | None = None tool_calls: list[ToolCall] = field(default_factory=list) raw_message: dict[str, Any] = field(default_factory=dict) @dataclass(slots=True) class ToolResult: ok: bool data: dict[str, Any] error: str | None = None suppress_llm_reply: bool = False def to_payload(self) -> dict[str, Any]: payload: dict[str, Any] = {"ok": self.ok, "data": self.data} if self.error: payload["error"] = self.error return payload