ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

把 WorkBuddy 定时任务换成 DeepSeek Harness,TaoToken 只提供 Base URL

2026/9/18 22:21:30 拓冰建站 浏览量
把 WorkBuddy 定时任务换成 DeepSeek Harness,TaoToken 只提供 Base URL 1. WorkBuddy 定时任务迁移到 DeepSeek Harness先换 TaoToken Base URL迁移实施的第一步不是改 Harness 里的任务表达式而是把模型调用入口统一到 TaoToken先在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmigration_intro 获取 Key再把 Base URL 设为 https://taotoken.net/api。这样做的原因很直接旧链路里 WorkBuddy 负责按计划扫描 Obsidian 仓库任务由时间驱动文件改动后要等下一个计划点才处理高风险写入也缺少前置审批。换成 DeepSeek Harness 后触发方式从 cron 改为文件事件知识更新 Agent 按需启动。这里真正消耗 Token 的不是文件监听本身而是 DeepSeek Harness 触发的知识更新 Agent。因此迁移的核心是三件事把 Key 来源切到 TaoToken把 Base URL 统一成 https://taotoken.net/api把 WorkBuddy 的定时任务改写成 Harness 的事件触发任务。站在迁移实施工程师视角这次改造不应该重写知识库业务逻辑。已有 Markdown 目录、frontmatter 字段、标签体系、人工审批规则都保留只替换三处任务触发源、LLM 供应商配置、Key 的来源。迁移完成后产出物应该包括一份迁移步骤、一份 Base URL 配置、一份任务触发对照表以及可回滚的开关。回滚开关很重要旧 WorkBuddy 定时任务先不要删除可以停用但保留配置等 Harness 事件触发稳定运行 24 小时后再下线。下面按实施顺序拆解。2. 迁移实施工程师视角Key 来源、目录约定与事件边界先处理凭证和目录再动 Harness 任务。很多迁移失败不是模型问题而是 Key 放错位置、目录监听范围过大、事件边界不清晰。第一步在 TaoToken 官网创建 Key。进入 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentapi_key_guide 按控制台提示创建 API Key。创建后不要写进代码仓库也不要提交到 Obsidian 笔记里。推荐放在本机环境变量或密钥管理工具中。Key 占位符统一写成YOUR_API_KEY实际部署时替换。第二步确认 Base URL。工具配置里的 Base URL 固定用https://taotoken.net/api注意这个地址只用于工具配置不要额外拼接来源参数。很多 404 问题就是把 Base URL 写成了带查询参数的地址或者在后面重复加了/v1。先按https://taotoken.net/api配置再根据 Harness 的实际 SDK 文档决定路径拼接。第三步冻结 WorkBuddy 定时任务。不要直接删除先把 cron 从“执行更新”改为“只记录不写入”观察一天。确认 Harness 事件触发覆盖了原有任务范围后再关闭 WorkBuddy 的写操作。第四步定义目录白名单。Obsidian 仓库里通常有.obsidian/、附件目录、模板目录、归档目录。知识更新 Agent 不应该监听全部文件。建议只监听笔记正文目录例如vault/ projects/ areas/ resources/ daily/ templates/ # 排除 .obsidian/ # 排除 attachments/ # 排除第五步定义 frontmatter 必填项。原文提到“项目背景、目标都填全了才允许召回相关知识”这个思路适合迁移。可以约定--- project: 知识库迁移 goal: 把 WorkBuddy 定时任务迁到 DeepSeek Harness owner: 迁移实施工程师 status: active risk: low ---只有project、goal、owner都有值且正文长度超过阈值才允许进入知识更新 Agent。这样能避免空笔记、草稿、模板触发 Token 消耗。第六步定义事件边界。文件事件通常有add、change、unlink。知识更新 Agent 建议先只处理add和change删除事件单独走人工确认。否则一次误删可能触发大量无效更新。第七步准备环境变量。Harness、Claude Code、Codex 可能共用同一台机器但配置位置不同。通用环境变量可以这样写# .env 示例不要提交到 Git TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYYOUR_API_KEY HARNESS_MODELyour-model-id NOTE_DIR./vault/projects DEBOUNCE_MS800如果是 CI 或远程执行环境把TAOTOKEN_API_KEY放到 Secret 中不要放在明文脚本里。迁移实施工程师要检查三处本地 shell、Harness 服务、任务执行器。任意一处漏了 Key都会表现为 401。3. 任务触发对照WorkBuddy cron 与 Harness 事件驱动差异迁移不是简单换命令而是触发模型的改变。下面这张对照表可以直接放进迁移方案。维度WorkBuddy 定时任务DeepSeek Harness 事件触发触发源cron 时间表Markdown 文件变更事件触发时机固定周期可能延迟数分钟到数小时文件保存后秒级感知任务入口WorkBuddy 内置任务Harness 任务或事件回调人工审批通常缺失或事后检查可在放行条件中前置审批幂等控制依赖时间窗口容易重复内容指纹 去重表Token 消耗每次可能全量扫描只对通过条件的内容召回失败恢复等下一个 cron 周期事件队列重试 死信记录回滚方式恢复旧 cron切回旧任务开关从实施角度看最重要的差异是“按需触发”。WorkBuddy 定时任务到点就执行不管文件有没有变。DeepSeek Harness 可以通过文件监听拿到变更再决定是否调用知识更新 Agent。这里要强调监听、防抖、指纹比对本身不消耗 Token只有 Harness 把内容送入模型时才消耗 Token。所以优化 Token 的关键不是减少监听频率而是提高放行条件质量。任务触发对照还要覆盖审批。旧流程里高风险操作没有人工审批迁移后可以加一个“待审批队列”。例如 frontmatter 里risk: high的笔记不直接调用知识更新 Agent而是写入pending-review.json。等人工确认后再由 Harness 触发后续更新。这样既不阻塞普通笔记也能控制高风险操作。如果 Harness 支持重试策略建议设置普通事件最多重试 3 次退避 30 秒、2 分钟、5 分钟超过后写入失败队列。不要无限重试否则 429 会放大。对于同一文件的连续变更使用合并策略只保留最后一次内容指纹前序事件标记为 superseded。这样能避免保存一次文件触发多次 Agent。4. DeepSeek Harness 的 Base URL 与 Key 配置环境变量、Claude Code、Codex、CC Switch这一节给出可直接复制的配置骨架。核心原则只有两条Key 从 TaoToken 控制台来Base URL 用https://taotoken.net/api。如果你还没创建 Key可以在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentbaseurl_config 进入官网控制台。注意不同工具的配置字段不同不要把 Claude Code 的ANTHROPIC_*配置套到 Codex 上。4.1 Harness 通用环境变量# DeepSeek Harness 读取的 LLM 配置示例 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYYOUR_API_KEY HARNESS_MODELyour-model-id如果 Harness 任务需要单独指定供应商建议在任务配置里引用环境变量而不是硬编码。例如# harness-task.yaml 示例 name: knowledge-update-agent trigger: type: file_change paths: - vault/projects/**/*.md llm: provider: taotoken base_url_env: TAOTOKEN_BASE_URL api_key_env: TAOTOKEN_API_KEY model_env: HARNESS_MODEL approval: high_risk: true queue: pending-review.json4.2 Claude Codesettings.json 与 ANTHROPIC_*Claude Code 使用settings.json和ANTHROPIC_*环境变量。配置示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY, ANTHROPIC_MODEL: your-model-id } }如果你的 Claude Code 通过 shell 启动也可以写成export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYYOUR_API_KEY这里的关键是ANTHROPIC_BASE_URL只给 Claude Code 用。不要把它复制到 Codex 配置里。4.3 Codexconfig.tomlCodex 使用config.toml不要使用ANTHROPIC_*。示例model_provider taotoken model your-model-id [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在 shell 中设置export TAOTOKEN_API_KEYYOUR_API_KEYCodex 的base_url同样不加来源参数。如果 404优先检查是否多写了/v1或重复路径。4.4 CC Switch 三件套CC Switch 可以理解为切换供应商的三件套Provider、Base URL、API Key。填写时参考配置项填写值Provider 名称TaoTokenBase URLhttps://taotoken.net/apiAPI KeyYOUR_API_KEY模型按实际可用模型填写切换完成后先跑一个最小对话测试再启动 Harness 知识更新任务。不要一上来就全量监听否则配置错误会放大成大量失败事件。5. 文件监听 防抖去重 条件放行的 TypeScript 重构原文后半段是 TypeScript 源码这里不逐行照搬而是重构成迁移实施工程师能直接理解的步骤监听、防抖、指纹、放行、调用 Harness。代码块中的 API 调用入口请按你的 Harness SDK 替换不要直接假设某个内部接口名。import chokidar from chokidar; import { createHash } from node:crypto; import { readFile } from node:fs/promises; import matter from gray-matter; const NOTE_DIR process.env.NOTE_DIR ?? ./vault/projects; const DEBOUNCE_MS Number(process.env.DEBOUNCE_MS ?? 800); const seenFingerprints new Mapstring, string(); const debounceTimers new Mapstring, NodeJS.Timeout(); function sha256(text: string): string { return createHash(sha256).update(text).digest(hex); } function hasRequiredFrontmatter(data: Recordstring, unknown): boolean { const required [project, goal, owner]; return required.every((key) { const value data[key]; return typeof value string value.trim().length 0; }); } async function shouldRunAgent(file: string): Promiseboolean { const raw await readFile(file, utf8); const fingerprint sha256(raw); if (seenFingerprints.get(file) fingerprint) { console.log([skip] 内容未变化: ${file}); return false; } seenFingerprints.set(file, fingerprint); const { data, content } matter(raw); if (!hasRequiredFrontmatter(data)) { console.log([skip] frontmatter 必填项缺失: ${file}); return false; } if (content.trim().length 30) { console.log([skip] 正文过短: ${file}); return false; } if (data.risk high) { console.log([queue] 高风险进入人工审批: ${file}); return false; } return true; } async function triggerKnowledgeUpdateAgent(file: string) { const ok await shouldRunAgent(file); if (!ok) return; // 这里调用 DeepSeek Harness 的知识更新 Agent。 // 注意真正消耗 Token 的是这个 Agent不是文件监听。 const llmConfig { baseUrl: process.env.TAOTOKEN_BASE_URL ?? https://taotoken.net/api, apiKey: process.env.TAOTOKEN_API_KEY }; if (!llmConfig.apiKey) { throw new Error(缺少 TAOTOKEN_API_KEY请到 TaoToken 控制台创建); } console.log([run] 触发 Harness 知识更新 Agent: ${file}); // 调用你的 Harness 任务入口并把 llmConfig 传给 Agent。 // await harness.runKnowledgeUpdate({ file, llmConfig }); } const watcher chokidar.watch(NOTE_DIR, { ignoreInitial: true, awaitWriteFinish: { stabilityThreshold: 500, pollInterval: 100 } }); watcher.on(all, (event, file) { if (event ! add event ! change) return; if (!file.endsWith(.md)) return; const oldTimer debounceTimers.get(file); if (oldTimer) clearTimeout(oldTimer); debounceTimers.set( file, setTimeout(() { triggerKnowledgeUpdateAgent(file).catch((error) { console.error([error] ${file}, error); }); }, DEBOUNCE_MS) ); });这段代码对应迁移后的三条防线。第一文件一改就感知但不会立刻执行。第二防抖加内容指纹避免保存一次触发多次。第三frontmatter 必填项和风险等级放行避免无效 Token 消耗。对于高风险笔记代码只写入审批队列不直接调用 Agent。实际部署时seenFingerprints最好持久化到本地 JSON 或 SQLite否则重启后会重复处理一次。另外文件监听不要直接监听整个 Obsidian 仓库。附件、图片、模板、.obsidian目录都会产生事件。白名单越精确Harness 的任务队列越干净。对于重命名事件先当作删除加新增处理并加入人工确认避免 Agent 误判。6. 联调排障401/404/429、重复触发与不触发清单迁移实施阶段最常见的问题不是模型效果而是配置和事件边界。下面按报错逐项排查。401 Unauthorized先检查TAOTOKEN_API_KEY是否来自 TaoToken 控制台是否已经替换YOUR_API_KEY。然后检查 Harness 服务、Claude Code、Codex 三处是否都读到了环境变量。如果其中一处用了旧 Key也会 401。重新创建 Key 可以到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentdebug_checklist 进入控制台。404 Not Found大部分是 Base URL 拼接错误。工具配置里用https://taotoken.net/api不要带查询参数也不要随意加/v1。如果 Harness SDK 自己会补/v1配置里再写一次就会变成重复路径。先做最小请求测试确认路径。429 Too Many Requests说明短时间触发过多。检查防抖时间是否太短指纹是否生效。可以把DEBOUNCE_MS提高到 1000 到 1500 毫秒并对同一文件的变更做合并。对于批量导入笔记建议走队列不要一次性并发调用知识更新 Agent。同一文件触发两次常见原因是编辑器原子写先写临时文件再重命名于是产生add和change。解决方法是加awaitWriteFinish并在指纹去重后延迟执行。如果指纹只存在内存重启后也会重复。建议把文件路径和指纹持久化。文件改了但不触发检查四件事路径是否在白名单内扩展名大小写是否一致例如.MD和.mdfrontmatter 必填项是否齐全Harness 任务是否启用。还要检查文件是否被.gitignore或监听器的 ignore 规则排除。Token 消耗异常如果发现 Token 消耗高于预期先看知识更新 Agent 的调用次数。监听和防抖不消耗 Token消耗发生在 Agent 调用。检查是否放行了空笔记、草稿、模板是否每次全量召回而不是按变更片段召回。可以把content.trim().length阈值调高并要求 frontmatter 中status: active。高风险操作不要让知识更新 Agent 直接连接生产库也不要让 Agent 直接执行 SQL。SQL 和命令应由读者本地执行或者进入人工审批队列。Harness 只负责生成建议、召回相关知识、输出 diff。写操作由人工确认后触发。7. 从知识更新 Agent 到 TaoToken模型对话、Coding Plan、创建 Key、Claude Code 文档迁移完成后建议按下面顺序做一次验收。第一步用模型对话做最小连通性测试确认 Base URL 和 Key 可用https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchat_cta 。第二步如果团队需要长期跑知识更新 Agent可以查看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_plan_cta 。第三步创建和管理 Key 在控制台完成https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_key_cta 。第四步如果还要配置 Claude Code参考文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_code_doc_cta 。最终检查清单可以简化成六条WorkBuddy 定时任务已停用写操作保留回滚开关。TaoToken Key 已创建没有硬编码在仓库里。Harness 的 Base URL 使用https://taotoken.net/api。文件监听只覆盖 Markdown 白名单目录。防抖、内容指纹、frontmatter 放行全部生效。高风险操作进入审批队列SQL/命令本地执行。把 WorkBuddy 定时任务换成 DeepSeek Harness 后知识库更新从“到点扫描”变成“变更触发”。TaoToken 在这里只做两件事提供 Key 来源提供统一 Base URL。真正消耗 Token 的是 DeepSeek Harness 触发的知识更新 Agent所以优化重点应该放在放行条件和去重策略上。先跑小范围目录再逐步扩大监听范围迁移会比一次性全量切换稳得多。