1. 为什么 Claude Code + LLM Wiki + Obsidian 会卡在 401 和 local proxy failed
Claude 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 本身不碰网络,它只负责读写 Markdown;LLM 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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_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/api,Key 在控制台创建,Model ID 根据你用的模型填,比如claude-sonnet-4-20250514这类。
创建 Key 的入口在控制台里,打开 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,登录后找到 API Keys 页面,点创建。创建完复制出来,只显示一次,丢了就重新建。
如果你还没决定用哪个模型,可以先到模型对话页面试一下 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite ,确认模型能正常返回再写进配置。长期编码或 Agent 场景,可以看 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,按用量选更划算。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有不同客户端的配置示例。Claude Code 的接入可以参考 ClaudeCodeAnthropic 页面 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite ,里面写了 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 不要提交到 Git,Skills 配置文件里可以用环境变量引用,避免泄露。
把这三件套准备好之后,再往下改 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/api,Key 填同一个,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、Assets;wiki下分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_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 重新创建一个可调用的 Key,替换settings.json里的ANTHROPIC_API_KEY。
如果 Key 没问题,检查 Base URL。Anthropic 协议填https://taotoken.net/api,OpenAI 协议也填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 没更新 Index,Query 就查不到。手动跑一次/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 不要共享。每个人用自己的 Key,settings.json放本地,不要提交到仓库。Skills 可以共享,因为里面只有工作流,没有密钥。
最后一步是定期跑 Lint。知识库越大,死链和不关联链接越多。每周跑一次/lint,让它自动修复或报告。修复记录会写进wiki/Log,方便追踪。
到这里,Claude Code、LLM Wiki、Obsidian 就在一个软件里打通了。你不需要在三个软件之间切来切去,所有操作都在 Obsidian 的 Claudian 窗口里完成。Skills 的目录和功能都可以按自己习惯改,改完重启 Obsidian 就生效。