
1. 为什么我把小红书笔记流程搬进了 Codex Obsidian做小红书最让人焦虑的不是写不出来而是阅读量忽高忽低。同一套选题逻辑昨天 8 万阅读今天 300 阅读你根本不知道变量出在哪。我试过把「找对标、挖评论、建选题库、写正文、配图」这五步全手动跑一遍一篇笔记从选题到成稿要两个多小时而且质量完全取决于当天状态。后来我把这套流程拆成了可复用的 Skills跑在 Codex 里素材和选题沉淀到 Obsidian模型侧统一走 TaoToken 的 API。核心变化是Codex 负责编排和生成Obsidian 负责长期记忆TaoToken 负责稳定调用 GPT 系列模型。三者拼起来才是一套能持续产出 5 位数阅读笔记的全栈工作流。这篇文章交付三样东西Codex 接入 TaoToken 的config.toml骨架、Obsidian 里 Skills 的目录结构与提示词模板、以及从选题到成稿的验证动作。适合已经在用 Obsidian 做知识管理、又想用 Codex 把内容生产流程自动化的同学。如果你还没配好模型接入先把第 2 节看完再动手。2. TaoToken 前置把模型通道先打通Codex 本身是编排层真正干活的是背后的模型。我选择用 TaoToken 作为统一入口原因是它同时提供 OpenAI 兼容接口和 Claude Code 兼容接口一套 Key 能覆盖 GPT 系列和 Claude 系列切换模型不用改代码结构。你需要先拿到 API Key。打开控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_obsidian_skills创建完 Key 之后在 API Keys 页面可以查看和复制https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_obsidian_skills接口地址统一用https://taotoken.net/api注意这个地址不加任何查询参数。Codex 的配置走 OpenAI 兼容格式所以base_url填https://taotoken.net/api/v1即可。注意Key 只显示一次复制后立刻存进密码管理器。不要写进会提交到 Git 的文件里后面我会用环境变量隔离。如果你更习惯用 Claude Code 那套交互TaoToken 也提供了对应的接入文档配置方式略有不同https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_obsidian_skills3. 可复制配置config.toml 骨架与 Obsidian 目录结构3.1 Codex 的 config.toml 骨架Codex 的配置文件默认在~/.codex/config.toml。下面是我实际在用的骨架把模型指向 TaoToken同时保留本地 Skills 的加载路径# ~/.codex/config.toml model gpt-4o model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api/v1 env_key TAOTOKEN_API_KEY wire_api chat [skills] # Skills 根目录指向 Obsidian 仓库里的 skills 文件夹 root /Users/yourname/Obsidian/ContentVault/skills auto_load true [history] persistence save-allenv_key这一行是关键Codex 会从环境变量TAOTOKEN_API_KEY读取密钥而不是把 Key 硬编码进配置文件。在~/.zshrc或~/.bashrc里加一行export TAOTOKEN_API_KEYsk-你的Key然后source ~/.zshrc生效。这样即使你把config.toml同步到多台机器也不会泄露密钥。3.2 Obsidian 里的 Skills 目录结构Obsidian 仓库我单独建了一个ContentVaultSkills 全部放在skills/下。每个 Skill 是一个独立文件夹包含一个SKILL.md描述文件和可选的提示词模板ContentVault/ ├── skills/ │ ├── find-trend/ │ │ └── SKILL.md │ ├── search-viral/ │ │ └── SKILL.md │ ├── mine-comments/ │ │ └── SKILL.md │ ├── build-topic-library/ │ │ └── SKILL.md │ └── write-note/ │ ├── SKILL.md │ └── prompt.md ├── topics/ │ └── 选题库.md └── notes/ └── 已发布笔记.mdSKILL.md的写法直接决定 Codex 能不能正确调用。以search-viral/SKILL.md为例--- name: search-viral description: 搜索指定领域近 30 天的小红书爆款笔记输出标题、互动数据和链接 trigger: 当用户要求找对标或搜爆款时调用 --- # 搜索爆款笔记 ## 输入 - 领域关键词如AI副业 - 时间范围默认近30天 ## 输出格式 | 标题 | 点赞 | 收藏 | 评论 | 发布时间 | |------|------|------|------|----------| ## 约束 - 只保留点赞 1000 的笔记 - 按点赞降序排列 - 结果同时写入 topics/选题库.mdtrigger字段是给 Codex 看的路由提示它决定了你说「帮我找对标」时会不会命中这个 Skill。description要写清楚能力边界否则 Codex 容易把多个 Skill 混在一起调用。3.3 提示词模板write-note/prompt.md写笔记的 Skill 我单独拆了一个提示词模板方便迭代你是一个小红书爆款笔记写手。请基于以下素材写一篇笔记 ## 参考选题 {{topic}} ## 对标笔记结构 {{reference_structure}} ## 评论区高频需求 {{comment_needs}} ## 输出要求 1. 标题 20 字以内带数字或反差 2. 正文分 3-4 段每段不超过 3 行 3. 结尾留一个互动问题 4. 单独输出 3 个备选标题{{}}占位符由 Codex 在调用时从 Obsidian 的topics/选题库.md里读取填充。这样提示词和素材分离改模板不影响历史数据。4. 验证请求从选题到成稿跑一遍配置完成后先做一次最小验证确认 Codex 能正确调用 TaoToken 并加载 Skills。4.1 验证模型通道在终端里直接发一个请求curl https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: 回复 OK}] }返回里能看到choices[0].message.content为OK说明 Key 和地址都没问题。如果返回 401检查环境变量有没有生效返回 404检查base_url是不是写成了https://taotoken.net/api少了/v1。4.2 验证 Skills 加载启动 Codex输入列出当前加载的所有 skills正常会输出find-trend、search-viral、mine-comments、build-topic-library、write-note五个。如果少了检查config.toml里的root路径是不是指向了 Obsidian 仓库的绝对路径。4.3 跑通完整链路输入第一条指令帮我找 AI 副业领域近 30 天的爆款笔记Codex 会命中search-viral几分钟后返回一个表格同时把结果写进topics/选题库.md。打开 Obsidian 能看到新增的条目。第二条指令挖一下这些笔记评论区的需求命中mine-comments输出高频需求词和典型评论。第三条指令参考 Obsidian 选题库写一篇 AI 副业的小红书笔记命中write-note读取prompt.md模板输出正文和 3 个备选标题。整个过程你只发了三句话中间的情报整理和素材生产全部由 Skills 完成。4.4 成功结果的判断标准跑通之后Obsidian 的topics/选题库.md应该有结构化条目notes/已发布笔记.md里能看到生成的正文。Codex 的输出里不应该出现「我无法访问网络」这类话如果出现说明 Skill 的description没写清楚Codex 没把它当成可执行能力。5. 本篇常见错排查5.1 401 Unauthorized最常见的原因是环境变量没生效。echo $TAOTOKEN_API_KEY如果输出为空说明source没执行或者写错了文件。另一个原因是 Key 复制时带了空格重新从 API Keys 页面复制一次。5.2 Codex 不调用 Skill如果输入「找对标」但 Codex 直接用自己的知识回答说明 Skill 没被加载。检查三处config.toml的root路径、SKILL.md的trigger字段、以及auto_load是否为true。trigger里要包含用户可能说的原话比如「找对标」「搜爆款」「看看别人怎么写的」。5.3 写入 Obsidian 失败Codex 写文件需要绝对路径。SKILL.md里如果写的是相对路径topics/选题库.md它会写到当前工作目录而不是 Obsidian 仓库。改成/Users/yourname/Obsidian/ContentVault/topics/选题库.md或者用config.toml里的root做拼接。5.4 模型返回截断长笔记生成到一半停了通常是max_tokens没设够。在config.toml的[model_providers.taotoken]下加一行max_tokens 4096。如果还是截断把write-note的提示词拆成「先出标题再出正文」两步。5.5 多个 Skill 冲突比如你说「找对标并写笔记」Codex 可能同时命中search-viral和write-note导致输出混乱。解决办法是在SKILL.md的description里写清楚依赖关系比如write-note的description加上「需要先有选题库数据不负责搜索」。6. 长期跑下去把 Coding Plan 用起来这套工作流跑顺之后你会发现瓶颈不在写笔记而在 Skills 本身的迭代。每次调整提示词、增加新的 Skill、优化 Obsidian 目录结构都是一次小型的编码任务。这时候用按次计费的 API 就不划算了。TaoToken 的 Coding Plan 适合这种长期、高频的编码场景包月制不用每次调用都算 tokenhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_obsidian_skills如果你只是想先验证模型效果用模型对话页面直接试https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_obsidian_skills接入过程中遇到报错优先查接入文档里面按错误码列了排查步骤https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcodex_obsidian_skills最后说一个我踩过的坑Skills 的SKILL.md不要写太长超过 200 行 Codex 反而容易忽略关键字段。把详细逻辑放进prompt.mdSKILL.md只保留name、description、trigger和输入输出格式。这样加载快路由也准。