deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:shenkonghui/dsh-llm-acp
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
中文 | English
DeepSeek Harness 的 ACP 客户端 LLM 适配器 + ACP 服务设置界面。通过外部 Agent Client Protocol 服务器作为模型提供方接入 harness 的 LLM 层,并提供一个 Web 设置页面用于浏览 ACP 注册表和管理已配置的服务器。
本包是一个双面 dsh 插件:宿主端(lib/index.js)是传输适配器,在 ctx.llm 上注册 provider 路由;客户端(lib/client.js)是浏览器设置页面,让用户从 Web UI 浏览 ACP 注册表并添加/删除 ACP agent 服务器。
支持acp registry上的所有acp-server[https://agentclientprotocol.com/get-started/registry]
如claude,codex,opencode等



dsh plugin --profile my-acp add github:shenkonghui/dsh-llm-acp
或从本地目录安装:
dsh plugin --profile my-acp add ./dsh-llm-acp
构建产物(lib/)已提交到仓库,安装时无需运行任何构建脚本。
dsh plugin --profile my-acp remove @deepseek-ai/dsh-llm-acp
这会从 profile 中移除依赖和 bundle 层。
安装后,在 Web UI 中打开 设置 → ACP 服务。浏览 ACP 注册表,在任意 agent(如 Devin、Codex、Claude Agent)上点击 添加,即可将其配置为 ACP 服务器。每个已配置的服务器会创建一个独立的 provider 路由 acp-<server-id>。
在 我的服务 标签页中,点击任意已配置服务器上的 编辑 按钮,可以:
DEEPSEEK_API_KEY、OPENAI_API_KEY)。每个服务器的环境变量会与插件级 env 合并,服务级优先。也可以直接在 settings.yaml 中配置:
llm-acp:
servers:
devin:
command: devin
args:
- acp
name: Devin
env:
DEEPSEEK_API_KEY: sk-xxx
models:
- deepseek-chat
- deepseek-reasoner
apply(ctx, config) 从 llm-acp 设置命名空间读取已配置的服务器列表。对每个服务器,启动一个长生命周期的子进程,通过 stdin/stdout 建立 ACP ClientSideConnection,并在 ctx.llm 上注册路由为 acp-<server-id> 的 AcpAdapter。每次模型调用会创建新的 ACP session,将完整对话作为一条用户消息发送,并将流式 agent_message_chunk 更新转换为 harness 的 StreamChunk。
浏览器端注册一个 settings.section slot,渲染 ACP 注册表浏览器和"我的服务"列表。添加服务器时会将其持久化到 llm-acp 设置命名空间;宿主端监听变更并同步更新 provider 目录。
ACP 注册表指定了不同的分发类型:
| 类型 | 命令 |
|---|---|
npx |
npx -y <package> ...args |
uvx |
uvx <package> ...args |
binary |
取注册表 cmd 的 basename(如 ./bin/devin → devin) |
binary 类型使用可执行文件的 basename,这样已安装到 PATH 的二进制文件可以直接找到,避免 spawn ./bin/devin ENOENT 错误。
| 配置 | 默认值 | 说明 |
|---|---|---|
permission |
allow |
自动应答 session/request_permission:reject 拒绝所有请求,allow 选择第一个 allow_once/allow_always 选项。 |
emitReasoning |
true |
是否将 agent_thought_chunk 和扩展进度通知转换为 reasoning-delta chunk。 |
defaultModelId |
glm-5-2 |
ACP 发现未返回模型时的回退模型 ID。 |
defaultModelName |
GLM-5.2 High |
回退模型显示名称。 |
disposeEofGraceMs |
6000 |
stdin EOF 后等待平台终止的宽限时间(毫秒)。 |
disposeGraceMs |
3000 |
SIGTERM 后等待 SIGKILL 的 POSIX 宽限时间(毫秒)。 |
每次 stream() 调用:
session/new,使用配置的 cwd。messages 和 system prompt 渲染为一条 ACP 文本块。session/prompt,将流式 agent_message_chunk 更新作为 text-delta chunk 传输。emitReasoning 开启时,agent_thought_chunk 更新转换为 reasoning-delta chunk。session/prompt 响应的终态 stopReason 转换为 finish chunk。工具调用增量不会被输出。ACP 服务器内部执行自己的工具。
| ACP | Harness finish |
|---|---|
end_turn |
stop |
max_tokens |
max-tokens |
refusal |
error(code REFUSAL) |
cancelled |
aborted |
max_turn_requests / 未知 |
error |
pnpm install
pnpm build # tsc -b && tsdown
构建产物已提交到仓库,用户安装时只需 pnpm install 即可。
GenerateOptions.tools 被忽略。stream() 调用创建新的 ACP session 并重新发送完整对话。usage chunk。session/new 没有 system 槽位,harness 的 system prompt 被拼接到用户消息文本前。messages 数组渲染为一条用户消息。@agentclientprotocol/sdk 0.25.1,其 session/prompt 响应携带终态 stopReason(v1 契约)。_cognition.ai/* 通知被静默消费(进度文本在 emitReasoning 开启时作为 reasoning 输出);其他非标准 ACP 扩展被吞掉以避免 SDK 错误日志。MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。