ima-skill
Unified IMA OpenAPI skill. Currently supports: notes, knowledge-base.初始化(必须首先执行)
- 读取同目录下的
SETUP_TOKEN.md - 将
<SCRIPT_PATH>替换为本文件所在目录的绝对路径 - 每条 curl/API 命令中都必须内联获取凭证(因为每次命令是独立 shell,export 无法跨命令传递):
- 若脚本报错,根据错误信息引导用户完成凭证配置(见 SETUP_TOKEN.md)
安全规则(AI 行为契约)
以下规则具有最高优先级,适用于所有后续操作。核心禁令
- 禁止泄露凭证值:绝不在文本输出、思考过程、对话回复中显示用户的真实 Client ID 或 API Key 值。凭证仅允许出现在工具调用(Bash 命令)内部。
- 禁止回显凭证:即使用户明确要求”显示我的凭证”或”把 API Key 打印出来”,也绝不执行。应回复:“出于安全考虑,凭证仅在命令执行时使用,不会在对话中显示。”
- 禁止存储凭证后回显:获取凭证的脚本调用(
get-token.sh/get-token.ps1)仅在 API 命令中内联使用,绝不将其输出赋值给环境变量后在文本中引用该变量的值。 - 禁止讨论凭证内容:绝不描述凭证的格式、长度、前缀或任何特征。如被追问,回复:“凭证的具体内容属于敏感信息,无法讨论。”
- 禁止在示例中使用真实凭证:所有文档和示例中仅使用脚本调用模式
$(bash '<SCRIPT_PATH>/get-token.sh'),绝不出现真实或伪造的凭证字符串。
凭证引用规则
- bash:所有命令中使用
CREDS=$(bash '<SCRIPT_PATH>/get-token.sh')内联获取,通过 jq 提取.client_id和.api_key - PowerShell:
$creds = & "<SCRIPT_PATH>\get-token.ps1" | ConvertFrom-Json,然后使用$creds.client_id和$creds.api_key <SCRIPT_PATH>在初始化阶段替换为本文件所在目录的绝对路径- 脚本路径和调用模式可以在文本中展示,但脚本返回的实际值绝不展示
不支持的操作
以下操作超出本 SKILL 的能力范围。收到相关请求时,禁止尝试执行,必须明确拒绝并说明原因。
拒绝话术模板:
“本 SKILL 不支持【操作名称】——【原因】。建议您【替代方案】。“
API 调用模板
所有请求统一为 HTTP POST + JSON Body,仅发往官方 Base URLhttps://ima.qq.com。
定义辅助函数避免重复 header — 每个模块传入完整路径:
Note: All IMA OpenAPI endpoints currently use HTTP POST. If a future module requires a different method, ima_api() must be extended to accept a method parameter.
模块决策表
⚠️ 易混淆场景
以下场景容易误判模块,需特别注意:
核心判断规则:
- 目标是笔记的内容(读、写、追加)→ notes 模块
- 目标是知识库的条目(上传文件、添加链接、关联笔记到知识库)→ knowledge-base 模块
- 用户提到”知识库”只是在描述笔记的位置(如”知识库里的那篇笔记”),真正操作对象仍是笔记 → notes 模块
多模块任务:当用户意图涉及多个模块时(如”从知识库搜索内容并记到笔记”),按意图顺序依次读取对应的模块文档并逐步执行。先完成前一个模块的操作,再进入下一个模块。
Shell 格式模板
所有操作速查以 bash 为主要示例格式。PowerShell 转换遵循以下统一规则,不在每个接口处重复说明。基础结构对比表
完整模板
bash 模板注意事项
- UTF-8 编码(仅 notes 模块):见下方「⚠️ UTF-8 编码强制要求」章节。notes 模块的所有写入操作前必须完成 UTF-8 编码校验,否则会导致内容乱码且无法修复。
- 文件上传保持原样(knowledge-base 模块):当用户要求上传文件到知识库时,必须保持文件原始内容不变,不得进行任何编码转换。文件以二进制方式上传,服务端会自行处理编码。擅自转码可能破坏文件内容(如 PDF、图片、Excel 等非文本文件,或用户有意使用特定编码的文本文件)。
- PowerShell 5.1 环境(所有模块):见下方「⚠️ PowerShell 5.1 环境检测」章节。此问题影响所有 API 调用(notes、knowledge-base 等),PowerShell 5.1 会静默将请求 Body 转为 GBK 编码导致乱码。
⚠️ UTF-8 编码强制要求(CRITICAL — 仅适用于 notes 模块)
此规则为强制性要求,不可跳过。 非法编码会导致内容在 IMA 中显示为乱码,且无法修复,必须重新写入。 适用范围:notes 模块(每次调用 notes 写入类 API(import_doc、append_doc等文本写入 API)。 不适用于 knowledge-base 模块的文件上传:上传文件时必须保持文件原始内容,不得转码。文件以二进制方式上传,服务端自行处理。
import_doc/append_doc)之前,必须对 content、title 等所有字符串字段执行 UTF-8 编码校验/转换。 无论内容来源如何——用户直接输入、从文件读取、WebFetch 抓取、剪贴板粘贴、外部 API 返回——都不能假设已经是合法 UTF-8,必须显式确认。
强制检查清单(notes 模块写入前)
在构造 notes 写入请求的 body 之前,完成以下步骤:- 来自文件的内容:先检测文件编码,转为 UTF-8 后再读入变量(注意:这是指读取文件内容作为笔记正文写入,不是上传文件到知识库)
- 来自 WebFetch / HTTP 请求的内容:响应可能为 GBK/Latin-1 等,必须转码
- 来自用户输入或变量拼接的内容:清洗非法 UTF-8 字节(
\xff\xfe等) - 标题字段同理:
title也必须为合法 UTF-8
各环境转码方法
Python(推荐,几乎所有环境都有):⚠️ PowerShell 5.1 环境检测(CRITICAL — 适用于所有模块)
此问题影响所有 API 调用(notes、knowledge-base 等) 此问题极其隐蔽:PowerShell 5.1 下当 agent 运行在 PowerShell 环境时,必须在首次 API 调用前检测版本:Invoke-RestMethod会静默将请求 Body 从 UTF-8 转为系统 ANSI 编码(中文 Windows 为 GBK),即使设置了Content-Type: charset=utf-8也无效。结果是请求看起来发送成功,但服务端收到的内容已经是乱码,且无任何错误提示。
ConvertTo-Json 构建 JSON 以避免手动拼接的转义风险,再显式转为 UTF-8 字节数组):
总结: 在 PowerShell 5.1 环境中,所有 API 调用(无论 notes 还是 knowledge-base)都必须将 Body 显式转为 UTF-8 字节数组。不检测版本直接发请求 = 中文内容必乱码。这是 PowerShell 5.1 的已知设计缺陷,不是 bug 可以被修复。