十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

cli-anything-slay-the-spire-ii 实战指南:通过本地 Bridge Mod 以命令行与 Agent 控制真实《杀戮尖塔2》

cli-anything-slay-the-spire-ii 实战指南:通过本地 Bridge Mod 以命令行与 Agent 控制真实《杀戮尖塔2》 cli-anything-slay-the-spire-ii 实战指南通过本地 Bridge Mod 以命令行与 Agent 控制真实《杀戮尖塔2》【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything导读cli-anything-slay-the-spire-ii是 CLI-Anything 项目中面向《Slay the Spire 2》杀戮尖塔 2的智能体原生Agent-Native命令行桥接层它通过一款运行在游戏进程内的STS2_Bridge模组在http://localhost:15526暴露本地 HTTP API从而让 CLI、脚本或 AI Agent 直接读取规范化游戏状态并下发战斗、地图导航、奖励领取、菜单管理等动作指令。本文基于仓库内 Skill 定义文档SKILL.md展开结合 CLI 源码、状态/动作适配器与测试用例完整讲解安装部署、全部命令组、决策状态机、配置项以及面向 Agent 的调用约定帮助你用命令行接管真实游戏流程而非依赖屏幕自动化或模拟器。工作原理真实游戏进程内的 HTTP 桥与多数包装独立桌面应用的 CLI-Anything harness 不同本项目不启动子进程、不做屏幕识别而是依赖一个定制桥接模组在游戏进程内直接读取内部状态并执行动作。整条调用链路架构见 agent-harness/STS2.mdSlay the Spire 2 (Steam) 进程内 └── STS2_Bridge (.NET 9 mod) ├── 读取游戏状态战斗、地图、菜单、奖励… └── 在 http://localhost:15526/api/v1/singleplayer 暴露 API ▲ GET state → 返回原始 JSON ▼ POST action → 执行动作并返回结果 cli-anything-sts2Click CLI REPLCLI 侧由三个核心模块支撑源码目录 cli_anything/slay_the_spire_ii/utils/sts2_backend.pySts2RawClient基于标准库urllib封装 GET/POST 请求连接{base_url}/api/v1/singleplayer失败时抛出带原因的ApiErrorcore/state_adapter.pynormalize_state()把桥接模组返回的原始 JSON 映射为带decision字段的规范化状态core/action_adapter.py全部动作负载的工厂函数如play_card(card_index, targetNone)支持按名称分发。从源码结构看这种游戏内 Mod HTTP 桥的设计翻译层极薄桥直接访问游戏内部状态与动作 APICLI 侧只需把命令映射为 JSON 负载因此状态与动作的语义损耗很小。安装与前置条件环境要求Python 3.10Steam 版《Slay the Spire 2》且已启用STS2_Bridge模组.NET 9 SDK仅构建桥接模组时需要第 1 步安装 CLIgit clone https://github.com/HKUDS/CLI-Anything.git cd CLI-Anything/slay_the_spire_ii/agent-harness pip install -e .安装后即可获得cli-anything-sts2命令入口见 slay_the_spire_ii_cli.py。也可以直接使用 Python 模块方式运行python -m cli_anything.slay_the_spire_ii。第 2 步构建并安装桥接模组桥接模组是一个.NET 9插件需要编译后装入游戏目录。仓库中构建脚本默认自动探测 macOS Steam 游戏数据目录cd CLI-Anything/slay_the_spire_ii/agent-harness/bridge/plugin ./build.sh cd ../install ./install_bridge.sh若自动探测失败可显式指定游戏数据目录目标目录需至少包含sts2.dll、GodotSharp.dll、0Harmony.dllSTS2_GAME_DATA_DIR/path/to/data_sts2 ./build.sh安装脚本同样支持显式传入游戏根目录如./install_bridge.sh /path/to/Slay the Spire 2。第 3 步启用模组并验证连通通过 Steam 启动游戏在模组管理器中启用STS2_Bridge然后执行cli-anything-sts2 state只要返回 JSON而非连接错误即表示 CLI 与桥已连通。常见的连接失败原因包括游戏未运行、模组未安装/未启用、localhost:15526上的 API 尚未就绪。基本命令与交互方式# 读取规范化游戏状态始终从这里开始 cli-anything-sts2 state # 无子命令时进入交互式 REPL默认行为 cli-anything-sts2 # 查看全部可用命令 cli-anything-sts2 --helpREPL 模式在 slay_the_spire_ii_cli.py 中实现cli组通过invoke_without_commandTrue在未指定子命令时自动进入repl。REPL 内部复用同一 Click 命令树——每行输入会被shlex.split后重新喂给cli.main()因此REPL 内可用命令与命令行完全一致支持help查看快捷键、quit/exit退出。会话内每行命令都会透传--base-url与--timeout上下文保证与当前连接一致。# 交互会话示例 # slay_the_spire_ii [http://localhost:15526] ❯ state # slay_the_spire_ii [http://localhost:15526] ❯ play-card 0 --target jaw_worm_0 # slay_the_spire_ii [http://localhost:15526] ❯ end-turn命令组全览状态检查命令说明state返回带decision字段的规范化状态raw-state返回桥接模组的原始 JSONstate的实现是先调用client.get_state(formatjson)拿到原始状态再交给normalize_state()规范化state_adapter.pyraw-state则直接透传原始 JSON供调试或排查规范化问题使用。主菜单命令说明continue-game继续已保存的局start-game --character IRONCLAD --ascension 0开启新一局abandon-game放弃当前存档return-to-main-menu从任意界面返回主菜单start-game两个参数均有默认值--character默认IRONCLAD--ascension默认0。目前支持的角色为IRONCLAD铁甲战士、SILENT沉默猎手、DEFECT故障机器人、NECROBINDER、REGENT。动作负载由action_adapter.start_new_game(character, ascension)构造测试用例 test_core.py 验证了角色与进阶等级会被原样保留。战斗命令说明play-card index [--target enemy_id]打出手牌按手牌序号use-potion slot [--target enemy_id]使用药水按槽位end-turn结束当前回合--target是可选参数源码中play_card()仅在显式传入 target 时才向负载中加入target字段见 action_adapter.py这一点也被单测test_play_card_without_target_omits_target_field专门覆盖。enemy_id格式如jaw_worm_0需要从state返回的enemies列表中读取。地图与房间流转命令说明choose-map index选择地图节点proceed离开当前房间choose-map对应动作choose_map_node规范化地图状态中包含next_options下一层可选节点、current_position、visited、nodes与boss等信息。奖励命令说明claim-reward index领取战斗奖励pick-card-reward index选择卡牌奖励skip-card-reward跳过卡牌奖励claim-treasure-relic index领取宝箱房遗物select-relic index选择遗物skip-relic-selection跳过遗物选择事件与篝火命令说明event index选择事件选项advance-dialogue推进纯对话类事件rest index选择篝火动作规范化事件状态里in_dialogue/is_ancient两个布尔字段可以辅助判断应使用event还是advance-dialogue。商店命令说明shop-buy index购买商店物品规范化商店状态会把条目按category拆分为cards、relics、potions与card_removal删牌服务便于 Agent 按类别直接取用对应索引。卡牌/遗物选择覆盖层命令说明select-card index在覆盖层中选择卡牌confirm-selection确认当前选择cancel-selection取消当前选择combat-select-card index战斗中的卡牌覆盖层选择combat-confirm-selection确认战斗卡牌选择战斗内的hand_select与战斗外如事件、宝箱的card_select使用两套不同命令分别对应combat_select_card/combat_confirm_selection与select_card/confirm_selection动作使用时务必与decision字段匹配。原始动作命令说明action name --kv keyvalue发送任意桥接动作这是 CLI 的逃生舱口可发送未封装成高级命令的桥接动作。--kv可重复传入keyvalue值会被自动做类型推断纯数字转为inttrue/false不区分大小写转为布尔其余保留为字符串见 slay_the_spire_ii_cli.py 的_parse_kv_pairs/_coerce_value。例如cli-anything-sts2 action custom --kv floor12 --kv urgenttrueE2E 测试 test_full_e2e.py 验证了action命令会向假桥服务器精确发送{action: custom, floor: 12, urgent: true}负载。决策状态机Agent 的路由依据state返回的规范化 JSON 中decision字段标识当前游戏画面是决定下一步命令的唯一依据。Skill 文档定义的决策类型与典型后续命令如下决策含义典型后续命令menu主菜单continue-game、start-gamecombat_play战斗中、轮到你的回合play-card、use-potion、end-turnhand_select卡牌选择覆盖层战斗中combat-select-card、combat-confirm-selectionmap_select地图节点选择choose-mapgame_over本局结束return-to-main-menucombat_rewards战斗后奖励claim-reward、proceedcard_reward卡牌奖励选择pick-card-reward、skip-card-rewardevent_choice事件界面event、advance-dialoguerest_site篝火restshop商店界面shop-buy、proceedcard_select卡牌选择界面select-card、confirm-selectionrelic_select遗物选择select-relic、skip-relic-selectiontreasure宝箱房claim-treasure-relic、proceed从源码看决策值由normalize_state()依据桥接模组返回的state_type分发映射产生state_adapter.pymonster/elite/boss→combat_playhand_select、card_reward、combat_rewards、map、event、rest_site、shop、card_select、relic_select、treasure、game_over、menu一一对应。除上述类型外还有两种附加决策overlay保留原始 overlay 负载的通用覆盖层与unknown未识别类型时回退同时保留raw_state_type与完整raw负载便于调试。STS2.md中进一步汇总为 15 种决策类型menu·combat_play·hand_select·map_select·game_over·combat_rewards·card_reward·event_choice·rest_site·shop·card_select·relic_select·treasure·overlay·unknown。战斗状态的规范化输出_normalize_combat值得重点关注它同时暴露了round、turn、is_play_phase、energy、max_energy、hand、enemies、draw_pile_count、discard_pile_count、exhaust_pile_count等关键字段——Agent 可以根据能量判断能否打出某张手牌根据牌堆数量估算抽牌风险再决定play-card或end-turn。配置项选项默认值说明--base-urlhttp://localhost:15526桥接 API 地址--timeout10.0HTTP 超时秒两个选项由 Click 在 slay_the_spire_ii_cli.py 中定义作用于整个命令树REPL 会透传。例如cli-anything-sts2 --base-url http://127.0.0.1:15526 --timeout 20 state--timeout会被传入Sts2RawClient并作用于每次urlopen调用超时或连接失败时sts2_backend.py会抛出包含诊断信息的ApiError如提示游戏是否已运行且模组已启用CLI 将其转换为非零退出码与 stderr 错误信息。面向 AI Agent 的使用约定Skill 文档为程序化调用总结出四条铁律全部可从实现上得到印证始终先读state获取decision字段再决定动作——因为决策状态决定了当前可用的命令集合每次动作后重新读state——战斗中手牌序号、能量、敌方 ID 都会实时变化如打出一张牌后hand列表长度减一序号失效检查返回码——0 表示成功非零表示错误CLI 的main()会把ClickException输出到 stderr 并以对应退出码返回解析 stdout 的 JSON——state、raw-state、action等命令均将 JSON 以缩进格式输出到 stdoutensure_asciiFalse保证中文等字符不被转义。除 Skill 文档外包内 READMEagent-harness 内 README.md还补充了两条建议涉及文件操作时使用绝对路径以及优先使用state而非raw-state作为常规决策依据。源码与测试佐证项目用 14 个自动化测试tests/TEST.md锁定了核心行为可作为二次开发或排障时的行为规范单元测试test_core.py9 个用例覆盖动作负载工厂play-card的 target 条件包含、start-new-game参数保留、from_name分发与非法动作拒绝以及状态适配器战斗 →combat_play、商店条目分类拆分、菜单能力字段、覆盖层透传、未知类型回退到unknown。E2E 测试test_full_e2e.py5 个用例启动本地假 HTTP 服务器模拟桥接 API验证--help、raw-state、state、action --kv、continue-game的子进程行为无需真实安装游戏即可运行。这些测试同时示范了三种真实工作流场景先raw-state再state的决策前检查、用action发送一次性桥接动作、以及用continue-game走类型化动作工厂。故障排查速查现象排查方向state无法连接游戏未运行STS2_Bridge未安装或未启用localhost:15526API 未就绪build.sh找不到游戏目录确认游戏已安装后用STS2_GAME_DATA_DIR/path/to/data_sts2 ./build.sh显式指定动作命令返回非零退出码用raw-state检查当前decision是否支持该动作必要时用action name --kv …直接调试桥接动作结语cli-anything-slay-the-spire-ii以游戏内桥接模组 本地 HTTP API的架构把真实《杀戮尖塔 2》的全部关键交互面暴露为标准命令行与 JSON 状态使脚本与 AI Agent 得以按读状态 → 判决策 → 发动作的循环稳定驱动游戏流程。本文覆盖的命令面、决策状态机与配置项均以 SKILL.md 为骨架、以仓库源码与测试为印证更完整的桥接模组原始 API 说明可继续查阅 bridge/plugin/docs/raw_api.md 与 STS2.md。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表