桌面应用【免费下载链接】SabakiAn elegant Go board and SGF editor for a more civilized age.项目地址https://gitcode.com/gh_mirrors/sa/Sabaki点击查看免费下载Sabaki 是一款基于 Electron 的 SGF 编辑器与棋盘应用而 docs/guides/engines.md 描述的核心能力是把任何支持 GTPGo Text Protocol的围棋引擎进程接入 Sabaki让你能离线与 AI 对弈、观看引擎自评分析或让两个引擎自对弈。本文以该文档为主体结合 src/modules/enginesyncer.js、src/modules/sabaki.js 等源码讲清楚引擎如何配置、如何被 Sabaki 启动与同步、对弈与分析流程的底层实现以及配套的调试手段。一、GTPSabaki 与引擎之间的统一接口Sabaki 本身不内置任何围棋 AI它只做一件事启动引擎进程通过标准输入/输出stdin/stdout与之进行文本协议通信。因此只要一个引擎实现了 GTP 子集name、version、protocol_version、list_commands、play、genmove等命令就能被 Sabaki 当作对手或分析师使用引擎进程由 Sabaki 负责拉起和回收无需手动在终端启动大部分引擎支持可选参数来调节能力搜索深度、时间控制等参数清单以引擎自身文档为准在 Sabaki 里则填到引擎配置的args字段中。引擎进程的控制逻辑封装在sabaki/gtp包中package.json 中声明为sabaki/gtp: ^3.1.0Sabaki 侧的同步层 EngineSyncer 在此基础上实现状态跟踪与局面同步。二、在偏好设置中配置引擎在偏好设置抽屉的 Engines 页签下src/components/drawers/PreferencesDrawer.js每个引擎条目有 4 个字段与源码中EngineItem渲染的输入框一一对应字段含义占位提示源码原文name引擎名称用于在界面上区分多个引擎(Unnamed Engine)path引擎可执行文件路径Path (e.g., /path/to/engine or C:\path\to\engine.exe)旁边有 Browse 按钮用系统对话框选择args传给引擎的可选启动参数Optional arguments (e.g., -param1 value1 -param2 value2)commands引擎启动后自动执行的初始 GTP 命令多条用分号;分隔Initial commands (;-separated)配置保存在设置项engines.list数组见 src/setting.js。相关的引擎/GTP 默认配置还有// src/setting.js engines.list: [], engines.analyze_commands: [analyze, kata-analyze, lz-analyze], engines.gemove_analyze_commands: [ genmove_analyze, kata-genmove_analyze, lz-genmove_analyze, ], gtp.console_log_enabled: false, gtp.console_log_path: null, gtp.engine_quit_timeout: 3000, // 退出quit等待超时毫秒 gtp.move_delay: 300, // 引擎落子相关延迟 board.analysis_interval: 50, // analyze 命令的更新间隔厘秒从源码结构看引擎列表在偏好设置抽屉关闭时还会按名称做自然排序后写回engines.listPreferencesDrawer.js因此界面上引擎按名称有序展示。三、常用引擎与启动参数速查docs/guides/engines.md 给出的引擎清单及推荐启动参数如下path指向引擎可执行文件args填下表内容引擎获取方式args启动参数支持分析Leela Zero下载适合自己系统的版本提供二进制与源码再获取网络权重文件通常取最佳网络--gtp -w path/to/weightsfile是KataGo从 Releases 下载对应系统、含预训练模型的版本gtp -model /path/to/model.txt.gz -config /path/to/gtp_example.cfg是GNU GoWindows 有二进制Linux / macOS 需自行编译源码另有 OS X 10.4.3 的通用二进制--mode gtp否PachiWindows / Linux 有二进制源码可编译无None否Leela下载 engine only (commandline/GTP engine) 版本--gtp否AQ开源引擎无None否Ray开源引擎无None否注意两点细节KataGo 的参数首词是子命令gtp而 Leela Zero、GNU Go、Leela 用的是--gtp这类开关漏掉它们会导致引擎不进入 GTP 模式Sabaki 启动后无法完成握手。文档中明确标注supports analysis as well的只有 Leela Zero 和 KataGo这对应 Sabaki 的连续分析功能见第六节其余引擎仅能用于对弈。四、引擎生命周期启动、握手与局面同步引擎被添加后并不会立刻运行。只有当界面需要某个引擎时分配给黑/白方、开始分析等Sabaki 才会调用 attachEngines 创建EngineSyncer实例并start()对应进程。4.1 进程拉起EngineSyncer 构造函数 中path先按当前工作目录resolve若存在则用绝对路径args经argvsplit解析为参数数组工作目录设为引擎文件所在目录// src/modules/enginesyncer.js节选 let absolutePath resolve(path) let executePath existsSync(absolutePath) ? absolutePath : path let executeArgs [...argvsplit(args)] this.controller new Controller(executePath, executeArgs, { cwd: dirname(absolutePath), })这里有一个针对 Flatpak 沙箱的特殊处理当环境变量FLATPAK_ID存在时沙箱内无法直接执行宿主机的引擎二进制Sabaki 会自动改走flatpak-spawn --host --directory引擎所在目录来启动并保留工作目录enginesyncer.js。这解释了在 Flatpak 版 Sabaki 中配置引擎路径仍指向宿主机路径也能工作这一现象。4.2 启动握手进程started事件触发后Sabaki 并发发送name、version、protocol_version、list_commands四条命令并把list_commands的返回缓存为this.commands——后续是否走genmove_analyze/analyze流程正是依据这个列表判断的随后若commands配置字段非空还会按;拆分、依次发送这些初始命令enginesyncer.js。4.3 把 SGF 局面同步给引擎对弈或分析前必须让引擎的棋盘与当前 SGF 节点一致。sync() 实现了三级递进的策略重放Replay从根节点到目标节点依次把B/W/AB/AW属性转成play B xx/play W xx命令对于 handicap 节点若引擎支持set_free_handicap命令则优先用一条该命令摆出贴角子enginesyncer.js增量重排Incremental rearrangement若重放结果与目标局面不一致例如 SGF 中有提子后补下这类 GTP 无法精确复现的历史则基于引擎已接收的历史命令重算棋盘只对差异点补发play全量重排Complete rearrangement仍不一致时按目标棋盘逐格重放所有棋子。同步前还有两个硬性校验失败会直接抛出带提示的错误i18n 文案见 enginesyncer.jsGTP 引擎不支持无效局面非法棋子位置棋盘尺寸最大只支持 19×19坐标字母表ABCDEFGHJKLMNOPQRSTUVWXYZ共 25 个字母源码按字母表长度做上限校验。同步参数还包括从 SGF 根属性读取的komiKM默认 0与boardsizeenginesyncer.js。三级重排后仍无法复现目标局面时会报错 Current board arrangement cant be recreated on the GTP engine.。4.4 退出与超时stop()通过controller.stop(quitTimeout)退出进程quitTimeout即设置项gtp.engine_quit_timeout默认 3000ms见 setting.js。另外 sendAbort() 会在引擎忙碌时尽力发送protocol_version打断当前长耗时操作供queueCommand在发新命令前调用。五、与引擎对弈人机对战与引擎互搏5.1 把引擎分配给玩家在 Info 抽屉游戏信息面板中可以为黑方、白方分别选择引擎InfoDrawer.js 的保存逻辑会为尚未 attach 的引擎调用sabaki.attachEngines([engine])并把 syncer id 写入状态blackEngineSyncerId/whiteEngineSyncerId。菜单src/menu.js中的 Start Engine vs. Engine Game 则调用startStopEngineGame。5.2 生成一步棋genmove 与 genmove_analyzegenerateMove 是让引擎走一步的统一入口// src/modules/sabaki.js节选 let commandName setting.get(engines.gemove_analyze_commands) .find((x) syncer.commands.includes(x)) || genmove即若引擎的list_commands中声明了genmove_analyze、kata-genmove_analyze、lz-genmove_analyze之一就优先使用该命令并附带间隔参数board.analysis_interval默认 50 厘秒——引擎在思考期间持续输出info行供界面刷新最终以play vertex结束否则退化为普通genmove color一次性返回坐标。引擎返回resign时Sabaki 会写入 SGF 结果属性RE形如WResign/BResign并弹提示返回pass时落虚手节点并播放 pass 音效sabaki.js。5.3 引擎互搏engine vs engine gamestartEngineGame 在没有已绑定引擎时默认取列表前两个引擎分别绑黑、白然后循环执行轮到谁就调用谁的generateMove。终止条件有三类任一方resign连续 2 次 passconsecutivePasses 2用户中途停止engineGameOngoing不再等于当前对局 id。仓库的端到端测试 e2e/engine.spec.js 完整覆盖了对战链路attach/detach 引擎、响应genmove、人类 pass 触发引擎应招对应 issue #857、以及 bot-vs-bot 对局完整走完测试中的假引擎走 3 手后 resign。这些测试使用的假引擎实现在 test/engines/resignEngine.js——它用sabaki/gtp的Engine类实现了boardsize、clear_board、komi、play、undo、genmove六个命令是理解一个最小可用 GTP 引擎长什么样的现成范例// test/engines/resignEngine.js节选 engine.command(genmove, (_, out) { if (stop 0) { out.send(stopword) // resign 或 pass } else { out.send(${alpha[rand()]}${rand() 1}) // 随机落子 } }) engine.start()六、引擎分析集成analyze 命令与热力图对于支持分析命令的引擎KataGo、Leela ZeroSabaki 提供逐节点连续分析并把结果画成棋盘热力图。对引擎开发者而言协议细节完整记录在 docs/guides/engine-analysis-integration.mdanalyze color interval从指定方视角分析每interval厘秒输出形如info keyvalue... pv vertex... (info ... )...的一行genmove_analyze color interval生成一手棋并持续输出info行最终用play vertex结束必需键值对move被分析的棋点、visits累计访问数、winrate整数时是百分比×100如9543表示 95.43%带小数点时是 0.0–1.0 的小数可选键值对scoreLead该方走这手后的预计平均领先目数响应会一直输出直到stdin收到新的输入才终止。Sabaki 侧的解析与匹配逻辑命令匹配analyzeMove 按engines.analyze_commands默认analyze、kata-analyze、lz-analyze顺序取引擎list_commands中第一个存在的命令若一个都没有则提示 None of the attached engines support analysis.menu.js。winrate 方言EngineSyncer 中按命令名前缀决定格式——kata开头kata-analyze等报告的是 0–1 浮点胜率lz-analyze/analyze报告万分之一整数结构化解析parseAnalysis 把一条info ... info ...行拆成多个 variation每个含vertex、visits、winrate经 normalizeWinrate 归一化到 0–100、scoreLead与pv变化序列并刻意过滤掉截断/畸形片段以保证健壮性热力图呈现getAnalysisHeatMapCell 为每个落点计算叠加强度strength正比于visits × winrate与标签文本标签按board.analysis_type显示胜率百分比或scoreLead并支持board.analysis_value_type切换绝对值/相对最优手的差值此时最优手显示为 0。更新频率由board.analysis_interval默认 50ms控制。分析期间导航 SGF 节点时若局面历史发生变化treePosition会被置空并重新同步引擎enginesyncer.js保证热力图始终对应当前节点。七、调试与验证GTP 日志和现成的测试7.1 GTP 控制台日志偏好设置 Engines 页签顶部提供 Enable GTP logging to directory 开关与目录选择对应gtp.console_log_enabled/gtp.console_log_path。日志写入由 src/modules/gtplogger.js 实现每条记录带毫秒级时间戳并标注方向(in)stdin、(out)stdout、(err)stderr、(meta)格式为引擎名 方向 : 消息gtplogger.js日志文件命名为sabaki_时间戳_pid.log每次重新 attach 引擎会滚动到新文件rotate()若启用了日志但目录无效或不可写Sabaki 会弹警告框要求修正或关闭该选项gtplogger.js且偏好设置抽屉关闭时若仍有引擎在运行会强制校验路径。排查引擎不响应/不认命令问题时打开此日志即可看到 Sabaki 与引擎之间的全部原始报文。7.2 端到端自测仓库内置了可运行的 Playwright 用例验证引擎链路关键文件e2e/engine.spec.jsattach/启动、clean detach、genmove响应、人类 pass 触发引擎应招、bot-vs-bot 完整对局、加载 SGF 后局面同步e2e/helpers.js 中的attachAndWaitForEngines/detachAndWait封装了测试用的挂接与清理test/engines/resignEngine.js 与 test/engines/replayEngine.js两个不依赖外部模型的最小 GTP 引擎分别演示随机落子后 resign和按脚本重放两类行为。小结回顾整条链路在 Preferences → Engines 中登记{name, path, args, commands}→ 界面触发时attachEngines拉起进程并完成 GTP 握手 →EngineSyncer.sync三级重排把 SGF 局面灌入引擎 →generateMove对弈或analyze连续分析 → GTP 日志留痕、e2e 用例验证。只要引擎实现 GTP 基本命令集即可对弈若再按 engine-analysis-integration.md 实现analyze/genmove_analyze输出约定格式的info行就能无缝接入 Sabaki 的热力图分析功能。赞分享桌面应用【免费下载链接】SabakiAn elegant Go board and SGF editor for a more civilized age.项目地址https://gitcode.com/gh_mirrors/sa/Sabaki点击查看免费下载相关推荐【免费下载】 LizzieYzy - 围棋引擎图形界面LizzieYzy 围棋引擎图形界面 项目基础介绍和主要编程语言 LizzieYzy 是一个基于 Lizzie 修改的围棋引擎图形界面主要使用 Java 语言桌面应用AI 应用围棋AI分析工具LizzieYzy多引擎图形界面全攻略围棋AI分析工具LizzieYzy多引擎图形界面全攻略 LizzieYzy是一款基于Java开发的围棋AI分析工具通过直观的多引擎图形界面为围棋爱好者提供专桌面应用AI 应用围棋AI分析工具LizzieYzy多引擎图形界面全面解析围棋AI分析工具LizzieYzy多引擎图形界面全面解析 LizzieYzy是一款专业的围棋AI分析工具通过直观的多引擎图形界面为围棋爱好者提供深度棋谱分析桌面应用AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考