dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
围棋复盘教练:解析 SGF 棋谱,用自带 KataGo 引擎补算胜率与目差,在对话里逐手讲解问题手,并把讲解写回 SGF 副本;Web 面板用棋盘展示问题手、AI 首选与变化图。
给 DSH(DeepSeek Harness)装一位围棋老师。把手上一盘棋的 SGF 棋谱交给它,它会像陪练老师那样逐手讲给你听:这手棋原本想干什么、问题出在哪、改下哪里会更好。讲完可以把讲解写回棋谱文件,也可以导出一份 Markdown 复盘报告。
PB/PW/BR/WR),谁执黑不用问。
| 你想知道的 | 你怎么说 | 你会得到 |
|---|---|---|
| 这盘棋我哪儿下坏了 | 「复盘这盘棋 C:\棋谱\xxx.sgf」 | 按严重程度排好的问题手:第几手、谁下的、下在哪、大恶手 / 失误 / 不精确、掉了多少胜率与多少目 |
| 某一手为什么不好 | 「第 42 手为什么不好?」 | 这手的意图 + 问题所在 + 更好的下法与后续变化,口语讲解配一张图 |
| 换个下法会怎样 | 「第 42 手改下 R16 会怎样?」 | 一条主变:双方接下来怎么走、结果好不好;回答里直接画出这张变化图(着法按 1-9、A-Z 编号,关键棋子用三角形标出) |
| 我想看看大势怎么走的 | 打开左侧栏「Sensei 棋盘」 | 两张可折叠曲线:胜率曲线与目差曲线(统一黑方视角),点图上任意位置就跳到那一手;问题手在曲线上点着小色点 |
| 我想在自己的软件里看讲解 | 「把讲解写回棋谱」 | 逐手讲解写进同目录的 -sensei 副本的注释(标准 C[] 属性),任何能显示注释的打谱软件打开都能看到;源棋谱不被改动 |
| 我想要一份文字留档 | 「生成复盘报告」 | 与本次读取的棋谱同目录同名 .review.md:棋局信息 + 问题手表 + 已写回的讲解 |
| 只想看前半盘 / 只想看某一段 | 「只看前 50 手」 | 只讲这一段,省时省 token |
讲解由 DSH 会话里的「围棋老师」人格完成:先复述你的意图、指出问题、再给具体改进建议;术语密度按双方段位自动调整(18K10K 用生活化比喻,9K1D 用常规术语,2D 以上可以直接聊全局构思)。胜率与目差只是佐证——先讲棋理,再引数字。
# ① 装插件(在插件的上一级目录执行;下面这行是作者机器上的路径,换成你自己的)
cd C:\dsh\WeiQi
dsh plugin --profile web add ./dsh-go-sensei
# ② 重启 dsh web,浏览器打开 http://127.0.0.1:3080
③ 把一份棋谱放进当前会话的工作区(或者记住它的完整路径),在对话里说:
复盘这盘棋 [庄生梦1n4k]vs[鍾易成1]1788532348030034222.sgf
Sensei 会自己读谱、找问题手、逐手讲解。棋谱里没有 AI 分析数据也不打紧:插件自带 KataGo 引擎与 18b 权重(Windows),会自动补算,你不需要装任何东西。想换成更强的权重或换后端,见 KataGo 引擎 一节。
复盘过程中产生的分析数据与讲解都写进同目录的 <源名>-sensei.sgf 副本,你给的那份棋谱不会被改动(见 源棋谱只读)。
| 项 | 要求 |
|---|---|
| DSH | ≥ 0.1.5-rc.1(见 package.json 的 dsh.engines.dsh;本机实测 0.1.5-rc.1 / 0.1.5-rc.2) |
| Node.js | ≥ 22.19(见 package.json 的 engines;本机实测 v24.19.0) |
| 运行环境 | Windows / macOS / Linux 均可;依赖只有 3 个纯 JS 包,npm install 即可,无编译步骤 |
| 自带引擎 | engine/ 里随包分发的是 Windows x64 OpenCL 版 KataGo + 18b 权重;macOS / Linux 需自己下载对应平台的引擎(见下文) |
# 方式一:本地目录(自己 clone 或改源码时用;装完是 link,改完重启即生效)
dsh plugin --profile web add ./dsh-go-sensei
dsh plugin --profile web add D:\path\to\dsh-go-sensei # 也可以用绝对路径
# 方式二:直接从 GitHub 装(仓库公开)
dsh plugin --profile web add github:Zhuang-A/dsh-go-sensei
dsh plugin 会把这个包装进 web 这个 profile,并自动把声明了 dsh.bundle 的依赖加入 profile 图层列表——不需要你手工改 bundles。装完重启 dsh web 才生效。
仓库里带着引擎与权重,约 110 MB,clone / 首次安装会慢一些;本地目录安装用的是
link:,不复制文件,改完源码重启dsh web即生效。不需要自带引擎的话,删掉engine/目录即可。
# 合成后的配置里应该能看到 go-sensei 这一层
dsh --profile web --dump-config | Select-String -Context 0,3 go-sensei
再看两处:
go_* 系列工具 → 宿主端加载成功。dsh plugin --profile web update dsh-go-sensei # 升级(本地 link 安装无需此步)
dsh plugin --profile web remove dsh-go-sensei # 卸载
卸载后重启 dsh web 并刷新页面:面板与样式都不会残留。
插件的 package.json 里声明了 dsh.engines.dsh(>=0.1.5-rc.1)与 dsh.compatibility.dshReleases 逐版本兼容表。当前情况:
| DSH 内核 | 状态 | 依据 |
|---|---|---|
| 0.2.1-rc.2 | compatible | 2026-10-17 在官方桌面端(内核 0.2.1-rc.2)实测:7 个工具注册成功、配置 Schema 13 个字段带默认值完整投影、客户端 4 处插槽全部 active、兼容门判定通过(engines.dsh 开区间 + includePrerelease)、306 条单测通过 |
| 0.2.0-rc.2 | compatible | 2026-09-30 在官方桌面端(Electron 外壳,dsh-app://app 页面)实测:7 个工具注册成功、客户端 4 处插槽(输入框下方 / 左侧栏图标 / 主区域 / 右侧栏文档预览)全部 active、面板路由复用 GUI 鉴权闸门(未带凭据 401)、补算 30 手并写回 -sensei 副本、294 条单测通过 |
| 0.2.0-rc.1 | unknown | 没在真机上跑过 |
| 0.1.7-rc.1 / rc.2 | unknown | 没在真机上跑过 |
| 0.1.5-rc.1 / rc.2 | compatible | 长期使用的基线(web profile) |
两条在 0.2.x 上必须知道的事实:
engines.dsh 就只按它判,peerDependencies 会被忽略;没写 engines.dsh 才逐个校验 @deepseek-ai/dsh* peer。semver 判定固定带 { includePrerelease: true },所以 >=0.1.5-rc.1 能放行 0.2.1-rc.2(换成默认选项的话,预发布版会被判不满足——这是最容易踩的坑)。dsh.compatibility.dshReleases 只是对外声明,内核不读。dsh-app://app 上,宿主 cookie 由外壳进程持有、不下发给页面,所以指向 http://127.0.0.1:<端口> 的绝对图片地址在那边会 401。插件会把配图 SVG 落盘(棋谱同目录的 .go-sensei/)并用本机路径出图,由界面改写成带鉴权的 /api/file;浏览器界面(web profile)仍用绝对直链。两种形态都由 go_draw_diagram 返回,原样粘贴即可,不要自己改。全部可选,一个都不配也能用。 配置写在 profile 的补丁层文件里:
%USERPROFILE%\.dsh\profiles\web\cordis.patch.yml # Windows
~/.dsh/profiles/web/cordis.patch.yml # macOS / Linux
(若你设过 DSH_HOME,就是 $DSH_HOME\profiles\web\cordis.patch.yml。目前 Web 设置页里没有 Sensei 的配置卡片,改配置请直接编辑这个文件。)
# ── DeepGo Sensei ─────────────────────────────────────────
# 全部可选:一段都不写也能用(自带引擎会自动被发现)。
# 路径用正斜杠,既被 Windows 接受,也避免 YAML 反斜杠转义踩坑。
- id: go-sensei
config:
level: auto # 讲解难度 18K..1K/1D..9D,或 auto(按双方段位自适应)
winrateThreshold: 0.03 # 问题手胜率落差阈值(0~1 小数)
scoreThreshold: 3 # 问题手目差阈值(目)
maxCandidates: 10 # 每次复盘最多返回多少个问题手
pvDepth: 6 # 每条变化图保留多少手
tokenBudget: 50000 # 单局讲解的 token 预算(软约束)
engineDir: '' # 引擎目录;留空=用插件自带的 engine/
kataGoPath: '' # 可选:可执行文件(默认取 engineDir 里的 katago)
kataGoConfig: '' # 可选:analysis 配置(默认取 engineDir 里的 analysis_example.cfg)
kataGoModel: '' # 可选:权重文件;留空=自动挑 engineDir 里最大的 *.bin.gz
maxVisits: 100 # 补算每手搜索量:越大越准越慢
allowEnginePathOverride: false # 是否允许模型用工具入参临时改引擎路径(默认关,见下)
autoInstallSkill: true # 加载时把随件讲棋技能装进技能根(false=不碰技能目录,也不要求模型加载它)
没写的键一律用默认值。各项含义:
| 配置项 | 默认 | 作用 |
|---|---|---|
level | auto | 讲解难度;auto 时按棋谱双方段位取较弱一方(照顾初学者) |
winrateThreshold | 0.03 | 胜率落差超过该值即算问题手(3% 是 KataGo 的"失误线") |
scoreThreshold | 3 | 目差落差超过该值也算问题手(与胜率通道任一触发即标记) |
maxCandidates | 10 | 单次复盘返回的问题手上限(按严重度排序取前 N) |
pvDepth | 6 | 每条候选变化图截断到几手 |
tokenBudget | 50000 | 单局讲解预算,写进人设段作为软约束 |
autoInstallSkill | true | 插件加载时把随件的「围棋详细讲解」技能装进 <DSH_HOME>/skills(备份后覆盖、逐件复验)。关掉=不碰技能目录,并且不会要求模型去加载那个技能。见 内置讲棋技能 |
engineDir | '' | 引擎目录(放可执行文件 + analysis 配置 + 权重)。留空=用插件自带的 engine/ |
kataGoPath | '' | 可执行文件路径;留空=取 engineDir 里的 katago / katago.exe |
kataGoConfig | '' | analysis 配置路径;留空=取 engineDir 里的 analysis_example.cfg |
kataGoModel | '' | 权重路径;留空=自动挑 engineDir 里最大的 *.bin.gz(再退回配置里的 modelFile) |
maxVisits | 100 | 补算每手搜索量 |
allowEnginePathOverride | false | 是否允许模型用 go_engine_analyze 的入参临时覆盖 engineDir / kataGoPath / kataGoConfig / kataGoModel。默认关:引擎是可执行资产,路径决定权留在配置侧;关着时入参会被忽略并在结果里说明。打开后即恢复"只临时换一次"的便利(见 引擎章节) |
引擎不可用(非 Windows 且没配 engineDir)时,go_engine_analyze 不会注册,复盘自动走纯棋理模式;随时可以让 Sensei 调 go_engine_info 看当前状态与改法。
| 你的棋谱 | 插件会怎么做 | 要自己装引擎吗 |
|---|---|---|
自带 AI 分析数据(WV[]/LZ[] 属性,或注释里有胜率行) | 直接读棋谱里的分析来讲解 | ❌ 不用 |
| 没有任何分析数据(野狐导出的对局大多是这种) | 用插件自带的引擎自动补算问题手,再讲解 | ❌ 不用(Windows) |
| 没有任何分析数据,且引擎不可用 | 走「纯棋理」模式:只讲棋理,不虚构胜率与变化图 | ✅ 需要(非 Windows,见下文) |
怎么判断棋谱有没有分析数据:用记事本打开 .sgf,搜 WV[ 或 LZ[,或者搜「胜率」。搜得到就是自带分析。
engine/ 目录随插件分发,不需要填任何配置就能补算:
| 文件 | 是什么 |
|---|---|
katago.exe | KataGo v1.16.4,OpenCL 后端(Windows x64) |
*.dll | 引擎必需的运行库(缺一个就起不来) |
analysis_example.cfg | analysis 模式配置(官方版本,未改动) |
kata1-b18c384nbt-….bin.gz | 18b 权重(约 93 MB),业余复盘足够 |
LICENSE.txt | KataGo 的 MIT 许可与第三方组件声明 |
想确认现在到底在用哪套引擎、哪个权重,直接问一句「现在用的是哪个模型?」,Sensei 会调 go_engine_info 念给你听。
| 你想做什么 | 怎么改 |
|---|---|
| 换更强的权重(如 b28,约 270 MB) | 把 .bin.gz 丢进 <插件目录>/engine/,插件自动挑其中最大的那个 |
| 指定某个权重文件 | 配置 kataGoModel: <权重文件的完整路径>(下载的 .bin.gz 放哪就填哪) |
| 换引擎或换后端(CUDA / 纯 CPU 版 / 别的版本) | 配置 engineDir: <你的引擎目录>,该目录里放可执行文件 + analysis 配置 + 权重即可 |
| 只临时换一次(不动配置) | 让 Sensei 在 go_engine_analyze 里带上 engineDir / kataGoPath / kataGoConfig / kataGoModel 参数:带 engineDir=整个引擎目录换掉(目录内自动发现),只带某一项=只覆盖那一项。需要先把配置项 allowEnginePathOverride 打开(默认 false,见下) |
| 调搜索量(越大越准越慢) | 配置 maxVisits(默认 100;业余复盘 60~200 都合理) |
生效时机要分清:权重与路径每次调用都重新解析,所以往 engine/ 里丢一个新权重,下一盘复盘就用上了;而 go_engine_analyze 这个工具本身注册与否在插件加载时决定,改了 engineDir / kataGoPath 记得重启 dsh web。想强制重算某盘棋(不吃缓存),用 go_engine_analyze 指定手数区间。
⚠️ 可执行文件名的限制(2026-09-30 起):无论走
engineDir还是kataGoPath,可执行文件都必须是 KataGo 自己的发行名(katago/katago.exe/katago-opencl.exe这类),且kataGoPath必须指向 真实存在的普通文件;不符合时按"没有引擎"处理并说明原因。原因见装机章节的说明。
🔒 "只临时换一次"默认是关的(
allowEnginePathOverride: false):工具入参里的引擎路径只有在配置 显式打开后才生效 —— 引擎路径决定宿主执行哪个可执行文件,这个决定权留在配置(部署者)手里。 打开后,模型可以在go_engine_analyze里临时换引擎/权重;关着时入参被忽略,结果里会写明"已被忽略"。 想临时试一个引擎又不想重启,推荐做法是:把新引擎放进一个目录,改配置的engineDir并重启dsh web(重启只影响一次加载,仍然是显式动作)。
自带的是 Windows x64 OpenCL 版:macOS / Linux 上插件不会自动启用它,需要自己下载对应平台的引擎,再把 engineDir(或 kataGoPath)指过去。人肉装机要备齐三样,缺一不可:
katago 可执行文件 —— 版本 v1.14 以上(v1.14 起 analysis 模式默认 JSON 协议;自带的是 v1.16.4)。kata1-b18c384nbt-….bin.gz 的文件。步骤 1:下载引擎
打开 KataGo releases,挑一个匹配你系统的压缩包,按机器选后端:
| 你的机器 | 选哪个 | 说明 |
|---|---|---|
| 有独显、想最省事 | opencl 版 | NVIDIA / AMD / Intel 都能用,需要显卡驱动带 OpenCL |
| NVIDIA 显卡,愿意折腾驱动 | cuda 版 | 最快,但要装对应版本的 CUDA 运行库 |
| 没有独显 / 只有核显 / 不想碰驱动 | eigen 或 eigenavx2 版 | 纯 CPU,慢一些但一定能跑 |
| 服务器、专业显卡 | tensorrt 版 | 最快也最挑环境,新手不建议 |
| macOS | metal 版(v1.16+) | Apple 芯片走 Metal |
解压到一个固定目录,例如 D:\katago\。
⚠️ 整个目录一起留着,别只拷
katago.exe。 它依赖同目录的一堆 DLL(libcrypto-3-x64.dll、libssl-3-x64.dll、libz.dll、libzip.dll、msvcp140*.dll、vcruntime140*.dll),只拷 exe 会启动即失败。
步骤 2:下载模型权重
到 katagotraining.org 下载最新的权重文件:
放进同一个目录,例如 D:\katago\kata1-b18c384nbt-s9996604416-d4316597426.bin.gz。
步骤 3:准备 analysis 配置文件
用引擎目录里自带的 analysis_example.cfg(官方压缩包里就有),不需要改任何一行:
maxVisits,见配置项),配置文件里的 maxVisits 不生效。-override-config numAnalysisThreads=1,避免多线程和单次查询抢资源。reportAnalysisWinratesAs 决定胜率视角(随包配置实测是 BLACK),插件会读这一个键做口径换算——所以别删它。如果你的压缩包里没有这个文件,从官方仓库取: https://raw.githubusercontent.com/lightvector/KataGo/master/cpp/configs/analysis_example.cfg
⚠️ 别拿 GTP 配置顶替(形如
default_gtp.cfg、myconfig.cfg的那类)。GTP 配置缺 analysis 模式必需的键,引擎会直接报Could not find key。
步骤 4:先自己验证一次引擎
# 尖括号是占位符,换成你实际的位置(本文档别处的 D:\katago 只是示例目录名)
<你解压引擎的位置>\katago.exe version
正常输出(本机实测):
KataGo v1.16.4
Git revision: 4b8de63bea2bd8790db96cd6f8daf86dc87be6f7
Compile Time: Oct 20 2025 12:25:23
Using OpenCL backend
能打印版本号与 Using <后端> backend 就算过了。这一步报错就先别往插件里填,先把引擎跑通。
步骤 5:把它填进插件配置
回到 配置项,在 %USERPROFILE%\.dsh\profiles\web\cordis.patch.yml 里写:
- id: go-sensei
config:
engineDir: <你的引擎目录> # 该目录里有 katago 可执行文件、analysis 配置、权重
maxVisits: 100
⚠️ 可执行文件名必须还是 KataGo 的发行名(
katago/katago.exe/katago-opencl.exe这类, 即katago后面接-、_或.再接后缀)。engineDir里只认katago.exe/katago两个名字; 用kataGoPath显式指定时也只接受这一族名字,且必须是一个真实存在的普通文件。 这不是洁癖:go_engine_analyze允许模型临时覆盖引擎路径,而那一串最终会走到subprocess.spawn—— 没有这道闸门,一次被棋谱内容带偏的调用就能让宿主执行任意二进制 (2026-09-30 安全复查把这条收窄成"KataGo 自己的名字")。所以:别把引擎重命名成别的名字, 想换后端就换整个目录里的 exe 文件(名字照旧)。被拒时go_engine_info会明确写出原因。
(<你的引擎目录> 是占位符——填你自己解压引擎的位置,别照抄本文档里的示例目录名。
也可以更细:kataGoPath 指可执行文件、kataGoConfig 指配置文件、kataGoModel 指权重,三者各自覆盖 engineDir 里的自动发现。)
重启 dsh web。之后凡是没有分析数据、19 路的棋谱,go_review_moves 与 Web 面板都会自动补算,不需要你手动调工具;补算失败不会打断复盘,会降级成纯棋理模式并把失败原因如实带回。
katago.exe 是 Windows x64 OpenCL 版,其他平台不会自动启用,请走上面的"自己装一套"。engine/LICENSE.txt),上游条款以官方发布为准。engine/ 即可(插件会退回"自己装 / 纯棋理"两条路)。engine/KataGoData/(已在 .gitignore 里,删掉下次会重新调优);运行日志在 engine/analysis_logs/。| 现象 | 原因与解法 |
|---|---|
| 自带引擎也报「没有可用的 KataGo」 | engine/ 目录被删或移走了;恢复它,或配置 engineDir 指向你自己的引擎 |
| 引擎起不来 / 一闪而过 | 只拷了 exe 没拷 DLL;或后端和自己的显卡不匹配(用 katago.exe version 验证) |
Could not find key | 配置文件用错了——需要 analysis 配置,不是 GTP 配置 |
Must be a integer or half-integer from -150.0 to 150.0(field 却写着 rules) | 这是贴目超范围/非半整数,不是规则字符串的问题(KataGo v1.16.4 实测会把字段误标为 rules)。插件已把棋谱 KM[] 就近吸附到 0.5 的倍数并夹到 [-150, 150];仍报则检查棋谱贴目 |
| 第一次补算等很久 | 每次补算都要新起一个引擎进程并加载模型,首次运行还要做 OpenCL 调优(本机实测首次 214 秒、第二次 8.7 秒),之后一直快;调优缓存见上文 |
| 补算太慢 | 把 maxVisits 调小(60~100 足够业余复盘用);或换更小的模型 |
| 补算被拒 / 报子进程不可用 | 引擎查询被拒会把引擎原始错误带回;受限沙箱下启动子进程也可能被系统拒绝,工具会照实说明 |
补算耗时会在 go_engine_analyze 的返回里以 seconds 字段给出,跑几次就有直观感受。
| 项 | 要求 |
|---|---|
| 文件 | 磁盘上一个 .sgf 文件,路径可以是绝对路径,也可以相对当前会话工作区 |
| 内容 | 标准 SGF((;GM[1]FF[4]SZ[19]…),主变化线就是实战手顺 |
| 手顺 | 只复盘主变化线(每个节点第一个子节点);谱中的变化图/旁支会被统计但不逐手讲解 |
| 多局 | 一个文件里有多局时,只复盘第一局 |
| 题目型 | 只有摆子(AB/AW)没有实战手顺的死活题/布局题,没有可复盘的手 |
主变化线之外的手数不影响使用:在打谱软件里摆过的变化图、做过的手顺标记都可以留着。
-sensei 副本里Sensei 从不修改你给的棋谱文件。 所有写回(AI 分析数据 + 逐手讲解)都落在同目录的副本上:
QiPu/091301[甲]vs[乙]1789308106030024548.sgf ← 源棋谱:逐字节保持原样
QiPu/091301[甲]vs[乙]1789308106030024548-sensei.sgf ← 复盘副本:WV/DM/LZ 分析 + C[] 讲解
QiPu/091301[甲]vs[乙]1789308106030024548-sensei.review.md ← 复盘报告(跟着副本命名)
go_write_review(讲解)、补算写回的分析数据、go_export_report(报告)都写进副本;副本不存在时由第一次写入创建(内容是源棋谱 + 这次写入的东西),已存在时在它上面继续追加。.go-sensei/(diagram-<内容指纹>.svg),只为让界面能按本机路径加载;不想留就直接删掉整个 .go-sensei/ 目录,下次画图会重建。xxx-sensei.sgf 不会再叠一层后缀)。| 属性 | 含义 | 用途 |
|---|---|---|
SZ | 棋盘路数 | 缺省按 19 路;补算只支持 19 路 |
KM | 贴目 | 传给引擎;旧式 KM[375] 这类百分制写法会先归一化成 3.75 |
HA | 让子数 | 补算支持 2~9 子,更多子数会明确报错 |
RU | 规则 | 含 japan 按日本规则,其余按中国规则传给引擎 |
PB/PW/BR/WR | 棋手与段位 | 用于 level: auto 判断讲解深浅 |
RE/DT/GN/EV/AP | 结果/日期/棋局名/赛事/软件 | 出现在复盘信息与报告里 |
棋谱里只要有任意一手带分析数据,插件就直接用,不再补算。识别三种常见写法:
WV[](白方视角胜率)、DM[](黑方视角目差)、PV[](后续变化)。LZ[] / LZOP[](部分打谱软件保存分析数据时写入的私有属性)。C[] 的软件,形如 Move 42 黑胜率: 94.3% (±0.1%) (KataGo-18b / 1.0k 计算量)。插件按通行口径解析这类文本。触发条件(三条同时满足):
engine/ 能解析到(Windows),或用 engineDir / kataGoPath 指向了自己的引擎;补算失败不阻断复盘:自动降级为纯棋理模式,并把原因(引擎退出码、引擎拒绝查询的原文、子进程不可用等)带回。
| 来源 | 怎么拿到 | 注意 |
|---|---|---|
| 野狐(腾讯围棋) | 对局结束后在棋谱/历史对局里「保存棋谱 / 导出 SGF」,文件名形如 [庄生梦1n4k]vs[鍾易成1]1788532348030034222.sgf | 常见 GBK 编码(插件自动识别);导出的是对局记录,一般不含 AI 分析数据,想让 Sensei 出胜率与候选点就配 KataGo 补算 |
| 弈城(Tygem) | 复盘界面里保存 SGF | 编码可能是本地编码;棋手名万一乱码,插件会尝试自愈 |
| OGS / KGS 等网络平台 | 对局页面「下载 SGF / Export」 | 一般是 UTF-8,直接能用 |
| 电脑上自己下的棋 | Sabaki、CGoban 等打谱软件保存的 SGF | 若软件支持"保存分析数据",导出的棋谱会自带胜率与候选点 |
| AI 自战 / 让子对局 / 教练给的谱 | 直接拿文件即可 | 让子棋补算支持 2~9 子 |
| 只有图片或纸质棋谱 | 先用打谱软件把棋摆一遍再导出 SGF | 插件只吃 .sgf 文件,不能从图片或剪贴板里读棋谱 |
棋谱放哪、怎么写路径
C:\棋谱\2026-09-12-对局.sgf)。[],Windows 下照抄即可;路径里有空格时用引号包起来,或在输入框里用 @ 引用文件。复盘这盘棋 C:\棋谱\2026-09-12-对局.sgf
只看前 50 手,后面官子先不用讲
第 42 手为什么不好?我是 5K,讲简单点
第 42 手改下 R16 会怎样?给一条主变就行(回答里会配一张变化图)
把讲解写回棋谱
生成复盘报告
cached: true),不会重复消耗。三处视图各有分工:输入框下方的面板管「填路径 → 读棋谱 → 看曲线」,左侧栏整页看棋盘与讲解,右侧栏文档预览跟着对话一起看。同一盘棋、同一手在三处同步(共用一份视图状态,数据都来自宿主)。
插件往宿主注册了四条只读路由(/go-sensei/roots、/focus、/diagram、/review),浏览器面板与对话配图都靠它们取数据。这些路由直接挂在 webServer 上,而宿主默认监听 0.0.0.0(局域网可访问),所以它们各自先过一道闸门:
connection 服务的 requestRejection(),与界面自身的 /api 完全同一道:
Origin 与 Host 同源、Sec-Fetch-Site 不是 cross-site(挡 DNS rebinding 与跨站请求);?token=… 的界面地址时铸出)。401,跨站请求一律 403。connection 服务时(纯 CLI 组合,或极简宿主)闸门退回「仅本机来源」,局域网面板随之不可用——宁可如此,也不留一个无鉴权又对外的读文件接口。其余硬化:
/review 与 /diagram 接受的 ?path 必须落在宿主的已知工作区根之内 —— 会话工作区、模型复盘过的棋谱所在目录、以及面板默认根。这些根之外的路径一律 404 并给出可操作提示;判定发生在 readBytes 之前,对绝对路径连 stat 都不做(不给"这个文件存不存在"做探针)。想让某个目录可用:在对话里让 Sensei 复盘一次那盘棋,宿主就会记下它所在的目录。?cwd 不构成放行依据:它只在本身已经是已知工作区根时才作为本次请求的解析基准,否则直接拒绝 —— 否则调用方自造的基准会让包含校验自我作废。roots 仍只由工具执行与会话根补充。/review 有窗口限流(10 秒 / 20 次)与在飞上限(2 个),超限回 429/503(这条路由在没有分析数据时会现场启动 KataGo)。Web 页面输入框下方有一行折叠面板「DeepGo Sensei」:

