用 30 行 Python 让 AI 帮你「控制电脑」——Gemini 2.5 Flash Computer Use 实战
用 30 行 Python 让 AI 帮你「控制电脑」——Gemini 2.5 Flash Computer Use 实战
很多人以为 Computer Use(计算机使用)是 Claude 专属的黑魔法。
其实 Gemini 2.5 Flash 现在也支持了,而且速度更快、价格更低。更重要的是:接入方式跟普通聊天 API 几乎没区别,真的 30 行代码就能跑起来。
Computer Use 到底在做什么?
先澄清一个误解:它不是真的在"看屏幕"。
核心机制是这样的:
1. 你把截图(base64)塞进消息里
2. 模型返回「操作指令」,比如 click(x=320, y=150) 或 type("hello")
3. 你用 pyautogui 或系统 API 执行这些指令
4. 截图 → 再发给模型 → 循环
模型扮演的是「眼睛+大脑」,你的代码负责「手」。
环境准备
pip install openai pyautogui Pillow
为什么用 openai 库?因为 Gemini 2.5 Flash 支持 OpenAI 兼容格式,换个 base_url 就行,不用再装 Google 的 SDK。
完整代码(可直接运行)
import base64
import json
import pyautogui
from PIL import ImageGrab
from openai import OpenAI
# 接入无量Api,比官方便宜 60%+,国内直连无需代理
client = OpenAI(
api_key="你的 Key",
base_url="https://api2everything.xyz/v1"
)
def screenshot_b64() -> str:
"""截当前屏幕,转 base64"""
img = ImageGrab.grab()
img = img.resize((1280, 720)) # 压缩一下,省 token
import io
buf = io.BytesIO()
img.save(buf, format="PNG")
return base64.b64encode(buf.getvalue()).decode()
def ask_model(task: str, screen_b64: str) -> dict:
"""把截图和任务描述发给模型,拿回操作指令"""
resp = client.chat.completions.create(
model="gemini-2.5-flash", # 也可以换 claude-3-5-sonnet 等 300+ 模型
messages=[
{
"role": "system",
"content": (
"你是一个桌面自动化助手。根据截图和任务,"
"返回 JSON 格式的下一步操作。\n"
"格式:{\"action\": \"click|type|scroll|done\", "
"\"x\": int, \"y\": int, \"text\": str, \"reason\": str}"
)
},
{
"role": "user",
"content": [
{"type": "text", "text": f"任务:{task}"},
{"type": "image_url", "image_url": {
"url": f"data:image/png;base64,{screen_b64}"
}}
]
}
],
response_format={"type": "json_object"}
)
return json.loads(resp.choices[0].message.content)
def execute(action: dict):
"""执行模型返回的操作"""
op = action.get("action")
print(f"[执行] {op} — {action.get('reason', '')}")
if op == "click":
pyautogui.click(action["x"], action["y"])
elif op == "type":
pyautogui.typewrite(action["text"], interval=0.05)
elif op == "scroll":
pyautogui.scroll(action.get("amount", 3), x=action["x"], y=action["y"])
# 主循环
def run(task: str, max_steps: int = 10):
for step in range(max_steps):
screen = screenshot_b64()
action = ask_model(task, screen)
if action.get("action") == "done":
print("✅ 任务完成")
break
execute(action)
import time; time.sleep(1) # 等界面响应
if __name__ == "__main__":
run("打开计算器,计算 137 × 42")
几个关键细节
截图压到 1280×720
原始 4K 截图一张可能超 2MB,换算成 token 贵得离谱。压到 720p 对模型识别影响不大,但成本直接砍掉 75%。
response_format 锁死 JSON
不加这个参数,模型有时会返回 markdown 代码块包裹的 JSON,解析直接爆。加了之后稳定很多。
换模型只改一行
model="gemini-2.5-flash" 改成 model="claude-sonnet-4-5" 或 model="gpt-4o" 就切换了,其余代码一字不动。这就是 OpenAI 格式兼容的好处。
安全边界
别在生产机器上无人值守跑。加一个人工确认步骤,或者限制可操作的应用范围,是基本的防护措施。
拓展方向
这个框架稍微改改就能做:
- 自动填表:打开浏览器,识别表单字段,批量录入数据
- UI 测试:替代部分 Selenium 场景,自然语言描述操作步骤
- 桌面 RPA:操控没有 API 的旧系统(ERP、政务系统等)
Gemini 2.5 Flash 在速度和视觉理解上表现不错,适合这类需要快速响应的循环任务。Claude 3.5 Sonnet 在复杂界面推理上更稳,可以根据场景切换。
关于 API 费用
跑 Computer Use 的循环,每步都要发一张截图,token 消耗比普通对话高 5-10 倍。如果直接用官方 API,测试成本会比较肉疼。
我自己用的是 无量Api,国内直连,覆盖 Gemini / Claude / GPT / DeepSeek 等 300+ 模型,价格比官方便宜 60% 以上,SVIP 还有 7.7 折。注册送 ¥1,余额永不过期,拿来跑实验挺合适。改一行 base_url 就接入,上面代码直接可用。
代码跑起来有问题、或者想聊某个具体场景怎么实现,评论区说一下,看到都会回。
觉得有用的话点个赞,后续还会写 Agent 工具调用、多模型协作这些实战内容。