Game Assistant Walkthrough
提示:游戏助手服务在后台运行,不使用时可说"关闭服务"或"关掉服务"来停止。
使用时机
- 用户表达要开始玩游戏并打开攻略助手,或明确要求下载/更新攻略。
- 常见触发语:
- 我要玩游戏了
- 打开攻略
- 开始游戏
- 启动攻略助手
- 下载攻略
- 下载XXX攻略
- 更新攻略
- 打开XXX攻略
- 我要玩XXX游戏了
- 关闭服务 / 停止服务 / 关掉服务
前提步骤(每次执行 skill 时必须最先执行)
0. 读取声明(必须最先做)
必须重新读取本文件 frontmatter 的 models 和 install_dir 字段,用读到的最新值传参;禁止使用会话记忆/历史中的旧值。
1. 环境依赖
必须一次性安装全部 6 个依赖(使用清华源加速),本步骤未完成禁止进入下载/启动等任何后续步骤:
pip install requests beautifulsoup4 pillow keyboard py7zr modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 服务健康检查与部署(自动化)
download 和 launch 命令内置 _ensure_service() —— 自动检查服务健康,不健康则后台部署(命令立即返回 deploying,不阻塞)。服务就绪时命令直接执行。
模型下载策略(每次触发部署都必须带 --models):deploy / download / launch / ensure 都必须带 --models <值>,值取本文件 frontmatter 的 models 字段。取值:all=全部下载;skip=跳过下载;<模型名列表>=只下载指定模型(逗号分隔,如 MMR,LLM)。支持的模型名:LLM、Embedding、Rerank、MMR、ASR、OCR、Action、VLM、Splitter。不传会报错。
预装服务目录(--install-dir):若 frontmatter 的 install_dir 非空,则所有触发部署的命令(deploy / download / launch / ensure)以及 status 轮询命令都必须额外带 --install-dir <值>,在指定路径部署服务(模型按 --models 策略下载);该路径会被严格校验,不存在或无服务端 exe 会报错。日志与状态文件也写到该目录(不可写时回落默认目录并告警)。
轮询铁律:一旦 install_dir 非空,download / launch / status 三者必须使用同一个 --install-dir 值;每次 status 轮询都必须带上,任何一处漏带都会读错状态文件、误判任务卡死。
独立使用场景(如纯部署):
python ./scripts/service_manager.py health # 仅检查
python ./scripts/service_manager.py deploy --models <值> [--install-dir <值>] # 后台部署
python ./scripts/service_manager.py status [--install-dir <值>] # 轮询进度(install_dir 非空时必带)
python ./scripts/service_manager.py ensure --models <值> [--install-dir <值>] # 检查+按需部署
重要:download 和 launch 命令内置服务健康检查 + 自动部署。服务就绪时命令直接执行;若返回 {"status":"deploying"}(部署仍在后台进行,如手动下载服务包耗时较长,弹窗会一直等待),agent 改为每 30 秒轮询 status,done 后重新执行原命令,error 则通知用户失败。shutdown 自带端口检测,无需前置步骤。
意图分流规则
- 若用户原话包含
关闭服务、停止服务、关掉服务等,判定为关闭服务。执行:
输出结果后直接结束 skill。python ./scripts/service_manager.py shutdown - 若用户原话包含
下载攻略、下载XXX攻略、更新攻略等下载/更新诉求,判定为下载攻略。 - 若用户原话包含
打开攻略、我要玩游戏了、开始游戏、启动攻略助手等开启助手诉求,判定为打开攻略。 - 当同一句里同时出现下载与打开含义时,优先按用户的下载诉求执行,即先判定为
下载攻略。 - 若用户原话属于
打开XXX攻略、我要玩XXX游戏了这类"打开攻略 + 明确游戏名"表达,进入"打开攻略-直启分支"。
识别用户原话中的游戏名
- 优先读取 skill 参数里的用户原话。
- 如果原话清楚表达了目标游戏名,则直接使用,不运行检测。
- 可接受的明确表达包括但不限于:
下载黑神话悟空攻略帮我下载黑神话悟空的攻略更新一下黑神话悟空攻略- 仅移除动作词和尾部的
攻略、的攻略、图文攻略等固定修饰,不要擅自改写游戏名。 - 如果原话里没有明确游戏名,或游戏名提取后仍明显为空,再进入"游戏检测"步骤。
打开攻略-直启分支(新增)
触发条件:
- 意图已判定为
打开攻略。 - 用户原话可稳定提取出明确
game_name,典型如:打开XXX攻略、我要玩XXX游戏了。
执行规则:
- 命中该分支时,不运行
detect_game_with_retries.py。 - 通过 service_manager 启动客户端(含 PID 防重复):
python ./scripts/service_manager.py launch XXX --models <值> [--install-dir <值>]
- 其中
XXX必须替换为从用户原话提取到的game_name。 - 若提取失败或结果为空,则回退到"游戏检测"流程。
游戏检测
在当前 skill 目录执行检测命令(该脚本内部会执行 game_detection.py,并按 1 秒间隔最多重试 5 次):
python ./scripts/detect_game_with_retries.py
解析标准输出 JSON,重点读取 process、name。
分支规则:
process为null:表示process在 5 次内始终为空,直接结束 skill,不启动game_client.py。process不为null 并且 name为null或空:表示process非空但name为空,进入"联网补全游戏名"。name不为null且不为空:表示name已存在,直接作为后续动作所需的游戏名。
联网补全游戏名(必须由 agent 完成)
- 使用 agent 的联网能力(如网页检索/浏览)搜索:
<process> 对应的游戏名。 - 禁止写脚本调用搜索引擎 API。
- 选择最可信的中文游戏名(优先官方名称或高可信来源交叉验证)。
- 若无法可靠确定游戏名,结束 skill,不要猜测写入。
- 联网补全得到
game_name后,进入下方"写入 detected_processes.json(统一规则)"步骤。
写入 detected_processes.json(统一规则)
适用时机:只要当前已经拿到 process(非空)和最终 game_name(非空),无论 game_name 来源于"原话提取""检测结果 name""联网补全",都执行以下写入。
- 不再在 skill 内手动读写 JSON,统一调用脚本:
python ./scripts/append_detected_process.py "<process>" "<game_name>"
- 由该脚本负责以下行为:
- 目标文件为当前 skill 目录上层目录的
detected_processes.json。 - 若文件不存在则创建,并以空对象
{}初始化。 - 以 JSON 对象映射写入:
{"process_name": "game_name"}。 - 若 key 已存在则更新为最新
game_name。 - 若原文件内容为空或 JSON 非法,按空对象
{}处理后再写入。
- 目标文件为当前 skill 目录上层目录的
- 该步骤在两种意图下都必须执行:只要
process和最终game_name都非空,就先调用写入脚本,再进入后续动作。
动作执行
当你已经得到最终 game_name 后,按意图执行:
- 当意图为
下载攻略:后台下载,不启动客户端。 即使本地攻略文件已存在,也必须调用service_manager.py download <游戏名>,不得直接回复"已下载"。 先启动进度弹窗,然后后台执行下载+导入:
python ./scripts/service_manager.py download "<game_name>" --models <值> [--install-dir <值>]
- 若返回
{"status":"deploying"}(服务仍在部署,弹窗会一直等待,可能需手动下载服务包):告知用户"服务部署中,请稍候",之后每 30 秒轮询status,done后重新执行本条download命令,error则通知用户失败并结束。 - 若返回
{"status":"started"}:提示用户"攻略下载正在后台运行"。 之后 agent 每隔 30 秒轮询一次状态,status 命令必须带上与 download 命令完全相同的--install-dir值(install_dir 非空时):
python ./scripts/service_manager.py status [--install-dir <值>]
返回 JSON:{task, status, stage, progress}。
status为done→ 通知用户"攻略下载并导入完成"status为error→ 通知用户"下载失败",附 detail 信息
- 当意图为
打开攻略且命中"打开攻略-直启分支":通过 service_manager 启动客户端。
python ./scripts/service_manager.py launch "<game_name>" --models <值> [--install-dir <值>]
若返回 {"status":"deploying"},每 30 秒轮询 status,done 后重新执行本条 launch 命令,error 则通知用户失败。
- 当意图为
打开攻略且未命中"打开攻略-直启分支":通过 service_manager 启动客户端。
python ./scripts/service_manager.py launch --models <值> [--install-dir <值>]
若返回 {"status":"deploying"},同样每 30 秒轮询 status,done 后重新执行本条 launch 命令,error 则通知用户失败。
补充约定:
- 下载目录固定为当前目录下的
walkthrough/。 - 导入时
instance_id使用最终的game_name。 json_path使用walkthrough/<safe_game_name>/text_images.json。
完成条件
- 当意图为
下载攻略:已完成攻略下载并成功导入;或 - 当意图为
打开攻略:成功启动game_client.py;或 process连续 5 次检测为空并按规则结束;或- 当意图为
关闭服务:已执行 shutdown 并结束。
模糊退出意图的处理
当用户表达模糊的退出意图(如"不玩了""退出""关掉""结束"等,但不包含"服务"关键词)→ 不命中任何意图分支,此时提示用户:"如果需要关闭后台服务,请说'关闭服务'或'关掉服务'"。
微信扫一扫