技术教程 · 阅读约 7 分钟

用 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 工具调用、多模型协作这些实战内容。