5.6 KiB
5.6 KiB
name, description
| name | description |
|---|---|
| gemini-skill | 通过 Gemini 官网(gemini.google.com)执行问答与生图操作。用户提到"问问Gemini/让Gemini回答/去Gemini问",或出现"生图/画图/绘图/nano banana/nanobanana/生成图片"等关键词时触发。默认使用可用模型中最强档(优先 Gemini 3.1 Pro),按任务切换文本问答或图片生成流程,并把结果回传给用户。 |
Gemini Web Ops
核心规则
- 使用 OpenClaw 内置浏览器,
profile="openclaw"。 - 涉及生图关键词(如:生图、绘图、画一张、nano banana)时,优先用无头浏览器流程执行。
- 文本问答任务(如"问问Gemini xxx")走 Gemini 文本提问链路。
- 默认模型:可用列表中最强模型,优先
Gemini 3.1 Pro。 - 执行生图后先向用户回报"正在绘图中",完成后回传图片。
- 禁止使用浏览器截图(screenshot)获取生成图片。默认通过
extractImageBase64()从已渲染的 DOM 直接提取图片 Base64 数据,解码后保存到本地再发送给用户;仅当用户明确要求高清/原图时,才调用downloadLatestImage()走原图下载流程。
任务分流
- 文本问答触发词:
问问Gemini、让Gemini回答、去Gemini问。 - 生图任务触发词:
生图、画、绘图、海报、nano banana、nanobanana、image generation。 - 若请求含糊,先确认:是文本回答还是要出图。
标准执行流程
按钮状态机
Gemini 页面的操作按钮(.send-button-container 内)通过 aria-label 反映当前状态:
| aria-label | 状态 | 含义 |
|---|---|---|
| 麦克风 | idle |
输入框为空,空闲中 |
| 发送 / Send | ready |
输入框有内容,可发送 |
| 停止 / Stop | loading |
已发送,正在生成回答 |
可通过 GeminiOps.getStatus() 获取当前状态,通过 GeminiOps.pollStatus() 分段轮询等待生成完毕。
A. 文本问答
- 打开
https://gemini.google.com。 - 校验登录态(头像/输入框可见)。
- 新建会话:
click('newChatBtn'),确保干净上下文。 - 选择最强可用模型(优先 Gemini 3.1 Pro)。
- 将用户问题原样输入并发送。
- 分段轮询等待(见下方"CDP 保活轮询策略")。
- 等待完整输出,提炼后回传(必要时附原文要点)。
B. 生图流程
- 打开 Gemini 页面并确认登录。
- 新建会话:
click('newChatBtn'),确保干净上下文。 - 选择最强可用模型(优先 Gemini 3.1 Pro)。
- 将用户提示词原样输入。
- 发送后立即通知用户:正在绘图中。
- 分段轮询等待(见下方"CDP 保活轮询策略",生图超时上限 120s)。
- 结果出现后,调用
GeminiOps.getLatestImage()获取最新生成的图片(Gemini 一次只生成一张):- 返回
{ok, src, alt, width, height, hasDownloadBtn, debug}。 - 定位依据:
<img class="image loaded">— 只有同时具有image和loaded两个 class 的才是已渲染完成的生成图片;DOM 中取最后一个即为最新。 src为https://lh3.googleusercontent.com/...格式的原图 URL。- 若
ok === false,等几秒再调一次;连续两次失败则做 snapshot 排查页面状态。 - 默认:调用
GeminiOps.extractImageBase64()从 DOM 直接提取图片 Base64(Canvas 优先,跨域污染时 fallback 到 fetch),解码后保存为本地文件发送给用户。注意该函数返回 Promise,CDP 调用时需设置awaitPromise:true。 - 高清:仅当用户明确要求高清/原图时,才调用
GeminiOps.downloadLatestImage()走原图下载按钮流程。 - 下载按钮定位:从
img向上找到.image-container容器,容器内的mat-icon[fonticon="download"]即为下载原图按钮。 - ⚠️ 严禁使用浏览器截图(screenshot)代替保存图片。
- 返回
- 将保存到本地的图片文件发送给用户。
- 将每步操作返回的
debug日志一并回传给用户,方便排查定位失败和优化策略。所有函数(probe、click、fillPrompt、pollStatus、getLatestImage、extractImageBase64、downloadLatestImage)的返回值都包含debug字段。
CDP 保活轮询策略
核心原则:绝不在页面内做长时间 Promise 等待。每次
evaluate必须毫秒级返回,由调用端控制循环。
生图/问答发送后,按以下方式等待结果:
- 每隔 8~10 秒调用一次
GeminiOps.pollStatus()。 - 该函数立即返回
{status, label, pageVisible, ts}。 - 调用端根据
status判断:loading→ 继续等待,累计已耗时。idle→ 生成完毕,进入结果获取阶段。unknown→ 页面可能异常,做一次 snapshot 兜底排查。
- 累计耗时超过上限(文本 60s / 生图 120s)→ 走超时回退逻辑。
为什么这样做:OpenClaw 通过 CDP(Chrome DevTools Protocol)WebSocket 控制浏览器。若长时间(>30s)无消息往来,网关/代理可能判定连接空闲并断开。分段短轮询保证 CDP 通道始终有心跳流量。
失败回退
- 元素定位失败:刷新页面后重试一次。
- 模型不可用:降级到次优 Gemini 模型并告知。
- 生成超时:回报"仍在生成中",继续等待一次;再次超时则请用户换短提示词。
低 token 优先策略
- 优先使用
scripts/gemini_ui_shortcuts.js的快捷选择器。 - 先 evaluate 批量动作,再 snapshot 精准兜底。
- 避免高频全量快照。
参考
- 详细执行与回退:
references/gemini-flow.md - 关键词与路由:
references/intent-routing.md