面板只管「读」。要追问就点左侧栏整页或右侧栏里的一行(追问语会复制到剪贴板),粘到下面的输入框回车即可。
每盘棋都带两条可折叠的曲线,横轴=手数、纵轴=黑方视角(胜率越高 / 目差越正=黑越好),点表头即可收起:
| 曲线 | 纵轴 | 说明 |
|---|---|---|
| 胜率曲线(黑方) | 0~100%,50% 处一条虚线 | 一条曲线看完整盘棋的攻守转换,突降处就是转折 |
| 目差曲线(正=黑领先) | 关于 0 对称,自动取到 ±10/±20… 的整数档 | 胜率在均势区刻度很陡,判断"亏了多少"要看目差 |
数据口径由宿主一次算清(棋谱里 WV[] 是白方视角、DM[] 是黑方视角、LZ[] 是落子者视角、注释里的胜率又是另一套),浏览器只负责画 —— 所以三处视图上的同一条曲线永远是同一条。
棋盘不在输入框下方的面板里(那里地方小、又要给输入框让位)。看棋盘有两个入口:左侧栏的「Sensei 棋盘」整页(棋盘在左,曲线与问题手列表在右,讲解整幅在底部),或在对话里点开 .sgf 文件时的右侧栏文档预览。盘上的记号:
棋盘上沿写着黑方白方的名字(● 黑 庄生梦1n4k(18级) … 白 鍾易成1(17级) ○):名字取自棋谱根节点的 PB/PW,段位取自 BR/WR,棋谱没写名字时这一条不占位、盘面照旧。讲解配图(go_draw_diagram)画的是同一张盘,同一条名条也在。
| 盘上的记号 | 含义 |
|---|---|
| 反色小圆点 | 最后一手(黑子上白点、白子上黑点) |
| 小色点(紫色 / 红色 / 橙色) | 已经下过的着法里被评为问题手的那些:紫=大恶手、红=失误、橙=不精确 |
| 紫 / 红 / 橙圆圈 | 当前停在的这一手是问题手,颜色=严重度(大恶手 → 失误 → 不精确) |
| 蓝色小方点(棋子左上角) | 这一手棋谱写回讲解(C[] 注释),翻到哪手读哪手 |
| 青色实心圆 + 蓝圈 | AI 首选点,旁边橙底黑字给出它的胜率 |
| 半透明棋子 + 正中序号 | 变化图:首选之后的后续几手(改下首选之后,对方会应哪里、我又下哪里)。每一手都画成一颗半透明棋子(按轮转分黑白,黑棋上白字、白棋上黑字),序号 2、3… 就是这条变化里的第 2、3 手(序号 1 =首选那一点)。画法照 Lizzieyzy 的 ghost stone,只是取半透明 —— 底下的实战棋子还得看得见 |
| 小黑块 / 小白块 | 形势判断(独占模式,默认不显示):点控制条的「形势判断」后,盘上把黑地/白地画成小方块、未定处留白,死子则在棋子上盖对方颜色的方块;棋盘右侧同时开出数字浮窗 |
AI 首选与变化图不只给问题手看:只要棋谱里有候选着法(LZ[],补算过的棋谱都有),翻到任意一手盘上都会画出首选点、它的胜率,以及首选之后的后续几手——包括「有讲解」但没被评为问题手的那几手(老师在好手、关键处同样会写讲解,那些手以前是空白的)。不是问题手时,盘下那行也会直接写出「◌ AI 首选 Q16(胜率 56.3%) 后续:D4 → Q4」,并在本手有讲解时提示「本手有讲解(见下方)」。这一层归「AI 首选 / 变化图」开关管,关掉后盘上与文字一起消失。
盘上的标注都只标"已经下到"的那几手:停在开局时盘面是干净的,问题点与讲解点随棋局展开一处处出现——这样一眼能看出"讲到哪儿了",而不是一上来就满盘记号。
图例就在棋盘下面,每项=色样 + 名称的小胶囊,点一下即可开/关那一类标注(关掉的项变淡划掉),三项分别是「问题手」「有讲解」「AI 首选 / 变化图」。开关是三个视图共享的:在下方面板关掉,右侧栏与整页棋盘同时生效。只想安静看棋形时,把三类全关掉即可。(形势判断不在这里:它是控制条上的一个按钮,按下即进入独占模式,见 形势判断。)
⏮ ◀ ▶ ⏭ 逐手前后翻;◀恶点 / 恶点▶ 直接跳到上一处 / 下一处问题手,◀讲解 / 讲解▶ 跳到上/下一处有讲解的手(都到头绕回另一端,方便把每个恶点过一遍);右侧滑块拖动快速定位。表头实时显示「第 N/M 手 · 黑 Q16」。maxVisits 不同会有出入)。这期间按钮上是「读取中…」,面板会另起一行说明「正在用 KataGo 补算」,算完自动出结果——不是卡死。同一盘再读就走缓存,很快。go_position_context 看第 42 手,三处视图的棋盘就都停在第 42 手的局面。
C[] 注释(即 Sensei 用 go_write_review 写回去的那段讲解),棋盘下方就出现「讲解(已写回棋谱注释)」框,翻到哪手读哪手;问题手列表里对应行也会标出「有讲解」。照 Lizzieyzy 的判定规则做的:盘上把地画出来、棋盘右侧的浮窗把目数报出来,滑块拖到哪一手就按那一手的局面算。
默认不显示。在控制条上点「形势判断」才进入,而且它是独占模式:进入后只留地盘与浮窗,讲解小方点、问题手色点、AI 首选与变化图全部隐去,整页视图右列的曲线与问题手清单也一起让位(棋盘那一列随之外扩,专看地盘与数字);点浮窗右上角的 ×(或再按一次按钮)退出,并恢复到按下按钮之前的显示状态(进入前是开的还开、是关的还关)。
数据来自引擎的归属图(KataGo analysis 的 ownership,与胜率/目差出自同一次搜索),判定只有三条规则:
|归属| < 0.4 的点算未定,不画也不计(盘上留白);计分用数子法:目 = 活子 + 地(未定不计),领先 = 黑目 − 白目 − 贴目。浮窗里逐项报出来,形如:
形势判断 白领先 35 目(不贴目) 甲(黑) 145 目 乙(白) 180 目 提子 黑 3 · 白 1
没有归属数据时会当场补算:第一次点开若这盘棋还没算过(包括以前复盘过、只写了胜率/目差的老副本),会跑一次引擎(几十秒,浮窗里显示「正在补算」),算完把归属图写进 -sensei 副本的 TP[],以后打开秒出。引擎不可用时按钮禁用并说明原因——不拿估算顶包。
口径注意:这里的目数是点目(盘上点数的合计),与目差曲线(引擎 DM,黑方视角)不是同一个数;讲地盘归属用前者,讲领先多少目优先用后者,不要并排报两个数。
配图也能用:go_draw_diagram 加 territory: true,生成的 SVG 上叠同样的地块、图下附一行形势判断,工具返回值里也带着那行数字(模型应直接引用它,不要自己另算)。
没有分析数据的棋谱要现场补算(本机实测 96 手约 29 秒)。补算完成后,插件会把逐手胜率、目差,以及 AI 首选与变化图一起写进 -sensei 副本:
| 属性 | 含义 | 口径 |
|---|---|---|
WV[] | 该手之后的胜率 | 白方视角(KataGo 标准,与解析端同一口径) |
DM[] | 该手之后的领先目数 | 黑方视角 |
LZ[] | 该手之后的候选着法(AI 首选 + 变化图) | 头部落子者视角、候选记该节点行棋方视角(与 Lizzieyzy 同一写法,go_* 与第三方打谱软件都能读) |
TP[] | 该手之后的形势判断三档图(黑地/白地/未定) | 每点 2 bit、base64(19 路约 124 字符/手);判定规则见 形势判断,与 ownership 的口径无关(已归一成黑方视角再判) |
LZ[] 不只是给别的软件看的:AI 首选与变化图只存在候选着法里。只写胜率/目差的话,文件下次被打开时已经算"有分析数据"→ 不会再补算,而候选又取不到 → 面板上就只剩问题手、没有首选点和变化图(2026-09-13 实报缺陷)。
于是同一份棋谱再打开就是秒开(面板、整页棋盘、右侧栏、go_review_moves 都不再触发补算),别的打谱软件打开副本也能直接看到胜率数据与首选/变化图。写回只发生在明确的分析动作里(go_review_moves 的自动补算、或显式调用 go_engine_analyze),只读的面板路由从不改文件;同一进程内还留了一份内存缓存,模型刚算过的棋谱面板直接复用。
早先复盘过的棋谱(那时只写了 WV[]/DM[])想补上首选与变化图,对它显式跑一次 go_engine_analyze 即可:go_review_moves 不会自作主张重算(它认为"已有分析"),显式补算才会把 LZ[] 一并写上。补写同样落在副本里 —— 源棋谱里原有的分析数据原样不动。
写回与讲解回写共用同一套"重新序列化"逻辑,手数与旁支都不丢(幂等:重复写回不会堆积属性),而且都只动副本:**源棋谱一个字节