dsh-gomokuDeepSeek Harness plugin

在DSH中与AI下五子棋,也可以让AI对局,看哪个AI棋力更强

Stars
16
Forks
0
License
MIT
Last commit
Aug 15, 2026

Overview

在DSH中与AI下五子棋,也可以让AI对局,看哪个AI棋力更强

Original README

Cached from the project repository on Sep 3, 2026. This is source content, separate from the Agents.md review above.

View source

English · 简体中文

五子棋(Gomoku)· 在 DSH 里和 AI 杀一盘

dsh-gomoku

总是让 AI 帮你写代码、做表格?这次换它陪你下棋。@yejiming/dsh-gomoku 是 DeepSeek Harness 的五子棋插件:在 DSH 侧边栏摆上一盘 15×15 的棋盘,让 DeepSeek 或任何你配置好的模型执子对弈。

这里没有搜索算法,也没有启发式剪枝——每一步落子都来自 LLM 纯粹的推理与判断,堪称对模型「思考能力」最直观的考验。最过瘾的当属双 AI 对战:让两个模型同台厮杀,谁的推理更缜密、更懂审时度势,一局见分晓。

想更进一步?黑、白两方的系统提示词可以分别编辑,约束 AI 落子前的思维链,亲眼看着棋力在你的「调教」下节节攀升——输赢先不论,围观棋路、偷师几手也不亏。

最贴心的是:棋盘弹窗想开就开、想关就关,对局和 AI 的思考在后台照常进行。一边用 DSH 处理正事,一边偷空落一子,摸鱼与工作两不误。

主要功能

  • 人机与双 AI 对弈:支持执黑、执白、双 AI 对弈三种模式,15×15 无禁手规则(双三、双四、长连均合法,连成五子及以上即胜)。对弈模式与新开局按钮位于棋盘下方。
  • 黑白 AI 分别设置:黑、白两方可分别选择模型与思考档位(Off / High / Max),互不影响;模型不支持所选档位时自动回落其默认档位。
  • 思考过程分侧展示:黑、白两方的思考记录分别列在棋盘左右两侧(与各自的 AI 设置同侧),默认折叠,点击某手可展开该步的完整推理文本。
  • 暂停与手动接管:棋盘下方【新开局】按钮右侧的【暂停】按钮可随时中断 AI 思考(两者均为「图标 + 文字」的胶囊按钮:⟳ 新开局、⏸ 暂停、▶ 继续,暂停中按钮转为琥珀色高亮);暂停期间你可为黑白双方轮流落子,没有步数限制,再次点击【继续】后 AI 恢复思考。
  • 固定超时与输出上限:单次落子的端到端超时固定为 3000000 毫秒(3000 秒)、输出 token 上限固定为 32000,随每次落子请求发送,不在界面中暴露。
  • 黑白提示词分开编辑:黑、白两方 AI 的系统提示词分别在棋盘左右两侧的面板中常驻展示、随时编辑,各自可一键恢复默认。默认提示词包含规则、术语(活二/活三/眠三/双活三/四三/防守要点等,附 JSON 示范)、强制思考流程(穷举威胁→分析候选→综合判断)与高水平 Few-shot 对弈示例(每条附返回案例)。
  • 弹窗关闭不中断对局:棋局保存在浏览器端 store 中,关闭棋盘弹窗既不会重置棋局,也不会中断正在进行的 AI 思考,可以一边使用 Harness 主功能一边对弈。
  • 瞬时失败自动重试:流式响应中断(连接断开、限流等瞬时传输故障)会在尝试预算内自动重试,不会直接让整步棋失败。

快速安装

支持三种安装方式,均无需本地构建(构建产物 lib/ 已提交进仓库,且不设 prepare/prepack 脚本)。DSH 的标准插件安装机制是「组合包 → profile」:插件包在 package.json 中声明 dsh.bundle 并附带 patch 文件(cordis.patch.yml),用户用 dsh plugin 把它安装进任意 profile。

方式一:npm 安装(推荐)

sh
# 从 npm 安装(首次使用会初始化该 profile)
dsh plugin --profile demo add @yejiming/dsh-gomoku

方式二:GitHub 源码安装

sh
# 从 GitHub 源码安装(仓库已提交构建产物 lib/,安装时无需构建)
dsh plugin --profile demo add github:omdsh-dev/dsh-gomoku

方式三:本地 checkout / tarball 安装

sh
# 从本地 checkout 安装(在插件目录内执行)
dsh plugin --profile demo add .
# 从 tarball 安装(tarball 由 pnpm pack 生成,文件名形如 yejiming-dsh-gomoku-<版本>.tgz)
pnpm pack
dsh plugin --profile demo add ./yejiming-dsh-gomoku-0.0.1.tgz

