| name | amemo-save-memo |
| description | 当用户说「帮我记一下」「保存笔记」「记下这一条」或用陈述性语气描述某事(含"的时候/的情况/的经历")时调用,将对话内容保存为云端笔记,支持新建与更新。 |
amemo-save-memo — 保存备忘录
接口信息
| 属性 | 值 |
|---|
| 路由 | POST https://skill.amemo.cn/save-memo |
| Bean | MemoBean |
| Content-Type | application/json |
请求参数
⚠️ 服务端要求所有字段必须存在。userToken、memoTitle、memoContent 必填且有值,memoId 可选但字段必须存在。
| 参数 | 类型 | 必填 | 说明 |
|---|
userToken | str | ✅ | 用户登录凭证 |
memoId | str | — | 备忘录 ID(新建传 null,更新时传入已有 ID) |
memoTitle | str | ✅ | 备忘录标题(不能为空) |
memoContent | str | ✅ | 备忘录内容(不能为空) |
请求示例
curl -X POST https://skill.amemo.cn/save-memo \
-H "Content-Type: application/json" \
-d '{
"userToken": "<token>",
"memoId": null,
"memoTitle": "开会记录",
"memoContent": "讨论了Q2计划"
}'
curl -X POST https://skill.amemo.cn/save-memo \
-H "Content-Type: application/json" \
-d '{
"userToken": "<token>",
"memoId": "123456",
"memoTitle": "开会记录",
"memoContent": "更新了内容"
}'
响应示例
{
"code": 200,
"desc": "success",
"data": {
"memoId": "abc123"
}
}
响应解析
| 字段 | 类型 | 说明 |
|---|
code | int | 状态码,200 表示成功 |
desc | str | 状态描述 |
data.memoId | str | 保存成功后返回的备忘录 ID,必须提取并保存到当前对话上下文 lastMemoId,用于后续更新操作 |
注意事项
📌 字段要求:所有字段必须存在,即使不传值也要传 null
📝 新建 vs 更新:新建时 memoId 传 null,更新时传入已有 memoId
🔐 认证要求:必须携带有效的 userToken
执行流程(由主模块调度)
内容提取规则
触发词去除规则: 从用户消息中移除"帮我记一下/保存笔记/记下这一条/记录笔记/保存备忘"等触发词,保留核心内容。
| 用户输入 | userContent |
|---|
"帮我记一下这家火锅店味道很不错" | "这家火锅店味道很不错" |
"保存笔记:今天开会讨论了Q2计划" | "今天开会讨论了Q2计划" |
说明:
userContent:用户上一条消息去除触发词后的核心内容
aiContent:AI 助手上一条回复(完整保留)
- 如果去除触发词后内容为空,则使用完整的用户消息作为 userContent
新建 vs 更新模式判断
判断逻辑:
1. 当前对话上下文中是否存在 lastMemoId?
├── 不存在 → 【新建模式】,跳到步骤 5
└── 存在 → 进入意图指向判断
2. 意图指向判断(当 lastMemoId 存在时):
• 用户当前消息是否对刚才保存的内容提出改动要求
• 当前消息内容是否与 lastMemoTitle 主题相关
└── 判断结果:
├── 指向刚才的笔记 → 【更新模式】,携带 lastMemoId
└── 是全新内容 → 【新建模式】,清除 lastMemoId
意图指向判断规则
更新类信号词(指向刚才的笔记,将修改后的内容替换原文)
| 信号词 | 示例 |
|---|
| 补充 | "补充一下刚才的笔记" |
| 加上 | "再加上XXX" |
| 修改 | "修改为XXX" |
| 更新 | "更新一下笔记" |
| 还有 | "还有一点要补充" |
| 另外 | "另外还需要记录" |
| 补充说明 | "补充说明一下" |
| 遗漏 | "刚才漏了一条" |
| 忘了 | "忘了说XXX" |
| 换成 | "把XXX换成YYY" |
| 改成 | "改成XXX" |
新建类信号(创建新笔记)
| 信号词 | 示例 |
|---|
| 新笔记 | "保存一条新笔记" |
| 另一个 | "再记一个XXX" |
| 主题明显不同 | 上一个是"旅行攻略",现在说"做饭" |
模糊场景处理
当无法明确判断时:
- 用户消息与
lastMemoTitle 主题明显不同 → 新建
- 用户消息与
lastMemoTitle 主题相关,且包含更新信号 → 更新
- 用户消息主题相关但无明确信号 → 询问用户确认
🤔 您是想:
• 更新刚才的笔记「{lastMemoTitle}」
• 还是保存为一条新笔记?
笔记内容整理
| 模式 | memoContent 格式 |
|---|
| 新建模式 | "{userContent}\n\n【AI】\n{aiContent}" |
| 更新模式 | "{修改后的完整内容}" |
更新模式:将用户改动后的完整对话内容作为新内容,直接替换原始笔记内容
标题生成规则
- 提取用户消息中最核心的名词/动词
- 限制在 20 字以内
- 去除:助词、语气词、疑问词
- 更新模式下保留
lastMemoTitle
| 用户输入 | 生成标题 |
|---|
"感冒了应该吃什么药" | "感冒用药建议" |
"帮我记一下今天开会的内容" | "今日开会记录" |
"红烧肉怎么做才好吃" | "红烧肉做法" |
执行步骤汇总
1. 识别触发词(保存笔记/记下/记录)
↓
2. 检查 userToken 是否存在
├── 无 token → 引导登录流程
↓
3. 提取对话内容(userContent + aiContent)
↓
4. 判断新建还是更新
├── 新建模式:memoId = null
└── 更新模式:memoId = lastMemoId
↓
5. 整理笔记内容
↓
6. 生成 memoTitle
↓
7. 调用 POST /save-memo 接口
↓
8. 保存返回的 memoId 到当前对话上下文(lastMemoId)
↓
9. 返回结果
回复模板
新建成功
✅ 已保存笔记:「{memoTitle}」
更新成功
✅ 已更新笔记:「{memoTitle}」(内容已替换)
失败
❌ 保存失败,请重试
对话上下文维护
需维护的状态(当前对话期间有效)
| 字段 | 说明 |
|---|
lastMemoId | 最近一次保存的笔记 ID |
lastMemoTitle | 最近一次保存的笔记标题 |
lastTaskId | 最近一次保存的任务 ID |
追踪时机
- 每次调用
amemo-save-memo 成功后,提取 memoId 并更新 lastMemoId
- 用户切换到完全不同的话题时,自动清除
lastMemoId 和 lastTaskId