"""Base Pydantic models for WhatsApp SDK.
These models represent the core structures used across the SDK,
matching Meta's WhatsApp Cloud API v23.0 exactly.
"""
from __future__ import annotations
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
[docs]
class BaseResponse(BaseModel):
"""Base response model for WhatsApp API responses.
All WhatsApp API responses include these common fields.
"""
messaging_product: str = Field(
default="whatsapp", description="The messaging product (always 'whatsapp')"
)
[docs]
class Config:
extra = "allow" # Allow additional fields from API
[docs]
class Message(BaseModel):
"""Message information in API responses.
Represents a sent message confirmation.
"""
id: str = Field(..., description="The unique message ID from WhatsApp")
[docs]
class Config:
extra = "allow"
[docs]
class Error(BaseModel):
"""Error model matching Meta's error format.
WhatsApp API errors follow this structure.
"""
code: int = Field(..., description="Error code from WhatsApp API")
title: Optional[str] = Field(None, description="Short error title")
message: str = Field(..., description="Detailed error message")
error_data: Optional[Dict[str, Any]] = Field(None, description="Additional error details")
error_subcode: Optional[int] = Field(None, description="More specific error subcode")
error_user_title: Optional[str] = Field(None, description="User-friendly error title")
error_user_msg: Optional[str] = Field(None, description="User-friendly error message")
fbtrace_id: Optional[str] = Field(None, description="Facebook trace ID for debugging")
[docs]
class Config:
extra = "allow"
[docs]
class ErrorResponse(BaseModel):
"""Complete error response from WhatsApp API."""
error: Error = Field(..., description="The error details")
[docs]
class Config:
extra = "allow"
[docs]
class MessageResponse(BaseResponse):
"""Standard response after sending a message.
This is the response you get when successfully sending any message type.
"""
contacts: List[Contact] = Field(
default_factory=list, description="List of contacts that were processed"
)
messages: List[Message] = Field(
default_factory=list, description="List of messages that were sent"
)
[docs]
class Config:
extra = "allow"