本 Skill 依赖 OpenClaw 平台提供的以下能力:
| 能力 | 用途 | 使用场景 |
|---|---|---|
| ------ | ------ | ---------- |
| 时间解析服务 | 从文本中提取日期时间 | 用户说"昨天下午"、"3号出发"等 |
| 地理位置解析 | 从文本中提取地名并转换为坐标 | 用户说"在洱海边"、"大理古城"等 |
| 多模态描述 | 对图片/视频生成文本描述 | 用户上传图片或视频时自动生成描述 |
| 语音转写 | 将语音消息转为文字 | 用户发送语音记录素材时 |
| 文件存储 | 存储用户上传的文件 | 保存图片、视频、音频文件 |
严格遵循以下规则:
ongoingendedongoing 的旅行才能添加素材1. 开始旅行 → 创建新档案
2. 结束旅行 → 封存当前档案
3. 补充记录 → 添加到指定档案(需明确意图)
4. 普通消息 → 记录到当前进行中的旅行(如有)
```
Pillow==10.2.0
markdown==3.5.2
jinja2==3.1.3
weasyprint==60.2
```
```bash
mkdir -p travelogue_data/uploads
```
触发条件:用户表达开始旅行的意图
执行流程:
scripts/trip_manager.py --action create 创建新的旅行记录参数提取:
trip_name: 旅行名称(必需,从用户消息中提取)start_location: 起始地点(可选)start_event: 开始事件描述(可选)执行示例:
python scripts/trip_manager.py --action create \
--name "北京旅游" \
--start-location "北京"
智能体响应示例:
用户:"开始北京旅游"
智能体:"好的,已创建【北京旅游】的游记档案,开始时间为 2026-04-03 08:30。现在你可以随时发送文字、图片或语音来记录旅途点滴。"
前提条件:必须有状态为 ongoing 的旅行
重要规则:
scripts/moment_manager.py --action add 添加素材执行示例:
python scripts/moment_manager.py --action add \
--trip-id <trip_id> \
--type text \
--content "风真大,但洱海蓝得不像话" \
--location "洱海" \
--timestamp "2026-04-03 15:30:00"
⚠️ 重要:图片必须先保存到本地文件!
执行流程:
./travelogue_data/uploads/image_temp.jpg--raw-path 参数完整执行示例:
# 步骤1:智能体先保存图片(用户上传后)
# 保存路径:./travelogue_data/uploads/image_temp.jpg
# 步骤2:调用脚本添加素材
python scripts/moment_manager.py --action add \
--trip-id <trip_id> \
--type image \
--content "洱海的蓝天白云,远处的苍山若隐若现" \
--raw-path "./travelogue_data/uploads/image_temp.jpg" \
--location "洱海" \
--timestamp "2026-04-03 15:30:00"
# 脚本会自动:
# 1. 验证文件存在
# 2. 复制到标准路径:travelogue_data/uploads/{momentId}.jpg
# 3. 记录 rawUrl 字段
注意事项:
travelogue_data/uploads/{momentId}.{ext}./uploads/{momentId}.jpg(相对路径)⚠️ 重要:音频文件必须先保存到本地!
执行流程:
./travelogue_data/uploads/audio_temp.mp3--raw-path 参数执行示例:
python scripts/moment_manager.py --action add \
--trip-id <trip_id> \
--type audio \
--content "刚刚在古城吃到了烤乳扇,酸酸甜甜" \
--raw-path "./travelogue_data/uploads/audio_temp.mp3" \
--location "大理古城" \
--timestamp "2026-04-03 16:45:00"
注意事项:
uploads/ 目录⚠️ 重要:视频文件必须先保存到本地!
执行流程:
./travelogue_data/uploads/video_temp.mp4--raw-path 参数执行示例:
python scripts/moment_manager.py --action add \
--trip-id <trip_id> \
--type video \
--content "客栈阳台的风景,远处是苍山,夕阳西下" \
--raw-path "./travelogue_data/uploads/video_temp.mp4" \
--location "双廊客栈" \
--timestamp "2026-04-03 18:00:00"
注意事项:
python scripts/moment_manager.py --action add \
--trip-id
--type text \
--content "风真大,但洱海蓝得不像话" \
--location "洱海" \
--timestamp "2026-04-03 15:30:00"
### 3. 结束旅程(封存游记档案)
**触发条件**:用户表达结束旅行的意图
- 示例:"结束北京旅行"、"旅行结束了"、"回家了"、"行程结束了"
- 关键词:结束、回家、行程结束、旅行结束
**执行流程**:
1. 检查是否有进行中的旅行
- 如果没有,提示用户:"你当前没有进行中的旅行。"
2. 调用 `scripts/trip_manager.py --action end` 结束旅行
3. 提取结束地点、结束感言等信息
4. 更新旅行状态为 `ended`
5. **重要**:此后该旅行不再接受新素材
**参数提取**:
- `end_location`: 结束地点
- `end_event`: 结束感言
**执行示例**:
python scripts/trip_manager.py --action end \
--end-location "北京" \
--end-event "三天两夜,不虚此行"
**智能体响应示例**:
用户:"结束北京旅行"
智能体:"【北京旅游】已结束,档案封存于 2026-04-05 18:30。共记录了 12 条素材。需要我现在生成游记吗?或者你可以说'导出为PDF/HTML/Markdown'。"
### 4. 补充记录(明确指定)
**触发条件**:用户明确要求向已结束的旅行添加素材
- 示例:"补充到北京旅行里"、"往云南之旅加一条"、"刚才忘记记录了,补充到XX旅行"
- 关键词:补充、添加到、往...加
**执行流程**:
1. 识别目标旅行(通过名称或ID)
2. 检查目标旅行是否存在
3. 调用脚本添加素材到指定旅行
4. **重要**:即使旅行已结束,也允许添加
**参数提取**:
- `trip_name`: 目标旅行名称(从用户消息中识别)
- 其他素材参数同普通添加流程
**执行示例**:
python scripts/trip_manager.py --action list --status-filter ended
python scripts/moment_manager.py --action add \
--trip-id
--type text \
--content "补充:刚才在天坛拍的照片忘记发了" \
--location "天坛"
**智能体响应示例**:
用户:"补充到北京旅行:刚才在天坛拍的照片忘记发了"
智能体:"已补充到【北京旅游】游记中。"
### 5. 查询旅行状态
**触发条件**:用户询问旅行记录情况
- 示例:"我的旅行记录怎么样了"、"现在记录了多少条"
**执行示例**:
python scripts/trip_manager.py --action status
**智能体响应示例**:
用户:"我的旅行记录怎么样了"
智能体:"你当前正在进行【北京旅游】,已记录 12 条素材(8 段文字、3 张图片、1 段语音)。旅行始于 2026-04-03,已持续 2 天。"
### 6. 生成游记
旅行结束后,可生成完整游记:
**执行流程**:
1. 调用 `scripts/moment_manager.py --action list` 获取所有素材
2. 智能体根据素材按时间线整理内容
3. 根据用户选择的风格(文艺/幽默/简洁/详细)生成叙事
4. 生成游记标题、章节结构、每日高光时刻等
详细流程参考:[references/narrative_guide.md](references/narrative_guide.md)
### 7. 导出游记
根据用户需求导出为不同格式:
python scripts/export_generator.py --trip-id
--format markdown \
--output ./travelogue.md
python scripts/export_generator.py --trip-id
--format html \
--output ./travelogue.html
python scripts/export_generator.py --trip-id
--format pdf \
--output ./travelogue.pdf
## 资源索引
- 旅行管理脚本:[scripts/trip_manager.py](scripts/trip_manager.py)(用途:创建/结束/查询旅行记录)
- 素材管理脚本:[scripts/moment_manager.py](scripts/moment_manager.py)(用途:添加/查询/删除素材)
- 导出生成脚本:[scripts/export_generator.py](scripts/export_generator.py)(用途:生成 Markdown/HTML/PDF 文件)
- 数据模型参考:[references/data_model.md](references/data_model.md)(何时读取:理解数据结构时)
- 叙事风格指南:[references/narrative_guide.md](references/narrative_guide.md)(何时读取:生成游记时)
- 导出格式规范:[references/export_format.md](references/export_format.md)(何时读取:导出文件时)
- HTML 模板:[assets/templates/travelogue.html](assets/templates/travelogue.html)(直接用于生成 HTML 文件)
## 注意事项
### 旅行档案管理
- **严格的生命周期**:开始 → 进行中 → 结束 → 封存
- **自动拒绝**:已结束的旅行默认不接受新素材
- **明确意图**:补充记录需要用户明确指定目标旅行
- **单一进行中**:同一时间只能有一个进行中的旅行
### 智能体职责
- 准确识别用户意图(开始/结束/补充/普通记录)
- 在用户发送素材时,检查旅行状态
- 对不符合规则的操作给出清晰提示
### 数据安全
- 旅行记录和素材存储在本地文件中
- 所有素材自动关联到对应旅行,按时间戳排序
- 游记风格可随时调整,重新生成即可
## 使用示例
### 示例 1:标准流程
用户:"开始北京旅游"
智能体:"好的,已创建【北京旅游】的游记档案,开始时间为 2026-04-03 08:30。现在你可以随时发送文字、图片或语音来记录旅途点滴。"
用户:[上传照片] "故宫真的太大了"
智能体:"收到!故宫的照片已保存到【北京旅游】游记中。"
用户:"晚上吃了烤鸭,味道不错"
智能体:"记下了,听起来很美味。"
用户:"结束北京旅行"
智能体:"【北京旅游】已结束,档案封存于 2026-04-03 20:30。共记录了 5 条素材。需要我现在生成游记吗?"
用户:"生成游记"
智能体:[生成游记预览] "游记已生成,需要导出吗?"
### 示例 2:错误处理
用户:[直接发送照片] "这是颐和园"
智能体:"你当前没有进行中的旅行。请先说'开始XX旅行'来创建游记档案。"
用户:"开始北京旅游"
智能体:"好的,已创建【北京旅游】的游记档案..."
用户:[发送素材] ...
用户:"结束北京旅行"
智能体:"【北京旅游】已结束,档案封存。"
用户:[发送照片] "这是长城"
智能体:"【北京旅游】已结束。如需补充记录,请明确说'补充到北京旅游:这是长城'。"
用户:"补充到北京旅游:这是长城"
智能体:"已补充到【北京旅游】游记中。"
### 示例 3:多旅行管理
用户:"开始云南之旅"
智能体:"好的,已创建【云南之旅】的游记档案..."
用户:[记录素材] ...
用户:"结束云南之旅"
智能体:"【云南之旅】已结束,档案封存。"
用户:"开始西藏旅游"
智能体:"好的,已创建【西藏旅游】的游记档案..."
用户:[记录素材] ...
用户:"我的旅行记录怎么样了"
智能体:"你当前正在进行【西藏旅游】,已记录 8 条素材。你还有 1 个已结束的旅行:【云南之旅】。"
共 1 个版本