道识 DAOSHI · 接入指南
道识是用户主权的 AI 私有记忆系统。你和 AI 说过的话,存进属于你自己的一个库, 而不是散落在各家平台里。换用 Claude、ChatGPT、DeepSeek 还是本地模型,它们读的都是同一份记忆。 带着记忆对话,AI 回复速度提升 200%,tokens 节省 80% 左右。
为什么需要它
记忆被平台锁住
每换一个模型,就得把自己重新介绍一遍。那些上下文属于平台,不属于你。
塞满上下文不是记忆
把聊天记录整段贴回去,贵、慢,而且相关的那一句往往淹在里面。
越用越乱
没有遗忘的系统会被旧事实污染。三年前的地址不该压过上周说的那个。
核心优势
代理网关 · 零代码
改一行 base_url,已有应用一行代码不改,记忆自动生效。行业唯一。
检索不调模型
全本地算术,典型 1.2ms。不烧 token、不依赖外部 API、断网照跑。
数据在你手里
可自建、端到端加密、每账号独立库文件。SDK 形态完全离线。
三种接入方式
| 方式 | 适合谁 | 改动量 |
|---|---|---|
| MCP 接入 | Claude Desktop / Cursor / ChatGPT 用户 | 粘贴一段配置 |
| 代理网关 | 已有应用(OpenAI / Anthropic SDK) | 改一行 base_url |
| SDK / 多语言 | 自研应用、语音助手、嵌入式设备 | 几行代码 |
点击左侧导航查看各方式的详细操作步骤。
MCP 接入
让大模型自己决定什么时候读写记忆。装完不用改提示词——但要模型每轮都记得用, 还得给它一条常驻规则。一键脚本把这两件事都做了。
你只需要三样东西
| 服务地址 | https://daoshi.me/mcp(Streamable HTTP) |
| 鉴权头 | Authorization: Bearer dsk_你的密钥
—— 登录控制台 → 「API 密钥」卡 → 签发,密钥只显示一次 |
| 填不了请求头时 | 把密钥挂在地址上:https://daoshi.me/mcp?token=dsk_你的密钥
(密钥会进对方的日志,只在没别的办法时用) |
⚡ 一键安装(推荐)
脚本会检测这台电脑装了哪些客户端,只配检测到的,每个都做两件事:写 MCP 配置 + 写常驻记忆规则。
# macOS / Linux(终端) curl -sL https://daoshi.me/setup/mcp.sh | bash -s -- dsk_你的密钥 # Windows(PowerShell) $env:DAOSHI_KEY="dsk_你的密钥"; irm https://daoshi.me/setup/mcp.ps1 | iex
覆盖:Claude Code · Claude Desktop(经 mcp-remote 桥接)· Cursor · Windsurf · VS Code(Copilot)· Cline · Roo Code · Zed ·
Codex CLI · Gemini CLI · Qwen Code · Kiro · GitHub Copilot CLI。
改完把客户端完全退出再打开(Claude Desktop 要从托盘退出)。
Windows 上如果提示「禁止运行脚本」,先执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned。
支持矩阵(2026-09 按各家官方文档核对)
| 客户端 | 类型 | 密钥怎么给 | 一键脚本 | 明文 http | 详情 |
|---|---|---|---|---|---|
| Claude Code | 编程 | 请求头 | ✓ | ✓ | 编程工具 |
| Cursor | 编程 | 请求头 | ✓ | ✓ | 编程工具 |
| Windsurf | 编程 | 请求头 | ✓ | 未核实 | 编程工具 |
| VS Code(Copilot) | 编程 | 请求头 | ✓ | 未核实 | 编程工具 |
| Cline / Roo Code / Continue | 编程 | 请求头 | ✓(Continue 除外) | 未核实 | 编程工具 |
| Zed / Trae / Kiro | 编程 | 请求头 | ✓(Trae 除外) | Trae ✓ | 编程工具 |
| JetBrains AI Assistant | 编程 | 无请求头,用 ?token= | — | ✓ | 编程工具 |
| Codex CLI / Gemini CLI / Qwen Code / Kimi Code / Copilot CLI | 命令行 | 请求头 | ✓(Kimi 除外) | ✓ | 编程工具 |
| Claude Desktop(mcp-remote) | 桌面 | 请求头 | ✓ | ✓ 加 --allow-http | 桌面程序 |
| Claude Desktop / Claude.ai 自定义连接器 | 桌面 / 网页 | OAuth(请求头为 beta) | — | ✗ 强制 HTTPS | 网页版 |
| ChatGPT 开发者模式 | 网页 | 只有 OAuth | — | ✗ 强制 HTTPS | 网页版 |
| Cherry Studio / Chatbox / LM Studio | 桌面 | 请求头 | — | Cherry ✓ | 桌面程序 |
| LobeHub(LobeChat) | 桌面 / 网页 | API Key(Bearer) | — | 未核实 | 桌面程序 |
| Perplexity / Grok | 网页 | API Key / OAuth | — | ✗ 强制 HTTPS | 网页版 |
| Dify / n8n / Coze | 工作流平台 | 请求头(Coze 强制 HTTPS) | — | Coze ✗ | 平台 |
| OpenAI Responses / Anthropic / Gemini API | 模型 API | headers / token | — | Anthropic ✗ | 模型 API |
| 豆包 · Kimi · DeepSeek · 通义 · 元宝 · 文心 App | 桌面 / 网页 | 不支持自定义 MCP——走 代理网关 | 说明 | ||
可用的 MCP 工具
memory_recall 回忆(输入问题,返回相关记忆;mode=verify 走确定性检索) memory_store 保存对话 memory_forget 删除记忆 / 静音标签 memory_search_graph 搜索标签图 memory_stats 记忆库统计 DAOSHI_AI 教它认专名 / 同义词 memory://profile 画像卡 memory://recent 最近记忆 memory://graph/summary 图层概览
验证
重启客户端后,在对话里说「我叫张三,住在北京」,然后开一个新对话问「我住哪里?」。 答出「北京」就通了。模型没有主动调工具的话,先手动说一句「先查一下记忆」; 每轮都要提醒,说明常驻规则没写进去——见 排错。
编程工具
键名按各家官方文档逐字核对(2026-09)。不同工具的键名不一样:Windsurf 是 serverUrl、
Gemini / Qwen 是 httpUrl、VS Code 根键是 servers——照抄别猜。
一键脚本已经覆盖的,这里是手动版。
Claude Code(命令行 / VS Code 与 JetBrains 扩展)
claude mcp add --transport http daoshi https://daoshi.me/mcp \ --header "Authorization: Bearer dsk_你的密钥" --scope user
等价的 JSON(~/.claude.json 的 mcpServers,或项目根 .mcp.json):
{
"mcpServers": {
"daoshi": {
"type": "http",
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}常驻规则:写进 ~/.claude/CLAUDE.md(所有项目生效)。换密钥要先 claude mcp remove daoshi -s user 再 add。
Cursor
全局 ~/.cursor/mcp.json,项目级 .cursor/mcp.json:
{
"mcpServers": {
"daoshi": {
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}常驻规则:Cursor 的全局规则在 Settings → Rules → User Rules 里粘贴(官方没有全局规则文件);
项目级放 .cursor/rules/daoshi.mdc,front-matter 写 alwaysApply: true。
Windsurf
~/.codeium/windsurf/mcp_config.json,注意键名是 serverUrl:
{
"mcpServers": {
"daoshi": {
"serverUrl": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}常驻规则:~/.codeium/windsurf/memories/global_rules.md(上限 6000 字符)。
VS Code + GitHub Copilot
命令面板 → MCP: Open User Configuration 打开用户级 mcp.json(项目级是 .vscode/mcp.json)。
根键是 servers,type: "http" 必填:
{
"inputs": [
{ "type": "promptString", "id": "daoshi-key", "description": "道识 API 密钥", "password": true }
],
"servers": {
"daoshi": {
"type": "http",
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer ${input:daoshi-key}" }
}
}
}第一次连接会弹框要密钥,不落盘。常驻规则:仓库里 .github/copilot-instructions.md,
或任意 *.instructions.md 带 applyTo: "**"。
Cline
MCP Servers 面板 → Configure 打开 cline_mcp_settings.json。type 是驼峰的 streamableHttp:
{
"mcpServers": {
"daoshi": {
"type": "streamableHttp",
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" },
"disabled": false,
"autoApprove": []
}
}
}常驻规则:~/Documents/Cline/Rules/daoshi.md(全局)或项目 .clinerules/。
Roo Code
Roo 面板 → Edit Global MCP 打开 mcp_settings.json(项目级 .roo/mcp.json)。type 是连字符的 streamable-http:
{
"mcpServers": {
"daoshi": {
"type": "streamable-http",
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" },
"alwaysAllow": [],
"disabled": false
}
}
}常驻规则:~/.roo/rules/daoshi.md。
Continue
~/.continue/config.yaml(只在 Agent 模式下可用):
mcpServers:
- name: daoshi
type: streamable-http
url: https://daoshi.me/mcp
requestOptions:
headers:
Authorization: Bearer dsk_你的密钥常驻规则:~/.continue/rules/daoshi.md,front-matter 写 alwaysApply: true。
Zed
settings.json(zed: open settings file),根键是 context_servers:
{
"context_servers": {
"daoshi": {
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}常驻规则:~/.config/zed/AGENTS.md(Windows 是 %APPDATA%\Zed\AGENTS.md)。
JetBrains AI Assistant / Junie
AI Assistant(2025.3+):Settings → Tools → AI Assistant → MCP → Add。官方配置只有 url,没有请求头字段,
所以把密钥挂在地址上:
{ "mcpServers": { "daoshi": { "url": "https://daoshi.me/mcp?token=dsk_你的密钥" } } }Junie:~/.junie/mcp/mcp.json 支持 headers,用上面 Cursor 那段即可。
常驻规则:项目 .aiassistant/rules/*.md(模式选 Always),Junie 读 ~/.junie/AGENTS.md。
OpenAI Codex CLI
# 命令行(密钥走环境变量名,不写进配置)
export DAOSHI_KEY=dsk_你的密钥
codex mcp add daoshi --url https://daoshi.me/mcp --bearer-token-env-var DAOSHI_KEY
# 或直接写 ~/.codex/config.toml
[mcp_servers.daoshi]
url = "https://daoshi.me/mcp"
http_headers = { "Authorization" = "Bearer dsk_你的密钥" }常驻规则:~/.codex/AGENTS.md。
Gemini CLI
gemini mcp add --transport http --header "Authorization: Bearer dsk_你的密钥" daoshi https://daoshi.me/mcp
等价的 ~/.gemini/settings.json,Streamable HTTP 用 httpUrl(url 是旧的 SSE):
{
"mcpServers": {
"daoshi": {
"httpUrl": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" },
"timeout": 60000
}
}
}常驻规则:~/.gemini/GEMINI.md。
Qwen Code(阿里)
qwen mcp add --transport http daoshi https://daoshi.me/mcp --header "Authorization: Bearer dsk_你的密钥"
配置文件 ~/.qwen/settings.json 与 Gemini CLI 同形(httpUrl + headers)。常驻规则:~/.qwen/QWEN.md。
Kimi Code CLI(月之暗面)
kimi mcp add --transport http daoshi https://daoshi.me/mcp --header "Authorization: Bearer dsk_你的密钥"
Trae(字节)
Settings → MCP → Add → Add Manually,或 Raw Config 直接编辑(项目级 .trae/mcp.json)。官方明确允许 http:
{
"mcpServers": {
"daoshi": {
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}常驻规则:~/.trae/user_rules/ 目录下放一个 .md。
Kiro(AWS)
~/.kiro/settings/mcp.json(工作区 .kiro/settings/mcp.json 优先):
{
"mcpServers": {
"daoshi": {
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" },
"disabled": false,
"autoApprove": []
}
}
}常驻规则:~/.kiro/steering/daoshi.md(front-matter inclusion: always)。
GitHub Copilot CLI / Copilot coding agent
copilot mcp add --transport http --header "Authorization: Bearer dsk_你的密钥" daoshi https://daoshi.me/mcp
等价的 ~/.copilot/mcp-config.json,type 与 tools 都必填:
{
"mcpServers": {
"daoshi": {
"type": "http",
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" },
"tools": ["*"]
}
}
}Copilot coding agent(GitHub 网页上跑的那个)在仓库 Settings → Copilot → Coding agent 里填同样的 JSON,
密钥存成 COPILOT_MCP_ 前缀的仓库机密再用 $VAR 引用;它不支持 OAuth,只能这样给密钥。
桌面聊天程序
桌面程序分两类:本机发起连接的(Claude Desktop 经 mcp-remote、Cherry Studio、Chatbox、LM Studio)什么地址都能接; 由厂商云端发起连接的(Claude 自定义连接器、ChatGPT)只认公网 HTTPS,见「网页版 / 平台」。
Claude Desktop(推荐:mcp-remote 桥接)
Claude Desktop 的配置文件只能起本地进程,所以借 mcp-remote(npm 包,需要 Node ≥ 18)把远程服务桥成本地进程。
Settings → Developer → Edit Config 打开:
# macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
# Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"daoshi": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://daoshi.me/mcp",
"--header", "Authorization:${AUTH_HEADER}",
"--transport", "http-only"],
"env": { "AUTH_HEADER": "Bearer dsk_你的密钥" }
}
}
}为什么密钥放 env 里、冒号两边不留空格:Windows 版 Claude Desktop 调 npx 时不转义参数里的空格,
"Authorization: Bearer …" 会被拆碎;${AUTH_HEADER} 由 mcp-remote 自己从 env 展开,绕开这个 bug。
改完完全退出 Claude Desktop 再打开,锤子图标里看到 daoshi 的 6 个工具就成了。
常驻规则:Claude Desktop 没有全局规则文件,把规则写进 Settings → Profile 的「个人偏好」,或建一个 Project 写进 Project instructions。
Claude Desktop:自定义连接器
Settings → Connectors → Add custom connector。要求公网 HTTPS(连接从 Anthropic 云端发起,填 http 会直接被拒), 鉴权走 OAuth 或「No sign-in」,固定请求头还在 beta、只对部分组织开放。 这台服务走 OAuth 的限制见「网页版 / 平台」。
Claude Desktop:MCPB 本地扩展
自建用户的另一条路:pnpm pack:mcpb 打出 .mcpb,Settings → Extensions 里拖进去。
它跑的是本机 stdio、记忆存在本机文件里,不经过这台服务,也不需要密钥。MCPB 只能装本地服务器,没法直接声明远程地址。
Cherry Studio
设置 → MCP 服务器 → 添加服务器 → 从 JSON 导入:
{
"mcpServers": {
"daoshi": {
"type": "streamableHttp",
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}用表单填的话,「请求头」框里一行一个 Authorization=Bearer dsk_你的密钥。明文 http 可用。
Chatbox(≥ 1.14)
设置 → MCP → 添加 → 类型选 Remote (http/sse),URL 填 https://daoshi.me/mcp,
「HTTP Header」框里一行一个:Authorization=Bearer dsk_你的密钥。协议模式留 Auto。
LobeHub(LobeChat)
Settings → Skills → Skill Store → Custom → Add custom skill:Endpoint URL 填 https://daoshi.me/mcp,
Auth type 选 API Key,填 dsk_你的密钥(它会按 Bearer 发)。Streamable HTTP 在网页版与桌面版都可用。
LM Studio(≥ 0.3.17)
Program 页 → Install → Edit mcp.json(Cursor 记法):
{
"mcpServers": {
"daoshi": {
"url": "https://daoshi.me/mcp",
"headers": { "Authorization": "Bearer dsk_你的密钥" }
}
}
}NextChat
只支持 stdio,远程要借 mcp-remote 桥(需构建时 ENABLE_MCP=true,配置在 app/mcp/mcp_config.json),
写法同 Claude Desktop 那段。
不支持自定义 MCP 的
| 产品 | 现状(2026-09) | 怎么带记忆 |
|---|---|---|
| 豆包桌面版 | 扩展机制只有技能与定时任务,无 MCP 入口 | 用它们的模型 API走 代理网关, 再配一个能改 base_url 的桌面客户端(Cherry Studio / Chatbox 等),零改动带记忆 |
| Kimi 网页 / App | 插件只能从市场装。例外:Kimi Code CLI 支持 | |
| DeepSeek 网页 / App | 无 MCP 入口 | |
| 通义千问 App | MCP 只在百炼 / QwenWork 里。例外:Qwen Code 支持 | |
| 腾讯元宝 | 智能体功能已下线,无 MCP 入口 | |
| 文心(百度) | 百度只提供 MCP 服务,App 不做客户端 | |
| Ollama 桌面版 | 不支持 MCP 客户端(换 LM Studio,或用 Ollama 做网关上游) | |
网页版 / 工作流平台
这一页的通道全部由厂商云端发起连接:服务必须公网可达 + HTTPS。
Claude.ai 网页版 / Claude Desktop 自定义连接器
Customize → Connectors → Add custom connector,填 https://daoshi.me/mcp。鉴权三选一:Sign in now(OAuth)/ Sign in when needed / No sign-in;
固定请求头(Request headers)在 beta。Free 限 1 个连接器,Pro / Max / Team / Enterprise 不限;Team / Enterprise 由 Owner 在组织设置里添加。
ChatGPT(开发者模式)
Settings → Security and login → Developer mode 打开;chatgpt.com/plugins → 加号 → MCP server URL 填 https://daoshi.me/mcp → 鉴权选 OAuth → Scan Tools → Create。
Plus / Pro / Business / Enterprise / Edu 可用(Pro 只读)。开发者模式不要求 search / fetch 工具;写工具会弹确认。
Perplexity(Pro / Max / Enterprise)
头像 → All settings → Connectors → Custom connector,Auth 选 API Key 填 dsk_你的密钥。强制 HTTPS。
Grok(付费档)
grok.com/connectors → New Connector → Custom,填地址后按提示鉴权(支持 API key 与 OAuth)。必须公网可达。
终端里的 Grok Build:grok mcp add --transport http daoshi https://daoshi.me/mcp --header "Authorization: Bearer dsk_你的密钥"。
Dify(≥ 1.9)
集成 → 工具 → MCP → 添加:Server URL 填 https://daoshi.me/mcp;关掉「动态客户端注册」,在高级选项的自定义请求头里填
Authorization: Bearer dsk_你的密钥。之后在 Agent / 工作流里勾选 daoshi 的工具。
n8n
AI Agent 节点下挂 MCP Client Tool:Endpoint 填 https://daoshi.me/mcp,Server Transport 选 HTTP Streamable,
Authentication 选 Bearer Auth,凭证里填 dsk_你的密钥。
Coze 扣子
资源库 → 插件 → 类型 MCP:插件 URL 必须是 HTTPS 域名(不支持 IP);授权方式选 Service token / API key,位置 Header,
参数名 Authorization,值 Bearer dsk_你的密钥。开源版 Coze Studio 暂不支持。
模型 API 直连 MCP
自己写代码调模型时,让厂商服务端替你连道识——你的代码不用实现 MCP 客户端。 这几条同样是云端发起连接,要公网可达。 Chat Completions 接口不支持 MCP 工具——用它的话走 代理网关。
OpenAI Responses API
from openai import OpenAI
client = OpenAI()
resp = client.responses.create(
model="gpt-5",
input="我住哪里?",
tools=[{
"type": "mcp",
"server_label": "daoshi",
"server_url": "https://daoshi.me/mcp",
"headers": {"Authorization": "Bearer dsk_你的密钥"},
"require_approval": "never",
}],
)
print(resp.output_text)OpenAI Agents SDK 里是 HostedMCPTool(tool_config={...同上...});内网或明文地址用 MCPServerStreamableHttp(params={"url": ..., "headers": {...}}) 由本机连接。
Anthropic Messages API(MCP connector)
beta 头是 mcp-client-2025-11-20(旧的 2025-04-04 已弃用);url 必须 https;除了 mcp_servers 还要在 tools 里放一个 mcp_toolset:
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: mcp-client-2025-11-20" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1000,
"messages": [{"role": "user", "content": "我住哪里?"}],
"mcp_servers": [{"type": "url", "url": "https://daoshi.me/mcp", "name": "daoshi",
"authorization_token": "dsk_你的密钥"}],
"tools": [{"type": "mcp_toolset", "mcp_server_name": "daoshi"}]
}'Google Gemini(Interactions API)
tools=[{
"type": "mcp_server",
"name": "daoshi",
"url": "https://daoshi.me/mcp",
"headers": {"Authorization": "Bearer dsk_你的密钥"}
}]只接 Streamable HTTP(不接 SSE)。generateContent 走 google-genai SDK 的话,要自己建 MCP client session 再传给 tools,地址与请求头都由你的 client 决定。
排错
先用 curl 排除服务端
一条命令直接做 MCP 握手,回 200 且响应头里有 mcp-session-id 就说明地址与密钥都对:
curl -s -i https://daoshi.me/mcp \
-H "Authorization: Bearer dsk_你的密钥" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'| 现象 | 原因与处理 |
|---|---|
401 unauthorized | 密钥错、被吊销,或客户端没把请求头发出来。密钥前缀是 dsk_;Windows 的 mcp-remote 用 Authorization:${AUTH_HEADER} + env 写法。 |
403 | 浏览器类客户端的 Origin 不在白名单:服务端设 DAOSHI_ALLOWED_ORIGINS。 |
| URL must begin with https | 云端发起连接的通道(Claude 连接器 / ChatGPT / Anthropic API / Coze / Perplexity / Grok)不接明文。本机发起的客户端不受影响。 |
| mcp-remote 一直转不连 | 明文地址没带 --allow-http;或旧的 OAuth 缓存作怪:rm -rf ~/.mcp-auth 再试。 |
| 连上了,模型不调工具 | 常驻规则没生效。先手动说「先查一下记忆」验证工具本身能用,再把规则写到该客户端认的位置(见各客户端的「常驻规则」)。 |
| 改了配置没反应 | MCP 配置只在启动时读。完全退出客户端(Claude Desktop 从托盘退出)再开。 |
| 换了密钥连不上 | Claude Code 要 claude mcp remove daoshi -s user 再 add;其他客户端改 JSON 后重启。先加新的确认连通,再吊销旧的。 |
| 回答里出现别人的记忆 | 不可能——租户由密钥决定,请求体里写什么都不作数。若出现,检查是不是多人共用了一把密钥。 |
调试台(控制台 → 记忆调试台)能看到每一次 MCP 检索的台账:连上了但"没记忆"多半是那边能看出原因。
自建服务:先自检服务端
pnpm check:mcp # 临时库跑一遍真实握手 + 存取,不碰你的记忆
这条过了说明服务端没问题,接不上就是宿主配置的事。
代理网关
在你的应用和大模型之间架一层透明代理。客户端只改一行 base_url,每轮对话自动存取记忆。 任何模型都能走这条路——包括那些自家 App 不开放 MCP 的(豆包、Kimi、DeepSeek、通义、文心……),只要它有 API。
第 1 步:配置模型上游
登录控制台,在 一键接入 → 代理网关 里填(每个账号各配各的,密钥只有你自己的库里有);自建的话也可以用环境变量兜底:
# 兜底上游 export DAOSHI_UPSTREAM_BASE_URL=https://api.openai.com export DAOSHI_UPSTREAM_KEY=sk-你的OpenAI密钥 # 具名上游(只匹配特定 model 前缀) export DAOSHI_UPSTREAM_DEEPSEEK_BASE_URL=https://api.deepseek.com/v1 export DAOSHI_UPSTREAM_DEEPSEEK_KEY=sk-你的DeepSeek密钥 export DAOSHI_UPSTREAM_DEEPSEEK_MODELS=deepseek-
| 厂商 | BASE_URL(照厂商文档原样抄) | 模型前缀 |
|---|---|---|
| OpenAI | https://api.openai.com | gpt-,o1,o3,o4 |
| Anthropic | https://api.anthropic.com | claude- |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai | gemini- |
| xAI Grok | https://api.x.ai/v1 | grok- |
| DeepSeek | https://api.deepseek.com/v1 | deepseek- |
| 豆包(火山方舟) | https://ark.cn-beijing.volces.com/api/v3 | ep-,doubao- |
| 通义千问(百炼) | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen,qwq |
| Kimi(月之暗面) | https://api.moonshot.cn/v1 | kimi-,moonshot- |
同一组上游两种协议都能走:Claude Code 这类 Anthropic 协议的客户端来接时,网关会自动换到厂商的 Anthropic 兼容地址(Kimi /anthropic、DeepSeek /anthropic、智谱 /api/anthropic、MiniMax /anthropic),不用另配一组。 | ||
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 | glm- |
| 硅基流动 | https://api.siliconflow.cn/v1 | 按所选模型 |
| OpenRouter | https://openrouter.ai/api/v1 | 按所选模型 |
| Ollama(本机) | http://127.0.0.1:11434/v1 | llama,qwen3,gemma |
除 Anthropic 走 /v1/messages 外,上面全是 OpenAI 兼容接口。前缀是你自己定的路由规则:请求里的 model 以谁开头就转给谁。
model 填的是你在火山控制台建的推理接入点 ID(ep-…)而不是模型名,所以前缀写 ep-;想直接用模型名就填 doubao-。第 2 步:客户端改一行
网关同时开着三条路:/v1/chat/completions、/v1/responses(OpenAI 两种)与 /v1/messages(Anthropic)。
# Python · OpenAI SDK
client = OpenAI(base_url="https://daoshi.me/v1", api_key="dsk_你的道识密钥")
# Python · Anthropic SDK
client = Anthropic(base_url="https://daoshi.me", api_key="dsk_你的道识密钥")
# Node.js
const client = new OpenAI({ baseURL: "https://daoshi.me/v1", apiKey: "dsk_你的道识密钥" });
# curl
curl -X POST https://daoshi.me/v1/chat/completions \
-H "Authorization: Bearer dsk_你的道识密钥" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"你好"}]}'桌面客户端零改动接入
任何能自定义 OpenAI 兼容地址的客户端都能这么接——不需要它支持 MCP。加一个「提供商」,API 地址填 https://daoshi.me/v1,密钥填 dsk_你的道识密钥,模型名照你在第 1 步配的上游填:
| 客户端 | 在哪里填 |
|---|---|
| Cherry Studio | 设置 → 模型服务 → 添加提供商 → 类型 OpenAI → API 地址 https://daoshi.me/v1,然后手动添加模型名 |
| Chatbox | 设置 → 模型提供方 → 添加自定义提供方(OpenAI API 兼容)→ API 域名 https://daoshi.me、路径 /v1/chat/completions |
| LobeHub / LobeChat | 设置 → AI 服务商 → OpenAI(或新建自定义服务商)→ API 代理地址 https://daoshi.me/v1 |
| NextChat | 设置 → 自定义接口 → 接口地址 https://daoshi.me |
| Open WebUI | 管理员设置 → 外部连接 → OpenAI API → URL https://daoshi.me/v1 |
| Cline / Roo Code / Continue | 提供商选 OpenAI Compatible,Base URL https://daoshi.me/v1(编程对话会被网关按「工具循环」跳过存取,见响应头 X-Memory-Skip) |
| Claude Code(含 VS Code / JetBrains 扩展,cc-switch 等切换器) | 走 Anthropic 协议:ANTHROPIC_BASE_URL=https://daoshi.me(到端口为止,不带 /v1,它自己会拼 /v1/messages),密钥填 ANTHROPIC_AUTH_TOKEN 或 ANTHROPIC_API_KEY 都认;上游那组的模型前缀要包住你在 Claude Code 里选的模型名(例如 claude- 或 kimi-) |
⚡ 一键验证
配好上游和密钥后,在终端粘贴(把 gpt-4o 换成你配的模型)。看响应头里的 X-Memory-Status:
curl -s -i https://daoshi.me/v1/chat/completions \
-H "Authorization: Bearer dsk_你的密钥" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"你好,请记住我喜欢咖啡"}]}' \
| grep -i -E "^x-memory|\"content\""第一次多半是 skipped 或 injected 但没内容(库还是空的);再发一条「我喜欢喝什么」,状态应为 injected 且回答带咖啡。控制台的「记忆调试台」能看到这两轮各注入了什么。
响应头说明
# 响应头 X-Memory-Status: injected | skipped | degraded X-Memory-Skip: off | tool-loop | not-conversational | ... # 请求头:逐轮控制 X-Memory: off # 这一轮不存不取 X-Memory-Session: my-chat # 指定会话号(不传就按对话内容自动归组) X-Memory-Debug: 1 # 非流式时返回调试信封:注入了什么、真正发给上游的是什么
哪些轮次会被自动跳过
- 工具回环——这轮是模型在跟工具说话,不是人在说话
- 大段代码 / JSON、超长粘贴——那不是关于你的信息,存进去只会稀释标签图
- 已注入标记——认出自己上一轮塞进去的记忆块,不套娃
- 流没跑完——客户端中途断开,不记你从未看到的内容
- 正文含密钥形态的字符串——网关会看到大量凭据,一律不入永久记忆
跳过的原因写在响应头 X-Memory-Skip 里,一眼能查。
SDK / 多语言接入
核心只有两个 HTTP 接口:POST /v1/memories 写入、POST /v1/recall 检索。任何能发 HTTP 请求的语言都能接入,不需要专门的 SDK。
@daoshi/sdk 是嵌入式内核(记忆存本机文件、完全离线),
以离线包形式在控制台下载;其他语言一律直接调 REST。如果你在别处看到 pip install daoshi,那是旧文档,装不到。| 语言 | 方式 | 适合场景 |
|---|---|---|
| Python | REST + requests(下面有 30 行封装) | AI 应用、数据分析、自动化脚本 |
| Node.js | REST + fetch;或嵌入式 @daoshi/sdk 离线包 | Web 应用、桌面应用、离线设备 |
| C++ | REST + libcurl | 语音助手、车机、机器人、智能音箱 |
| Java / Kotlin | REST + OkHttp | Android 应用、后端服务 |
| Go | REST + net/http | 后端微服务、CLI 工具 |
| Swift | REST + URLSession | iOS / macOS 应用、Siri Shortcut |
Python
没有 pip 包,直接封装 REST(只依赖 requests)。字段名与 REST API 参考 一致:
import requests
class Daoshi:
def __init__(self, base_url, api_key, session_id=None):
self.base = base_url.rstrip("/")
self.h = {"Authorization": f"Bearer {api_key}"}
self.session_id = session_id
def _post(self, path, body):
r = requests.post(self.base + path, json=body, headers=self.h, timeout=10)
r.raise_for_status()
return r.json()
def store(self, content, role="user"):
body = {"items": [{"role": role, "content": content}]}
if self.session_id: body["sessionId"] = self.session_id
return self._post("/v1/memories", body)
def store_turn(self, user_said, ai_replied):
body = {"items": [{"role": "user", "content": user_said},
{"role": "assistant", "content": ai_replied}]}
if self.session_id: body["sessionId"] = self.session_id
return self._post("/v1/memories", body)
def recall(self, query, mode="associative"):
return self._post("/v1/recall", {"query": query, "mode": mode}).get("block", "")
def forget(self, memory_ids=None, mute_tag=None):
return self._post("/v1/forget", {"memoryIds": memory_ids, "tag": mute_tag})
def stats(self):
return requests.get(self.base + "/v1/stats", headers=self.h, timeout=10).json()
# 对话循环
from openai import OpenAI
mem = Daoshi("https://daoshi.me", "dsk_你的密钥")
ai = OpenAI()
def chat(user_input):
memory = mem.recall(user_input)
messages = ([{"role": "system", "content": memory}] if memory else []) \
+ [{"role": "user", "content": user_input}]
reply = ai.chat.completions.create(model="gpt-4o", messages=messages).choices[0].message.content
mem.store_turn(user_input, reply)
return reply只想要"每轮自动存取"而不想写这几行?那就走 代理网关,把 OpenAI(base_url=...) 指过来即可。
Node.js / TypeScript
两种形态,接口不一样:接这台服务用 REST;要完全离线、记忆存本机文件,用嵌入式内核。
形态一:REST(接这台服务)
const BASE = "https://daoshi.me", KEY = "dsk_你的密钥";
const h = { Authorization: "Bearer " + KEY, "Content-Type": "application/json" };
async function recall(query) {
const r = await fetch(BASE + "/v1/recall", { method: "POST", headers: h, body: JSON.stringify({ query }) });
return (await r.json()).block ?? "";
}
async function storeTurn(userSaid, aiReplied) {
await fetch(BASE + "/v1/memories", { method: "POST", headers: h, body: JSON.stringify({
items: [{ role: "user", content: userSaid }, { role: "assistant", content: aiReplied }],
}) });
}
// 对话循环
import OpenAI from "openai";
const ai = new OpenAI();
async function chat(userInput) {
const memory = await recall(userInput);
const messages = memory ? [{ role: "system", content: memory }] : [];
messages.push({ role: "user", content: userInput });
const resp = await ai.chat.completions.create({ model: "gpt-4o", messages });
const reply = resp.choices[0].message.content;
await storeTurn(userInput, reply);
return reply;
}形态二:嵌入式内核 @daoshi/sdk(完全离线)
没有上 npm。登录控制台在「SDK 嵌入」那一栏下载离线包(daoshi-sdk-<版本>.tgz),Node ≥ 22:
npm i ./daoshi-sdk-0.3.0.tgz
import { createMemory } from "@daoshi/sdk";
const mem = createMemory({ path: "./my-memory.db" }); // 一个文件就是全部记忆
await mem.remember("我家的橘猫叫饭团");
const block = await mem.recall("我家猫叫什么"); // 空串 = 没有达标记忆
await mem.rememberTurn("用户说的", "AI 回的");
await mem.forget({ memoryIds: [12] });
await mem.forget({ tag: "咖啡" }); // 静音一个标签
await mem.learnWord("尹雪光", "person"); // 教它认专名
await mem.recallDetailed("我家猫叫什么"); // 条目、分数、命中标签、耗时
await mem.stats(); // 记忆条数、标签图规模
await mem.close(); // 用完必须 close嵌入式形态与这台服务没有关系:记忆在你自己的 .db 里,不需要密钥。它带两个原生模块(SQLCipher 与分词),安装时会拉对应平台的预编译二进制。
C++ / 嵌入式设备
智能音箱、车机、机器人等嵌入式场景,用 C++ 通过 HTTP 调用 REST API。
#include <curl/curl.h>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
class DaoshiMemory {
std::string base_url, api_key;
public:
DaoshiMemory(const std::string& url, const std::string& key)
: base_url(url), api_key(key) {}
void store(const std::string& content, const std::string& role = "user") {
json body = {{"items", {{{"role", role}, {"content", content}}}}};
post("/v1/memories", body.dump());
}
std::string recall(const std::string& query) {
json body = {{"query", query}};
auto resp = post("/v1/recall", body.dump());
return json::parse(resp).value("block", "");
}
private:
std::string post(const std::string& path, const std::string& body);
// libcurl POST,带 Authorization: Bearer 头
};
// 语音助手主循环
DaoshiMemory mem("https://daoshi.me", "dsk_你的密钥");
void on_user_speech(const std::string& text) {
std::string memory = mem.recall(text);
std::string prompt = memory.empty() ? text : memory + "\n\nUser: " + text;
std::string reply = call_llm(prompt);
mem.store(text, "user");
mem.store(reply, "assistant");
speak(reply); // TTS 输出
}Java / Kotlin
// Java — OkHttp
public class DaoshiMemory {
private final OkHttpClient client = new OkHttpClient();
private final String baseUrl, apiKey;
public DaoshiMemory(String baseUrl, String apiKey) {
this.baseUrl = baseUrl; this.apiKey = apiKey;
}
public String recall(String query) throws Exception {
JSONObject body = new JSONObject().put("query", query);
Request req = new Request.Builder()
.url(baseUrl + "/v1/recall")
.header("Authorization", "Bearer " + apiKey)
.post(RequestBody.create(body.toString(),
MediaType.parse("application/json")))
.build();
try (Response resp = client.newCall(req).execute()) {
return new JSONObject(resp.body().string()).optString("block", "");
}
}
public void store(String content, String role) throws Exception {
JSONObject item = new JSONObject().put("role", role).put("content", content);
JSONObject body = new JSONObject().put("items", new JSONArray().put(item));
Request req = new Request.Builder()
.url(baseUrl + "/v1/memories")
.header("Authorization", "Bearer " + apiKey)
.post(RequestBody.create(body.toString(),
MediaType.parse("application/json")))
.build();
client.newCall(req).execute().close();
}
}
// Kotlin
val mem = DaoshiMemory("https://daoshi.me", "dsk_你的密钥")
val memory = mem.recall("我叫什么")Go
package daoshi
import ("bytes"; "encoding/json"; "net/http")
type Memory struct{ BaseURL, APIKey string }
func (m *Memory) Recall(query string) (string, error) {
body, _ := json.Marshal(map[string]string{"query": query})
req, _ := http.NewRequest("POST", m.BaseURL+"/v1/recall",
bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+m.APIKey)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil { return "", err }
defer resp.Body.Close()
var result struct{ Block string }
json.NewDecoder(resp.Body).Decode(&result)
return result.Block, nil
}
func (m *Memory) Store(content, role string) error {
type Item struct{ Role, Content string }
body, _ := json.Marshal(map[string]any{
"items": []Item{{role, content}},
})
req, _ := http.NewRequest("POST", m.BaseURL+"/v1/memories",
bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer "+m.APIKey)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil { return err }
resp.Body.Close()
return nil
}
// 使用
mem := &Memory{"https://daoshi.me", "dsk_你的密钥"}
block, _ := mem.Recall("我家猫叫什么")Swift(iOS / macOS)
import Foundation
class DaoshiMemory {
let baseURL: String, apiKey: String
init(baseURL: String, apiKey: String) {
self.baseURL = baseURL; self.apiKey = apiKey
}
func recall(_ query: String) async throws -> String {
var req = URLRequest(url: URL(string:
"\(baseURL)/v1/recall")!)
req.httpMethod = "POST"
req.setValue("Bearer \(apiKey)",
forHTTPHeaderField: "Authorization")
req.setValue("application/json",
forHTTPHeaderField: "Content-Type")
req.httpBody = try JSONSerialization.data(
withJSONObject: ["query": query])
let (data, _) = try await URLSession.shared.data(for: req)
let json = try JSONSerialization.jsonObject(with: data)
as? [String: Any]
return json?["block"] as? String ?? ""
}
func store(_ content: String, role: String = "user")
async throws {
var req = URLRequest(url: URL(string:
"\(baseURL)/v1/memories")!)
req.httpMethod = "POST"
req.setValue("Bearer \(apiKey)",
forHTTPHeaderField: "Authorization")
req.setValue("application/json",
forHTTPHeaderField: "Content-Type")
req.httpBody = try JSONSerialization.data(
withJSONObject: ["items": [
["role": role, "content": content]
]])
_ = try await URLSession.shared.data(for: req)
}
}
let mem = DaoshiMemory(baseURL: "https://daoshi.me", apiKey: "dsk_你的密钥")
let memory = try await mem.recall("我明天要做什么")REST API 参考
# 核心接口 POST /v1/memories # 写入记忆 POST /v1/recall # 检索记忆 # 管理接口 GET /v1/stats # 统计 GET /v1/profile # 画像 GET /v1/recent # 最近记忆 GET /v1/graph # 标签图 POST /v1/forget # 软删 / 静音 POST /v1/flush # 推进打标队列 POST /v1/dict # 词典管理 # 认证 Authorization: Bearer dsk_你的密钥 # 能力域 memory:read memory:write memory:forget memory:purge dict:write admin
写入记忆
curl -X POST https://daoshi.me/v1/memories \
-H "Authorization: Bearer dsk_你的密钥" \
-H "Content-Type: application/json" \
-d '{"items":[{"role":"user","content":"我家的橘猫叫饭团"}]}'检索记忆
curl -X POST https://daoshi.me/v1/recall \
-H "Authorization: Bearer dsk_你的密钥" \
-H "Content-Type: application/json" \
-d '{"query":"我家宠物叫什么"}'
# 返回 {"block":"以下是你说过的:...","items":[...],"empty":false}其他接口
curl https://daoshi.me/v1/stats -H "Authorization: Bearer dsk_你的密钥"
curl https://daoshi.me/v1/profile -H "Authorization: Bearer dsk_你的密钥"
curl -X POST https://daoshi.me/v1/forget -H "Authorization: Bearer dsk_你的密钥" \
-d '{"memoryIds":[42]}'框架集成
最省事:把框架的 base_url 指向代理网关
什么钩子都不用写,每轮自动存取(前提是在控制台配好模型上游):
# LangChain from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o", base_url="https://daoshi.me/v1", api_key="dsk_你的密钥") # LlamaIndex from llama_index.llms.openai import OpenAI llm = OpenAI(model="gpt-4o", api_base="https://daoshi.me/v1", api_key="dsk_你的密钥") # CrewAI from crewai import LLM llm = LLM(model="openai/gpt-4o", base_url="https://daoshi.me/v1", api_key="dsk_你的密钥")
自己控制注入:LangChain(LCEL 两个钩子)
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda
mem = Daoshi("https://daoshi.me", "dsk_你的密钥") # 见「Python」页那 30 行封装
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([("system", "{memory}"), ("human", "{input}")])
def inject(x):
return {"input": x["input"], "memory": mem.recall(x["input"]) or "(无相关记忆)"}
chain = RunnableLambda(inject) | prompt | llm
def chat(user_input):
reply = chain.invoke({"input": user_input}).content
mem.store_turn(user_input, reply) # 钩子二:写回
return replyLlamaIndex / CrewAI / AutoGen 同理:在拼 prompt 的地方调 recall,在拿到回复的地方调 store_turn。
Agent 框架:直接挂 MCP
OpenAI Agents SDK、Claude Agent SDK、Google ADK 这类原生支持 MCP 的框架,不用钩子,把 https://daoshi.me/mcp 当工具服务器挂上即可——写法见 模型 API 直连 MCP。