Source code for mailos.vendors.models
"""Data models for vendor integrations and LLM interactions."""
from dataclasses import dataclass
from datetime import datetime
from enum import Enum
from typing import Any, Callable, Dict, List, Optional
[docs]
class RoleType(str, Enum):
"""Enumeration of possible message role types."""
SYSTEM = "system"
USER = "user"
ASSISTANT = "assistant"
FUNCTION = "function"
[docs]
class ContentType(str, Enum):
"""Enumeration of supported content types."""
TEXT = "text"
IMAGE = "image"
AUDIO = "audio"
FILE = "file"
EMBEDDING = "embedding"
[docs]
@dataclass
class Content:
"""Represents content in a message with type and value."""
type: ContentType
data: Any
mime_type: Optional[str] = None
[docs]
def to_dict(self) -> Dict:
"""Convert content to a dictionary."""
return {"type": self.type.value, "data": self.data, "mime_type": self.mime_type}
[docs]
@dataclass
class Message:
"""Represents a message in a conversation with role and content."""
role: RoleType
content: List[Content]
name: Optional[str] = None
function_call: Optional[Dict] = None
timestamp: datetime = datetime.now()
[docs]
def to_dict(self) -> Dict:
"""Convert message to a dictionary."""
return {
"role": self.role.value,
"content": [c.to_dict() for c in self.content],
"name": self.name,
"function_call": self.function_call,
"timestamp": self.timestamp.isoformat(),
}
[docs]
@dataclass
class ModelConfig:
"""Configuration settings for LLM model behavior and parameters."""
temperature: float = 0.7
max_tokens: Optional[int] = None
top_p: float = 1.0
frequency_penalty: float = 0.0
presence_penalty: float = 0.0
stop_sequences: Optional[List[str]] = None
[docs]
@dataclass
class LLMResponse:
"""Unified response model for all LLM providers."""
content: List[Content]
role: RoleType = RoleType.ASSISTANT
finish_reason: Optional[str] = None
tool_calls: Optional[List[Dict]] = None
usage: Optional[Dict[str, int]] = None
model: Optional[str] = None
system_fingerprint: Optional[str] = None
created_at: datetime = datetime.now()
[docs]
def to_message(self) -> Message:
"""Convert response to a Message object."""
return Message(
role=self.role,
content=self.content,
function_call=self.tool_calls[0] if self.tool_calls else None,
timestamp=self.created_at,
)
[docs]
def to_dict(self) -> Dict:
"""Convert response to a dictionary."""
return {
"content": [c.to_dict() for c in self.content],
"role": self.role.value,
"finish_reason": self.finish_reason,
"tool_calls": self.tool_calls,
"usage": self.usage,
"model": self.model,
"system_fingerprint": self.system_fingerprint,
"created_at": self.created_at.isoformat(),
}