以上方式都直接使用仓库内提交的预构建产物(lib/),安装时不需要执行构建脚本——从 git 安装也无需在 profile 的 pnpm-workspace.yaml 里配置 allowBuilds。要求 dsh ≥ 0.1.0-rc.6:插件使用 @deepseek-ai/dsh-host-webserverwebServer 服务,更早版本的 dsh 没有该服务,插件行会一直 pending。若 pnpm 提示 peer 依赖警告,可忽略:所需服务由宿主 dsh 在运行时提供。

首次使用 dsh plugin 会初始化该 profile(@deepseek-ai/dsh-base 作为第一个组合包);安装后先用 --dump-config 验证层,再启动:

sh
dsh --profile demo --dump-config   # 输出中应出现 gomoku 层
dsh --profile demo

移除:dsh plugin --profile demo remove @yejiming/dsh-gomoku 会同时移除依赖与对应层。

架构

棋局本身(状态、回合、胜负判定)在浏览器界面中;服务端只仲裁 AI 落子,因此非法回复在服务端被拒绝,不会破坏浏览器端的棋盘。游戏采用自由式五子棋(无禁手):黑方可以自由下双三、双四与长连——任意方向连续五子及以上即获胜。规则、返回格式、落子前思考流程、战术与示例都在默认系统提示词中;用户可以在界面中手改提示词,修改后的文本会原样作为系统提示词发送。

配置

所有字段都有 loader 默认值;无库级默认值。

说明
moveTimeoutMs单次 AI 落子尝试的端到端截止时间(默认 3000000 毫秒,即 3000 秒)。浏览器端每次都发送固定值,界面不再提供调整。
maxMoveOutputTokens单次 AI 落子回复的输出 token 上限(默认 32000)。推理模型会把思考计入输出预算,因此默认值较宽松;截断的回复只要 JSON 完整仍会被解析,只有 JSON 丢失才触发重试。浏览器端每次都发送固定值,界面不再提供调整。
maxMoveAttempts每次落子请求的 AI 尝试总次数;最后一次尝试附带纠正反馈(默认 3)。

模型调用

五子棋落子请求(Auxiliary gomoku move request)

What the model sees

每次 AI 落子都是发往所选 provider/model 路由的一次独立辅助请求。系统提示词是黑、白两方各自编辑后的文本(在棋盘两侧面板中随时可改),某方未编辑时用下方的包默认文本;唯一的用户消息包含 15×15 棋盘文本(首行列号,随后 15 行每行以行号开头,每格一个 B/W/· 字符)、AI 执子方,以及(重试时)上一次非法回复与拒绝原因。落子请求还可携带思考档位(off/high/max):仅当所选模型声明支持该档位时,服务端才会把它作为请求的 reasoning effort 转发;不支持的档位回落到模型自身默认值,而不是让请求失败。浏览器端固定发送按请求 moveTimeoutMs(3000000)与 maxMoveOutputTokens(32000)覆盖值。回复中的推理块会随落子、和棋或错误结果以 reasoning 字段返回给浏览器。

