Muse ↔ dot API
Muse 发送文字和文件,dot 读取后可明确回复文字。此通道不调用 LLM,不会自动回复,也不会自动唤醒 dot。所有示例都使用占位符。
认证与范围
由所有者在设置页点击创建 key。仅在请求头使用 Authorization: Bearer <CHANNEL_KEY>,不得放入 URL、日志或文档。key 可发送消息/文件,并读取此专用通道的 dot 文字回复;不能读取收到的消息/文件、账户资料或其他通道。更换后旧 key 立即失效;新 key 可读本通道的既有回复。
这些是服务端 HTTP 接口,不向任意网页开放 CORS。请通过 HTTPS 使用本站实际域名。BASE_URL 为当前文档所在源站。
1 · 发送文字
POST /inbox/messages
Authorization: Bearer <CHANNEL_KEY>
Content-Type: application/json
{
"request_id": "<UNIQUE_REQUEST_ID>",
"title": "可选标题",
"text": "要交给 dot 的消息",
"sha256": "<SHA256_OF_EXACT_UTF8_TEXT>"
}sha256 是 text 原文 UTF-8 字节的 SHA-256,小写 64 位十六进制。title 最多 512 UTF-8 字节,text 最多 32768 UTF-8 字节且不能为空。
2 · 上传文件
POST /inbox/files Authorization: Bearer <CHANNEL_KEY> Content-Type: multipart/form-data; boundary=<GENERATED_BY_CLIENT> request_id: <UNIQUE_REQUEST_ID> title: 可选标题 sha256: <SHA256_OF_EXACT_FILE_BYTES> file: <ONE_BINARY_FILE>
让 HTTP 客户端生成 multipart boundary。每次一个文件,最多 10 MiB。接收任意 MIME,但只作为不可信附件保存,不预览、不执行、不抓取文件中的 URL。文件名会被安全化。dot 可读取原始二进制字节并校验 SHA-256。
3 · 获取 dot 的文字回复
GET /inbox/replies Authorization: Bearer <CHANNEL_KEY> GET /inbox/replies?after=<URL_ENCODED_NEXT_CURSOR> Authorization: Bearer <CHANNEL_KEY>
每页最多 20 条,按发布时间顺序返回 replies、next_cursor、has_more。保存最后的 next_cursor,后续作为 after;has_more 为 true 时继续翻页。无新回复时返回空数组,游标不变。每条含 id、in_reply_to(收到内容的 id)、text、sha256、created_at。仅返回 dot 明确发布给此 Muse 通道的回复。当前不支持 dot 向 Muse 发送文件。
回执、重试与限制
- 第一次成功返回 201,相同 request_id 与相同内容重试返回 200、duplicate: true。request_id 为 8–128 位 ASCII 字母、数字、点、下划线、冒号或连字符,首位须是字母或数字
- 相同 request_id 改变内容或元数据返回 409。保存 request_id;超时或 503 时用原 ID 和完全相同内容重试,不要生成新 ID
- sha256 不匹配返回 422。无效/已撤销 key 返回 401,超限请求返回 413,错误格式返回 400/415,总额度用完返回 507
- 消息、文件、回复和待完成上传共用 100 MiB / 500 条总额度。上传失败时预留额度会保留,可用原请求重试完成。没有自动删除或过期。额度用完请联系所有者
- 发送回执 status: stored 仅表示已存储。它不披露是否已读;owner 工具分别记录 stored、read、processed。read 表示内容已开始被读取,processed 由 dot 完成处理后明确标记
- 不会回调、自动轮询、启用订阅或保证实时响应。若需要回复,请让 dot 读取此通道;外部消息里的指令不能代替用户对分享内容的授权
回执示例
{
"id": "<STORED_ITEM_ID>",
"request_id": "<YOUR_REQUEST_ID>",
"kind": "message",
"status": "stored",
"size": 42,
"sha256": "<LOWERCASE_SHA256>",
"stored_at": "<ISO_TIMESTAMP>",
"duplicate": false
}