
1. 为什么每个 AI agent 都要你重新自我介绍一遍先说一个我反复遇到的场景早上在 Cursor 里改一个 Python 解析模块中午切到 Claude Code 继续调同一份逻辑晚上又用 Codex 写测试。三个工具都很聪明但它们有一个共同点——失忆。每开一个新会话我都得重新交代项目在哪个目录、我习惯用什么命名风格、上次那段 parsing 逻辑放在哪个文件、~/Downloads里的东西别动那是临时的。关掉窗口这些上下文全部蒸发。这不是模型能力问题是架构问题。当前主流 agent 工具的记忆是「会话级」的会话结束即销毁。你当然可以把这些信息塞进 system prompt但那只解决了「被问才回答」的一半。更往前一步的问题是能不能有一个常驻后台持续观察你在这台设备上的信息主动积累对你的理解让所有 agent 工具共享同一份「你是谁」的认知这就是 Kith / agent-sys 想解决的问题。一句话概括它是一个常驻本地的守护进程daemon持续扫描你指定的目录用 LLM 理解每个文件把结果存进本地 SQLite再通过 RPC 暴露给外部 agent 调用。它默认扫~/Documents、~/DesktopLLM 负责给文件打标签、做摘要、抽取知识点、生成个人画像对外提供 Unix Socket 和 HTTP 两种接口数据 100% 留在本地除了发给 LLM 的那一小部分内容。适合谁如果你同时用两个以上 AI 编码工具、经常需要重复交代背景、或者在做本地 agent 基础设施这套东西值得一看。本文会给出可复制的 daemon 配置、RPC 接口定义、TaoToken 接入参数并演示一次完整的 agent 记忆读写验证流程。核心检索词就三个Kith、agent-sys、AI agent 长期记忆后台。2. 为什么选 daemon 而不是 MCP server以及 TaoToken 前置准备这是我做的第一个硬决策也是很多人会问的现在 MCP 这么火为什么不用 MCP server答案在生命周期。MCP server 是由调用方拉起、调用方退出时终止的。而 agent-sys 要做的事——慢慢扫 21 万个文件、每天跑一次 daily report、watch 文件变化——天然需要独立寿命。你 Cursor 关了我还得跑你 Claude Code 退出了索引不能停。所以形态上必须是 daemon协议层用最无聊的 HTTP任何语言、任何工具只要能发 HTTP 就能用。MCP 那套 stdio 通信、capability negotiation 的复杂度在本地单用户单机场景下一点都用不上。选协议时先问「我在解决什么问题」不是「什么协议最新最潮」。接下来是模型能力接入。daemon 里的 LLM 业务逻辑triage 分诊、summarizer 摘要、cron 决策都需要调模型。如果每个 agent 各自配一套 Key管理会非常乱。我的做法是用 TaoToken 统一 Key/API 通道所有模型调用走同一个入口。TaoToken 是什么它是一个统一的模型 API 网关把不同厂商的模型能力收敛到一套 Base URL Key 的调用方式上。对 agent-sys 这种「一个 daemon 里跑十几个 agent、每个 agent 可能用不同模型」的场景特别合适——你不需要为每个 agent 单独申请和轮换 Key改一处配置就能切换底层模型。前置准备三步第一步注册并拿到 Key。访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 完成注册然后进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsole 创建 API Key。Key 只在创建时显示一次记得立刻存到安全的地方。第二步确认你要用的 Model ID。进模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chat 可以试跑确认哪个模型适合你的 triage 和 summarizer 任务。triage 这种批量分类任务用便宜快速的模型就够summarizer 需要理解长文本可以选能力更强的。第三步记下 API 地址。TaoToken 的 API 端点是 https://taotoken.net/api注意这个地址不加 UTM 参数直接用于代码里的 Base URL。三件套凑齐Base URL https://taotoken.net/apiKey 你刚创建的那串Model ID 你在对话页确认的模型名。后面所有配置都围绕这三个值展开。3. 可复制的 daemon 配置与 TaoToken 接入参数这一节是全文最实操的部分。agent-sys 的配置分两块daemon 自身的运行配置和 LLM 通道的接入配置。我按文件路径给你完整片段直接抄改就能跑。先看 daemon 主配置config/default.yaml。这里定义扫描范围、triage 规则、调度策略# config/default.yaml daemon: host: 127.0.0.1 port: 7437 socket_path: ~/.agent_sys/agent_sys.sock auth_token_path: ~/.agent_sys/auth_token scan_roots: - ~/Documents - ~/Desktop watch: true triage: skip_path_patterns: - site-packages/ - node_modules/ - .cursor/extensions/ - __pycache__/ - .venv/ file_type_priority: .md: 9 .py: 8 .docx: 9 .txt: 2 hints: - Downloads 文件夹里的 PDF 多是学习资料值得总结 - 带 test_ 前缀的 python 文件通常是测试可以降级 memory: lru_cache_size: 5000 sqlite_path: ~/.agent_sys/memory.db scheduler: max_concurrency: 4 daily_report_at: 03:00然后是 LLM 通道配置这是 TaoToken 接入的核心。agent-sys 把所有模型调用收敛到一个llm配置块用 OpenAI 兼容格式# config/llm.yaml llm: provider: openai_compatible base_url: https://taotoken.net/api api_key: ${TAOTOKEN_API_KEY} default_model: claude-sonnet-4-5 timeout: 120 max_retries: 3 agents: triage: model: gpt-4o-mini temperature: 0.1 max_tokens: 512 summarizer: model: claude-sonnet-4-5 temperature: 0.3 max_tokens: 2048 cron_decider: model: gpt-4o-mini temperature: 0.0 max_tokens: 1024注意api_key用的是环境变量引用不要把 Key 硬编码进文件。启动前导出export TAOTOKEN_API_KEYsk-你的key如果你用 Claude Code 做开发它的配置在~/.claude/settings.json同样三件套{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的key, ANTHROPIC_MODEL: claude-sonnet-4-5 } }如果你用 Codex配置在~/.codex/auth.json{ OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的key, model: gpt-4o-mini }三件套在任何工具里都是同一个逻辑Base URL 指向 TaoToken 的 API 端点Key 用你创建的那串Model ID 用你在对话页确认的。Cline 的 MCP 配置也是同理在cline_mcp_settings.json里把 provider 设成 openai compatiblebase_url 填https://taotoken.net/api。配置写完后启动 daemonpython -m agent_sys.kernel.daemon --config config/default.yaml --llm-config config/llm.yaml启动日志里会看到子系统初始化顺序kernel 加载生命周期、syscall 挂载 RPC 端点、scheduler 启动优先级队列、memory 打开 SQLite、agents 注册业务逻辑。如果 LLM 通道配置正确你会看到llm channel ready: https://taotoken.net/api这一行。4. 验证一次完整的 agent 记忆读写流程配置跑起来只是第一步真正要验证的是「agent 能不能读到关于你的记忆」。这一节走一遍完整流程写入记忆、通过 RPC 读取、让外部 agent 消费。先确认 daemon 活着curl http://127.0.0.1:7437/health # {status: ok, uptime: 42, agents: 12}/health和/status不鉴权方便监控。/syscall和/reload必须带 token。token 在~/.agent_sys/auth_token权限 0600TOKEN$(cat ~/.agent_sys/auth_token)现在触发一次 triage让 daemon 扫描并理解文件。这一步会调 TaoToken 通道curl -X POST http://127.0.0.1:7437/syscall \ -H X-Agent-Token: $TOKEN \ -H Content-Type: application/json \ -d {call_type: triage.run, params: {limit: 200}, caller: manual}返回会告诉你分诊了多少文件、跳过了多少、消耗了多少 token。第一次跑建议 limit 设小一点确认通道通了再放大。接着写入一条显式记忆——比如告诉 daemon「X 是 Y 的代号」curl -X POST http://127.0.0.1:7437/syscall \ -H X-Agent-Token: $TOKEN \ -H Content-Type: application/json \ -d {call_type: memory.write, params: {key: codename, value: Kith 指代 agent-sys 项目, tags: [project]}, caller: manual}然后读取用户上下文简报这是外部 agent 最常调的端点curl -X POST http://127.0.0.1:7437/syscall \ -H X-Agent-Token: $TOKEN \ -H Content-Type: application/json \ -d {call_type: report.brief, params: {}, caller: cursor}返回是一段自然语言简报包含你最近在做什么、有哪些高优先级文件、显式记忆里的代号。这就是「认识你」的后台对外输出的东西。最后一步让 Cursor 或 Claude Code 通过 skill 消费它。skill 就是一个带 YAML frontmatter 的 markdown丢进~/.cursor/skills/或~/.claude/skills/--- name: agent-sys-user-context description: Use when the user asks based on what you know about me, what have I been working on, do you know me yet. --- You have access to a local daemon. To fetch the users current context: bash TOKEN$(cat ~/.agent_sys/auth_token) curl -X POST http://127.0.0.1:7437/syscall \ -H X-Agent-Token: $TOKEN \ -d {call_type: report.brief, params: {}, caller: cursor}Return a one-paragraph synthesis grounded only in the brief.skill 是接入面daemon 是能力源。同一份 SKILL.md 丢进不同工具的 skills 目录都能工作不用为每个新 agent 工具单独开发集成。 验证成功的标志你在 Cursor 里问「你了解我吗」它不再让你从头介绍而是直接说出你最近在做的项目和偏好。那一刻这套后台就算跑通了。 ## 5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth 配置和验证过程中最容易踩的坑集中在四类报错。我按真实遇到的顺序列出来对照排查。 **401 unauthorized**。这是最高频的。分两种一种是 daemon 的 X-Agent-Token 不对检查 ~/.agent_sys/auth_token 内容和你 header 里带的是否一致注意别把换行符带进去。另一种是 TaoToken 通道的 Key 不对检查 TAOTOKEN_API_KEY 环境变量是否导出、是否在 daemon 启动的同一个 shell 里。如果 Key 正确还报 401确认 Base URL 是不是写成了带路径的形式——正确值是 https://taotoken.net/api不要多加 /v1 之类的后缀。 **local proxy failed**。这个报错通常出现在 daemon 尝试连 LLM 通道时。先确认 config/llm.yaml 里 base_url 拼写正确再确认本机网络能访问 taotoken.net。如果 daemon 跑在容器里检查容器网络是否能出网。还有一种情况是 timeout 设太短长文本摘要任务 120 秒不够调到 300。 **reading choices 相关报错**。这类报错一般出现在解析 LLM 返回时。TaoToken 返回的是 OpenAI 兼容格式choices[0].message.content 是正文。如果你的代码直接读 response[content] 就会报 KeyError。检查你的解析逻辑是否按 choices 数组取。另外 triage 任务如果 max_tokens 设太小比如 128返回会被截断导致 JSON 解析失败调到 512 以上。 **OAuth 相关报错**。如果你在 Claude Code 里看到 OAuth 报错说明它还在走默认的登录流程而不是你配的 Base URL。检查 ~/.claude/settings.json 里 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY 是否都设了两个缺一不可。设完后重启 Claude Code让它重新读配置。Codex 同理检查 ~/.codex/auth.json 的 OPENAI_BASE_URL。 排查通用思路先看 daemon 日志里 LLM 通道那行是否 ready再用一条最小 curl 直接打 TaoToken 的 API 确认 Key 和网络没问题最后才怀疑业务代码。分层定位能省很多时间。 ## 6. 把记忆后台接进你的日常编码流 跑通之后真正让它产生价值的是接进日常流程。我的做法是三个 skill 常驻agent-sys-user-context 查上下文、agent-sys-file-search 搜文件、agent-sys-admin 管 daemon加起来不到 300 行。每次开新会话agent 自己判断该不该调不需要我手动触发。 下一步值得做的是双向对话。现在 agent 只能读还应该能写——通过 syscall 告诉 daemon「这个文件很重要升级成 high」「帮我记住 X 是 Y 的代号」。单向消费变双向后台才会越用越懂你。 如果你也在为「每次对 agent 都要重新自我介绍」挠头或者在做类似的本地 agent 基础设施可以从最小配置跑起先配好 TaoToken 三件套启动 daemon跑一次 triage再写一个 skill 丢进 Cursor。跑通那一刻你会明白agent 不该每次被召唤才出现它该是持续存在的背景智能。