line-webhook / models.py
Therdpoom's picture
Upload 10 files
82eac1b verified
Raw
History Blame Contribute Delete
2.3 kB
"""
Pydantic models β€” LINE Webhook Payload
ΰΈ„ΰΈ£ΰΈ­ΰΈšΰΈ„ΰΈ₯ΰΈΈΰΈ‘ event types ΰΈ—ΰΈ΅ΰΉˆΰΈˆΰΈ³ΰΉ€ΰΈ›ΰΉ‡ΰΈ™ΰΈͺำหรับ chat conversation
"""
from typing import Optional, Literal
from pydantic import BaseModel
# ─── Source ───────────────────────────────────────────────────────────────────
class LineSource(BaseModel):
type: Literal["user", "group", "room"]
userId: Optional[str] = None
groupId: Optional[str] = None
roomId: Optional[str] = None
# ─── Message ──────────────────────────────────────────────────────────────────
class LineMessage(BaseModel):
id: str
type: Literal["text", "image", "sticker", "location", "audio", "video", "file"]
text: Optional[str] = None # ΰΈ‘ΰΈ΅ΰΉ€ΰΈ‰ΰΈžΰΈ²ΰΈ° type=text
# ─── Events ───────────────────────────────────────────────────────────────────
class LineEvent(BaseModel):
type: Literal["message", "follow", "unfollow", "join", "leave", "postback"]
timestamp: int
replyToken: Optional[str] = None
source: LineSource
message: Optional[LineMessage] = None
# ─── Root Payload ─────────────────────────────────────────────────────────────
class LineWebhookPayload(BaseModel):
destination: str # Channel ID ΰΈ›ΰΈ₯ΰΈ²ΰΈ’ΰΈ—ΰΈ²ΰΈ‡
events: list[LineEvent]
# ─── Sentiment Result ─────────────────────────────────────────────────────────
class SentimentResult(BaseModel):
label: Literal["positive", "neutral", "negative"]
score: float # confidence ΰΈ‚ΰΈ­ΰΈ‡ label ΰΈ«ΰΈ₯ัก (0–1)
raw_scores: dict[str, float] # {"positive": 0.8, "neutral": 0.1, "negative": 0.1}