封神组合!Claude Code+LLM Wiki+Obsidian 一站式打通 AI 知识库:把 Skills 配置改到 TaoToken
1. 为什么 Claude Code LLM Wiki Obsidian 会卡在 401 和 local proxy failedClaude Code、LLM Wiki、Obsidian 这套组合本质上是在本地把「笔记仓库」变成「可被 Agent 检索的记忆体」。Obsidian 负责存文件LLM Wiki 负责给知识库加记忆层Claude Code 负责执行 Ingest、Query、Lint 这些工作流。听起来很顺但真正跑起来十有八九会先撞上两个报错401 Unauthorized和local proxy failed。这两个错看着像网络问题其实大多数时候是 Skills 配置里的模型接入信息没对齐。Claude Code 在调用外部模型时会读取.claude/settings.json或 Skills 里的环境变量如果 Base URL 指向了一个不可用的地址或者 Key 和地址不匹配就会先报 401如果本地代理层没起来或者端口被占用就会报 local proxy failed。我试过把这套链路拆开看Obsidian 本身不碰网络它只负责读写 MarkdownLLM Wiki 的 Skills 是纯文本工作流也不直接发请求真正发请求的是 Claude Code 调用的模型客户端。所以问题一定出在「Claude Code 怎么找到模型」这一层。适合谁看这篇如果你已经在 Obsidian 里建好了知识库也把 LLM Wiki 的 Skills 放进了.claude/skills但一执行/ingest或/query就报错那这篇就是给你写的。下面我会从目录结构开始把 Skills 配置、Base URL 改写、验证请求、常见报错排查一次讲清楚。先明确一个概念LLM Wiki 不是某个软件而是 Karpathy 提的那套 Ingest、Query、Lint 工作流。你可以用软件实现也可以用 Skills 实现。用 Skills 的好处是目录和功能都能改坏处是配置得自己写写错一个字段就报错。2. TaoToken 前置把模型接入层先固定下来在改 Skills 之前先把模型接入层固定下来。Claude Code 需要一个兼容 Anthropic 或 OpenAI 协议的端点TaoToken 提供的就是这个端点。你不需要改 Claude Code 的源码只需要在配置里把 Base URL 和 Key 填对。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。注意 API 地址后面不加 UTM 参数直接写进配置里就行。你需要准备三样东西Base URL、API Key、Model ID。这三件套在 Claude Code、Cline MCP、Codex auth.json 里都是通用的。Base URL 填https://taotoken.net/apiKey 在控制台创建Model ID 根据你用的模型填比如claude-sonnet-4-20250514这类。创建 Key 的入口在控制台里打开 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后找到 API Keys 页面点创建。创建完复制出来只显示一次丢了就重新建。如果你还没决定用哪个模型可以先到模型对话页面试一下 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 确认模型能正常返回再写进配置。长期编码或 Agent 场景可以看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 按用量选更划算。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有不同客户端的配置示例。Claude Code 的接入可以参考 ClaudeCodeAnthropic 页面 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 里面写了 Anthropic 协议的 Base URL 怎么填。这里有个坑很多人把 Base URL 写成https://taotoken.net/api/v1结果报 404 或 401。正确写法是https://taotoken.net/api具体路径由客户端自己拼。如果你用的是 Anthropic 协议有些客户端要求填https://taotoken.net/api后自动加/v1/messages这个要看客户端文档。Key 的权限也要注意。如果你创建的是只读 Key调用模型时会报 401 或 403。创建时选可调用模型的权限。另外 Key 不要提交到 GitSkills 配置文件里可以用环境变量引用避免泄露。把这三件套准备好之后再往下改 Skills 配置。顺序不能反先有可用的接入层再改工作流否则你分不清是 Skills 写错了还是 Key 不对。3. 可复制配置Skills 文件与 settings.json 改写步骤这一节是核心。你要改两个地方一个是 Claude Code 的settings.json一个是 Skills 里的模型调用配置。先看目录结构。Obsidian 知识库根目录下建.claude文件夹里面放settings.json和skills目录。Skills 目录里每个技能一个文件夹比如ingest、query、lint每个文件夹里放SKILL.md和可选的脚本。先写settings.json。路径是你的知识库/.claude/settings.json。内容如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [ Read, Write, Bash ] } }注意ANTHROPIC_BASE_URL后面不要加/v1也不要加斜杠结尾。ANTHROPIC_API_KEY填你刚创建的 Key。ANTHROPIC_MODEL填 Model ID不确定就先填一个后面验证时再调。如果你用的是 Codex 或 Cline配置位置不同。Codex 的auth.json路径通常在~/.codex/auth.json内容类似{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-sonnet-4-20250514 }Cline MCP 的配置在 Cline 设置里Base URL 填https://taotoken.net/apiKey 填同一个Model ID 填同一个。三件套保持一致不要一个填 A 一个填 B。接下来写 Skills。以ingest为例路径是知识库/.claude/skills/ingest/SKILL.md。内容如下--- name: ingest description: 把 raw 目录下的原始资料整理成 wiki 条目 --- # Ingest 读取 raw/Articles、raw/Papers、raw/Transcripts 下的文件按以下步骤处理 1. 提取摘要写入 wiki/Sources/ 2. 提取概念写入 wiki/Concepts/ 3. 提取实体写入 wiki/Entities/ 4. 更新 wiki/Index/ 5. 把原文移到 raw/Archive/ 6. 在 wiki/Log/ 记录本次操作 调用模型时使用 settings.json 里的 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY。query和lint类似query负责检索和生成图表lint负责检查死链和不关联链接。三个 Skills 都放在.claude/skills下Claude Code 启动时会自动加载。目录结构建议按 excerpt 里那套来raw下分Articles、Papers、Transcripts、Meeting_notes、Archive、Assetswiki下分Concepts、Entities、Sources、Bridge、Index、Log。你可以按自己习惯改但改完要同步改 SKILL.md 里的路径。改完配置后重启 Obsidian让 Claudian 插件重新加载.claude目录。然后在 Claudian 聊天窗口输入/应该能看到ingest、query、lint三个技能。如果看不到检查 Skills 目录层级是不是多了一层比如.claude/skills/skills/ingest这种就错了。配置里最容易错的是 Base URL 结尾的斜杠和/v1。我踩过的坑是写了https://taotoken.net/api/结果请求变成//v1/messages报 404。去掉结尾斜杠就好了。4. 验证请求从报错到跑通的一次完整动作配置写完先别急着跑全量 Ingest。用一个最小请求验证接入层通不通。在 Claudian 聊天窗口输入/query 测试一下模型是否可用如果返回正常文本说明 Base URL、Key、Model ID 三件套都对。如果报 401往下看第 5 节。如果报 local proxy failed也往下看。更稳的验证方式是直接用 curl 打一次 API。在终端执行curl -X POST https://taotoken.net/api/v1/messages \ -H Content-Type: application/json \ -H x-api-key: sk-你的Key \ -H anthropic-version: 2023-06-01 \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: ping}] }如果返回 JSON 里有content字段说明接入层没问题。如果返回401检查 Key 是否复制完整、是否有调用权限。如果返回404检查 Base URL 是不是多写了/v1。接入层通了之后再跑一次完整 Ingest。在知识库raw/Articles下放一篇 Markdown 文章然后在 Claudian 输入/ingest正常流程是Claude Code 读取文章调用模型生成摘要和概念写入wiki/Sources和wiki/Concepts更新wiki/Index把原文移到raw/Archive最后在wiki/Log写一条记录。跑通后你会看到wiki/Log里多了一条记录类似## 2025-06-01 10:23 Ingest - 来源raw/Articles/test.md - 生成wiki/Sources/test.md, wiki/Concepts/xxx.md - 状态成功如果 Ingest 跑到一半报reading choices错误通常是模型返回格式和 Skills 预期不一致。检查 SKILL.md 里有没有要求模型返回 JSON如果有确认模型确实返回了 JSON。有些模型在长上下文下会返回纯文本导致解析失败。验证 Query 时输入/query 我的知识库里有哪些关于 LLM Wiki 的概念正常会返回wiki/Concepts下相关条目的摘要和链接。如果返回空检查wiki/Index是否更新了。Index 没更新Query 就找不到。验证 Lint 时输入/lint正常会扫描wiki目录报告死链和不关联链接并写入wiki/Log。如果 Lint 报local proxy failed说明本地代理层没起来看下一节。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节按报错对照排查。先看 401。401 Unauthorized出现时先确认三件事Key 是否正确、Base URL 是否匹配、Key 是否有调用权限。最常见的是 Key 复制时带了空格或者复制的是只读 Key。到控制台 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 重新创建一个可调用的 Key替换settings.json里的ANTHROPIC_API_KEY。如果 Key 没问题检查 Base URL。Anthropic 协议填https://taotoken.net/apiOpenAI 协议也填https://taotoken.net/api。不要填https://taotoken.net/api/v1也不要填https://taotoken.net。填错会报 401 或 404。local proxy failed通常出现在 Claude Code 启动时。原因是 Claude Code 会起一个本地代理进程如果端口被占用或者代理进程没权限启动就报这个错。排查步骤先看有没有其他 Claude Code 实例在跑关掉重开再看防火墙有没有拦本地端口最后看.claude目录权限确保当前用户可读写。如果local proxy failed伴随ECONNREFUSED说明代理进程根本没起来。可以手动在终端跑一次 Claude Code看完整日志。日志里会写代理监听哪个端口以及为什么失败。reading choices错误一般出现在模型返回后。Claude Code 期望模型返回特定结构但模型返回了纯文本或格式不对。解决方式是改 SKILL.md把输出格式要求写得更明确比如「必须返回 JSON字段包括 summary、concepts、entities」。如果模型还是返回纯文本换一个指令遵循更好的 Model ID。OAuth错误通常出现在你用 Claude Code 官方登录方式时。如果你已经改用 API Key就不应该走 OAuth。检查settings.json里有没有残留的 OAuth 配置比如oauth_account字段有就删掉。Claude Code 会优先读 OAuth读不到才读 API Key。还有一个隐蔽的错Skills 加载了但没生效。原因是.claude/skills目录层级不对或者 SKILL.md 的 frontmatter 格式错了。frontmatter 必须是---开头和结尾name和description必填。缺一个就加载失败。排查时建议开 Claude Code 的 debug 日志。在settings.json里加{ env: { ANTHROPIC_LOG: debug } }重启后看日志能看到请求发到哪个 URL、返回什么状态码。这比猜快得多。如果所有配置都对但 Query 还是找不到内容检查wiki/Index是不是空的。Index 是 Query 的入口Ingest 没更新 IndexQuery 就查不到。手动跑一次/ingest确认 Index 有内容。6. 把知识库问答链路稳定跑起来配置改完、验证通过之后这套链路就算跑起来了。但「跑起来」和「稳定跑」是两回事。稳定跑的关键是让 Skills 的输出格式固定下来这样 Ingest、Query、Lint 之间才能互相衔接。我的做法是在每个 SKILL.md 里加一段「输出契约」明确写清楚模型必须返回什么字段。比如 Ingest 必须返回summary、concepts、entities、source_path四个字段Query 必须返回answer、references、confidence三个字段。字段固定了后续解析就不会出错。另一个稳定技巧是把 Model ID 写死在settings.json里不要依赖默认值。默认值可能随客户端版本变写死之后行为一致。如果你要换模型改一个地方就行。长期用的话建议把wiki/Log当成审计日志。每次 Ingest、Query、Lint 都写一条出问题时能回溯是哪一步错了。Log 里记时间、操作类型、输入文件、输出文件、状态。这样即使上下文丢了也能从 Log 恢复。如果你要把这套链路用到团队注意 Key 不要共享。每个人用自己的 Keysettings.json放本地不要提交到仓库。Skills 可以共享因为里面只有工作流没有密钥。最后一步是定期跑 Lint。知识库越大死链和不关联链接越多。每周跑一次/lint让它自动修复或报告。修复记录会写进wiki/Log方便追踪。到这里Claude Code、LLM Wiki、Obsidian 就在一个软件里打通了。你不需要在三个软件之间切来切去所有操作都在 Obsidian 的 Claudian 窗口里完成。Skills 的目录和功能都可以按自己习惯改改完重启 Obsidian 就生效。