$npx -y skills add nexus-research-lab/nexus --skill notes> ⛔ Before ANY write (import_doc/append_doc): validate ALL string fields (content, title) are legal UTF-8. > Non-UTF-8 content causes irreversible garbled text in IMA. See root SKILL.md § MANDATORY RULES for platform-specific validation methods.
| 1 | # Notes (笔记) |
| 2 | |
| 3 | > ⛔ Before ANY write (`import_doc`/`append_doc`): validate ALL string fields (`content`, `title`) are legal UTF-8. |
| 4 | > Non-UTF-8 content causes irreversible garbled text in IMA. See root SKILL.md § MANDATORY RULES for platform-specific validation methods. |
| 5 | |
| 6 | API base path: `openapi/note/v1` |
| 7 | |
| 8 | 通过 IMA OpenAPI 管理用户个人笔记,支持读取(搜索、列表、获取内容)和写入(新建、追加)。 |
| 9 | |
| 10 | 完整的数据结构和接口参数详见 `references/api.md`。 |
| 11 | |
| 12 | > **隐私规则:** 笔记内容属于用户隐私,在群聊场景中只展示标题和摘要,禁止展示笔记正文。 |
| 13 | |
| 14 | ## 接口决策表 |
| 15 | |
| 16 | | 用户意图 | 调用接口 | 关键参数 | |
| 17 | | --------------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------- | |
| 18 | | 搜索/查找笔记 | `search_note` | `query_info`(QueryInfo 对象) | |
| 19 | | 查看笔记本列表 / 列出笔记本 | `list_notebook` | `cursor`(必填,首页传`"0"`) + `limit`(必填) | |
| 20 | | 列出笔记/获取多篇笔记信息 | `list_note` | `folder_id`(选填,空为全部) + `sort_type` + `cursor`(首次传`""`) + `limit` | |
| 21 | | 读取笔记正文 | `get_doc_content` | `note_id` + `target_content_format`(必填,推荐`0`纯文本) | |
| 22 | | 新建一篇笔记(用户明确说"新建/创建笔记"时走此接口) | `import_doc` | `content` + `content_format`(必填,固定`1`) + 可选 `folder_id` | |
| 23 | | 往已有笔记追加内容(⚠️ **敏感操作**:用户必须明确指定目标笔记,否则先确认再操作) | `append_doc` | `note_id` + `content` + `content_format`(必填,固定`1`) | |
| 24 | |
| 25 | ## ⚠️ 新建 vs. 追加 — 行为规则 |
| 26 | |
| 27 | **新建笔记(`import_doc`)** 和 **追加内容到已有笔记(`append_doc`)** 是两个完全不同的操作,务必正确区分: |
| 28 | |
| 29 | ### 明确走新建的信号词 |
| 30 | |
| 31 | 用户说以下任一表述时,**直接调用 `import_doc` 创建新笔记**: |
| 32 | |
| 33 | - "**新建**笔记"、"**创建**笔记"、"**写一篇**笔记" |
| 34 | - "**新建**一篇笔记记录这些内容" |
| 35 | |
| 36 | ### 明确走追加的信号词 |
| 37 | |
| 38 | 用户说以下任一表述时,**调用 `append_doc` 追加到已有笔记**(但仍需确认目标笔记,见下方规则): |
| 39 | |
| 40 | - "把这段话**追加到**《XX》笔记里" |
| 41 | - "在那篇笔记**末尾加上**这段内容" |
| 42 | |
| 43 | ### 模糊场景 — 必须先询问用户 |
| 44 | |
| 45 | 以下表述**既可能是新建、也可能是追加**,agent **不得自行假设**,必须先向用户确认: |
| 46 | |
| 47 | - "帮我记一下"、"记录一下"、"保存为笔记"、"存成笔记" |
| 48 | - "把这段内容记到笔记里" |
| 49 | - "添加到笔记里" |
| 50 | - 任何其他未明确表达"新建"或"追加"意图的表述 |
| 51 | |
| 52 | 询问示例: |
| 53 | |
| 54 | > "您是想**创建一篇新笔记**,还是**追加到某篇已有笔记**?" |
| 55 | |
| 56 | ### 追加到已有笔记是敏感操作 |
| 57 | |
| 58 | `append_doc` 会**不可撤销地修改**用户的现有笔记,因此必须谨慎处理: |
| 59 | |
| 60 | 1. **用户明确指定了目标笔记** — 可以直接追加。例如: |
| 61 | |
| 62 | - "把这段话追加到《会议纪要》笔记里" |
| 63 | - "在那篇笔记末尾加上这段内容"(上下文中已有明确的笔记对象) |
| 64 | |
| 65 | 2. **用户没有明确指定目标笔记** — **必须先向用户确认**,不要自行猜测。例如: |
| 66 | - 用户说"添加到笔记里" → 询问:"您想追加到哪篇已有笔记?请提供笔记标题或让我帮您搜索。" |
| 67 | - 用户说"把这个加到之前那篇笔记" → 如果上下文中有多篇笔记或不确定是哪篇 → 列出候选笔记让用户选择 |
| 68 | |
| 69 | > **原则**:不确定时,先问。宁可多问一句,也不要误改用户的已有笔记或自作主张创建新笔记。 |
| 70 | |
| 71 | ### 🖼️ 本地图片不支持 |
| 72 | |
| 73 | `import_doc` 和 `append_doc` 的 `content` 字段仅支持Markdown,**不支持本地图片**。 |
| 74 | |
| 75 | 写入笔记内容前,必须检查并处理图片引用: |
| 76 | |
| 77 | 1. **过滤本地图片** — 如果用户提供的内容中包含本地图片路径(如 ``, ``, `` 等),**移除这些图片引用**,不要将其写入笔记。 |
| 78 | 2. **告知用户** — 移除后主动提醒用户: |
| 79 | > "笔记接口暂不支持上传本地图片,以下图片已被过滤:`xxx.png`、`yyy.jpg`。您可以先将图片上传到网络,再用网络链接插入笔记。" |
| 80 | 3. **保留网络图片** — 以 `http://` 或 `https://` 开头的图片链接可以正常保留。 |
| 81 | |
| 82 | ## 常用工作流 |
| 83 | |
| 84 | ### 查找并阅读笔记 |
| 85 | |
| 86 | 先搜索获取 `note_id`,再用 `get_doc_content` 读取正文: |
| 87 | |
| 88 | ```bash |
| 89 | # 1. 按标题搜索 |
| 90 | ima_api "openapi/note/v1/search_note" '{"search_type": 0, "query_info": {"title": "会议纪要"}, "start": 0, "end": 20}' |
| 91 | # 从返回的 search_note_infos[].note_book_info.note_id 中取目标笔记 ID |
| 92 | |
| 93 | # 2. 读取正文(纯文本格式,Markdown 格式目前不支持) |
| 94 | ima_api "openapi/note/v1/get_doc_content" '{"note_id": "目标note_id", "target_content_format": 0}' |
| 95 | ``` |
| 96 | |
| 97 | ### 列出自己有哪些笔记 |
| 98 | |
| 99 | 直接使用`list_note`,拉取全部笔记列表,直到符合用户要求(如:用户要求全部笔记,则到 `is_end=true` 时停止;用户要求近30天的笔记,则根据`modify_time`与当前时间判断停止) |
| 100 | |
| 101 | ```bash |
| 102 | # 1. 拉取全部笔记的列表(首页 cursor 传 "") |
| 103 | ima_api "openapi/note/v1/list_note" '{"folder_id":"", "sort_type":0, "cursor": "", "limit": 20}' |
| 104 | # 获取全部笔记中前20篇笔记的信息 |
| 105 | |
| 106 | ``` |
| 107 | |
| 108 | ### 浏览笔记本里的笔记 |
| 109 | |
| 110 | 先拉笔记本列表获取 `folder_id`,再拉该笔记本下的笔记: |
| 111 | |
| 112 | ```bash |
| 113 | # 1. 列出笔记本(首页 cursor 传 "0") |
| 114 | ima_api "openapi/note/v1/list_notebook" '{"cursor": "0", "limit": 20}' |
| 115 | |
| 116 | # 2. 拉取指定笔记本的笔记(首页 cursor 传 "") |
| 117 | ima_api "openapi/note/v1/list_note" '{"folder_id": "目标folder_id", "cursor": "", "limit": 20}' |
| 118 | ``` |
| 119 | |
| 120 | ### 新建笔记 |
| 121 | |
| 122 | ```bash |
| 123 | # 新建到默认位置 |
| 124 | ima_api "openapi/note/v1/import_doc" '{"content_format": 1, "content": "# 标题\n\n正文内容"}' |
| 125 | |
| 126 | # 新建到指定笔记本 |
| 127 | ima_api "openapi/note/v1/import_doc" '{"content_format": 1, "content": "# 标题\n\n正文内容", "folder_id": "笔记本ID"}' |
| 128 | # 返回 note_id,后续可用于 append_doc |
| 129 | ``` |
| 130 | |
| 131 | ### 追加内容到已有笔记 |
| 132 | |
| 133 | ```bash |
| 134 | ima_api "openapi/note/v1/append_doc" '{"note_id": "笔记ID", "content_format": 1, "content": "\n## 补充内容\n\n追加的文本"}' |
| 135 | ``` |
| 136 | |
| 137 | ### 按正文搜索 |
| 138 | |
| 139 | ```bash |
| 140 | ima_api "openapi/note/v1/search_note" '{"search_type": 1, "query_info": {"content": "项目排期"}, "start": 0, "end": 20}' |
| 141 | ``` |
| 142 | |
| 143 | ## 核心响应字段 |
| 144 | |
| 145 | **搜索结果**(`SearchNoteInfo`):笔记信息路径为 `search_note_infos` 包含 `NoteBookInfo`,关键字段:`note_id`、`title`、`summary`、`create_time`、`modify_time`、`note_ext_info.folder_id`、`note_ext_info.folder_name`。额外包含 `highlightInfo`(高亮匹配,key 为 `doc_title`,value 含 `<em>高亮词</em>`)。 |
| 146 | |
| 147 | **笔记列表条目**(`NoteBookInfo`):关键字段:`note_id`、`title`、`summary`、`create_time`、`modify_time`、`cover_image`、`note_ext_info`(含 `folder_id`、`folder_name`)。 |
| 148 | |
| 149 | **笔记本条目**(`NoteFolderInfo`): |