本字段的原文(Verbatim text for this field, when needed)
markdown
1你是五子棋对局引擎(无禁手规则)。请根据给定的棋盘局面,为你的执子方选择一步合法落子,并严格按照规定的 JSON 格式返回。
2
3# 术语解释(每个概念附一条 JSON 示范;坐标 (r,c) 表示第 r 行第 c 列,即 [r, c])
4- 活二:两子相连,且两端都能继续延伸。
5  {"概念": "活二", "示范": "白子 (5,5)(5,6),(5,4) 与 (5,7) 均为空"}
6- 冲三:三子相连,只有一端开口,下一步可成冲四。
7  {"概念": "冲三", "示范": "黑子 (3,0)(3,1)(3,2),仅 (3,3) 一端为空"}
8- 活三:三子相连,两端都是空位,下一步可成活四;对手出现活三时,必须立即堵住其中一端。
9  {"概念": "活三", "示范": "黑子 (3,3)(3,4)(3,5),两端 (3,2) 与 (3,6) 均为空", "应对": {"move": [3, 2]}}
10- 冲四:四子相连,只有一端开口,下一步即成五;必须立即堵住开口端。
11  {"概念": "冲四", "示范": "黑子 (3,3)(3,4)(3,5)(3,6),(3,2) 已有白子,仅 (3,7) 一端为空", "应对": {"move": [3, 7]}}
12- 活四:四子相连,两端都是空位,下一步必成五,无法阻挡。
13  {"概念": "活四", "示范": "白子 (7,3)(7,4)(7,5)(7,6),两端 (7,2) 与 (7,7) 均为空"}
14- 五连:任意方向连续 5 颗及以上己方棋子,即获胜(长连同样算赢)。
15  {"概念": "五连", "示范": "黑子 (8,5)(8,6)(8,7)(8,8)(8,9) 连成五子,黑方直接获胜"}
16
17# 棋盘
18- 棋盘为 15×15,共 225 个交叉点。行 row 与列 col 均从 0 到 14,坐标写作 [row, col]。
19- 棋盘在消息中以 16 行文本给出:第 1 行是列号(0 到 14,与每列对齐),随后 15 行每行以行号开头,后面是该行的 15 个交叉点,每格一个字符:`B` 表示黑子,`W` 表示白子,`·` 表示空交叉点。
20- 黑方先手,双方轮流落子;每一步只能落一子,且必须落在空交叉点上。
21
22# 胜负规则
23- 任意一方在横、竖或两条斜线(共 4 个方向)中的任一方向上,率先形成连续 5 颗及以上己方棋子,即获得胜利。
24- 本局采用无禁手规则:黑方没有任何落子限制。专业规则中禁止的「双三」「双四」「长连」(连续六子及以上)在本局中全部允许——只要连成五子及以上,无论用什么手段都算赢。
25- 棋盘没有空位且无人获胜时为和棋。
26
27# 基本战术(落子前逐条检查;沿横、竖、两条斜线共 4 个方向分别扫描双方棋型;每条附返回案例)
281. 取胜优先:若本步能直接形成五连(包括把己方四连补成五连),立即落子取胜,不要贪图其他棋型。
29   案例:黑方执子,黑方在 (6,6)(6,7)(6,8)(6,9) 已有四连,(6,10) 为空。
30   返回:{"move": [6, 10]}
312. 必防冲四:若对手已有四连且只差一子即成五,必须立即堵住其成五点(四连只有一端开口时堵住开口端),否则对手下一步直接获胜。
32   案例:白方执子,黑方在 (4,4)(4,5)(4,6)(4,7) 已有四连,(4,3) 已有白子,只剩 (4,8) 一个成五点。
33   返回:{"move": [4, 8]}
343. 活三必挡:若对手已形成活三(三连且两端都是空位),必须立即堵住其中一端;否则对手下一步形成两端都能成五的活四,将无法阻止。
35   案例:黑方执子,白方在 (7,3)(7,4)(7,5) 连成三子,两端 (7,2) 与 (7,6) 均为空。
36   返回:{"move": [7, 2]}
374. 主动进攻:没有上述威胁时,优先落子让己方形成活三或冲四;落子尽量靠近己方已有棋子并保持连线,不要下在远离棋子的孤立位置。
38   案例:黑方执子,黑方已有 (5,5)(5,6) 两连,(5,4) 为空,在 (5,4) 落子可形成两端 (5,3)(5,7) 皆空的活三。
39   返回:{"move": [5, 4]}
405. 双重威胁:一个落点若能同时形成两个威胁(如双三、四三)应优先选择;防守时若能一子同时堵住对手多个威胁则更佳。
41   案例:黑方执子,黑方已有横向 (5,3)(5,4) 与纵向 (3,5)(4,5) 各两连,在 (5,5) 落子可同时形成两个活三(双活三)。
42   返回:{"move": [5, 5]}
43
44# 返回格式(必须严格遵守)
45只返回一个 JSON 对象,不要输出任何思考过程、解释、Markdown 代码块或前后缀(思考会占用输出预算,导致回复被截断):
46- 正常落子:{"move": [row, col]}
47- 和棋:{"draw": true}
48- 局面无法理解:{"error": "一句话说明原因"}
49
50# 正确案例
51示例 1:黑方执子。棋盘上第 7 行第 8 列(row=7, col=8)为空,黑方在此落子即可形成连续五子并获胜。
52返回:{"move": [7, 8]}
53错误示范(禁止返回):"我认为应该下在这里。{"move": [7, 8]}" —— 带解释的文字不是合法输出。
54
55# 坐标校验
56row 与 col 必须是 0 到 14 的整数,且目标交叉点必须为空;违反任何一条都是非法落子,你会收到纠正提示并重新选择。
Token effect

辅助请求按棋盘构造成本消耗 token(约 530 个固定字符——带行列标注的棋盘加构句——外加用户编辑后的提示词)以及 maxMoveOutputTokens(默认 8192)。高于 off 的思考档位会增加模型的思考 token,计入同一个输出预算。该请求与任何 agent 对话相互独立,绝不写入会话日志。命中输出上限的回复仍会先尝试解析出完整 JSON 对象,解析失败才计为一次失败尝试。

KV Cache effect

辅助请求是独立的模型请求;其提示词随每个棋局位置变化,因此与 agent 流量之间没有稳定的共享前缀。用户编辑系统提示词会整体替换文本,使 provider 侧的跨局前缀复用失效;默认提示词只在未编辑时保持稳定。