{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-08-17-controlling-android-with-gemini-3-7-flash-and-150-lines-of/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "Last week we launched [Gemini 3.7 Flash](https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-3-7-flash/), our first hybrid reasoning model built for coding and agentic workflows.\n\nIts multimodal reasoning and fast turn-by-turn latency make it uniquely suited for Computer Use. Instead of waiting several seconds between taps, the model inspects screenshots, plans the next step, and emits precise coordinates fast enough to keep device control loops interactive.\n\nTo test this on a real mobile interface, I gave it a task: *\"play 1 round of Wordle at wordle.global/en/unlimited\"*.\n\nRunning on an Android emulator, it opened Chrome, cleared tutorial popups, played an opening word, read the color-coded feedback with thinking, and solved the game in 2 guesses.\n\n## The problem with mobile automation\n\nMobile test automation has been painful for 15 years.\n\nAppium, Espresso, and UIAutomator all depend on accessibility trees, element IDs, and XPath selectors. When a product team runs an A/B test, redesigns a checkout card, or adds a marketing banner, the test script breaks.\n\nWebviews and dynamic canvas games are even worse because they often expose zero accessibility nodes to ADB.\n\nGemini 3.7 Flash allows you to approach this almost human like. The model looks at the raw screenshot, figures out where elements sit, and returns normalized 0–999 coordinates for clicks, text input, and key presses.\n\n## How the agent loop works\n\n![Multimodal Tool Use Agent Loop for Android Computer Use](https://www.philschmid.de/static/blog/gemini-android-computer-use/android_agent_loop.svg)\n\nThe Agent connects to an Android emulator over ADB and runs a continuous loop:\n\n1. **Capture**: ADB takes a screenshot (`adb exec-out screencap -p`) and encodes it as Base64.\n2. **Evaluate**: Gemini 3.7 Flash inspects the image and plans its next move.\n3. **Emit action**: Gemini returns a tool call with normalized coordinates and intent (e.g. `click(x=884, y=190)`).\n4. **Execute**: The Python script maps `0–999` to physical pixels (`1080x1920`) and fires `adb shell input tap <x> <y>`.\n5. **Continue**: The client grabs a fresh screenshot and sends it back in `function_result` with `previous_interaction_id`.\n\nHere is the core loop using the `google-genai` Python SDK:\n\nPython\n\n```python\nfrom google import genai\nimport base64\n \nclient = genai.Client()\n \n# 1. Package the prompt with the initial device screenshot\nuser_input = [\n    {\"type\": \"text\", \"text\": \"play 1 round of Wordle at wordle.global/en/unlimited\"},\n    {\"type\": \"image\", \"data\": base64.b64encode(bridge.screenshot()).decode(), \"mime_type\": \"image/png\"}\n]\n \nprevious_interaction_id = None\n \nwhile True:\n    # 2. Call Gemini 3.7 Flash with mobile computer use and thinking\n    interaction = client.interactions.create(\n        model=\"gemini-3.7-flash\",\n        system_instruction=\"You are operating an Android device. Use tools to finish the task.\",\n        input=user_input,\n        tools=[{\"type\": \"computer_use\", \"environment\": \"mobile\"}],\n        generation_config={\"thinking_level\": \"medium\"},\n        previous_interaction_id=previous_interaction_id,\n    )\n \n    # 3. Stop if the model produced text rather than a tool call\n    function_calls = [s for s in interaction.steps if s.type == \"function_call\"]\n    if not function_calls:\n        print(\"Task finished:\", interaction.output_text)\n        break\n \n    # 4. Dispatch actions (scales 0-999 coordinates to screen pixels over ADB)\n    function_responses = []\n    for fc in function_calls:\n        bridge.execute(fc.name, **fc.arguments)\n \n        # 5. Capture new screen state and return result to continue session\n        function_responses.append({\n            \"type\": \"function_result\",\n            \"name\": fc.name,\n            \"call_id\": fc.id,\n            \"result\": [\n                {\"type\": \"text\", \"text\": '{\"status\": \"ok\"}'},\n                {\"type\": \"image\", \"data\": base64.b64encode(bridge.screenshot()).decode(), \"mime_type\": \"image/png\"}\n            ]\n        })\n \n    user_input = function_responses\n    previous_interaction_id = interaction.id\n```\n\nThe full implementation, including the `ADBBridge` coordinate scaler, device setup scripts, and CLI runner, is in the [gemini-android-computer-use-quickstart](https://github.com/google-gemini/gemini-android-computer-use-quickstart) repository.\n\n## Playing 1 round of Wordle\n\nHere is what happened during the Wordle session.\n\n**1\\. Launch and navigation**\n\nThe agent started on the home screen, opened Chrome by package name, opened a new tab, and typed the URL:\n\n![Agent launching Chrome and navigating to Wordle](https://www.philschmid.de/static/blog/gemini-android-computer-use/step1_initial_task.jpg)\n\n```text\n[function_call] open_app({'package_name': 'com.android.chrome', 'intent': 'Open Chrome browser'})\n[function_call] click({'x': 270, 'y': 180, 'intent': 'Open a new tab in Chrome'})\n[function_call] type({'text': 'https://wordle.global/en/unlimited', 'press_enter': True, 'intent': 'Type Wordle Unlimited URL and navigate'})\n```\n\n**2\\. Clearing modal overlays**\n\nTwo popups blocked the game board on page load: a \"How to Play\" tutorial and a stats dialog.\n\nThe model spotted the close icons and clicked them:\n\n![Agent closing the tutorial modal overlay](https://www.philschmid.de/static/blog/gemini-android-computer-use/step2_dismiss_popups.jpg)\n\n```text\n[function_call] click({'x': 884, 'y': 190, 'intent': 'Close the How to Play modal'})\n[function_call] click({'x': 884, 'y': 256, 'intent': 'Close stats modal'})\n```\n\n**3\\. Playing guess 1 (CRANE)**\n\nWith a clear board, it typed a standard vowel-heavy opener: `C - R - A - N - E`.\n\n![Entering first word CRANE on the virtual keyboard](https://www.philschmid.de/static/blog/gemini-android-computer-use/step3_guess1_crane.jpg)\n\n```text\n[function_call] click({'x': 390, 'y': 915, 'intent': 'Click C'})\n[function_call] click({'x': 355, 'y': 736, 'intent': 'Click R'})\n[function_call] click({'x': 72,  'y': 822, 'intent': 'Click A'})\n[function_call] click({'x': 708, 'y': 908, 'intent': 'Click N'})\n[function_call] click({'x': 259, 'y': 736, 'intent': 'Click E'})\n[function_call] press_key({'key': 'Enter', 'intent': 'Press Enter key'})\n```\n\n**4\\. Reading tile colors with thinking**\n\nThe game returned feedback:\n\n- **C** turned yellow (in the word, wrong spot).\n- **R, A, N** turned gray (not in the word).\n- **E** turned green (correct spot at index 5).\n\nGemini checked words ending in `E` that contain `C` somewhere in the middle without `R`, `A`, or `N`. It picked **`SPICE`**. All 5 tiles turned green. The model saw the victory popup and stopped:\n\n![Solved in 2 guesses celebration card](https://www.philschmid.de/static/blog/gemini-android-computer-use/step5_solved_spice.jpg)\n\n```text\nAgent finished: I have completed a round of Wordle Unlimited at https://wordle.global/en/unlimited, successfully solving the puzzle (\"SPICE\") in 2 guesses.\n```\n\n## What you can build with this\n\nWordle is a clean visual benchmark, but the underlying loop works for any Android application.\n\nYou can use this for automated UI testing, user flow verification, exploratory bug reproduction, or general task automation. Because the model operates on raw screenshots, it works across native Android apps, webviews, and dynamic canvas interfaces without relying on accessibility IDs or DOM trees.\n\nThe complete quickstart with the emulator setup script, ADB bridge, and CLI runner is open source:\n\n- **GitHub repo**: [google-gemini/gemini-android-computer-use-quickstart](https://github.com/google-gemini/gemini-android-computer-use-quickstart)\n- **Interactions API overview**: [Interactions API Docs](https://ai.google.dev/gemini-api/docs/interactions/overview)\n- **Computer Use guide**: [Computer Use Guide](https://ai.google.dev/gemini-api/docs/interactions/computer-use)\n- **Thinking documentation**: [Thinking in Gemini 3.7](https://ai.google.dev/gemini-api/docs/thinking)\n\n* * *\n\nThanks for reading! If you have any questions or feedback, please let me know on [Twitter](https://twitter.com/_philschmid) or [LinkedIn](https://www.linkedin.com/in/philipp-schmid-a6a2bb196/).\n",
  "authors": [],
  "captured_at": "2026-09-27T19:29:15.293681927+00:00",
  "category": "programming",
  "content_html": "<p>Last week we launched <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-3-7-flash/\">Gemini 3.7 Flash</a>, our first hybrid reasoning model built for coding and agentic workflows.</p>\n<p>Its multimodal reasoning and fast turn-by-turn latency make it uniquely suited for Computer Use. Instead of waiting several seconds between taps, the model inspects screenshots, plans the next step, and emits precise coordinates fast enough to keep device control loops interactive.</p>\n<p>To test this on a real mobile interface, I gave it a task: <em>&quot;play 1 round of Wordle at wordle.global/en/unlimited&quot;</em>.</p>\n<p>Running on an Android emulator, it opened Chrome, cleared tutorial popups, played an opening word, read the color-coded feedback with thinking, and solved the game in 2 guesses.</p>\n<h2>The problem with mobile automation</h2>\n<p>Mobile test automation has been painful for 15 years.</p>\n<p>Appium, Espresso, and UIAutomator all depend on accessibility trees, element IDs, and XPath selectors. When a product team runs an A/B test, redesigns a checkout card, or adds a marketing banner, the test script breaks.</p>\n<p>Webviews and dynamic canvas games are even worse because they often expose zero accessibility nodes to ADB.</p>\n<p>Gemini 3.7 Flash allows you to approach this almost human like. The model looks at the raw screenshot, figures out where elements sit, and returns normalized 0–999 coordinates for clicks, text input, and key presses.</p>\n<h2>How the agent loop works</h2>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/gemini-android-computer-use/android_agent_loop.svg\" alt=\"Multimodal Tool Use Agent Loop for Android Computer Use\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The Agent connects to an Android emulator over ADB and runs a continuous loop:</p>\n<ol>\n<li><strong>Capture</strong>: ADB takes a screenshot (<code>adb exec-out screencap -p</code>) and encodes it as Base64.</li>\n<li><strong>Evaluate</strong>: Gemini 3.7 Flash inspects the image and plans its next move.</li>\n<li><strong>Emit action</strong>: Gemini returns a tool call with normalized coordinates and intent (e.g. <code>click(x=884, y=190)</code>).</li>\n<li><strong>Execute</strong>: The Python script maps <code>0–999</code> to physical pixels (<code>1080x1920</code>) and fires <code>adb shell input tap &lt;x&gt; &lt;y&gt;</code>.</li>\n<li><strong>Continue</strong>: The client grabs a fresh screenshot and sends it back in <code>function_result</code> with <code>previous_interaction_id</code>.</li>\n</ol>\n<p>Here is the core loop using the <code>google-genai</code> Python SDK:</p>\n<p>Python</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">google</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">genai</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">base64</span></span></span>\n \n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">client</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">genai</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">Client</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n \n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 1. Package the prompt with the initial device screenshot\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">user_input</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n    <span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">play 1 round of Wordle at wordle.global/en/unlimited<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">image<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">data<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">base64</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">b64encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">bridge</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">screenshot</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">decode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">mime_type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">image/png<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span>\n<span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n \n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">previous_interaction_id</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-constant syntax-language syntax-python\">None</span>\n \n<span class=\"syntax-meta syntax-statement syntax-while syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-while syntax-python\">while</span> <span class=\"syntax-constant syntax-language syntax-python\">True</span><span class=\"syntax-punctuation syntax-section syntax-block syntax-while syntax-python\">:</span></span>\n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 2. Call Gemini 3.7 Flash with mobile computer use and thinking\n</span>    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">interaction</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">interactions</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">create</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n        <span class=\"syntax-variable syntax-parameter syntax-python\">model</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">gemini-3.7-flash<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n        <span class=\"syntax-variable syntax-parameter syntax-python\">system_instruction</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">You are operating an Android device. Use tools to finish the task.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n        <span class=\"syntax-variable syntax-parameter syntax-python\">input</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">user_input</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n        <span class=\"syntax-variable syntax-parameter syntax-python\">tools</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">computer_use<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">environment<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">mobile<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n        <span class=\"syntax-variable syntax-parameter syntax-python\">generation_config</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">thinking_level<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">medium<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n        <span class=\"syntax-variable syntax-parameter syntax-python\">previous_interaction_id</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">previous_interaction_id</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    </span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 3. Stop if the model produced text rather than a tool call\n</span>    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">function_calls</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">s</span></span> <span class=\"syntax-meta syntax-expression syntax-generator syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-generator syntax-python\">for</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">s</span> <span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-in syntax-python\">in</span></span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">interaction</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">steps</span></span> <span class=\"syntax-keyword syntax-control syntax-flow syntax-if syntax-inline syntax-python\">if</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">s</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">type</span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-python\">==</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">function_call<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n    <span class=\"syntax-meta syntax-statement syntax-if syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">if</span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-python\">not</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">function_calls</span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-conditional syntax-python\">:</span></span>\n        <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Task finished:<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">interaction</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">output_text</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n        <span class=\"syntax-keyword syntax-control syntax-flow syntax-python\">break</span>\n \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 4. Dispatch actions (scales 0-999 coordinates to screen pixels over ADB)\n</span>    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">function_responses</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n    <span class=\"syntax-meta syntax-statement syntax-for syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-python\">for</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">fc</span> <span class=\"syntax-meta syntax-statement syntax-for syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-in syntax-python\">in</span></span></span><span class=\"syntax-meta syntax-statement syntax-for syntax-python\"> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">function_calls</span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-for syntax-python\">:</span></span>\n        <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">bridge</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">execute</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">fc</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">name</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-keyword syntax-operator syntax-unpacking syntax-mapping syntax-python\">**</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">fc</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">arguments</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n \n        <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 5. Capture new screen state and return result to continue session\n</span>        <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">function_responses</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">append</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span>\n            <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">function_result<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span>\n            <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">name<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">fc</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">name</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span>\n            <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">call_id<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">fc</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">id</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span>\n            <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">result<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n                <span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&#39;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\">{&quot;status&quot;: &quot;ok&quot;}<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&#39;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n                <span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">image<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">data<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">base64</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">b64encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">bridge</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">screenshot</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">decode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">mime_type<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">image/png<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span>\n            <span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n        <span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n \n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">user_input</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">function_responses</span></span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">previous_interaction_id</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">interaction</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">id</span></span>\n</span></span></code></pre>\n<p>The full implementation, including the <code>ADBBridge</code> coordinate scaler, device setup scripts, and CLI runner, is in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/google-gemini/gemini-android-computer-use-quickstart\">gemini-android-computer-use-quickstart</a> repository.</p>\n<h2>Playing 1 round of Wordle</h2>\n<p>Here is what happened during the Wordle session.</p>\n<p><strong>1. Launch and navigation</strong></p>\n<p>The agent started on the home screen, opened Chrome by package name, opened a new tab, and typed the URL:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/gemini-android-computer-use/step1_initial_task.jpg\" alt=\"Agent launching Chrome and navigating to Wordle\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">[function_call] open_app({&#39;package_name&#39;: &#39;com.android.chrome&#39;, &#39;intent&#39;: &#39;Open Chrome browser&#39;})\n[function_call] click({&#39;x&#39;: 270, &#39;y&#39;: 180, &#39;intent&#39;: &#39;Open a new tab in Chrome&#39;})\n[function_call] type({&#39;text&#39;: &#39;https://wordle.global/en/unlimited&#39;, &#39;press_enter&#39;: True, &#39;intent&#39;: &#39;Type Wordle Unlimited URL and navigate&#39;})\n</span></code></pre>\n<p><strong>2. Clearing modal overlays</strong></p>\n<p>Two popups blocked the game board on page load: a &quot;How to Play&quot; tutorial and a stats dialog.</p>\n<p>The model spotted the close icons and clicked them:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/gemini-android-computer-use/step2_dismiss_popups.jpg\" alt=\"Agent closing the tutorial modal overlay\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">[function_call] click({&#39;x&#39;: 884, &#39;y&#39;: 190, &#39;intent&#39;: &#39;Close the How to Play modal&#39;})\n[function_call] click({&#39;x&#39;: 884, &#39;y&#39;: 256, &#39;intent&#39;: &#39;Close stats modal&#39;})\n</span></code></pre>\n<p><strong>3. Playing guess 1 (CRANE)</strong></p>\n<p>With a clear board, it typed a standard vowel-heavy opener: <code>C - R - A - N - E</code>.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/gemini-android-computer-use/step3_guess1_crane.jpg\" alt=\"Entering first word CRANE on the virtual keyboard\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">[function_call] click({&#39;x&#39;: 390, &#39;y&#39;: 915, &#39;intent&#39;: &#39;Click C&#39;})\n[function_call] click({&#39;x&#39;: 355, &#39;y&#39;: 736, &#39;intent&#39;: &#39;Click R&#39;})\n[function_call] click({&#39;x&#39;: 72,  &#39;y&#39;: 822, &#39;intent&#39;: &#39;Click A&#39;})\n[function_call] click({&#39;x&#39;: 708, &#39;y&#39;: 908, &#39;intent&#39;: &#39;Click N&#39;})\n[function_call] click({&#39;x&#39;: 259, &#39;y&#39;: 736, &#39;intent&#39;: &#39;Click E&#39;})\n[function_call] press_key({&#39;key&#39;: &#39;Enter&#39;, &#39;intent&#39;: &#39;Press Enter key&#39;})\n</span></code></pre>\n<p><strong>4. Reading tile colors with thinking</strong></p>\n<p>The game returned feedback:</p>\n<ul>\n<li><strong>C</strong> turned yellow (in the word, wrong spot).</li>\n<li><strong>R, A, N</strong> turned gray (not in the word).</li>\n<li><strong>E</strong> turned green (correct spot at index 5).</li>\n</ul>\n<p>Gemini checked words ending in <code>E</code> that contain <code>C</code> somewhere in the middle without <code>R</code>, <code>A</code>, or <code>N</code>. It picked <strong><code>SPICE</code></strong>. All 5 tiles turned green. The model saw the victory popup and stopped:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.philschmid.de/static/blog/gemini-android-computer-use/step5_solved_spice.jpg\" alt=\"Solved in 2 guesses celebration card\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<pre><code class=\"language-text\"><span class=\"code-snippet\">Agent finished: I have completed a round of Wordle Unlimited at https://wordle.global/en/unlimited, successfully solving the puzzle (&quot;SPICE&quot;) in 2 guesses.\n</span></code></pre>\n<h2>What you can build with this</h2>\n<p>Wordle is a clean visual benchmark, but the underlying loop works for any Android application.</p>\n<p>You can use this for automated UI testing, user flow verification, exploratory bug reproduction, or general task automation. Because the model operates on raw screenshots, it works across native Android apps, webviews, and dynamic canvas interfaces without relying on accessibility IDs or DOM trees.</p>\n<p>The complete quickstart with the emulator setup script, ADB bridge, and CLI runner is open source:</p>\n<ul>\n<li><strong>GitHub repo</strong>: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/google-gemini/gemini-android-computer-use-quickstart\">google-gemini/gemini-android-computer-use-quickstart</a></li>\n<li><strong>Interactions API overview</strong>: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ai.google.dev/gemini-api/docs/interactions/overview\">Interactions API Docs</a></li>\n<li><strong>Computer Use guide</strong>: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ai.google.dev/gemini-api/docs/interactions/computer-use\">Computer Use Guide</a></li>\n<li><strong>Thinking documentation</strong>: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ai.google.dev/gemini-api/docs/thinking\">Thinking in Gemini 3.7</a></li>\n</ul>\n<hr />\n<p>Thanks for reading! If you have any questions or feedback, please let me know on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://twitter.com/_philschmid\">Twitter</a> or <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.linkedin.com/in/philipp-schmid-a6a2bb196/\">LinkedIn</a>.</p>\n",
  "content_markdown": "Last week we launched [Gemini 3.7 Flash](https://blog.google/innovation-and-ai/models-and-research/gemini-models/introducing-gemini-3-7-flash/), our first hybrid reasoning model built for coding and agentic workflows.\n\nIts multimodal reasoning and fast turn-by-turn latency make it uniquely suited for Computer Use. Instead of waiting several seconds between taps, the model inspects screenshots, plans the next step, and emits precise coordinates fast enough to keep device control loops interactive.\n\nTo test this on a real mobile interface, I gave it a task: *\"play 1 round of Wordle at wordle.global/en/unlimited\"*.\n\nRunning on an Android emulator, it opened Chrome, cleared tutorial popups, played an opening word, read the color-coded feedback with thinking, and solved the game in 2 guesses.\n\n## The problem with mobile automation\n\nMobile test automation has been painful for 15 years.\n\nAppium, Espresso, and UIAutomator all depend on accessibility trees, element IDs, and XPath selectors. When a product team runs an A/B test, redesigns a checkout card, or adds a marketing banner, the test script breaks.\n\nWebviews and dynamic canvas games are even worse because they often expose zero accessibility nodes to ADB.\n\nGemini 3.7 Flash allows you to approach this almost human like. The model looks at the raw screenshot, figures out where elements sit, and returns normalized 0–999 coordinates for clicks, text input, and key presses.\n\n## How the agent loop works\n\n![Multimodal Tool Use Agent Loop for Android Computer Use](https://www.philschmid.de/static/blog/gemini-android-computer-use/android_agent_loop.svg)\n\nThe Agent connects to an Android emulator over ADB and runs a continuous loop:\n\n1. **Capture**: ADB takes a screenshot (`adb exec-out screencap -p`) and encodes it as Base64.\n2. **Evaluate**: Gemini 3.7 Flash inspects the image and plans its next move.\n3. **Emit action**: Gemini returns a tool call with normalized coordinates and intent (e.g. `click(x=884, y=190)`).\n4. **Execute**: The Python script maps `0–999` to physical pixels (`1080x1920`) and fires `adb shell input tap <x> <y>`.\n5. **Continue**: The client grabs a fresh screenshot and sends it back in `function_result` with `previous_interaction_id`.\n\nHere is the core loop using the `google-genai` Python SDK:\n\nPython\n\n```python\nfrom google import genai\nimport base64\n \nclient = genai.Client()\n \n# 1. Package the prompt with the initial device screenshot\nuser_input = [\n    {\"type\": \"text\", \"text\": \"play 1 round of Wordle at wordle.global/en/unlimited\"},\n    {\"type\": \"image\", \"data\": base64.b64encode(bridge.screenshot()).decode(), \"mime_type\": \"image/png\"}\n]\n \nprevious_interaction_id = None\n \nwhile True:\n    # 2. Call Gemini 3.7 Flash with mobile computer use and thinking\n    interaction = client.interactions.create(\n        model=\"gemini-3.7-flash\",\n        system_instruction=\"You are operating an Android device. Use tools to finish the task.\",\n        input=user_input,\n        tools=[{\"type\": \"computer_use\", \"environment\": \"mobile\"}],\n        generation_config={\"thinking_level\": \"medium\"},\n        previous_interaction_id=previous_interaction_id,\n    )\n \n    # 3. Stop if the model produced text rather than a tool call\n    function_calls = [s for s in interaction.steps if s.type == \"function_call\"]\n    if not function_calls:\n        print(\"Task finished:\", interaction.output_text)\n        break\n \n    # 4. Dispatch actions (scales 0-999 coordinates to screen pixels over ADB)\n    function_responses = []\n    for fc in function_calls:\n        bridge.execute(fc.name, **fc.arguments)\n \n        # 5. Capture new screen state and return result to continue session\n        function_responses.append({\n            \"type\": \"function_result\",\n            \"name\": fc.name,\n            \"call_id\": fc.id,\n            \"result\": [\n                {\"type\": \"text\", \"text\": '{\"status\": \"ok\"}'},\n                {\"type\": \"image\", \"data\": base64.b64encode(bridge.screenshot()).decode(), \"mime_type\": \"image/png\"}\n            ]\n        })\n \n    user_input = function_responses\n    previous_interaction_id = interaction.id\n```\n\nThe full implementation, including the `ADBBridge` coordinate scaler, device setup scripts, and CLI runner, is in the [gemini-android-computer-use-quickstart](https://github.com/google-gemini/gemini-android-computer-use-quickstart) repository.\n\n## Playing 1 round of Wordle\n\nHere is what happened during the Wordle session.\n\n**1\\. Launch and navigation**\n\nThe agent started on the home screen, opened Chrome by package name, opened a new tab, and typed the URL:\n\n![Agent launching Chrome and navigating to Wordle](https://www.philschmid.de/static/blog/gemini-android-computer-use/step1_initial_task.jpg)\n\n```text\n[function_call] open_app({'package_name': 'com.android.chrome', 'intent': 'Open Chrome browser'})\n[function_call] click({'x': 270, 'y': 180, 'intent': 'Open a new tab in Chrome'})\n[function_call] type({'text': 'https://wordle.global/en/unlimited', 'press_enter': True, 'intent': 'Type Wordle Unlimited URL and navigate'})\n```\n\n**2\\. Clearing modal overlays**\n\nTwo popups blocked the game board on page load: a \"How to Play\" tutorial and a stats dialog.\n\nThe model spotted the close icons and clicked them:\n\n![Agent closing the tutorial modal overlay](https://www.philschmid.de/static/blog/gemini-android-computer-use/step2_dismiss_popups.jpg)\n\n```text\n[function_call] click({'x': 884, 'y': 190, 'intent': 'Close the How to Play modal'})\n[function_call] click({'x': 884, 'y': 256, 'intent': 'Close stats modal'})\n```\n\n**3\\. Playing guess 1 (CRANE)**\n\nWith a clear board, it typed a standard vowel-heavy opener: `C - R - A - N - E`.\n\n![Entering first word CRANE on the virtual keyboard](https://www.philschmid.de/static/blog/gemini-android-computer-use/step3_guess1_crane.jpg)\n\n```text\n[function_call] click({'x': 390, 'y': 915, 'intent': 'Click C'})\n[function_call] click({'x': 355, 'y': 736, 'intent': 'Click R'})\n[function_call] click({'x': 72,  'y': 822, 'intent': 'Click A'})\n[function_call] click({'x': 708, 'y': 908, 'intent': 'Click N'})\n[function_call] click({'x': 259, 'y': 736, 'intent': 'Click E'})\n[function_call] press_key({'key': 'Enter', 'intent': 'Press Enter key'})\n```\n\n**4\\. Reading tile colors with thinking**\n\nThe game returned feedback:\n\n- **C** turned yellow (in the word, wrong spot).\n- **R, A, N** turned gray (not in the word).\n- **E** turned green (correct spot at index 5).\n\nGemini checked words ending in `E` that contain `C` somewhere in the middle without `R`, `A`, or `N`. It picked **`SPICE`**. All 5 tiles turned green. The model saw the victory popup and stopped:\n\n![Solved in 2 guesses celebration card](https://www.philschmid.de/static/blog/gemini-android-computer-use/step5_solved_spice.jpg)\n\n```text\nAgent finished: I have completed a round of Wordle Unlimited at https://wordle.global/en/unlimited, successfully solving the puzzle (\"SPICE\") in 2 guesses.\n```\n\n## What you can build with this\n\nWordle is a clean visual benchmark, but the underlying loop works for any Android application.\n\nYou can use this for automated UI testing, user flow verification, exploratory bug reproduction, or general task automation. Because the model operates on raw screenshots, it works across native Android apps, webviews, and dynamic canvas interfaces without relying on accessibility IDs or DOM trees.\n\nThe complete quickstart with the emulator setup script, ADB bridge, and CLI runner is open source:\n\n- **GitHub repo**: [google-gemini/gemini-android-computer-use-quickstart](https://github.com/google-gemini/gemini-android-computer-use-quickstart)\n- **Interactions API overview**: [Interactions API Docs](https://ai.google.dev/gemini-api/docs/interactions/overview)\n- **Computer Use guide**: [Computer Use Guide](https://ai.google.dev/gemini-api/docs/interactions/computer-use)\n- **Thinking documentation**: [Thinking in Gemini 3.7](https://ai.google.dev/gemini-api/docs/thinking)\n\n* * *\n\nThanks for reading! If you have any questions or feedback, please let me know on [Twitter](https://twitter.com/_philschmid) or [LinkedIn](https://www.linkedin.com/in/philipp-schmid-a6a2bb196/).\n",
  "dateCreated": "2026-09-27T19:29:15.293681927+00:00",
  "date_created": "2026-08-17T00:00:00+00:00",
  "date_modified": "2026-08-17T00:00:00+00:00",
  "date_published": "2026-08-17T00:00:00+00:00",
  "description": "Use Gemini 3.7 Flash Computer Use with about 150 lines of Python to control an Android emulator. The model plays Wordle from screenshots: opens Chrome, clears popups, reads tile colors, and solves in two guesses.",
  "external_url": "https://www.philschmid.de/gemini-android-computer-use",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/philschmid-de/2026/08/2026-08-17-controlling-android-with-gemini-3-7-flash-and-150-lines-of.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/philschmid-de/2026/08/2026-08-17-controlling-android-with-gemini-3-7-flash-and-150-lines-of.md"
  },
  "id": "urn:aggr:item:0b8859463d34cd6c1157bc75fb5335f59e0eb56d",
  "isBasedOn": {
    "@id": "https://www.philschmid.de/gemini-android-computer-use"
  },
  "mainEntity": {
    "@id": "https://www.philschmid.de/gemini-android-computer-use",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-08-17-controlling-android-with-gemini-3-7-flash-and-150-lines-of/#webpage"
    },
    "dateModified": "2026-08-17T00:00:00+00:00",
    "datePublished": "2026-08-17T00:00:00+00:00",
    "headline": "Controlling Android with Gemini 3.7 Flash and 150 lines of Python",
    "timeRequired": "PT5M",
    "url": "https://www.philschmid.de/gemini-android-computer-use",
    "wordCount": 941
  },
  "name": "Archived snapshot: Controlling Android with Gemini 3.7 Flash and 150 lines of Python",
  "preview": null,
  "reading_minutes": 5,
  "replicated_at": null,
  "source": "philschmid-de",
  "source_name": "philschmid.de - RSS feed",
  "summary": "Use Gemini 3.7 Flash Computer Use with about 150 lines of Python to control an Android emulator. The model plays Wordle from screenshots: opens Chrome, clears popups, reads tile colors, and solves in two guesses.",
  "tags": [],
  "temporalCoverage": "2026-09-27T19:29:15.293681927+00:00",
  "title": "Controlling Android with Gemini 3.7 Flash and 150 lines of Python",
  "url": "https://aggr.aymericbeaumet.com/items/philschmid-de/2026-08-17-controlling-android-with-gemini-3-7-flash-and-150-lines-of/",
  "word_count": 941
}