Files
email-classifier/app/models.py

65 lines
2.0 KiB
Python

from __future__ import annotations
from typing import Literal
from pydantic import BaseModel, Field
class EmailData(BaseModel):
subject: str
body: str
class ClassifyRequest(BaseModel):
email_data: EmailData
provider: Literal["openai", "anthropic"] | None = None
model: str | None = None
base_url: str | None = None
api_key: str | None = Field(default=None, exclude=True)
temperature: float | None = None
id: str | None = None
internetMessageId: str | None = None
conversationId: str | None = None
bodyPreview: str | None = None
receivedDateTime: str | None = None
sentDateTime: str | None = None
hasAttachments: bool | None = None
importance: str | None = None
isRead: bool | None = None
from_address: str | None = None
class ClassificationDetails(BaseModel):
summary: str | None = None
suggested_title: str | None = None
suggested_notes: str | None = None
deadline: str | None = None
people: list[str] = Field(default_factory=list)
organizations: list[str] = Field(default_factory=list)
attachments_referenced: list[str] = Field(default_factory=list)
next_steps: list[str] = Field(default_factory=list)
key_points: list[str] = Field(default_factory=list)
source_signals: list[str] = Field(default_factory=list)
dedupe_key: str | None = None
class DedupeResult(BaseModel):
status: Literal["new", "duplicate", "updated"]
seen_count: int = 1
matched_on: Literal["none", "id", "conversation", "fingerprint"] = "none"
message_id: str | None = None
conversation_id: str | None = None
fingerprint: str
class ClassificationResult(BaseModel):
needs_action: bool
category: Literal["action_required", "question", "fyi", "newsletter", "promotional", "automated", "alert", "uncategorized"]
priority: Literal["high", "medium", "low"]
task_description: str | None = None
reasoning: str
confidence: float
details: ClassificationDetails | None = None
dedupe: DedupeResult | None = None