技能包配合 Obsidian,TaoToken 给 Harness 复盘供 Key

发布时间:2026/9/18 13:19:44
技能包配合 Obsidian,TaoToken 给 Harness 复盘供 Key
1. 从 Harness 复盘超时说起Obsidian 技能包为什么要换模型入口前天晚上跑里程碑复盘DeepSeek Harness 的日志停在provider init timeout after 120sObsidian 里那条20-Projects/alpha/复盘.md一直没生成候选知识。问题不在技能包也不在 Obsidian而是 Harness 调用模型的入口没有稳定落到一个可配置的 OpenAI 兼容端点。我的做法很简单到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_intro 拿 Key在 Harness 复盘调用里把 API Base 设为https://taotoken.net/apiKey 用占位符YOUR_API_KEY管理。这样 Obsidian、技能包、Harness 三层解耦复盘任务不再绑定某个临时入口。这套东西的核心不是“再做一个知识库”而是让知识库里的技能包能被 Harness 调度并且把调度所需的模型 Key 统一收口。Obsidian 负责文档、双链和人工维护规则技能包负责把“每日日志、里程碑复盘、月度健康检查”拆成可执行任务Harness 负责跑 Agent 和插件TaoToken 提供 Key 与 API Base。下面把我这套“技能包 Obsidian Harness 复盘”的可复现路径拆开写包括目录、命令、配置和输出样例。2. 技能包目录怎么摆Obsidian、Harness、复盘输出三层分离我不建议把技能包直接塞进.obsidian/plugins因为插件目录容易在升级时被覆盖也不方便用 Git 做版本管理。更稳的做法是在 Vault 根目录建99-Skills把每个技能做成一个独立文件夹再用 Harness 的启动脚本去读它。目录可以这样摆MyVault/ ├── .obsidian/ │ └── plugins/ │ ├── templater-obsidian/ │ ├── quickadd/ │ └── shell-commands/ ├── 00-Inbox/ │ ├── 2025-01-15.md │ └── 审批队列/ ├── 10-Notes/ │ ├── 案例库/ │ └── 工作流/ ├── 20-Projects/ │ └── alpha/ │ ├── 里程碑.md │ └── 复盘.md ├── 90-Templates/ │ ├── daily-log.md │ └── milestone-retro.md ├── 99-Skills/ │ ├── daily-log-extractor/ │ │ ├── SKILL.md │ │ ├── schema.json │ │ └── prompt.md │ ├── milestone-retro/ │ │ ├── SKILL.md │ │ ├── schema.json │ │ └── prompt.md │ └── monthly-health-check/ │ ├── SKILL.md │ └── schema.json └── .harness/ ├── config.yaml └── runs/99-Skills里的每个技能包都遵循同一套最小结构。SKILL.md写触发条件、风险等级、输入输出schema.json约束模型输出避免它自由发挥prompt.md放真正发给模型的指令。例如daily-log-extractor/SKILL.md可以这样写--- name: daily-log-extractor trigger: daily-log risk: low output: 10-Notes/候选知识 --- # daily-log-extractor ## 输入 - 00-Inbox/{{date}}.md ## 任务 1. 提取可复用的案例、命令、排错记录。 2. 按 schema.json 输出候选知识。 3. 低风险内容写入 10-Notes。 4. 高风险内容写入 00-Inbox/审批队列。milestone-retro/SKILL.md则更偏阶段性复盘--- name: milestone-retro trigger: milestone risk: medium output: 20-Projects/{{project}}/复盘.md --- # milestone-retro ## 输入 - 20-Projects/{{project}}/里程碑.md - 10-Notes/案例库/*.md - 10-Notes/工作流/*.md ## 任务 1. 对照里程碑目标找出已完成、未完成、阻塞项。 2. 抽取重复出现的模式和可复用经验。 3. 把候选知识按 low / medium / high 分级。 4. low 自动入库medium 和 high 进入人工审批队列。这里的关键是Obsidian 只负责人工维护的规则和最终文档Harness 只负责按技能包跑任务复盘输出写到.harness/runs或项目目录不直接改原始笔记。这样一来知识库不会被模型一次跑偏就污染。3. 到 TaoToken 拿 Key 并写入 Harness 复盘调用Harness 要跑复盘必须有模型调用入口。入口配置我只认三样Base URL、API Key、模型名。Base URL 固定为https://taotoken.net/api不要带多余路径API Key 用YOUR_API_KEY占位真实值只放在本地环境变量或本地配置文件里。TaoToken 的 Key 可以在官网控制台创建入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_key 登录后进入 API Keys 页面创建复制出来填到 Harness 的复盘调用配置里。如果你的 Harness 通过环境变量读取模型供应商可以这样注入# 只在本机当前 shell 生效不要提交到 Git export TAOTOKEN_API_KEYYOUR_API_KEY export HARNESS_MODEL_BASE_URLhttps://taotoken.net/api export HARNESS_MODEL_API_KEY$TAOTOKEN_API_KEY export HARNESS_MODEL_NAMEdeepseek-v3.2 export HARNESS_TIMEOUT120然后在 Harness 的启动脚本里读取这些变量。字段名不一定和我的完全一样但核心就是三件事把base_url指向https://taotoken.net/api把api_key指向YOUR_API_KEY的实际值把model指向你要用的模型。可以写一个.harness/config.yamlmodel: provider: openai_compatible base_url: https://taotoken.net/api api_key: ${HARNESS_MODEL_API_KEY} model: deepseek-v3.2 timeout: 120 retro: skill_dir: 99-Skills input_roots: - 00-Inbox - 10-Notes - 20-Projects output_dir: .harness/runs risk_policy: low: auto_commit medium: human_approval high: human_approval这里不要把 Key 硬编码进 YAML。${HARNESS_MODEL_API_KEY}会从环境变量读取这样你切换 Key 的时候只需要改 shell不会把敏感信息写进仓库。如果你用的是 Windows PowerShell可以写成$env:TAOTOKEN_API_KEYYOUR_API_KEY $env:HARNESS_MODEL_BASE_URLhttps://taotoken.net/api $env:HARNESS_MODEL_API_KEY$env:TAOTOKEN_API_KEY $env:HARNESS_MODEL_NAMEdeepseek-v3.2配好之后先用一个最小复盘任务验证。不要让 Harness 一上来就跑全库先指定一个项目目录cd ~/MyVault export TAOTOKEN_API_KEYYOUR_API_KEY export HARNESS_MODEL_BASE_URLhttps://taotoken.net/api export HARNESS_MODEL_API_KEY$TAOTOKEN_API_KEY export HARNESS_MODEL_NAMEdeepseek-v3.2 # 以你本地 Harness 入口为准核心是注入上面的变量 ./your-harness-entry \ --skill 99-Skills/milestone-retro \ --input 20-Projects/alpha \ --output .harness/runs如果日志里出现base_urlhttps://taotoken.net/api和modeldeepseek-v3.2说明入口已经接上了。接下来才是 Obsidian 命令层的事。4. Obsidian 命令层用 URI、Templater、QuickAdd 触发日志与复盘Obsidian 本身不负责跑 Harness但它可以负责“触发”。我常用三种方式URI 打开笔记、Templater 生成模板、Shell commands 调本地脚本。先把每日日志固定到00-Inbox/YYYY-MM-DD.md用 URI 打开# macOS open obsidian://open?vaultMyVaultfile00-Inbox%2F$(date %F).md # Linux xdg-open obsidian://open?vaultMyVaultfile00-Inbox%2F$(date %F).md注意 vault 名称和路径要做 URL 编码。如果 Vault 叫My Vault就要写成My%20Vault路径里的/写成%2F。这一步不通过后面什么自动化都白搭。每日日志模板放在90-Templates/daily-log.md用 Templater 插入日期和项目字段--- date: % tp.date.now(YYYY-MM-DD) % type: daily-log project: risk: low --- # % tp.date.now(YYYY-MM-DD) % 日志 ## 今天做了什么 ## 遇到的问题 ## 可复用命令 ## 候选知识写完之后你不一定想手动跑 Harness。可以用 Shell commands 插件配一个命令让它调用本地脚本cd ~/MyVault export TAOTOKEN_API_KEYYOUR_API_KEY export HARNESS_MODEL_BASE_URLhttps://taotoken.net/api export HARNESS_MODEL_API_KEY$TAOTOKEN_API_KEY ./scripts/run-daily-extractor.shrun-daily-extractor.sh不需要很复杂核心就是把当天日志路径传给 Harness#!/usr/bin/env bash set -euo pipefail VAULT$HOME/MyVault TODAY$(date %F) cd $VAULT export TAOTOKEN_API_KEY${TAOTOKEN_API_KEY:-YOUR_API_KEY} export HARNESS_MODEL_BASE_URLhttps://taotoken.net/api export HARNESS_MODEL_API_KEY$TAOTOKEN_API_KEY export HARNESS_MODEL_NAMEdeepseek-v3.2 ./your-harness-entry \ --skill 99-Skills/daily-log-extractor \ --input 00-Inbox/${TODAY}.md \ --output .harness/runs/daily-${TODAY}.json里程碑复盘也可以用同样的方式。当项目到达v0.3这种节点时用 QuickAdd 触发milestone-retro把项目名作为变量传进去cd ~/MyVault export TAOTOKEN_API_KEYYOUR_API_KEY export HARNESS_MODEL_BASE_URLhttps://taotoken.net/api export HARNESS_MODEL_API_KEY$TAOTOKEN_API_KEY ./your-harness-entry \ --skill 99-Skills/milestone-retro \ --input 20-Projects/alpha \ --output .harness/runs/retro-alpha-v0.3.md这样你在 Obsidian 里点一个命令Harness 就在后台读取技能包、调用模型、生成复盘文件。Obsidian 不直接改原笔记只负责展示和审批。5. 复盘输出长什么样候选知识、风险分级、审批队列复盘输出不能是一大段“感觉不错、继续加油”。我要求技能包输出结构化 Markdown同时带一份 JSON方便后续脚本消费。Markdown 示例# Alpha 项目里程碑复盘v0.3 - run_idretro-2025-01-15-alpha-v0.3 - providerTaoToken - base_urlhttps://taotoken.net/api - modeldeepseek-v3.2 - 耗时42s - 输入20-Projects/alpha/里程碑.md、10-Notes/案例库/*.md ## 一、目标对照 | 目标 | 状态 | 说明 | | --- | --- | --- | | 完成 API 接入 | 已完成 | Base URL 统一到 TaoToken | | 完成复盘自动化 | 部分完成 | 里程碑复盘已跑通月度检查待补 | | 补充案例库 | 进行中 | 新增 3 条候选案例 | ## 二、重复出现的模式 - 模型调用超时大多来自入口未统一。 - 排错记录沉淀后下次定位速度明显变快。 - 高风险工作流变更仍然需要人工确认。 ## 三、候选知识 | 类型 | 风险 | 建议动作 | 目标文件 | | --- | --- | --- | --- | | 案例补充 | low | 自动入库 | 10-Notes/案例库/API超时重试.md | | 命令记录 | low | 自动入库 | 10-Notes/命令片段/环境变量注入.md | | 工作流变更 | high | 人工审批 | 00-Inbox/审批队列/复盘流程调整.md | ## 四、阻塞与下一步 - 月度健康检查技能包还缺 schema 校验。 - 审批队列需要增加“驳回原因”字段。对应的 JSON 可以写成{ run_id: retro-2025-01-15-alpha-v0.3, provider: taotoken, base_url: https://taotoken.net/api, model: deepseek-v3.2, candidates: [ { type: case, risk: low, action: auto_commit, target: 10-Notes/案例库/API超时重试.md }, { type: workflow, risk: high, action: human_approval, target: 00-Inbox/审批队列/复盘流程调整.md } ] }低风险候选知识可以自动写入10-Notes但高风险内容必须进审批队列。审批队列本身也是 Obsidian 里的普通笔记你可以用双链把复盘.md和候选知识关联起来。这样知识库不是“自动写入就完事”而是“自动提取 人工确认 可追溯”。6. Claude Code / Codex / CC Switch 如何共用同一套 Key 与 Base URL虽然主线是 Harness 复盘但实际工作里经常还要在 Claude Code、Codex 和 CC Switch 之间切换。它们可以共用同一个 TaoToken Key但配置文件不能混。Claude Code 用settings.json和ANTHROPIC_*环境变量{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: claude-sonnet-4-5, ANTHROPIC_SMALL_FAST_MODEL: claude-haiku-4-5 } }Codex 则用config.toml不要在里面写ANTHROPIC_*。可以这样配model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在本机设置export TAOTOKEN_API_KEYYOUR_API_KEYCC Switch 我习惯把它理解成三件套供应商、Key、默认模型。三件套填清楚切换就不会乱供应商名称TaoToken Base URLhttps://taotoken.net/api API KeyYOUR_API_KEY 默认模型claude-sonnet-4-5注意Claude Code 的ANTHROPIC_*只放在 Claude Code 的settings.json或对应环境变量里不要套到 Codex 的config.toml。Codex 只认model_providers和env_key。Harness 复盘调用又是另一套配置但它同样只认https://taotoken.net/api和YOUR_API_KEY。把这三套分开后续排错才不会互相污染。7. 常见报错与排查401、404、超时、YAML 解析失败第一个常见报错是401 Unauthorized。先检查环境变量有没有真的注入echo $TAOTOKEN_API_KEY如果输出为空说明 shell 没读到。如果你用的是.env文件确认 Harness 启动脚本有没有source .env。另外不要把真实 Key 写进config.yaml后提交到 Git用YOUR_API_KEY占位本地再覆盖。第二个是404 Not Found。大多数情况是 Base URL 写错。Harness 复盘调用里应该写https://taotoken.net/api不要再拼别的路径。如果你在 Claude Code 里写ANTHROPIC_BASE_URL也同样是https://taotoken.net/api。排查时可以直接用 curl 测一下curl -sS https://taotoken.net/api/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY如果这里返回 404先检查路径如果返回 401先检查 Key。具体控制台入口可以在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_troubleshoot 里找到重新创建 Key 后覆盖本地变量。第三个是超时。Harness 跑复盘时输入可能包含大量笔记timeout设 120 秒只是起步。你可以先把输入范围缩小到一个项目目录再逐步扩大到全库。日志里如果一直停在provider init优先检查 Base URL 和网络出口而不是先改 prompt。第四个是 YAML 解析失败。Obsidian 的 front matter 对缩进和引号很敏感。日期字段建议统一成YYYY-MM-DD含冒号的字符串加引号--- date: 2025-01-15 type: daily-log project: alpha risk: low ---技能包里的SKILL.md和 Harness 的config.yaml不要混用同一套缩进。一个用两个空格另一个也用两个空格别一会儿 Tab 一会儿空格。8. 把闭环跑起来每日、里程碑、月度健康检查最后把这套系统跑成闭环。每日日志触发daily-log-extractor只做低风险提取里程碑触发milestone-retro输出复盘和候选知识每月触发monthly-health-check只生成报告不改原文件。规则全部写在你人工维护的99-Skills和90-Templates里Harness 只按规则执行TaoToken 只提供 Key 和 API Base。这样知识库能自更新但不会失控。如果你想先试一条最小路径可以按这个顺序来先用模型对话验证复盘 prompt 是否能稳定输出结构化结果再看 Coding Plan 是否适合长期跑复盘任务然后去控制台创建 API Key最后参考 Claude Code 文档把编码工作流也统一到同一套 Base URL。对应入口如下模型对话https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_chatCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_plan创建 Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_keysClaude Code 文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentobsidian_harness_claudecode回到最开始那个超时问题它不是 Obsidian 技能包的问题也不是 Harness 插件的问题而是模型入口没有统一。把 Key 和 Base URL 收到 TaoToken 后Harness 复盘可以稳定跑Obsidian 只负责展示和审批技能包只负责定义规则。省下这些折腾的时间你就可以把精力放回真实项目和真实世界。