这段时间我把主力终端 AI 助手从 OpenCode 切到了 DeepSeek-Harness(以下简称 dsh),折腾了一圈第三方兼容 API 的配置,踩了不少坑,也把整个配置链路摸透了。这篇东西就是把我自己的实操过程完整梳理一遍,从安装到配置再到排错,尽量让后来的人少走弯路。
先说清楚 dsh 是什么。它是一个跑在终端里的 AI Agent 框架,定位和 OpenCode、Claude Code 类似,但配置方式和插件机制有自己的逻辑。dsh 默认支持官方 API,但实际用的时候,很多人手里拿的是第三方兼容 API——比如各类中转网关、自建的 One API / New API 网关,或者是本地起的 Ollama、vLLM 服务。这些服务大多提供的是 OpenAI 兼容接口或 Anthropic 兼容接口,dsh 对这两类兼容格式都有支持,问题在于配置细节太多,文档又不算友好(或者说文档确实写得不够细),导致很多人倒在了“配置半天、一请求就报错”这一步。
这篇文章适合这几类人看:手里有第三方 API Key 但不知道往哪填的;想用 dsh 但反复 401 / 404 报错的;以及想搞清楚 dsh 和 OpenCode 配置差异、准备做迁移的。我会按自己的实际操作顺序来写:环境准备、API 信息确认、配置文件结构、常见报错排查、进阶调优,最后聊一下和 OpenCode 的对比。
1. 准备工作:先确认你手里的 API 到底属于哪种兼容格式
很多人一上来就急着改配置文件,结果连自己手上的 API 是什么兼容格式都没搞清楚。这是后续所有报错的总根源。
1.1 为什么第三方 API 的“兼容格式”是第一决定因素
第三方 API 网关千奇百怪,但从兼容性角度基本可以归成三类:
- OpenAI 兼容格式:请求路径是
/v1/chat/completions,返回格式遵循 OpenAI 规范。大多数自建网关(One API、New API)、云厂商的中转服务、Ollama 的 OpenAI 兼容端点都属于这一类。 - Anthropic 兼容格式:请求路径是
/v1/messages,返回格式遵循 Anthropic 规范。部分网关为了兼容 Claude Code 生态,会额外暴露这套接口。 - 原生格式:既不兼容 OpenAI 也不兼容 Anthropic,那 dsh 基本没法直接对接。这种情况要么让网关提供兼容端点,要么换网关。
1.2 用 curl 快速验证 API 类型
在动配置文件之前,我强烈建议先用一个简单请求验证 API 的可用性。把下面的命令里的 Key、BaseURL、模型名换成你自己的:
# OpenAI 兼容格式验证 curl https://你的网关地址/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的密钥" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 10 }'如果返回的是带choices字段的 JSON,说明这是 OpenAI 兼容接口;如果返回 404,试一下/v1/messages:
# Anthropic 兼容格式验证 curl https://你的网关地址/v1/messages \ -H "Content-Type: application/json" \ -H "x-api-key: sk-你的密钥" \ -H "anthropic-version: 2023-06-01" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 10, "messages": [{"role": "user", "content": "ping"}] }'这一步非常关键。你只有确认了接口类型,才能知道 dsh 的model_type该填openai还是anthropic。
提示:如果两个都 404,很可能是你的 BaseURL 没写对。BaseURL 一般只到域名或端口层(比如
https://api.example.com或http://localhost:3000),不要把完整路径拼上去。dsh 内部会自己补全/v1/chat/completions或/v1/messages。
1.3 顺带确认 Node 环境和工具链
dsh 依赖 Node.js 运行。我用的版本是 Node.js 20 LTS,实测 18 也能跑,但低于 16 就别折腾了。检查方式:
node -v npm -v如果 Node 版本过旧,建议先升到 18 或 20 再继续。装 dsh 我用的是 npm 全局安装:
npm install -g deepseek-harness安装完成后验证版本:
dsh --version如果提示找不到命令,检查 npm 全局 bin 目录是否在 PATH 里。这个属于基础环境问题,排查方式和 node 全局包装不上是一样的,先npm config get prefix看路径,再把对应的 bin 目录加进 shell 配置文件的 PATH。
2. 收集 API 配置四要素:密钥、BaseURL、模型名与类型
配置 dsh 之前,你必须把四样东西搞清楚。这不是什么琐碎细节,而是整个配置文件的核心命脉。我见过太多人只拿了一个 Key 就开始配置,然后到处报错,回头问我“为什么不行”,一查发现他连 BaseURL 都没有。
2.1 四要素清单
我用一个表格先列清楚,后面逐条解释:
| 要素 | 含义 | 示例 | 获取位置 |
|---|---|---|---|
| API Key | 认证凭证 | sk-xxxxx或dsh-xxxxx | 网关控制台 / 服务商后台 |
| BaseURL | 接口地址 | https://api.example.com | 网关文档 / 服务商公告 |
| Model 名称 | 实际请求的模型标识 | gpt-4o-mini、claude-sonnet-4-20250514、deepseek-chat | 网关模型列表 / 服务商文档 |
| 兼容类型 | OpenAI 还是 Anthropic | openai/anthropic | 用上一步 curl 验证 |
2.2 模型名的坑:不是你想填什么就填什么
这一点单独拎出来说。模型名必须和你的网关实际配置的模型名称一致。很多网关(特别是 One API 系)会把模型名映射成统一的标识,比如你充值的是 Claude 的额度,但网关里的模型名可能是claude-sonnet-4-20250514或者自定义的claude-sonnet。你在 dsh 里填的名字必须和网关里能响应请求的名字完全一致,否则就是 404 Model Not Found。
如果你不知道网关有哪些模型,去网关后台的“模型”页面看,或者用 curl 拉一下GET /v1/models(OpenAI 兼容):
curl https://你的网关地址/v1/models \ -H "Authorization: Bearer sk-你的密钥"返回的 JSON 里data数组就是所有可用的模型名。用这个列表去填 dsh 的model字段,基本不会出幺蛾子。
2.3 BaseURL 的常见误解
BaseURL 就是你的 API 网关访问入口,一般是https://域名或https://域名/路径前缀这种形式,不需要带/v1/chat/completions这种具体路径。dsh 会在配置好的 BaseURL 后面自动拼接/v1/chat/completions或/v1/messages。
但注意,有些网关的路径是https://域名/api/v1这种带前缀的,你需要把/api/v1这部分作为 BaseURL 填进配置里。怎么判断?还是用 curl,多试几个路径,能通的那个就是正确的 BaseURL。
3. .dsh.yaml 核心配置:从 provider 到 model 的映射逻辑
dsh 的配置结构核心是“provider(服务商)→ model(模型)→ profile(应用场景)”的层级关系。如果你之前配过 OpenCode,会发现思维不太一样。OpenCode 是直接provider里写模型,dsh 则是通过profile来组合 provider 和 model。
3.1 初始化配置文件
首次运行 dsh 初始化:
dsh init这一步会在当前目录生成一个.dsh.yaml配置文件(如果你的 dsh 版本较新,也可能是dsh.yaml,看提示即可)。这个配置文件是目录级的,也就是说你在哪个项目目录下运行 dsh,它就会读取哪个目录下的配置文件。这在你需要针对不同项目使用不同模型时非常方便。
我实际用下来,推荐把.dsh目录放在用户主目录下(~/.dsh/)做全局默认配置,然后在具体项目目录里放覆盖用的配置。dsh 的配置查找机制是先从当前目录往上找,找不到再找用户主目录的默认配置,所以你可以用“全局兜底 + 项目覆盖”的组合方式。
3.2 一个可以直接改的 OpenAI 兼容配置模板
下面是我现在在用的配置模板,做了脱敏处理。这段配置针对的是 OpenAI 兼容网关:
version: "1.0" provider: - name: my_gateway type: openai base_url: https://api.example.com api_key: sk-your-key-here default_model: gpt-4o-mini models: - name: gpt-4o-mini enable: true max_tokens: 16384 temperature: 0.7 supports_function_call: true - name: deepseek-chat enable: true max_tokens: 8192 temperature: 1.0 supports_function_call: true profile: - name: default provider: my_gateway model: gpt-4o-mini params: temperature: 0.3 max_tokens: 4096逐个解释:
provider:定义服务商。name是自己起的,type必须和上一步验证的兼容类型一致(openai或anthropic),base_url和api_key对应四要素,default_model是指不指定模型时的默认值。models:服务商底下可用的模型列表。每个模型可以单独配置max_tokens、temperature、supports_function_call等参数。实测supports_function_call这个开关很重要,如果你接的模型不支持 function call 但配置里开了,工具调用会直接报错或不返回结果。profile:使用场景配置。name是场景名,你可以配置code、chat、review等多个 profile,在运行时用dsh --profile xxx切换。provider和model指定用哪个服务商的哪个模型,params里的参数会覆盖上面模型层的默认参数。
3.3 Anthropic 兼容配置的差异点
如果你的网关是 Anthropic 兼容格式,配置几乎一样,只有两处不同:
provider: - name: claude_gateway type: anthropic base_url: https://api.example.com api_key: sk-your-key-here default_model: claude-sonnet-4-20250514 models: - name: claude-sonnet-4-20250514 enable: true max_tokens: 8192 temperature: 0.7 supports_function_call: true一是type改为anthropic,二是api_key的认证头 dsh 会自动处理成x-api-key或Authorization: Bearer(不同版本行为略有差异,但不用你手动管)。其他模型列表、profile 的结构完全一样。
3.4 profile 是 dsh 的灵魂设计
我想特别说一下 profile 这个东西。它其实是 dsh 和 OpenCode 在配置理念上最大的区别。OpenCode 的做法是配置一堆 provider,然后每次用命令去指定用哪个;dsh 的 profile 相当于把“场景”这个概念固化到了配置里。
比如我可以定义三个 profile:
profile: - name: code provider: my_gateway model: deepseek-coder-33b params: temperature: 0.2 max_tokens: 8192 - name: chat provider: my_gateway model: gpt-4o params: temperature: 0.8 max_tokens: 4096 - name: review provider: another_gateway model: claude-sonnet-4-20250514 params: temperature: 0.2 max_tokens: 16384用的时候:
dsh --profile code dsh --profile review这个设计在真实项目里非常实用。写代码用一个模型、聊天问问题用另一个模型、代码评审用更“聪明”的模型,不需要来回改配置文件。
3.5 环境变量引用:不要把 Key 硬编码在配置里
这是我从一开始就坚持的做法:API Key 不要直接写在.dsh.yaml里。因为你很可能把项目打包提交到 Git 仓库,密钥一旦进版本历史,不管后面怎么删都已经泄露了。dsh 支持环境变量引用,语法是${VAR_NAME}。
具体操作:
export GATEWAY_API_KEY="sk-xxx"然后在配置里写:
provider: - name: my_gateway type: openai base_url: https://api.example.com api_key: ${GATEWAY_API_KEY}如果你不想每次开终端都 export,可以写进~/.zshrc或~/.bashrc。注意修改完环境变量后要source一下才能生效:
source ~/.zshrc # 或 ~/.bashrc这个习惯能避免 90% 的“密钥泄露”事故。
4. 配置常见报错排查:401、404、超时的完整排查链路
下面这部分是踩坑的重头戏。我把我在配置 dsh 时遇到的高频报错和完整的排查链路写下来。如果你是照着前面的步骤做的,大概率不会走到这一步,但万一出问题,按链路来排查比瞎试高效得多。
4.1 401 Unauthorized:认证失败,但原因比你想的多
报错现象:dsh 启动后发起请求,很快返回一条401 Unauthorized或Authentication Fails的错误信息。
排查链路:
第一步,确认api_key是否被正确读取。在 dsh 配置里加了环境变量引用的,先确认环境变量有没有设对。可以临时在配置里硬编码试一下,如果能通说明是环境变量加载的问题,不是 Key 本身的问题。
第二步,确认 Key 本身有效。直接用 curl 请求网关接口,如果 curl 也是 401,说明 Key 在网关那边就不过,可能是 Key 过期、被禁用、额度用完,去网关控制台查。
第三步,确认认证头格式。不同网关对 Key 的认证方式不一样,有些是Authorization: Bearer sk-xxx,有些是自定义头。dsh 对 OpenAI 兼容格式默认使用Authorization: Bearer方式,如果你的网关比较特殊(比如要求x-api-key),需要先在网关文档里确认。
第四步,检查权限范围。有些 Key 限制了 IP 白名单或模型访问范围,如果你本机 IP 不在白名单内,或者 Key 没有目标模型的访问权限,也会返回 401。去网关控制台检查 Key 的权限配置。
注意:还有一种情况是
api_key字段名写错了。dsh 严格区分api_key和apikey、apiKey,不要写错。
4.2 404 Not Found:模型不存在或 BaseURL 路径错误
报错现象:请求能发出去,但网关返回类似404 Model Not Found或直接的 404。
排查链路:
第一步,用GET /v1/models拉一下模型列表(OpenAI 兼容),看看你填的模型名到底在不在列表里。这一步最直接,我在前面已经给过命令。
第二步,如果模型名在列表里但还是 404,多半是 BaseURL 路径有问题。你填的 BaseURL 可能少了/v1或多了/v1。dsh 会在 BaseURL 后自动拼接/v1/chat/completions,如果你把 BaseURL 填成https://api.example.com/v1,那请求就会变成https://api.example.com/v1/v1/chat/completions,自然 404。这种情况把 BaseURL 改成去掉/v1的形式。
第三步,确认模型名不需要带前缀。有些网关在模型名前面需要加gpt-前缀或网关自己的命名空间,比如my-gateway/gpt-4o这种带斜杠的格式。这种奇葩命名你用/v1/models接口拉一下列表就看出来了。
4.3 Connection Timeout 或读超时:网络连接问题
报错现象:请求发出去之后长时间无响应,最后报超时。
排查链路:
第一步,确认 DNS 和连通性。终端里执行:
curl -v https://你的网关地址/v1/models -H "Authorization: Bearer sk-你的密钥"如果 curl 卡住不动,要么是网络不同,要么是 DNS 解析不了,要么是端口被墙。这一步能看出是网络层面的问题还是 dsh 的问题。
第二步,确认代理设置。如果你的机器开了系统代理(HTTP_PROXY、HTTPS_PROXY),npm 或 Node 不一定默认走系统代理,但 dsh 的请求可能会读取代理环境变量。有时候是代理导致的超时,关掉代理再试。
第三步,确认网关是否健康。有些网关服务本身不稳定,或者并发连接数满了,或者部署在境外导致延迟特别高。这种情况换个时间段再试,或者联系网关服务商确认。
提示:如果网关延迟很高(比如境外网关 300ms+),dsh 的默认超时时间可能不够。你可以在配置里调大请求超时时间。
provider: - name: my_gateway type: openai base_url: https://api.example.com api_key: ${GATEWAY_API_KEY} timeout: 120
4.4 模型不返回结果或返回空
报错现象:请求成功,但模型返回的内容为空,或者 dsh 显示工具调用失败。
排查链路:
第一步,看 curl 直接请求返回的 raw 响应。有些网关在返回结果里有详细的错误信息(比如prompt is too long、max_tokens too small等),dsh 可能把错误信息吞掉了,但 curl 能看到原始内容。
第二步,检查supports_function_call配置。如果你用的模型不支持 function call(部分轻量模型或微调模型不支持),但配置里开了supports_function_call: true,dsh 会尝试发起工具调用,然后可能什么都不返回。把这项改成 false 再试。
第三步,把max_tokens调小或调大试一下。有些模型如果max_tokens设置得过小(比如 1),模型一个字都生成不出来,看起来就是返回为空。
5. 配置完成后:验证连通性并启动第一个会话
配置完成之后,先别急着扔一堆任务给 dsh,先做个最小验证,确认链路是通的。
5.1 用 dsh 自带命令验证配置
dsh 提供了验证配置的命令(不同版本命令名可能不同,我用的是dsh doctor和dsh config list):
dsh doctor这个命令会检查配置文件的语法、Key 的基本有效性、模型是否可访问,并给出一份体检报告。实测下来很有用,很多低级错误在这个阶段就能被发现。
然后列出当前生效的配置:
dsh config list确认你配置的 provider 和 profile 都在列表里。如果列表为空,检查配置文件路径是否正确——你是在哪个目录下运行 dsh 的,它就会去找哪个目录下的配置。
5.2 发起一次最简单的对话请求
dsh 的交互模式一般是进入一个 REPL(交互式终端):
dsh --profile default进入之后输入一句:
你好,请回复"配置成功"如果模型回复了,说明整个链路是通的。如果回复报错,把错误信息复制下来,对照上一章的排查链路逐项检查。
5.3 用日志定位剩余问题
如果交互模式下报错,查看日志是最高效的手段。dsh 的日志在(以我用的版本为例):
# 查看实时日志(如果 dsh 写入系统日志目录) tail -f ~/.dsh/logs/dsh.log # 或者在调试模式下运行 dsh --debug --profile default--debug模式会打印出完整的 HTTP 请求和响应内容,包括实际请求的 URL、请求头、响应状态码和响应体。看到实际请求的 URL 之后,90% 的配置问题都能瞬间定位——是不是多拼了/v1、Key 有没有正确附加、模型名有没有被正确替换。
我在用--debug模式时见过最典型的案例是:配置里的模型名写的是gpt-4o,但实际请求时 dsh 把它替换成了gpt-4o-2024-11-20(可能是 dsh 内部做了一次模型名归一化),然后网关不认识这个完整版本号,返回 404。遇到这种情况,把模型的name字段改成请求日志里的实际值,或者看看 dsh 是否有参数禁止模型名改写。
6. 进阶配置与调优:路由策略、多模型切换与 MCP 扩展
等你能正常跑通最简单的配置之后,我建议花点时间把进阶配置也做了。这些功能不是锦上添花,而是 dsh 真正值回票价的地方。
6.1 多 provider 配置与 fallback 策略
dsh 支持配置多个 provider,你可以根据某个 provider 故障时自动切换到备用 provider:
provider: - name: gateway_primary type: openai base_url: https://api.example.com api_key: ${PRIMARY_API_KEY} default_model: gpt-4o-mini - name: gateway_backup type: anthropic base_url: https://api.backup.com api_key: ${BACKUP_API_KEY} default_model: claude-sonnet-4-20250514 profile: - name: default provider: gateway_primary fallback_provider: gateway_backup model: gpt-4o-mini params: temperature: 0.3fallback_provider这个字段的语义是:主 provider 请求失败(网络错误、5xx、超时)时,自动用备用 provider 重试。注意它只在连接或服务端错误时触发,如果你的 Key 本身无效(401),dsh 不会用备用 Key 重试——这是设计如此,不是 bug,因为 401 是你的配置问题,对备用 Key 来说大概率也一样。
6.2 模型映射别名
有些第三方网关的模型名特别长(比如claude-sonnet-4-20250514-v1.2-fp8),每次都在命令行里敲很累。dsh 可以用alias给模型起别名:
provider: - name: my_gateway type: openai base_url: https://api.example.com api_key: ${GATEWAY_API_KEY} default_model: gpt-4o-mini models: - name: gpt-4o-mini alias: fast - name: deepseek-coder-33b alias: code然后在命令行里:
dsh --model fast这个功能看着简单,但实际使用频率非常高。特别是你在 profile 和命令行之间来回切换的适合,一个短别名能省不少事。
6.3 MCP 扩展:让 dsh 接入外部工具
dsh 的一个核心卖点是对 MCP(Model Context Protocol)的支持。简单说,MCP 让模型能调用外部工具,比如读本地文件、调用 API、执行命令。
在配置里启用 MCP 扩展:
mcp: servers: - name: filesystem command: npx args: - -y - @modelcontextprotocol/server-filesystem - /path/to/your/project这样 dsh 在对话中就能感知并调用文件系统工具。不过要注意,MCP 服务有很多,不是每个都能稳定运行,建议先从一个简单的开始(文件系统、数据库查询),确认整个链路没问题再逐步加。
6.4 系统 Prompt 配置:让 dsh 更贴合你的工作流
dsh 支持在配置里指定系统提示词,也就是告诉模型“你是一个什么角色,你应该怎样工作”:
profile: - name: code provider: my_gateway model: deepseek-coder-33b system_prompt: | 你是一位资深软件工程师,擅长代码审查与重构。 在回答时请遵循以下规则: 1. 先给出结论,再解释原理。 2. 涉及代码时给出可运行的完整示例,不要省略关键逻辑。 3. 如果问题描述不清楚,先提问澄清,不要猜测。 params: temperature: 0.27. dsh 与 OpenCode 的配置差异:迁移时要注意什么
最后聊聊 dsh 和 OpenCode 的对比。这两个工具我都在用,说实话各有各的优势。如果你正在考虑从 OpenCode 切到 dsh,有几个关键差异必须先知道。
7.1 配置结构的差异
OpenCode 的配置是扁平的provider列表,每个 provider 有自己的models,用的时候通过--provider或--model指定。dsh 多了一个profile层,这是一种“按使用场景组织模型”的思路——你可以把“写代码”“聊天问答”“代码评审”分别做成一个 profile,切换场景时只需要改一个 profile 名,不用记 provider 和 model 的完整组合。
从日常使用角度来说,dsh 的 profile 设计更顺手。特别是你经常在“快速问答”和“深度编码”之间切换的时候,dsh --profile chat和dsh --profile code的组合方式比 OpenCode 的--provider xxx --model yyy简洁太多。但反过来说,OpenCode 的扁平结构在调试时更直观,配置里有什么就能用什么,不存在 profile 覆盖参数的隐藏行为。
7.2 插件安装机制差异
dsh 和 OpenCode 都支持插件,但安装机制差别挺大。OpenCode 主要是 node 包的形式,通过 package manager 安装;dsh 则更偏向 MCP 协议的工具扩展。这意味着你想给 dsh 加“读文件”“写数据库”这类工具能力时,需要先理解 MCP 的 server 概念,而不是直接装一个 npm 包就能完事。
这种设计带来的好处是生态标准统一,一个 MCP server 可以同时给 dsh、OpenCode、Claude Desktop 用。坏处是排查问题更复杂,MCP server 本身也是一个进程,它挂了你得先查 server 的日志,再查 dsh 的日志。
如果你遇到“插件安装失败”相关的问题,我的排查思路是:先用独立命令启动 MCP server(就是配置文件里那个command),看它能不能正常跑起来;如果能跑,再用dsh --debug看 dsh 有没有成功连接到这个 server;最后看是不是 server 的启动路径不对、node 版本不兼容这些环境问题。
7.3 模型兼容性表现
在第三方 API 的兼容性上,dsh 对 OpenAI 兼容接口的适配做得比较完善,对 Anthropic 兼容接口的支持略少但基础功能没问题。OpenCode 在这块也很成熟,但它的配置方式更依赖社区预置的 provider 模板。如果你用的是小众网关,dsh 的自定义配置灵活度更高,不用等社区更新 provider 模板,自己改配置文件就能用。
从我个人的实际体验来看,dsh 和 OpenCode 之间不应该看作“替代”关系,而是“互补”。dsh 的 profile 机制和 MCP 扩展适合在一个稳定的工作流里深耕;OpenCode 的简单直接适合快速上手、临时用一下。我的建议是:主力工作流用 dsh,遇到需要快速验证某个模型或临时跑一个任务时用 OpenCode,谁顺手用谁。
8. 最后一些碎碎念和实战建议
走到这一步,你已经能把 dsh 和第三方兼容 API 顺利接上了。但配置只是开始,真正用起来还有一些细节值得提一下。
第一,不要过度依赖某一个网关。我见过不少同事把所有模型都绑在一个网关,结果网关一挂,整个工作流瘫痪。dsh 的多 provider 和 fallback 配置不是摆设,主备两个网关的搭配能让你的终端工作流稳定得多。
第二,定期检查你的 API 消费情况。第三方网关的计费逻辑千奇百怪,有些网关按 token 计费、有些按请求次数计费、有些按模型单独计费。建议每个月看看消费记录,确认没有异常消耗。特别是配置了多模型切换之后,很容易在不知情的情况下从默认的省钱模型切到了贵模型。
第三,关注 dsh 的更新日志。这个工具还在快速迭代阶段,每个版本都可能带来配置格式的变化。版本升级后如果配置报错,先去官方文档看有没有 Breaking Changes,而不是急着排查你的配置。我自己就遇到过升级后version字段从1.0变成2.0的情况,配置文件直接不识别。
第四,如果条件允许,把配置和常用的 prompt 模板纳入版本管理。配置文件里的 API Key 用环境变量引用,这样就算换电脑、重建环境,拉下仓库后只需要重新设置环境变量就能恢复完整的工作环境。配合 dsh 的目录级配置,你可以在不同项目里自动切换到不同的模型组合,这种“项目即配置”的体验在实际工作中帮助非常大。
我目前的工作流是:全局默认配置放主网关,面向日常问答;每个后端项目里放一个覆盖配置,指向项目专用的模型网关(或者本地 Ollama),同时把 MCP 的文件系统工具指向项目目录。这样不管切到哪个项目,打开终端进入目录后,dsh 会自动读取当前项目下的配置并切换到对应模型。这套配置已经稳定跑了三四个月,除了网关本身出过一次故障之外,没有再遇到配置层面的问题。希望这篇教程能帮你少走几个弯路。