ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepSeek Harness 的 Skills 和 AGENTS.md 怎么用、注入到哪:把 settings 改到 TaoToken 的实操拆解

DeepSeek Harness 的 Skills 和 AGENTS.md 怎么用、注入到哪:把 settings 改到 TaoToken 的实操拆解 1. DeepSeek Harness 里 Skills 和 AGENTS.md 到底注入到哪DeepSeek Harness下称 dsh是 DeepSeek 官方开源的编码 Agent 运行时它和 Claude Code、opencode 属于同一类东西你给它一个项目目录它读你的规则文件、加载技能、然后按你的指令改代码。很多人第一次用 dsh 会卡在同一个问题上——我写的AGENTS.md到底有没有被读到skills/目录里的SKILL.md是塞进系统提示词还是当普通消息发过去搞不清注入层级排查失效时就只能瞎猜。这篇聚焦三件事Skills 与 AGENTS.md 的加载路径、注入位置、以及把模型请求改到 TaoToken 的 settings 实操。版本基于deepseek-harness 0.1.0-rc.5源码部署全部实测过不是抄文档。先给一句话结论dsh 支持AGENTS.md和 skills开箱即用web 默认 standard 预设已挂载。但注意和 opencode 不一样这些内容不是塞进系统提示词的全是「用户角色消息」。这个差异直接决定了你感知规则强度的方式——系统提示词里的规则模型会当成「我的设定」用户消息里的规则模型会当成「用户刚跟我说的话」两者在长对话里的保持度不一样。别按 opencode 的习惯去预期 dsh 的行为。为什么注入位置这么重要因为排查「规则没生效」时你得知道去哪个环节找。如果规则走系统提示词那它应该在每次请求的最前面、且不会被后续对话冲淡如果走用户消息那它就是在消息序列里占一个位置可能被截断、可能被增量替换。dsh 属于后者所以它的行为更像「每轮对话开头有人提醒你一句」而不是「你天生就知道」。文件放哪、生效范围多大先看这张表文件位置生效范围~/.dsh/AGENTS.md全局所有会话项目根/AGENTS.md或CLAUDE.md整个项目项目根 往上找第一个.git子目录/AGENTS.md/CLAUDE.md只在该子目录下生效AGENTS.local.md/CLAUDE.local.md同目录的本地覆盖层基础文件之后加载同目录多个候选全加载AGENTS.md优先于CLAUDE.md。预算方面渲染上限 64KB单文件超过 1MB 直接忽略超预算截断不报错。这个「截断不报错」是个隐蔽坑后面排障章节会细说。Skills 的加载优先级从高到低目录说明项目根/.dsh/skills/项目专属最高优先项目根/.agents/skills/项目共享dsh 仓库自己的技能就在这~/.dsh/skills/个人全局~/.agents/skills/全局共享格式两种技能名/SKILL.md目录式或技能名.md扁平式。frontmatter 必填namedescription可选whenToUse、disable-model-invocation、user-invocable。缺 frontmatter 或缺name/description的文件直接忽略日志里有警告。文件改动自动热更新不用重启。注入位置是重点直接上表内容注入位置AGENTS.md / CLAUDE.md用户角色消息消息序列前缀技能目录用户角色消息available_skills块模型调 skill 工具拿到的正文工具调用结果用户侧用户发/技能名触发的正文用户角色消息追加在最后AGENTS.md 的注入细节每次模型请求前pre-step 钩子检查首次把完整指令集作为用户消息前缀注入之后只在文件变化时增量替换。每段带Instructions from: 路径标记。模型看到的效果就是对话开头多了一条用户消息内容是你的仓库规则。技能目录的注入细节每步请求前注入摘要目录格式长这样system-reminder A skill is a reusable set of task-specific instructions. The following skills are available in this session: available_skills - name: dsh-code-review: Use when reviewing a pull request... /available_skills If the user names a skill, or the task clearly matches a skills description, call the skill tool with the exact skill name before taking task actions. /system-reminder目录只含摘要不含正文。模型觉得任务匹配就调skill工具参数技能名工具返回完整正文包装成skill_content块作为工具结果进会话。目录消息里明确要求「先加载再执行」。用户直接发/技能名也能触发正文作为用户消息追加在注入链最后。disable-model-invocation: true的技能只能走这条路。理解了这个注入模型你就能解释很多现象为什么规则在长对话里会「变淡」、为什么技能目录描述被截断到 500 字符但正文不受限、为什么非 git 目录不会被当项目根。下一节先把 TaoToken 的接入前置讲清楚再进配置。2. 接入 TaoToken 前置Base URL、Key 与模型 ID 三件套dsh 默认会去连官方端点但很多人在国内网络环境下需要走一个稳定的 API 网关。TaoToken 提供 OpenAI 兼容与 Anthropic 兼容两种入口dsh 走的是 OpenAI 兼容那套。接入前你需要准备三件套Base URL、API Key、Model ID。这三样缺一不可而且必须和 dsh 的 settings 字段一一对上否则会出现 401 或者local proxy failed这类报错。Base URL 用https://taotoken.net/api注意这里不加任何 UTM 参数直接写这个地址就行。API Key 去控制台生成路径是 API Keys 页面。Model ID 填你实际要用的模型名比如deepseek-chat或者你在 TaoToken 上开通的其他模型标识。这三个值后面会写进 dsh 的 settings 文件。先说清楚为什么 dsh 要单独配这个。dsh 的模型请求走的是它自己的 provider 抽象层settings 里有一段providers配置每个 provider 有baseURL、apiKey、models三个核心字段。你要做的就是把 TaoToken 当成一个 provider 塞进去然后在 agent 配置里引用它。这跟 Claude Code 改ANTHROPIC_BASE_URL是同一个思路只是 dsh 用的是结构化配置文件而不是纯环境变量。如果你之前用过 Claude Code可能习惯在~/.claude/settings.json里写env段。dsh 不一样它的 settings 是 TOML 或 JSON 结构字段名也不同。别直接把 Claude Code 的配置粘过来会解析失败。下面给一个最小可用的 provider 片段你可以先对照自己的文件结构{ providers: { taotoken: { type: openai-compatible, baseURL: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, models: [deepseek-chat] } } }这里type写openai-compatible因为 TaoToken 的/api入口兼容 OpenAI 的/v1/chat/completions协议。models数组里可以放多个模型 IDdsh 在切换模型时会从这里选。apiKey建议不要硬编码在仓库里的 settings而是用环境变量引用后面配置章节会给完整写法。关于 Key 的获取去 TaoToken 控制台的 API Keys 页面新建一个复制出来。注意 Key 只在创建时完整显示一次关掉页面就看不到了所以当场存好。如果你要长期在 CI 或者多台机器上用建议建多个 Key 分别管理方便吊销。模型 ID 这块有个容易踩的坑dsh 的模型名和 TaoToken 上的模型标识必须完全一致大小写敏感。你可以在 TaoToken 的模型对话页面先手动发一条消息确认这个模型 ID 能正常返回再写进 settings。如果模型 ID 写错dsh 启动时不一定报错但第一次请求会返回model not found或者直接 404。还有一个前置是网络连通性。dsh 启动时会做一次 provider 健康检查如果 Base URL 写错或者网络不通日志里会出现local proxy failed或者连接超时。这时候先用 curl 测一下curl -sS https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的TaoToken密钥能返回模型列表就说明 Base URL 和 Key 都没问题问题在 dsh 的配置侧。返回 401 就是 Key 错了返回 404 多半是路径写错比如多写了或漏了/v1。这一步能帮你快速区分「网络问题」和「配置问题」省得在 dsh 日志里翻半天。三件套准备好之后就可以进配置章节了。记住顺序先确认 curl 能通再改 settings最后重启或热加载验证。跳过 curl 直接改配置出问题时你分不清是哪一层坏了。3. 可复制配置settings 片段与目录结构这一节给可直接复制的配置。dsh 的 settings 文件位置取决于你的部署方式源码部署一般在项目根或者~/.dsh/下。先确认你的 settings 路径再往里加 provider 段。先看目录结构示例这是你项目里应该长成的样子E:\deepseek-harness\ ├── .git\ ├── .dsh\ │ └── skills\ │ └── my-project-skill\ │ └── SKILL.md ├── .agents\ │ └── skills\ │ └── dsh-code-review\ │ └── SKILL.md ├── AGENTS.md ├── CLAUDE.md └── settings.json项目根靠.git识别所以.dsh/skills/和.agents/skills/必须放在有.git的那一层。如果你把技能放在子目录它只在该子目录下生效模型在主目录干活时看不到。这是很多人「技能没加载」的第一个原因。settings 的 provider 段完整写法用环境变量引用 Key{ providers: { taotoken: { type: openai-compatible, baseURL: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, models: [deepseek-chat, deepseek-reasoner] } }, agent: { provider: taotoken, model: deepseek-chat } }${TAOTOKEN_API_KEY}是环境变量占位dsh 启动时会去读同名环境变量。这样你的 Key 不会进 git。设置环境变量的方式# Linux / macOS export TAOTOKEN_API_KEYsk-你的TaoToken密钥 # Windows PowerShell $env:TAOTOKEN_API_KEYsk-你的TaoToken密钥如果你更习惯 TOML 格式dsh 也支持等价写法[providers.taotoken] type openai-compatible baseURL https://taotoken.net/api apiKey ${TAOTOKEN_API_KEY} models [deepseek-chat, deepseek-reasoner] [agent] provider taotoken model deepseek-chat两种格式选一种别混用。dsh 解析时如果发现同一个文件里既有 JSON 又有 TOML 语法会直接报解析错误。AGENTS.md 的写法没有特殊格式要求就是普通 Markdown。但有个细节每段会被加上Instructions from: 路径标记所以你可以用多个文件分层。比如全局~/.dsh/AGENTS.md放通用规则项目根AGENTS.md放项目规则子目录AGENTS.md放模块规则。加载顺序是全局 → 项目 → 子目录后面的覆盖前面的。SKILL.md 的 frontmatter 必须写全--- name: my-project-skill description: Use when editing the payment module in this repo whenToUse: payment, billing, invoice disable-model-invocation: false user-invocable: true --- # Payment Module Skill 这里写具体的任务指令模型调 skill 工具后会拿到这段正文。name和description必填缺一个文件就被忽略。whenToUse是给模型看的匹配提示写关键词。disable-model-invocation: true表示模型不能自动调只能用户发/技能名触发。user-invocable控制用户能不能手动触发。配置改完后dsh 支持热更新不用重启。但 provider 段的改动比如换 Base URL建议重启一次因为 provider 是在启动时初始化的。技能和 AGENTS.md 的改动是热更新的保存即生效。最后提醒一个路径细节Windows 下路径用反斜杠但 settings 里写路径建议用正斜杠或者双反斜杠避免转义问题。比如E:/deepseek-harness比E:\deepseek-harness更安全。4. 验证请求Skills 是否被读取、AGENTS.md 是否生效配置写完不算完得验证。dsh 提供了 HTTP API可以直接查会话和技能列表。假设你的 dsh 服务跑在http://127.0.0.1:3080先创建一个会话curl -sS -X POST http://127.0.0.1:3080/api/session.create \ -H Content-Type: application/json \ -d {cwd:E:\\deepseek-harness,preset:standard}返回里会有sessionId记下来。注意preset必须是standardminimal预设没有这些插件技能和 AGENTS.md 都不会加载。这是第二个常见坑。然后查技能列表curl -sS -X POST http://127.0.0.1:3080/api/skill.list \ -H Content-Type: application/json \ -d {sessionId:你的sessionId}实测在 dsh 仓库里跑返回 11 个技能全是仓库.agents/skills/下的dsh-*技能。如果你返回空数组说明技能目录没被识别回去检查.git是否存在、技能目录层级对不对。验证 AGENTS.md 是否生效最直接的办法是看模型请求的消息序列。dsh 的日志里会打印注入内容搜Instructions from:这个标记。如果日志里有这行说明 AGENTS.md 被读到了。如果没看到检查文件是否在项目根、是否超过 1MB、是否被 64KB 预算截断。技能目录的验证看available_skills块。在日志里搜这个标签能看到当前会话挂载了哪些技能。注意目录描述截断到 500 字符所以如果你的description写太长模型看到的可能是截断版。正文不受这个限制模型调skill工具后拿到的是完整正文。手动触发技能测试在会话里发/dsh-code-review看模型是否返回该技能的正文内容。如果返回「技能不存在」说明技能名拼错或者没加载。如果返回正文但模型没按正文执行那是模型行为问题不是加载问题。验证 TaoToken 是否接通发一条最简单的请求curl -sS -X POST http://127.0.0.1:3080/api/session.send \ -H Content-Type: application/json \ -d {sessionId:你的sessionId,message:回复 OK 两个字}如果返回正常文本说明 provider 配置对了。如果返回 401检查 Key如果返回local proxy failed检查 Base URL 和网络如果返回reading choices相关错误说明响应格式不符合预期多半是 Base URL 路径写错确认是https://taotoken.net/api而不是别的。成功的结果长这样会话创建返回sessionId技能列表返回非空数组发送消息返回模型文本日志里有Instructions from:和available_skills。四个都满足说明 Skills 和 AGENTS.md 都正确加载并注入了。如果只想快速验证模型通不通也可以直接用 TaoToken 的模型对话页面发一条确认模型 ID 可用再回到 dsh 里配。这样能把「模型问题」和「dsh 配置问题」分开。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节对照真实报错逐个拆。这些错误我都在实测里遇到过按出现频率排序。401 Unauthorized。最常见Key 错了或者没传。检查三处环境变量TAOTOKEN_API_KEY是否设置、settings 里${TAOTOKEN_API_KEY}拼写是否一致、Key 是否被吊销。用 curl 直接测 TaoToken 能快速定位curl -sS https://taotoken.net/api/v1/models \ -H Authorization: Bearer sk-你的TaoToken密钥curl 也 401 就是 Key 本身的问题去控制台重新生成。curl 通了但 dsh 401就是 dsh 没读到环境变量检查启动 dsh 的那个 shell 里有没有 export。local proxy failed。这个报错通常出现在 dsh 启动时的 provider 健康检查阶段。原因有三类Base URL 写错、网络不通、provider type 写错。先确认baseURL是https://taotoken.net/apitype是openai-compatible。然后确认机器能访问这个地址。如果都不行看 dsh 日志里的详细堆栈通常会带具体原因。reading choices 相关错误。这个报错说明 dsh 收到了响应但解析choices字段失败。多半是 Base URL 路径不对比如写成了https://taotoken.net少了/api或者写成了https://taotoken.net/api/v1多了一层。正确写法就是https://taotoken.net/apidsh 会自己拼/v1/chat/completions。另外确认type是openai-compatible如果误写成anthropic响应格式对不上也会报这个。OAuth 相关报错。如果你在 dsh 里配了需要 OAuth 的 provider或者误触发了 OAuth 流程会看到这类错误。TaoToken 走的是 API Key 认证不需要 OAuth。检查 settings 里有没有残留的 OAuth 配置段删掉。如果你之前配过 Claude Code 的 OAuth别把那段配置复制到 dsh。技能不加载。返回空数组或者技能名找不到。检查清单项目根有没有.git、技能目录是不是.dsh/skills/或.agents/skills/、SKILL.md的 frontmatter 有没有name和description、preset 是不是standard。这五个里任何一个不满足都会导致技能不加载。AGENTS.md 不生效。日志里没有Instructions from:。检查文件是否在项目根、是否超过 1MB、是否被 64KB 预算截断。截断不报错所以你可能以为没加载其实是加载了但被截掉了。把 AGENTS.md 精简到 64KB 以内再测。规则在长对话里变淡。这是注入位置决定的不是 bug。dsh 把 AGENTS.md 当用户消息注入长对话里会被后续消息冲淡。解决办法是把关键规则写进技能让模型在需要时主动调skill工具重新加载。或者用disable-model-invocation: true配合用户手动/技能名触发。CC Switch / Cline MCP / Codex auth.json 相关。如果你同时用这些工具注意它们的配置格式和 dsh 不通用。CC Switch 的 provider 配置、Cline 的 MCP 配置、Codex 的auth.json都是各自独立的。dsh 的 settings 是它自己的格式别混用。如果你在 dsh 里配 MCP注意 MCP 直连生产库是禁止的只连测试环境。排查顺序建议先 curl 测 TaoToken再查 dsh 日志里的 provider 初始化再看技能列表 API最后看消息序列里的注入标记。从外到内一层层排除。6. 把配置固化下来长期编码与 Agent 场景的落地建议配置调通之后下一步是把它固化避免每次换机器重来。几个实操建议。第一把 settings 里的 provider 段抽成模板Key 用环境变量。这样你的 settings 可以进 gitKey 不进。团队里每个人自己设环境变量配置共享。第二AGENTS.md 分层写。全局~/.dsh/AGENTS.md放个人偏好项目根AGENTS.md放项目规则子目录放模块规则。这样换项目时全局规则自动带上项目规则跟着仓库走。第三技能按项目组织。项目专属技能放项目根/.dsh/skills/团队共享技能放项目根/.agents/skills/个人技能放~/.dsh/skills/。优先级从高到低同名技能项目专属的会覆盖全局的。第四长对话场景下关键规则写进技能而不是 AGENTS.md。因为 AGENTS.md 走用户消息会被冲淡技能是模型主动调用的每次调用都重新注入正文保持度更好。把「必须遵守的硬规则」做成disable-model-invocation: true的技能需要时手动/技能名触发。第五验证脚本化。把第 4 节的 curl 命令写成一个 shell 脚本每次改配置后跑一遍确认会话创建、技能列表、消息发送三个环节都正常。这样比手动翻日志快。如果你要长期跑编码 Agent建议把模型请求统一走 TaoToken 的 Coding Plan这样多项目、多会话的请求都从一个入口走便于管理和排查。配置方式就是本文第 3 节的 provider 段把models换成你 Coding Plan 里开通的模型 ID。最后dsh 还在快速迭代0.1.0-rc.5的行为可能和后续版本有差异。遇到本文没覆盖的报错先看 dsh 日志里的详细堆栈再去 TaoToken 的接入文档对照 Base URL 和认证方式。配置类问题九成出在路径、Key、preset 这三个地方按第 5 节的清单逐个排除基本都能定位。
返回列表