于子扬
feat: 手冲方案卡 — 从小红书/抖音链接提取结构化冲煮参数
6cde229
Raw History Blame Contribute Delete
3.73 kB
"""
数据模型:定义解析结果、内容载体和笔记结构。
"""
from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
from typing import Optional
class Platform(Enum):
DOUYIN = "douyin"
XIAOHONGSHU = "xiaohongshu"
BILIBILI = "bilibili"
WECHAT = "wechat"
UNKNOWN = "unknown"
class ContentType(Enum):
VIDEO = "video"
IMAGE_TEXT = "image_text"
ARTICLE = "article"
@dataclass
class MediaItem:
"""单个媒体资源(图片或视频)"""
url: str
media_type: str # "image" | "video"
local_path: Optional[str] = None
width: Optional[int] = None
height: Optional[int] = None
@dataclass
class ParsedContent:
"""从平台解析出的原始内容"""
platform: Platform
content_type: ContentType
content_id: str
title: str = ""
description: str = ""
author: str = ""
tags: list[str] = field(default_factory=list)
images: list[MediaItem] = field(default_factory=list)
video: Optional[MediaItem] = None
source_url: str = ""
@dataclass
class ProcessedContent:
"""经过多模态处理后的内容"""
transcript: str = "" # ASR转录文本(视频)
ocr_texts: list[str] = field(default_factory=list) # OCR识别的图片文字
image_descriptions: list[str] = field(default_factory=list) # 图片语义描述
clean_text: str = "" # 清洗后的原文文本
audio_path: Optional[str] = None
@dataclass
class PourStep:
"""单次注水阶段"""
stage: str = "" # 阶段名:闷蒸 / 第一段 / 第二段 ...
water_ml: str = "" # 注水量或累计水量,如 "30ml" "注至150ml"
time: str = "" # 时间,如 "0:00-0:30" "30s"
technique: str = "" # 手法:中心注水 / 绕圈 / 搅拌 等
@dataclass
class BrewCard:
"""手冲咖啡方案参数卡"""
# 基本信息
title: str = ""
summary: str = "" # 一句话概括这个方案的特点/风格
# 咖啡豆
bean_name: str = "" # 豆子名称/品牌
origin: str = "" # 产地
roast_level: str = "" # 烘焙度:浅 / 中浅 / 中 / 中深 / 深
process: str = "" # 处理法:水洗 / 日晒 / 蜜处理 等
bean_notes: str = "" # 豆子补充说明
# 研磨
grind_size: str = "" # 研磨度描述:如 "中细" "C40 24格" "EK43 9.0"
# 冲煮核心参数
dose: str = "" # 粉量 (g)
water_amount: str = "" # 水量 (ml)
ratio: str = "" # 粉水比,如 "1:15"
water_temp: str = "" # 水温 (°C)
total_time: str = "" # 总萃取时间
# 器具
dripper: str = "" # 滤杯:V60 / Kalita / Origami 等
filter_paper: str = "" # 滤纸
equipment_notes: str = "" # 其他器具说明
# 冲煮步骤
pour_steps: list[dict] = field(default_factory=list)
# 风味
flavor_notes: str = "" # 预期风味描述
tips: str = "" # 作者的关键技巧/心得
# AI 补全标记:记录哪些字段是推理补全的(非原文提取)
inferred_fields: list[str] = field(default_factory=list)
# 来源
author: str = ""
source_platform: str = ""
source_url: str = ""
raw_content: str = ""
@dataclass
class NoteSummary:
"""AI生成的笔记摘要(通用,保留兼容)"""
title: str = ""
summary: str = ""
key_points: list[str] = field(default_factory=list)
tags: list[str] = field(default_factory=list)
chapters: list[dict] = field(default_factory=list)
source_platform: str = ""
source_url: str = ""
raw_content: str = ""