Full Code of bytedance/UI-TARS for AI

main 582f3a7ea5d2 cached
19 files
9.0 MB
2.3M tokens
19 symbols
1 requests
Download .txt
Showing preview only (9,399K chars total). Download the full file or copy to clipboard to get everything.
Repository: bytedance/UI-TARS
Branch: main
Commit: 582f3a7ea5d2
Files: 19
Total size: 9.0 MB

Directory structure:
gitextract_cmtoxgu7/

├── .github/
│   └── workflows/
│       └── test.yml
├── LICENSE
├── README.md
├── README_coordinates.md
├── README_deploy.md
├── README_v1.md
├── codes/
│   ├── .gitignore
│   ├── .python-version
│   ├── README.md
│   ├── makefile
│   ├── pyproject.toml
│   ├── tests/
│   │   ├── action_parser_test.py
│   │   └── inference_test.py
│   └── ui_tars/
│       ├── __init__.py
│       ├── action_parser.py
│       └── prompt.py
└── data/
    ├── test_messages.json
    ├── test_messages_single_image.json
    └── training_example.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/test.yml
================================================
name: Test

on:
  pull_request:
    types: [opened, synchronize, reopened]
    branches:
      - "**"
  push:
    branches:
      - "main"

jobs:
  test_ui_tars:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Install dependencies
        working-directory: codes
        run: |
          python -m pip install --upgrade pip uv
          uv sync
      - name: Run unit tests
        working-directory: codes
        run: |
          make test


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<!-- <p align="center">
  <img alt="UI-TARS"  width="260" src="figures/icon.png">
</p>

# UI-TARS: Pioneering Automated GUI Interaction with Native Agents -->
![Local Image](figures/writer.png)
<div align="center">
<p>
        🌐 <a href="https://seed-tars.com/">Website</a>&nbsp&nbsp | 🤗 <a href="https://huggingface.co/ByteDance-Seed/UI-TARS-1.5-7B">Hugging Face Models</a>&nbsp&nbsp 
        | &nbsp&nbsp 🔧 <a href="README_deploy.md">Deployment</a> &nbsp&nbsp  | &nbsp&nbsp 📑 <a href="https://arxiv.org/abs/2501.12326">Paper</a> &nbsp&nbsp  |&nbsp&nbsp</a>
🖥️ <a href="https://github.com/bytedance/UI-TARS-desktop">UI-TARS-desktop</a>&nbsp&nbsp  <br>🏄 <a href="https://github.com/web-infra-dev/Midscene">Midscene (Browser Automation) </a>&nbsp&nbsp | &nbsp&nbsp🫨 <a href="https://discord.gg/pTXwYVjfcs">Discord</a>&nbsp&nbsp
</p>

[![](https://trendshift.io/api/badge/repositories/13561)](https://trendshift.io/repositories/13561)
</div>

We also offer a **UI-TARS-desktop** version, which can operate on your **local personal device**. To use it, please visit [https://github.com/bytedance/UI-TARS-desktop](https://github.com/bytedance/UI-TARS-desktop). To use UI-TARS in web automation, you may refer to the open-source project [Midscene.js](https://github.com/web-infra-dev/Midscene).
**❗Notes**: Since Qwen 2.5vl based models ultilizes absolute coordinates to ground objects, please kindly refer to our illustration about how to process coordinates in this <a href="README_coordinates.md">guide</a>.

## Updates
- 🌟 2025.09.04: We’re excited to announce the release the **UI-TARS-2**, which is a major upgrade from UI-TARS-1.5, featuring with enhanced capabilities in GUI, Game, Code and Tool Use. It is an "All In One" Agent model, enabling seamless integration of multiple abilities for complex tasks. Please check our new [technical report](https://arxiv.org/abs/2509.02544) for more details. Refer to more fantastic showcases at our [website](https://seed-tars.com/showcase/ui-tars-2/).
- 🌟 2025.04.16: We shared the latest progress of the UI-TARS-1.5 model in our [blog](https://seed-tars.com/1.5), which excels in playing games and performing GUI tasks, and we open-sourced the [UI-TARS-1.5-7B](https://huggingface.co/ByteDance-Seed/UI-TARS-1.5-7B).
- ✨ 2025.03.23: We updated the OSWorld inference scripts from the original official [OSWorld repository](https://github.com/xlang-ai/OSWorld/blob/main/run_uitars.py). Now, you can use the OSWorld official inference scripts to reproduce our results.

## Introduction

UI-TARS-1.5, an open-source multimodal agent built upon a powerful vision-language model. It is capable of effectively performing diverse tasks within virtual worlds.

Leveraging the foundational architecture introduced in [our recent paper](https://arxiv.org/abs/2501.12326), UI-TARS-1.5 integrates advanced reasoning enabled by reinforcement learning. This allows the model to reason through its thoughts before taking action, significantly enhancing its performance and adaptability, particularly in inference-time scaling. Our new 1.5 version achieves state-of-the-art results across a variety of standard benchmarks, demonstrating strong reasoning capabilities and notable improvements over prior models.
<!-- ![Local Image](figures/UI-TARS.png) -->
<p align="center">
    <video controls width="480">
      <source src="https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/GUI_demo.mp4" type="video/mp4">
    </video>

<p>
<p align="center">
    <video controls width="480">
      <source src="https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/Game_demo.mp4" type="video/mp4">
    </video>
<p>

## 🚀 Quick Start Guide: Deploying and Using Our Model

To help you get started quickly with our model, we recommend following the steps below in order. These steps will guide you through deployment, prediction post-processing to make the model take actions in your environment.


### ✅ Step 1: Deployment & Inference

👉 <a href="README_deploy.md">Deployment and Inference</a>.
This includes instructions for model deployment using huggingface endpoint, and running your first prediction.


### ✅ Step 2: Post Processing

#### Installation
```bash
pip install ui-tars
# or
uv pip install ui-tars
```
#### Usage
```python
from ui_tars.action_parser import parse_action_to_structure_output, parsing_response_to_pyautogui_code

response = "Thought: Click the button\nAction: click(start_box='(100,200)')"
original_image_width, original_image_height = 1920, 1080
parsed_dict = parse_action_to_structure_output(
    response,
    factor=1000,
    origin_resized_height=original_image_height,
    origin_resized_width=original_image_width,
    model_type="qwen25vl"
)
print(parsed_dict)
parsed_pyautogui_code = parsing_response_to_pyautogui_code(
    responses=parsed_dict,
    image_height=original_image_height,
    image_width=original_image_width
)
print(parsed_pyautogui_code)
```
##### FYI: Coordinates visualization
To help you better understand the coordinate processing, we also provide a <a href="README_coordinates.md">guide</a> for coordinates processing visualization.

## Prompt Usage Guide

To accommodate different device environments and task complexities, the following three prompt templates in <a href="codes/ui_tars/prompt.py">codes/ui_tars/prompt.py</a>. are designed to guide GUI agents in generating appropriate actions. Choose the template that best fits your use case:

### 🖥️ `COMPUTER_USE`

**Recommended for**: GUI tasks on **desktop environments** such as Windows, Linux, or macOS.

**Features**:
- Supports common desktop operations: mouse clicks (single, double, right), drag actions, keyboard shortcuts, text input, scrolling, etc.
- Ideal for browser navigation, office software interaction, file management, and other desktop-based tasks.


### 📱 `MOBILE_USE`

**Recommended for**: GUI tasks on **mobile devices or Android emulators**.

**Features**:
- Includes mobile-specific actions: `long_press`, `open_app`, `press_home`, `press_back`.
- Suitable for launching apps, scrolling views, filling input fields, and navigating within mobile apps.


### 📌 `GROUNDING` 

**Recommended for**: Lightweight tasks focused solely on **action output**, or for use in model training and evaluation.

**Features**:
- Only outputs the `Action` without any reasoning (`Thought`).
- Useful for evaluating grounding capability.

---

When developing or evaluating multimodal interaction systems, choose the appropriate prompt template based on your target platform (desktop vs. mobile) 


## Performance
**Online Benchmark Evaluation**
| Benchmark type | Benchmark                                                                                                                                       | UI-TARS-1.5 | OpenAI CUA | Claude 3.7 | Previous SOTA       |
|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------|-------------|-------------|-------------|----------------------|
| **Computer Use** | [OSworld](https://arxiv.org/abs/2404.07972) (100 steps)                                                                                        | **42.5**     | 36.4        | 28          | 38.1 (200 step)      |
|                | [Windows Agent Arena](https://arxiv.org/abs/2409.08264) (50 steps)                                                                              | **42.1**     | -           | -           | 29.8                 |
| **Browser Use**  | [WebVoyager](https://arxiv.org/abs/2401.13919)                                                                                                 | 84.8         | **87**      | 84.1        | 87                   |
|                | [Online-Mind2web](https://arxiv.org/abs/2504.01382)                                                                                              | **75.8**     | 71          | 62.9        | 71                   |
| **Phone Use**    | [Android World](https://arxiv.org/abs/2405.14573)                                                                                              | **64.2**     | -           | -           | 59.5                 |


**Grounding Capability Evaluation**
| Benchmark | UI-TARS-1.5 | OpenAI CUA | Claude 3.7 | Previous SOTA |
|-----------|-------------|------------|------------|----------------|
| [ScreenSpot-V2](https://arxiv.org/pdf/2410.23218) | **94.2** | 87.9 | 87.6 | 91.6 |
| [ScreenSpotPro](https://arxiv.org/pdf/2504.07981v1) | **61.6** | 23.4 | 27.7 | 43.6 |



**Poki Game**

| Model       | [2048](https://poki.com/en/g/2048) | [cubinko](https://poki.com/en/g/cubinko) | [energy](https://poki.com/en/g/energy) | [free-the-key](https://poki.com/en/g/free-the-key) | [Gem-11](https://poki.com/en/g/gem-11) | [hex-frvr](https://poki.com/en/g/hex-frvr) | [Infinity-Loop](https://poki.com/en/g/infinity-loop) | [Maze:Path-of-Light](https://poki.com/en/g/maze-path-of-light) | [shapes](https://poki.com/en/g/shapes) | [snake-solver](https://poki.com/en/g/snake-solver) | [wood-blocks-3d](https://poki.com/en/g/wood-blocks-3d) | [yarn-untangle](https://poki.com/en/g/yarn-untangle) | [laser-maze-puzzle](https://poki.com/en/g/laser-maze-puzzle) | [tiles-master](https://poki.com/en/g/tiles-master) |
|-------------|-----------|--------------|-------------|-------------------|-------------|---------------|---------------------|--------------------------|-------------|--------------------|----------------------|---------------------|------------------------|---------------------|
| OpenAI CUA  | 31.04     | 0.00         | 32.80       | 0.00              | 46.27       | 92.25         | 23.08               | 35.00                    | 52.18       | 42.86              | 2.02                 | 44.56               | 80.00                  | 78.27               |
| Claude 3.7  | 43.05     | 0.00         | 41.60       | 0.00              | 0.00        | 30.76         | 2.31                | 82.00                    | 6.26        | 42.86              | 0.00                 | 13.77               | 28.00                  | 52.18               |
| UI-TARS-1.5 | 100.00    | 0.00         | 100.00      | 100.00            | 100.00      | 100.00        | 100.00              | 100.00                   | 100.00      | 100.00             | 100.00               | 100.00              | 100.00                 | 100.00              |


**Minecraft**

| Task Type   | Task Name           | [VPT](https://openai.com/index/vpt/) | [DreamerV3](https://www.nature.com/articles/s41586-025-08744-2) | Previous SOTA | UI-TARS-1.5 w/o Thought | UI-TARS-1.5 w/ Thought |
|-------------|---------------------|----------|----------------|--------------------|------------------|-----------------|
| Mine Blocks | (oak_log)               | 0.8      | 1.0            | 1.0                | 1.0              | 1.0             |
|             | (obsidian)          | 0.0      | 0.0            | 0.0                | 0.2              | 0.3             |
|             | (white_bed)               | 0.0      | 0.0            | 0.1                | 0.4              | 0.6             |
|             | **200 Tasks Avg.**  | 0.06     | 0.03           | 0.32               | 0.35             | 0.42            |
| Kill Mobs   | (mooshroom)            | 0.0      | 0.0            | 0.1                | 0.3              | 0.4             |
|             | (zombie)            | 0.4      | 0.1            | 0.6                | 0.7              | 0.9             |
|             | (chicken)          | 0.1      | 0.0            | 0.4                | 0.5              | 0.6             |
|             | **100 Tasks Avg.**  | 0.04     | 0.03           | 0.18               | 0.25             | 0.31            |

## Model Scale Comparison

Here we compare performance across different model scales of UI-TARS on the OSworld benchmark.

| **Benchmark Type** | **Benchmark**                      | **UI-TARS-72B-DPO** | **UI-TARS-1.5-7B** | **UI-TARS-1.5** |
|--------------------|------------------------------------|---------------------|--------------------|-----------------|
| Computer Use       | [OSWorld](https://arxiv.org/abs/2404.07972)             | 24.6                | 27.5               | **42.5**        |
| GUI Grounding      | [ScreenSpotPro](https://arxiv.org/pdf/2504.07981v1) | 38.1                | 49.6               | **61.6**        |

### Limitations

While UI-TARS-1.5 represents a significant advancement in multimodal agent capabilities, we acknowledge several important limitations:

- **Misuse:** Given its enhanced performance in GUI tasks, including successfully navigating authentication challenges like CAPTCHA, UI-TARS-1.5 could potentially be misused for unauthorized access or automation of protected content. To mitigate this risk, extensive internal safety evaluations are underway.
- **Computation:** UI-TARS-1.5 still requires substantial computational resources, particularly for large-scale tasks or extended gameplay scenarios.
- **Hallucination**: UI-TARS-1.5 may occasionally generate inaccurate descriptions, misidentify GUI elements, or take suboptimal actions based on incorrect inferences—especially in ambiguous or unfamiliar environments.
- **Model scale:** The released UI-TARS-1.5-7B focuses primarily on enhancing general computer use capabilities and is not specifically optimized for game-based scenarios, where the UI-TARS-1.5 still holds a significant advantage.

## What's next

We are providing early research access to our top-performing UI-TARS-1.5 model to facilitate collaborative research. Interested researchers can contact us at TARS@bytedance.com.

Looking ahead, we envision UI-TARS evolving into increasingly sophisticated agentic experiences capable of performing real-world actions, thereby empowering platforms such as [doubao](https://team.doubao.com/en/) to accomplish more complex tasks for you :)

## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=bytedance/UI-TARS&type=Date)](https://www.star-history.com/#bytedance/UI-TARS&Date)

## Citation
If you find our paper and model useful in your research, feel free to give us a cite.

```BibTeX
@article{qin2025ui,
  title={UI-TARS: Pioneering Automated GUI Interaction with Native Agents},
  author={Qin, Yujia and Ye, Yining and Fang, Junjie and Wang, Haoming and Liang, Shihao and Tian, Shizuo and Zhang, Junda and Li, Jiahao and Li, Yunxin and Huang, Shijue and others},
  journal={arXiv preprint arXiv:2501.12326},
  year={2025}
}
```


================================================
FILE: README_coordinates.md
================================================

# Tutorial: Processing Model Coordinate Outputs

**Note**: For complete action space parsing, please refer to [OSWorld `uitars_agent.py`](https://github.com/xlang-ai/OSWorld/blob/main/mm_agents/uitars_agent.py). This tutorial assumes that we have already obtained the raw coordinate output from the model and will process it to determine the actual position in the image that the model intends to click.

---

## Steps:

1. **Visualize the Model's Output Coordinates**  
   Use the code provided below to process the model's output and visualize the coordinates on the image.

## Code Example
```python
# Assume model output
model_raw_response = """Thought: xxx
Action: click(start_box='(197,525)')"""

# Please use re to parse the coordinate values
model_output_width = 197
model_output_height = 525

from PIL import Image
import matplotlib.pyplot as plt

import json
import base64
from io import BytesIO
from PIL import Image

import math

IMAGE_FACTOR = 28
MIN_PIXELS = 100 * 28 * 28
MAX_PIXELS = 16384 * 28 * 28
MAX_RATIO = 200

VIDEO_MIN_PIXELS = 128 * 28 * 28
VIDEO_MAX_PIXELS = 768 * 28 * 28
FRAME_FACTOR = 2
FPS = 2.0
FPS_MIN_FRAMES = 4
FPS_MAX_FRAMES = 768

def round_by_factor(number: int, factor: int) -> int:
    """Returns the closest integer to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor

def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer greater than or equal to 'number' that is divisible by 'factor'."""
    return math.ceil(number / factor) * factor

def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer less than or equal to 'number' that is divisible by 'factor'."""
    return math.floor(number / factor) * factor

def smart_resize(
    height: int, width: int, factor: int = IMAGE_FACTOR, min_pixels: int = MIN_PIXELS, max_pixels: int = MAX_PIXELS
) -> tuple[int, int]:
    """
    Rescales the image so that the following conditions are met:

    1. Both dimensions (height and width) are divisible by 'factor'.

    2. The total number of pixels is within the range ['min_pixels', 'max_pixels'].

    3. The aspect ratio of the image is maintained as closely as possible.
    """
    if max(height, width) / min(height, width) > MAX_RATIO:
        raise ValueError(
            f"absolute aspect ratio must be smaller than {MAX_RATIO}, got {max(height, width) / min(height, width)}"
        )
    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar

# Open the image
img = Image.open('./data/coordinate_process_image.png')
width, height = img.size
print(f'Original resolution: {width}, {height}')
# Calculate the new dimensions
new_height, new_width = smart_resize(height, width)
new_coordinate = (int(model_output_width/new_width * width), int(model_output_height/new_height * height))
print(f'Resized resolution: {new_width}, {new_height}')
print(new_coordinate)

# Display the image
plt.imshow(img)
plt.scatter([new_coordinate[0]], [new_coordinate[1]], c='red', s=50)  # Mark the point with a red dot
plt.title('Visualize Coordinate')
plt.axis('off')  # Set to 'off' to hide the axes
plt.savefig('./data/coordinate_process_image_som.png', dpi=350)
```

2. The output SOM image should look like this:

![Output SOM Image](./data/coordinate_process_image_som.png)


================================================
FILE: README_deploy.md
================================================
# UI-TARS 1.5 HuggingFace Endpoint Deployment Guide

## 1. HuggingFace Inference Endpoints Cloud Deployment

We use HuggingFace's Inference Endpoints platform to quickly deploy a cloud-based model.

### Deployment Steps

1. **Access the Deployment Interface**  
    - Click [Deploy from Hugging Face](https://endpoints.huggingface.co/catalog)  
    ![Deploy from Hugging Face](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_1_formal.png?download=true)  
    - Select the model `UI-TARS 1.5 7B` and click **Import Model**  
    ![Import Model](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_2_formal.png?download=true)  

2. **Configure Settings**
    - **Hardware Configuration**  
        - In the `Hardware Configuration` section, choose a GPU instance. Here are the recommendations for different model sizes:  
            - For the 7B model, select `GPU L40S 1GPU 48G` (Recommended: Nvidia L4 / Nvidia A100).  
        ![Hardware Configuration](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_3_formal.png?download=true)

    - **Container Configuration**  
        - Set the following parameters:  
            - `Max Input Length (per Query)`: 65536
            - `Max Batch Prefill Tokens`: 65536
            - `Max Number of Tokens (per Query)`: 65537
        ![Container Configuration](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_4_formal.png?download=true)

    - **Environment Variables**  
        - Add the following environment variables:  
            - `CUDA_GRAPHS=0` to avoid deployment failures. For details, refer to [issue 2875](https://github.com/huggingface/text-generation-inference/issues/2875).  
            - `PAYLOAD_LIMIT=8000000` to prevent request failures due to large images. For details, refer to [issue 1802](https://github.com/huggingface/text-generation-inference/issues/1802).  
        ![Environment Variables](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_5_formal.png?download=true)

    - **Create Endpoint**  
        - Click **Create** to set up the endpoint.  
        ![Create Endpoint](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_6_formal.png?download=true)

    - **Enter Setup**  
        - Once the deployment is finished, you will see the confirmation page and need to enter the settings page.  
        ![Complete](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_7_formal.png?download=true)
    
    - **Update URI** -
        - Go to the Container page, set the Container URI to ghcr.io/huggingface/text-generation-inference:3.2.1, and **click Update Endpoint to apply the changes**. 
        ![Complete](https://huggingface.co/datasets/JjjFangg/Demo_video/resolve/main/deployment_8_formal.png?download=true)


## 2. API Usage Example

### **Python Test Code**  
```python
# pip install openai
import io
import re
import json
import base64
from PIL import Image
from io import BytesIO
from openai import OpenAI

def add_box_token(input_string):
    # Step 1: Split the string into individual actions
    if "Action: " in input_string and "start_box=" in input_string:
        suffix = input_string.split("Action: ")[0] + "Action: "
        actions = input_string.split("Action: ")[1:]
        processed_actions = []
        for action in actions:
            action = action.strip()
            # Step 2: Extract coordinates (start_box or end_box) using regex
            coordinates = re.findall(r"(start_box|end_box)='\((\d+),\s*(\d+)\)'", action)
            
            updated_action = action  # Start with the original action
            for coord_type, x, y in coordinates:
                # Convert x and y to integers
                updated_action = updated_action.replace(f"{coord_type}='({x},{y})'", f"{coord_type}='<|box_start|>({x},{y})<|box_end|>'")
            processed_actions.append(updated_action)
        
        # Step 5: Reconstruct the final string
        final_string = suffix + "\n\n".join(processed_actions)
    else:
        final_string = input_string
    return final_string

client = OpenAI(
    base_url="https:xxx",
    api_key="hf_xxx"
)

result = {}
messages = json.load(open("./data/test_messages.json"))
for message in messages:
    if message["role"] == "assistant":
        message["content"] = add_box_token(message["content"])
        print(message["content"])

chat_completion = client.chat.completions.create(
    model="tgi",
    messages=messages,
    top_p=None,
    temperature=0.0,
    max_tokens=400,
    stream=True,
    seed=None,
    stop=None,
    frequency_penalty=None,
    presence_penalty=None
)

response = ""
for message in chat_completion:
    response += message.choices[0].delta.content
print(response)
```

### **Expected Output** ###
```python
Thought: 我看到Preferences窗口已经打开了,但这里显示的都是系统资源相关的设置。要设置图片的颜色模式,我得先看看左侧的选项列表。嗯,"Color Management"这个选项看起来很有希望,应该就是处理颜色管理的地方。让我点击它看看里面有什么选项。
Action: click(start_box='(177,549)')
```


================================================
FILE: README_v1.md
================================================
<!-- <p align="center">
  <img alt="UI-TARS"  width="260" src="figures/icon.png">
</p>

# UI-TARS: Pioneering Automated GUI Interaction with Native Agents -->
![Local Image](figures/writer.png)
<p align="center">
        🤗 <a href="https://huggingface.co/bytedance-research/UI-TARS-7B-DPO">Hugging Face Models</a>&nbsp&nbsp | &nbsp&nbsp🤖 <a href="https://www.modelscope.cn/models/bytedance-research/UI-TARS-7B-DPO">ModelScope</a>&nbsp&nbsp | &nbsp&nbsp 📑 <a href="https://arxiv.org/abs/2501.12326">Paper</a> &nbsp&nbsp  |&nbsp&nbsp</a>
🖥️ <a href="https://github.com/bytedance/UI-TARS-desktop">UI-TARS-desktop</a>&nbsp&nbsp  <br>🏄 <a href="https://github.com/web-infra-dev/Midscene">Midscene (Browser Automation) </a>&nbsp&nbsp | &nbsp&nbsp🤗 <a href="https://huggingface.co/spaces/bytedance-research/UI-TARS">Space</a>&nbsp&nbsp | &nbsp&nbsp🫨 <a href="https://discord.gg/pTXwYVjfcs">Discord</a>&nbsp&nbsp
</p>

We also offer a **UI-TARS-desktop** version, which can operate on your **local personal device**. To use it, please visit [https://github.com/bytedance/UI-TARS-desktop](https://github.com/bytedance/UI-TARS-desktop). To use UI-TARS in web automation, you may refer to the open-source project [Midscene.js](https://github.com/web-infra-dev/Midscene).
### ⚠️ Important Announcement: GGUF Model Performance

The **GGUF model** has undergone quantization, but unfortunately, its performance cannot be guaranteed. As a result, we have decided to **downgrade** it. 

💡 **Alternative Solution**:  
You can use **[Cloud Deployment](#cloud-deployment)** or **[Local Deployment [vLLM]](#local-deployment-vllm)**(If you have enough GPU resources) instead. 

We appreciate your understanding and patience as we work to ensure the best possible experience.

## Updates
- ✨ We updated the OSWorld inference scripts from the original official [OSWorld repository](https://github.com/xlang-ai/OSWorld/blob/main/run_uitars.py). Now, you can use the OSWorld official inference scripts for deployment and we've provided [trajectory examples](https://drive.google.com/file/d/1N9dYzAB9xSiHwE9VSdEi9xSpB9eXfVZT/view?usp=sharing) for OSWorld to help you get started.
- 🚀 01.25: We updated the **[Cloud Deployment](#cloud-deployment)** section in the 中文版: [GUI模型部署教程](https://bytedance.sg.larkoffice.com/docx/TCcudYwyIox5vyxiSDLlgIsTgWf#U94rdCxzBoJMLex38NPlHL21gNb) with new information related to the ModelScope platform. You can now use the ModelScope platform for deployment.



## Overview
UI-TARS is a next-generation native GUI agent model designed to interact seamlessly with graphical user interfaces (GUIs) using human-like perception, reasoning, and action capabilities. Unlike traditional modular frameworks, UI-TARS integrates all key components—perception, reasoning, grounding, and memory—within a single vision-language model (VLM), enabling end-to-end task automation without predefined workflows or manual rules.
![Local Image](figures/UI-TARS-vs-Previous-SOTA.png)
![Local Image](figures/UI-TARS.png)


## Core Features
### Perception
- **Comprehensive GUI Understanding**: Processes multimodal inputs (text, images, interactions) to build a coherent understanding of interfaces.
- **Real-Time Interaction**: Continuously monitors dynamic GUIs and responds accurately to changes in real-time.

### Action
- **Unified Action Space**: Standardized action definitions across platforms (desktop, mobile, and web).
- **Platform-Specific Actions**: Supports additional actions like hotkeys, long press, and platform-specific gestures.

### Reasoning
- **System 1 & System 2 Reasoning**: Combines fast, intuitive responses with deliberate, high-level planning for complex tasks.
- **Task Decomposition & Reflection**: Supports multi-step planning, reflection, and error correction for robust task execution.

### Memory
- **Short-Term Memory**: Captures task-specific context for situational awareness.
- **Long-Term Memory**: Retains historical interactions and knowledge for improved decision-making.

## Capabilities
- **Cross-Platform Interaction**: Supports desktop, mobile, and web environments with a unified action framework.
- **Multi-Step Task Execution**: Trained to handle complex tasks through multi-step trajectories and reasoning.
- **Learning from Synthetic and Real Data**: Combines large-scale annotated and synthetic datasets for improved generalization and robustness.

## Performance
**Perception Capabilty Evaluation**
| Model                     | VisualWebBench | WebSRC  | SQAshort |
|---------------------------|---------------|---------|----------|
| Qwen2-VL-7B              | 73.3          | 81.8    | 84.9     |
| Qwen-VL-Max              | 74.1          | 91.1    | 78.6     |
| Gemini-1.5-Pro           | 75.4          | 88.9    | 82.2     |
| UIX-Qwen2-7B             | 75.9          | 82.9    | 78.8     |
| Claude-3.5-Sonnet        | 78.2          | 90.4    | 83.1     |
| GPT-4o                   | 78.5          | 87.7    | 82.3     |
| **UI-TARS-2B**          | 72.9          | 89.2    | 86.4     |
| **UI-TARS-7B**          | 79.7          | **93.6** | 87.7     |
| **UI-TARS-72B**         | **82.8**      | 89.3    | **88.6** |

**Grounding Capability Evaluation**
- **ScreenSpot Pro**

| Agent Model              | Dev-Text | Dev-Icon | Dev-Avg | Creative-Text | Creative-Icon | Creative-Avg | CAD-Text | CAD-Icon | CAD-Avg | Scientific-Text | Scientific-Icon | Scientific-Avg | Office-Text | Office-Icon | Office-Avg | OS-Text | OS-Icon | OS-Avg | Avg-Text | Avg-Icon | Avg |
|--------------------------|----------|----------|----------|--------------|--------------|--------------|---------|---------|---------|---------------|---------------|---------------|------------|------------|------------|--------|--------|--------|---------|---------|------|
| QwenVL-7B               | 0.0      | 0.0      | 0.0      | 0.0          | 0.0          | 0.0          | 0.0     | 0.0     | 0.0     | 0.7           | 0.0           | 0.4           | 0.0        | 0.0        | 0.0        | 0.0    | 0.0    | 0.0    | 0.1     | 0.0     | **0.1**  |
| GPT-4o                  | 1.3      | 0.0      | 0.7      | 1.0          | 0.0          | 0.6          | 2.0     | 0.0     | 1.5     | 2.1           | 0.0           | 1.2           | 1.1        | 0.0        | 0.9        | 0.0    | 0.0    | 0.0    | 1.3     | 0.0     | **0.8**  |
| SeeClick                | 0.6      | 0.0      | 0.3      | 1.0          | 0.0          | 0.6          | 2.5     | 0.0     | 1.9     | 3.5           | 0.0           | 2.0           | 1.1        | 0.0        | 0.9        | 2.8    | 0.0    | 1.5    | 1.8     | 0.0     | **1.1**  |
| Qwen2-VL-7B             | 2.6      | 0.0      | 1.3      | 1.5          | 0.0          | 0.9          | 0.5     | 0.0     | 0.4     | 6.3           | 0.0           | 3.5           | 3.4        | 1.9        | 3.0        | 0.9    | 0.0    | 0.5    | 2.5     | 0.2     | **1.6**  |
| OS-Atlas-4B            | 7.1      | 0.0      | 3.7      | 3.0          | 1.4          | 2.3          | 2.0     | 0.0     | 1.5     | 9.0           | 5.5           | 7.5           | 5.1        | 3.8        | 4.8        | 5.6    | 0.0    | 3.1    | 5.0     | 1.7     | **3.7**  |
| ShowUI-2B              | 16.9     | 1.4      | 9.4      | 9.1          | 0.0          | 5.3          | 2.5     | 0.0     | 1.9     | 13.2          | 7.3           | 10.6          | 15.3       | 7.5        | 13.5       | 10.3   | 2.2    | 6.6    | 10.8    | 2.6     | **7.7**  |
| CogAgent-18B           | 14.9     | 0.7      | 8.0      | 9.6          | 0.0          | 5.6          | 7.1     | 3.1     | 6.1     | 22.2          | 1.8           | 13.4          | 13.0       | 0.0        | 10.0       | 5.6    | 0.0    | 3.1    | 12.0    | 0.8     | **7.7**  |
| Aria-UI                | 16.2     | 0.0      | 8.4      | 23.7         | 2.1          | 14.7         | 7.6     | 1.6     | 6.1     | 27.1          | 6.4           | 18.1          | 20.3       | 1.9        | 16.1       | 4.7    | 0.0    | 2.6    | 17.1    | 2.0     | **11.3**  |
| UGround-7B             | 26.6     | 2.1      | 14.7     | 27.3         | 2.8          | 17.0         | 14.2    | 1.6     | 11.1    | 31.9          | 2.7           | 19.3          | 31.6       | 11.3       | 27.0       | 17.8   | 0.0    | 9.7    | 25.0    | 2.8     | **16.5**  |
| Claude Computer Use      | 22.0  | 3.9   | 12.6  | 25.9  | 3.4   | 16.8  | 14.5  | 3.7   | 11.9  | 33.9  | 15.8  | 25.8  | 30.1  | 16.3  | 26.9  | 11.0  | 4.5   | 8.1   | 23.4  | 7.1  | **17.1**  |
| OS-Atlas-7B              | 33.1  | 1.4   | 17.7  | 28.8  | 2.8   | 17.9  | 12.2  | 4.7   | 10.3  | 37.5  | 7.3   | 24.4  | 33.9  | 5.7   | 27.4  | 27.1  | 4.5   | 16.8  | 28.1  | 4.0  | **18.9**  |
| UGround-V1-7B            | -     | -     | 35.5  | -     | -     | 27.8  | -     | -     | 13.5  | -     | -     | 38.8  | -     | -     | 48.8  | -     | -     | 26.1  | -     | -    | **31.1**  |
| **UI-TARS-2B**        | 47.4     | 4.1      | 26.4     | 42.9         | 6.3          | 27.6         | 17.8    | 4.7     | 14.6    | 56.9          | 17.3          | 39.8          | 50.3       | 17.0       | 42.6       | 21.5   | 5.6    | 14.3   | 39.6    | 8.4     | **27.7**  |
| **UI-TARS-7B**        | 58.4     | 12.4     | 36.1     | 50.0         | 9.1          | 32.8         | **20.8**| 9.4     | **18.0**| 63.9          | **31.8**      | **50.0**      | **63.3**   | 20.8       | 53.5       | 30.8   | **16.9**| 24.5   | 47.8    | 16.2    | **35.7**  |
| **UI-TARS-72B**       | **63.0** | **17.3** | **40.8** | **57.1**     | **15.4**     | **39.6**     | 18.8    | **12.5**| 17.2    | **64.6**      | 20.9          | 45.7          | **63.3**   | **26.4**   | **54.8**   | **42.1**| 15.7    | **30.1**| **50.9**| **17.5**| **38.1**  |


- **ScreenSpot**

| Method |  Mobile-Text | Mobile-Icon/Widget | Desktop-Text | Desktop-Icon/Widget | Web-Text | Web-Icon/Widget | Avg |
|--------|-------------|-------------|-------------|-------------|-------------|---------|---------|
| **Agent Framework**  | | | | | | | |
| GPT-4 (SeeClick) |  76.6 | 55.5 | 68.0 | 28.6 | 40.9 | 23.3 | **48.8** |
| GPT-4 (OmniParser)  | 93.9 | 57.0 | 91.3 | 63.6 | 81.3 | 51.0 | **73.0** |
| GPT-4 (UGround-7B)  | 90.1 | 70.3 | 87.1 | 55.7 | 85.7 | 64.6 | **75.6** |
| GPT-4o (SeeClick)  | 81.0 | 59.8 | 69.6 | 33.6 | 43.9 | 26.2 | **52.3** |
| GPT-4o (UGround-7B)  | 93.4 | 76.9 | 92.8 | 67.9 | 88.7 | 68.9 | **81.4** |
| **Agent Model**   | | | | | | | |
| GPT-4  | 22.6 | 24.5 | 20.2 | 11.8 | 9.2 | 8.8 | **16.2** |
| GPT-4o  | 20.2 | 24.9 | 21.1 | 23.6 | 12.2 | 7.8 | **18.3** |
| CogAgent  | 67.0 | 24.0 | 74.2 | 20.0 | 70.4 | 28.6 | **47.4** |
| SeeClick  | 78.0 | 52.0 | 72.2 | 30.0 | 55.7 | 32.5 | **53.4** |
| Qwen2-VL  | 75.5 | 60.7 | 76.3 | 54.3 | 35.2 | 25.7 | **55.3** |
| UGround-7B  | 82.8 | 60.3 | 82.5 | 63.6 | 80.4 | 70.4 | **73.3** |
| Aguvis-G-7B  | 88.3 | 78.2 | 88.1 | 70.7 | 85.7 | 74.8 | **81.8** |
| OS-Atlas-7B | 93.0 | 72.9 | 91.8 | 62.9 | 90.9 | 74.3 | **82.5** |
| Claude Computer Use  | - | - | - | - | - | - | **83.0** |
| Gemini 2.0 (Project Mariner)  | - | - | - | - | - | - | **84.0** |
| Aguvis-7B  | **95.6** | 77.7 | 93.8 | 67.1 | 88.3 | 75.2 | **84.4** |
| Aguvis-72B  | 94.5 | **85.2** | 95.4 | 77.9 | **91.3** | **85.9** | **89.2** |
| **Our Model**   | | | | | | | |
| **UI-TARS-2B**  | 93.0 | 75.5 | 90.7 | 68.6 | 84.3 | 74.8 | **82.3** |
| **UI-TARS-7B**  | 94.5 | **85.2** | **95.9** | 85.7 | 90.0 | 83.5 | **89.5** |
| **UI-TARS-72B**  | 94.9 | 82.5 | 89.7 | **88.6** | 88.7 | 85.0 | **88.4** |


- **ScreenSpot v2**

| Method |  Mobile-Text | Mobile-Icon/Widget | Desktop-Text | Desktop-Icon/Widget | Web-Text | Web-Icon/Widget | Avg |
|--------|-------------|-------------|-------------|-------------|-------------|---------|---------|
| **Agent Framework**  | | | | | | | |
| GPT-4o (SeeClick)  | 85.2 | 58.8 | 79.9 | 37.1 | 72.7 | 30.1 | **63.6** |
| GPT-4o (OS-Atlas-4B)  | 95.5 | 75.8 | 79.4 | 49.3 | 90.2 | 66.5 | **79.1** |
| GPT-4o (OS-Atlas-7B)  | 96.2 | 83.4 | 89.7 | 69.3 | **94.0** | 79.8 | **87.1** |
| **Agent Model**  | | | | | | | |
| SeeClick  | 78.4 | 50.7 | 70.1 | 29.3 | 55.2 | 32.5 | **55.1** |
| OS-Atlas-4B  | 87.2 | 59.7 | 72.7 | 46.4 | 85.9 | 63.1 | **71.9** |
| OS-Atlas-7B  | 95.2 | 75.8 | 90.7 | 63.6 | 90.6 | 77.3 | **84.1** |
| **Our Model**  | | | | | | | |
| **UI-TARS-2B**  | 95.2 | 79.1 | 90.7 | 68.6 | 87.2 | 78.3 | **84.7** |
| **UI-TARS-7B** | **96.9** | **89.1** | **95.4** | 85.0 | 93.6 | 85.2 | **91.6** |
| **UI-TARS-72B**  | 94.8 | 86.3 | 91.2 | **87.9** | 91.5 | **87.7** | **90.3** |


**Offline Agent Capability Evaluation**
- **Multimodal Mind2Web**

| Method |  Cross-Task Ele.Acc | Cross-Task Op.F1 | Cross-Task Step SR | Cross-Website Ele.Acc | Cross-Website Op.F1 | Cross-Website Step SR | Cross-Domain Ele.Acc | Cross-Domain Op.F1 | Cross-Domain Step SR |
|--------|----------------------|-------------------|--------------------|----------------------|--------------------|-------------------|--------------------|-------------------|-------------------|
| **Agent Framework**  | | | | | | | | | |
| GPT-4o (SeeClick)  | 32.1 | - | - | 33.1 | - | - | 33.5 | - | - |
| GPT-4o (UGround)  | 47.7 | - | - | 46.0 | - | - | 46.6 | - | - |
| GPT-4o (Aria-UI)  | 57.6 | - | - | 57.7 | - | - | 61.4 | - | - |
| GPT-4V (OmniParser)  | 42.4 | 87.6 | 39.4 | 41.0 | 84.8 | 36.5 | 45.5 | 85.7 | 42.0 |
| **Agent Model** |  | | | | | | | | |
| GPT-4o  | 5.7 | 77.2 | 4.3 | 5.7 | 79.0 | 3.9 | 5.5 | 86.4 | 4.5 |
| GPT-4 (SOM)  | 29.6 | - | 20.3 | 20.1 | - | 13.9 | 27.0 | - | 23.7 |
| GPT-3.5 (Text-only)  | 19.4 | 59.2 | 16.8 | 14.9 | 56.5 | 14.1 | 25.2 | 57.9 | 24.1 |
| GPT-4 (Text-only)  | 40.8 | 63.1 | 32.3 | 30.2 | 61.0 | 27.0 | 35.4 | 61.9 | 29.7 |
| Claude  | 62.7 | 84.7 | 53.5 | 59.5 | 79.6 | 47.7 | 64.5 | 85.4 | 56.4 |
| Aguvis-7B  | 64.2 | 89.8 | 60.4 | 60.7 | 88.1 | 54.6 | 60.4 | 89.2 | 56.6 |
| CogAgent  | - | - | 62.3 | - | - | 54.0 | - | - | 59.4 |
| Aguvis-72B  | 69.5 | 90.8 | 64.0 | 62.6 | 88.6 | 56.5 | 63.5 | 88.5 | 58.2 |
| **Our Model**  | | | | | | | | | |
| **UI-TARS-2B**  | 62.3 | 90.0 | 56.3 | 58.5 | 87.2 | 50.8 | 58.8 | 89.6 | 52.3 |
| **UI-TARS-7B**  | 73.1 | 92.2 | 67.1 | 68.2 | 90.9 | 61.7 | 66.6 | 90.9 | 60.5 |
| **UI-TARS-72B**  | **74.7** | **92.5** | **68.6** | **72.4** | **91.2** | **63.5** | **68.9** | **91.8** | **62.1** |


- **Android Control and GUI Odyssey**

| Agent Models        | AndroidControl-Low Type | AndroidControl-Low Grounding | AndroidControl-Low SR | AndroidControl-High Type | AndroidControl-High Grounding | AndroidControl-High SR | GUIOdyssey Type | GUIOdyssey Grounding | GUIOdyssey SR |
|---------------------|----------------------|----------------------|----------------|----------------------|----------------------|----------------|----------------|----------------|----------------|
| Claude             | 74.3                 | 0.0                  | 19.4           | 63.7                 | 0.0                  | 12.5           | 60.9           | 0.0            | 3.1            |
| GPT-4o             | 74.3                 | 0.0                  | 19.4           | 66.3                 | 0.0                  | 20.8           | 34.3           | 0.0            | 3.3            |
| SeeClick           | 93.0                 | 73.4                 | 75.0           | 82.9                 | 62.9                 | 59.1           | 71.0           | 52.4           | 53.9           |
| InternVL-2-4B      | 90.9                 | 84.1                 | 80.1           | 84.1                 | 72.7                 | 66.7           | 82.1           | 55.5           | 51.5           |
| Qwen2-VL-7B       | 91.9                 | 86.5                 | 82.6           | 83.8                 | 77.7                 | 69.7           | 83.5           | 65.9           | 60.2           |
| Aria-UI           | --                   | 87.7                 | 67.3           | --                   | 43.2                 | 10.2           | --             | 86.8           | 36.5           |
| OS-Atlas-4B       | 91.9                 | 83.8                 | 80.6           | 84.7                 | 73.8                 | 67.5           | 83.5           | 61.4           | 56.4           |
| OS-Atlas-7B       | 93.6                 | 88.0                 | 85.2           | 85.2                 | 78.5                 | 71.2           | 84.5           | 67.8           | 62.0           |
| Aguvis-7B         | --                   | --                   | 80.5           | --                   | --                   | 61.5           | --             | --             | --             |
| Aguvis-72B        | --                   | --                   | 84.4           | --                   | --                   | 66.4           | --             | --             | --             |
| **UI-TARS-2B**   | **98.1**             | 87.3                 | 89.3           | 81.2                 | 78.4                 | 68.9           | 93.9           | 86.8           | 83.4           |
| **UI-TARS-7B**   | 98.0                 | 89.3                 | 90.8           | 83.7                 | 80.5                 | 72.5           | 94.6           | 90.1           | 87.0           |
| **UI-TARS-72B**  | **98.1**             | **89.9**             | **91.3**       | **85.2**             | **81.5**             | **74.7**       | **95.4**       | **91.4**       | **88.6**       |

**Online Agent Capability Evaluation**

| Method |  OSWorld (Online) | AndroidWorld (Online) |
|--------|-------------------|------------------|
| **Agent Framework**  | | |
| GPT-4o (UGround)  | - | 32.8 |
| GPT-4o (Aria-UI)  | 15.2 | 44.8 |
| GPT-4o (Aguvis-7B)  | 14.8 | 37.1 |
| GPT-4o (Aguvis-72B)  | 17.0 | - |
| GPT-4o (OS-Atlas-7B)  | 14.6 | - |
| **Agent Model**  | | |
| GPT-4o  | 5.0 | 34.5 (SoM) |
| Gemini-Pro-1.5  | 5.4 | 22.8 (SoM) |
| Aguvis-72B  | 10.3 | 26.1 |
| Claude Computer-Use  | 14.9 (15 steps) | 27.9 |
| Claude Computer-Use  | 22.0 (50 steps) | - |
| **Our Model**  | | |
| **UI-TARS-7B-SFT**  | 17.7 (15 steps) | 33.0 |
| **UI-TARS-7B-DPO**  | 18.7 (15 steps) | - |
| **UI-TARS-72B-SFT**  | 18.8 (15 steps) | **46.6** |
| **UI-TARS-72B-DPO**  | **22.7** (15 steps) | - |
| **UI-TARS-72B-DPO**  | **24.6** (50 steps) | - |

## Deployment

### Cloud Deployment
We recommend using HuggingFace Inference Endpoints for fast deployment.
We provide two docs for reference:

English version: [GUI Model Deployment Guide](https://juniper-switch-f10.notion.site/GUI-Model-Deployment-Guide-17b5350241e280058e98cea60317de71)

中文版: [GUI模型部署教程](https://bytedance.sg.larkoffice.com/docx/TCcudYwyIox5vyxiSDLlgIsTgWf#U94rdCxzBoJMLex38NPlHL21gNb)

### Local Deployment [Transformers]
We follow the same way as Qwen2-VL. Check this [tutorial](https://github.com/QwenLM/Qwen2-VL?tab=readme-ov-file#using---transformers-to-chat) for more details.

### Local Deployment [vLLM]
We recommend using vLLM for fast deployment and inference. You need to use `vllm>=0.6.1`.
```bash
pip install -U transformers
VLLM_VERSION=0.6.6
CUDA_VERSION=cu124
pip install vllm==${VLLM_VERSION} --extra-index-url https://download.pytorch.org/whl/${CUDA_VERSION}

```
#### Download the Model
We provide three model sizes on Hugging Face: **2B**, **7B**, and **72B**. To achieve the best performance, we recommend using the **7B-DPO** or **72B-DPO** model (depends on your GPU configuration):

- [2B-SFT](https://huggingface.co/bytedance-research/UI-TARS-2B-SFT)
- [7B-SFT](https://huggingface.co/bytedance-research/UI-TARS-7B-SFT)
- [7B-DPO](https://huggingface.co/bytedance-research/UI-TARS-7B-DPO)
- [72B-SFT](https://huggingface.co/bytedance-research/UI-TARS-72B-SFT)
- [72B-DPO](https://huggingface.co/bytedance-research/UI-TARS-72B-DPO)


#### Start an OpenAI API Service
Run the command below to start an OpenAI-compatible API service. It is recommended to set the tensor parallel size `-tp=1` for 7B models and `-tp=4` for 72B models.

```bash
python -m vllm.entrypoints.openai.api_server --served-model-name ui-tars \
    --model <path to your model> --limit-mm-per-prompt image=5 -tp <tp>
```

Then you can use the chat API as below with the gui prompt (choose from mobile or computer) and base64-encoded local images (see [OpenAI API protocol document](https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images) for more details), you can also use it in [UI-TARS-desktop](https://github.com/bytedance/UI-TARS-desktop):
```python
import base64
from openai import OpenAI


instruction = "search for today's weather"
screenshot_path = "screenshot.png"
client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="empty",
)

## Below is the prompt for mobile
prompt = r"""You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. 

## Output Format
```\nThought: ...
Action: ...\n```

## Action Space

click(start_box='<|box_start|>(x1,y1)<|box_end|>')
left_double(start_box='<|box_start|>(x1,y1)<|box_end|>')
right_single(start_box='<|box_start|>(x1,y1)<|box_end|>')
drag(start_box='<|box_start|>(x1,y1)<|box_end|>', end_box='<|box_start|>(x3,y3)<|box_end|>')
hotkey(key='')
type(content='') #If you want to submit your input, use \"\
\" at the end of `content`.
scroll(start_box='<|box_start|>(x1,y1)<|box_end|>', direction='down or up or right or left')
wait() #Sleep for 5s and take a screenshot to check for any changes.
finished()
call_user() # Submit the task and call the user when the task is unsolvable, or when you need the user's help.


## Note
- Use Chinese in `Thought` part.
- Summarize your next action (with its target element) in one sentence in `Thought` part.

## User Instruction
"""

with open(screenshot_path, "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
response = client.chat.completions.create(
    model="ui-tars",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": prompt + instruction},
                {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{encoded_string}"}},
            ],
        },
    ],
    frequency_penalty=1,
    max_tokens=128,
)
print(response.choices[0].message.content)
```

For single step grounding task or inference on grounding dataset such as Seeclick, kindly refer to the following script:
```python
import base64
from openai import OpenAI


instruction = "search for today's weather"
screenshot_path = "screenshot.png"
client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="empty",
)

## Below is the prompt for mobile
prompt = r"""Output only the coordinate of one point in your response. What element matches the following task: """

with open(screenshot_path, "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
response = client.chat.completions.create(
    model="ui-tars",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{encoded_string}"}},
                {"type": "text", "text": prompt + instruction}
            ],
        },
    ],
    frequency_penalty=1,
    max_tokens=128,
)
print(response.choices[0].message.content)
```

### Prompt Templates
We provide two prompt templates currently for stable running and performance, one for mobile scene and one for personal computer scene.
- Prompt template for mobile:
```python
## Below is the prompt for mobile
prompt = r"""You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. 

## Output Format
```\nThought: ...
Action: ...\n```

## Action Space
click(start_box='<|box_start|>(x1,y1)<|box_end|>')
long_press(start_box='<|box_start|>(x1,y1)<|box_end|>', time='')
type(content='')
scroll(start_box='<|box_start|>(x1,y1)<|box_end|>', end_box='<|box_start|>(x3,y3)<|box_end|>')
press_home()
press_back()
finished(content='') # Submit the task regardless of whether it succeeds or fails.

## Note
- Use English in `Thought` part.

- Write a small plan and finally summarize your next action (with its target element) in one sentence in `Thought` part.

## User Instruction
"""
```

- Prompt template for computer:
```python
## Below is the prompt for computer
prompt = r"""You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. 

## Output Format
```\nThought: ...
Action: ...\n```

## Action Space

click(start_box='<|box_start|>(x1,y1)<|box_end|>')
left_double(start_box='<|box_start|>(x1,y1)<|box_end|>')
right_single(start_box='<|box_start|>(x1,y1)<|box_end|>')
drag(start_box='<|box_start|>(x1,y1)<|box_end|>', end_box='<|box_start|>(x3,y3)<|box_end|>')
hotkey(key='')
type(content='') #If you want to submit your input, use \"\
\" at the end of `content`.
scroll(start_box='<|box_start|>(x1,y1)<|box_end|>', direction='down or up or right or left')
wait() #Sleep for 5s and take a screenshot to check for any changes.
finished()
call_user() # Submit the task and call the user when the task is unsolvable, or when you need the user's help.


## Note
- Use Chinese in `Thought` part.
- Summarize your next action (with its target element) in one sentence in `Thought` part.

## User Instruction
"""
```

### Local Deployment [Ollama]
<!-- Ollama can deploy the model via gguf format. Bugs exist for safetensors. -->Ollama will be coming soon. Please be patient and wait~ 😊
<!-- #### Get the model in GGUF format
We provide 2B and 7B model in [GGUF](https://huggingface.co/docs/hub/en/gguf) format:

2B: https://huggingface.co/bytedance-research/UI-TARS-2B-gguf

7B: https://huggingface.co/bytedance-research/UI-TARS-7B-gguf

Users can convert the model into GGUF format by using the script from [llama.cpp](https://github.com/ggerganov/llama.cpp/blob/master/convert_hf_to_gguf.py):

```bash
python3 convert_hf_to_gguf.py <path to your model>
```

The GGUF file will be generated under the path provided.

#### Deploy GGUF model
We deploy the model by following Ollama [tutorial](https://github.com/ollama/ollama?tab=readme-ov-file#customize-a-model).

```bash
# Create Modelfile, Windows users can just create a file named Modelfile
echo "FROM ./path/to/model.gguf" > Modelfile

# Create model in Ollama
ollama create ui-tars -f Modelfile

# Run the model
ollama run ui-tars

```

Test script is same as vLLM except two changes:

```python
...
client = OpenAI(
    base_url="http://127.0.0.1:11434/v1/",
    ...
)
...
response = client.chat.completions.create(
    model="ui-tars" # the name we create via Ollama cli
    ...
)

``` -->

### Explanation of Inference Results

#### Coordinate Mapping
The model generates a 2D coordinate output that represents relative positions. To convert these values to image-relative coordinates, divide each component by 1000 to obtain values in the range [0,1]. The absolute coordinates required by the Action can be calculated by: 
- X absolute = X relative × image width
- Y absolute = Y relative × image height

For example, given a screen size: 1920 × 1080, and the model generates a coordinate output of (235, 512). The X absolute is `round(1920*235/1000)=451`. The Y absolute is `round(1080*512/1000)=553`. The absolute coordinate is (451, 553)

## Use in desktop and web automation

To experience UI-TARS agent in desktop, you may refer to [UI-TARS-desktop](https://github.com/bytedance/UI-TARS-desktop). We recommend using the **7B/72B DPO model** on desktop.

[Midscene.js](https://github.com/web-infra-dev/Midscene) is an open-source web automation SDK that has supported UI-TARS model. Developers can use javascript and natural language to control the browser. See [this guide](https://midscenejs.com/choose-a-model) for more details about setting up the model.

## License

UI-TARS is licensed under the Apache License 2.0.

## Acknowledgements
This project builds upon and extends the capabilities of Qwen2-VL, a powerful vision-language model, which serves as the foundational architecture for UI-TARS. We would like to acknowledge the contributions of the developers and researchers behind Qwen2-VL for their groundbreaking work in the field of multimodal AI and for providing a robust base for further advancements.

Additionally, we thank the broader open-source community for their datasets, tools, and insights that have facilitated the development of UI-TARS. These collaborative efforts continue to push the boundaries of what GUI automation and AI-driven agents can achieve.

## Citation
If you find our paper and code useful in your research, please consider giving a star :star: and citation :pencil:

```BibTeX
@article{qin2025ui,
  title={UI-TARS: Pioneering Automated GUI Interaction with Native Agents},
  author={Qin, Yujia and Ye, Yining and Fang, Junjie and Wang, Haoming and Liang, Shihao and Tian, Shizuo and Zhang, Junda and Li, Jiahao and Li, Yunxin and Huang, Shijue and others},
  journal={arXiv preprint arXiv:2501.12326},
  year={2025}
}
```


================================================
FILE: codes/.gitignore
================================================
# Python-generated files
__pycache__/
.pytest_cache/
*.py[oc]
build/
dist/
wheels/
*.egg-info

# Virtual environments
.venv
.DS_Store


================================================
FILE: codes/.python-version
================================================
3.10


================================================
FILE: codes/README.md
================================================
# ui-tars

A python package for parsing VLM-generated GUI action instructions into executable pyautogui codes.

---

## Introduction

`ui-tars` is a Python package for parsing VLM-generated GUI action instructions, automatically generating pyautogui scripts, and supporting coordinate conversion and smart image resizing.

- Supports multiple VLM output formats (e.g., Qwen-VL, Seed-VL)
- Automatically handles coordinate scaling and format conversion
- One-click generation of pyautogui automation scripts

---

## Quick Start

### Installation

```bash
pip install ui-tars
# or
uv pip install ui-tars
```

### Parse output into structured actions

```python
from ui_tars.action_parser import parse_action_to_structure_output, parsing_response_to_pyautogui_code

response = "Thought: Click the button\nAction: click(point='<point>200 300</point>')"
original_image_width, original_image_height = 1920, 1080
parsed_dict = parse_action_to_structure_output(
    response,
    factor=1000,
    origin_resized_height=original_image_height,
    origin_resized_width=original_image_width,
    model_type="doubao"
)
print(parsed_dict)
parsed_pyautogui_code = parsing_response_to_pyautogui_code(
    responses=parsed_dict,
    image_height=original_image_height,
    image_width=original_image_width
)
print(parsed_pyautogui_code)
```

### Generate pyautogui automation script

```python
from ui_tars.action_parser import parsing_response_to_pyautogui_code

pyautogui_code = parsing_response_to_pyautogui_code(parsed_dict, original_image_height, original_image_width)
print(pyautogui_code)
```

### Visualize coordinates on the image (optional)

```python
from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt

image = Image.open("your_image_path.png")
start_box = parsed_dict[0]["action_inputs"]["start_box"]
coordinates = eval(start_box)
x1 = int(coordinates[0] * original_image_width)
y1 = int(coordinates[1] * original_image_height)
draw = ImageDraw.Draw(image)
radius = 5
draw.ellipse((x1 - radius, y1 - radius, x1 + radius, y1 + radius), fill="red", outline="red")
plt.imshow(np.array(image))
plt.axis("off")
plt.show()
```

---

## API Documentation

### parse_action_to_structure_output

```python
def parse_action_to_structure_output(
    text: str,
    factor: int,
    origin_resized_height: int,
    origin_resized_width: int,
    model_type: str = "qwen25vl",
    max_pixels: int = 16384 * 28 * 28,
    min_pixels: int = 100 * 28 * 28
) -> list[dict]:
    ...
```

**Description:**
Parses output action instructions into structured dictionaries, automatically handling coordinate scaling and box/point format conversion.

**Parameters:**
- `text`: The output string
- `factor`: Scaling factor
- `origin_resized_height`/`origin_resized_width`: Original image height/width
- `model_type`: Model type (e.g., "qwen25vl", "doubao")
- `max_pixels`/`min_pixels`: Image pixel upper/lower limits

**Returns:**
A list of structured actions, each as a dict with fields like `action_type`, `action_inputs`, `thought`, etc.

---

### parsing_response_to_pyautogui_code

```python
def parsing_response_to_pyautogui_code(
    responses: dict | list[dict],
    image_height: int,
    image_width: int,
    input_swap: bool = True
) -> str:
    ...
```

**Description:**
Converts structured actions into a pyautogui script string, supporting click, type, hotkey, drag, scroll, and more.

**Parameters:**
- `responses`: Structured actions (dict or list of dicts)
- `image_height`/`image_width`: Image height/width
- `input_swap`: Whether to use clipboard paste for typing (default True)

**Returns:**
A pyautogui script string, ready for automation execution.

---

## Contribution

Contributions, issues, and suggestions are welcome!

---

## License

Apache-2.0 License


================================================
FILE: codes/makefile
================================================
test:
	uv run python3 -m unittest discover tests '*_test.py'


================================================
FILE: codes/pyproject.toml
================================================
[project]
name = "ui-tars"
version = "0.1.4"
description = "Parsing LLM-generated GUI action instructions, automatically generating pyautogui scripts, and supporting coordinate conversion and smart image resizing."
readme = "README.md"
authors = [
    { name = "liangshihao.0828", email = "liangshihao.0828@bytedance.com" },
    { name = "jinxin001", email = "jinxin001@bytedance.com" }
]
requires-python = ">=3.10,<4.0"
dependencies = []

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.envs.test.scripts]
test = "python -m unittest discover tests '*_test.py'"
publish = "python -m unittest discover tests '*_test.py' && uv build && uv publish"

[tool.black]
line-length = 88
target-version = ['py310']
include = '\.pyi?$'

[tool.hatch.build]
include = [
    "ui_tars/**/*.py",
    "!ui_tars/**/tests/*.py",
    "!ui_tars/**/tests.py"
]

[tool.uv]
dev-dependencies = [
    "matplotlib>=3.10.3",
    "pillow>=11.2.1",
]


================================================
FILE: codes/tests/action_parser_test.py
================================================
import unittest

import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from ui_tars.action_parser import (
    parsing_response_to_pyautogui_code,
    parse_action,
    parse_action_to_structure_output,
)


class TestActionParser(unittest.TestCase):
    def test_parse_action(self):
        action_str = "click(point='<point>200 300</point>')"
        result = parse_action(action_str)
        self.assertEqual(result['function'], 'click')
        self.assertEqual(result['args']['point'], '<point>200 300</point>')

    def test_parse_action_to_structure_output(self):
        text = "Thought: test\nAction: click(point='<point>200 300</point>')"
        actions = parse_action_to_structure_output(
            text, factor=1000, origin_resized_height=224, origin_resized_width=224
        )
        self.assertEqual(actions[0]['action_type'], 'click')
        self.assertIn('start_box', actions[0]['action_inputs'])

    def test_parsing_response_to_pyautogui_code(self):
        responses = {"action_type": "hotkey", "action_inputs": {"hotkey": "ctrl v"}}
        code = parsing_response_to_pyautogui_code(responses, 224, 224)
        self.assertIn('pyautogui.hotkey', code)


if __name__ == '__main__':
    unittest.main()


================================================
FILE: codes/tests/inference_test.py
================================================
import os
import sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


from PIL import Image
import matplotlib.pyplot as plt

import json
import base64
from io import BytesIO
from PIL import Image

import math

from ui_tars.action_parser import IMAGE_FACTOR, MIN_PIXELS, MAX_PIXELS, MAX_RATIO


def round_by_factor(number: int, factor: int) -> int:
    """Returns the closest integer to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor


def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer greater than or equal to 'number' that is divisible by 'factor'."""
    return math.ceil(number / factor) * factor


def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer less than or equal to 'number' that is divisible by 'factor'."""
    return math.floor(number / factor) * factor


def smart_resize(
    height: int,
    width: int,
    factor: int = IMAGE_FACTOR,
    min_pixels: int = MIN_PIXELS,
    max_pixels: int = MAX_PIXELS,
) -> tuple[int, int]:
    """
    Rescales the image so that the following conditions are met:

    1. Both dimensions (height and width) are divisible by 'factor'.

    2. The total number of pixels is within the range ['min_pixels', 'max_pixels'].

    3. The aspect ratio of the image is maintained as closely as possible.
    """
    if max(height, width) / min(height, width) > MAX_RATIO:
        raise ValueError(
            f"absolute aspect ratio must be smaller than {MAX_RATIO}, got {max(height, width) / min(height, width)}"
        )
    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar


if __name__ == '__main__':

    # Assume model output
    model_raw_response = """Thought: xxx
    Action: click(start_box='(197,525)')"""

    # Please use re to parse the coordinate values
    model_output_width = 197
    model_output_height = 525

    # Open the image
    img = Image.open('./data/coordinate_process_image.png')
    width, height = img.size
    print(f'Original coordinate: {width}, {height}')

    # Calculate the new dimensions
    new_height, new_width = smart_resize(height, width)
    new_coordinate = (
        int(model_output_width / new_width * width),
        int(model_output_height / new_height * height),
    )
    print(f'Resized dimensions: {new_width}, {new_height}')
    print(new_coordinate)

    # Display the image
    plt.imshow(img)
    plt.scatter(
        [new_coordinate[0]], [new_coordinate[1]], c='red', s=50
    )  # Mark the point with a red dot
    plt.title('Visualize Coordinate')
    plt.axis('off')  # Set to 'off' to hide the axes
    plt.savefig('./data/coordinate_process_image_som.png', dpi=350)


================================================
FILE: codes/ui_tars/__init__.py
================================================


================================================
FILE: codes/ui_tars/action_parser.py
================================================
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
# SPDX-License-Identifier: Apache-2.0
import re
import ast
import math

IMAGE_FACTOR = 28
MIN_PIXELS = 100 * 28 * 28
MAX_PIXELS = 16384 * 28 * 28
MAX_RATIO = 200


def convert_point_to_coordinates(text, is_answer=False):
    # 匹配 <bbox> 后面的四个数字
    pattern = r"<point>(\d+)\s+(\d+)</point>"

    def replace_match(match):
        x1, y1 = map(int, match.groups())
        x = (x1 + x1) // 2  # 使用截断取整
        y = (y1 + y1) // 2  # 使用截断取整
        if is_answer:
            return f"({x},{y})"  # 只返回 (x, y) 格式
        return f"({x},{y})"  # 返回带标签的格式

    # 去掉 [EOS] 并替换 <bbox> 坐标
    text = re.sub(r"\[EOS\]", "", text)
    return re.sub(pattern, replace_match, text).strip()


# 定义一个函数来解析每个 action
def parse_action(action_str):
    try:
        # 解析字符串为 AST 节点
        node = ast.parse(action_str, mode='eval')

        # 确保节点是一个表达式
        if not isinstance(node, ast.Expression):
            raise ValueError("Not an expression")

        # 获取表达式的主体
        call = node.body

        # 确保主体是一个函数调用
        if not isinstance(call, ast.Call):
            raise ValueError("Not a function call")

        # 获取函数名
        if isinstance(call.func, ast.Name):
            func_name = call.func.id
        elif isinstance(call.func, ast.Attribute):
            func_name = call.func.attr
        else:
            func_name = None

        # 获取关键字参数
        kwargs = {}
        for kw in call.keywords:
            key = kw.arg
            # 处理不同类型的值,这里假设都是常量
            if isinstance(kw.value, ast.Constant):
                value = kw.value.value
            elif isinstance(kw.value, ast.Str):  # 兼容旧版本 Python
                value = kw.value.s
            else:
                value = None
            kwargs[key] = value

        return {'function': func_name, 'args': kwargs}

    except Exception as e:
        print(f"Failed to parse action '{action_str}': {e}")
        return None


def escape_single_quotes(text):
    # 匹配未转义的单引号(不匹配 \\')
    pattern = r"(?<!\\)'"
    return re.sub(pattern, r"\\'", text)


def round_by_factor(number: int, factor: int) -> int:
    """Returns the closest integer to 'number' that is divisible by 'factor'."""
    return round(number / factor) * factor


def ceil_by_factor(number: int, factor: int) -> int:
    """Returns the smallest integer greater than or equal to 'number' that is divisible by 'factor'."""
    return math.ceil(number / factor) * factor


def floor_by_factor(number: int, factor: int) -> int:
    """Returns the largest integer less than or equal to 'number' that is divisible by 'factor'."""
    return math.floor(number / factor) * factor


def linear_resize(height: int,
                  width: int,
                  factor: int = IMAGE_FACTOR,
                  min_pixels: int = MIN_PIXELS,
                  max_pixels: int = MAX_PIXELS) -> tuple[int, int]:
    if width * height > max_pixels:
        """
        如果图片超过/低于像素限制,则计算一个缩放因子resize_factor,使图片的像素数缩小到等于或小于max_pixels。这个缩放因子是通过开平方根计算的,确保纵横比保持不变,这样原始的相对坐标可以不经转换直接复用
        """
        resize_factor = math.sqrt(max_pixels / (width * height))
        width, height = int(width * resize_factor), int(height * resize_factor)
    if width * height < min_pixels:
        resize_factor = math.sqrt(min_pixels / (width * height))
        width, height = math.ceil(width * resize_factor), math.ceil(
            height * resize_factor)

    return height, width


def smart_resize(height: int,
                 width: int,
                 factor: int = IMAGE_FACTOR,
                 min_pixels: int = MIN_PIXELS,
                 max_pixels: int = MAX_PIXELS) -> tuple[int, int]:
    """
    Rescales the image so that the following conditions are met:

    1. Both dimensions (height and width) are divisible by 'factor'.

    2. The total number of pixels is within the range ['min_pixels', 'max_pixels'].

    3. The aspect ratio of the image is maintained as closely as possible.
    """
    if max(height, width) / min(height, width) > MAX_RATIO:
        raise ValueError(
            f"absolute aspect ratio must be smaller than {MAX_RATIO}, got {max(height, width) / min(height, width)}"
        )
    h_bar = max(factor, round_by_factor(height, factor))
    w_bar = max(factor, round_by_factor(width, factor))
    if h_bar * w_bar > max_pixels:
        beta = math.sqrt((height * width) / max_pixels)
        h_bar = floor_by_factor(height / beta, factor)
        w_bar = floor_by_factor(width / beta, factor)
    elif h_bar * w_bar < min_pixels:
        beta = math.sqrt(min_pixels / (height * width))
        h_bar = ceil_by_factor(height * beta, factor)
        w_bar = ceil_by_factor(width * beta, factor)
    return h_bar, w_bar


def parse_action_to_structure_output(text,
                                     factor,
                                     origin_resized_height,
                                     origin_resized_width,
                                     model_type="qwen25vl",
                                     max_pixels=16384 * 28 * 28,
                                     min_pixels=100 * 28 * 28):
    text = text.strip()

    if "<point>" in text:
        text = convert_point_to_coordinates(text)
    if "start_point=" in text:
        text = text.replace("start_point=", "start_box=")
    if "end_point=" in text:
        text = text.replace("end_point=", "end_box=")
    if "point=" in text:
        text = text.replace("point=", "start_box=")

    if model_type == "qwen25vl":
        smart_resize_height, smart_resize_width = smart_resize(
            origin_resized_height,
            origin_resized_width,
            factor=IMAGE_FACTOR,
            min_pixels=min_pixels,
            max_pixels=max_pixels)

    # 正则表达式匹配 Action 字符串
    if text.startswith("Thought:"):
        thought_pattern = r"Thought: (.+?)(?=\s*Action: |$)"
        thought_hint = "Thought: "
    elif text.startswith("Reflection:"):
        thought_pattern = r"Reflection: (.+?)Action_Summary: (.+?)(?=\s*Action: |$)"
        thought_hint = "Reflection: "
    elif text.startswith("Action_Summary:"):
        thought_pattern = r"Action_Summary: (.+?)(?=\s*Action: |$)"
        thought_hint = "Action_Summary: "
    else:
        thought_pattern = r"Thought: (.+?)(?=\s*Action: |$)"
        thought_hint = "Thought: "
    reflection, thought = None, None
    thought_match = re.search(thought_pattern, text, re.DOTALL)
    if thought_match:
        if len(thought_match.groups()) == 1:
            thought = thought_match.group(1).strip()
        elif len(thought_match.groups()) == 2:
            thought = thought_match.group(2).strip()
            reflection = thought_match.group(1).strip()
    assert "Action:" in text
    action_str = text.split("Action: ")[-1]

    tmp_all_action = action_str.split(")\n\n")
    all_action = []
    for action_str in tmp_all_action:
        if "type(content" in action_str:
            if not action_str.strip().endswith(")"):
                action_str = action_str.strip() + ")"
            # 正则表达式匹配 content 中的字符串并转义单引号
            def escape_quotes(match):
                content = match.group(1)  # 获取 content 的值
                return content

            # 使用正则表达式进行替换
            pattern = r"type\(content='(.*?)'\)"  # 匹配 type(content='...')
            if re.search(pattern, action_str):  # 检查是否有匹配项
                content = re.sub(pattern, escape_quotes, action_str)
            else:
                raise ValueError("Pattern not found in the input string.")

            # 处理字符串
            action_str = escape_single_quotes(content)
            action_str = "type(content='" + action_str + "')"
        if not action_str.strip().endswith(")"):
            action_str = action_str.strip() + ")"
        all_action.append(action_str)

    parsed_actions = [
        parse_action(action.replace("\n", "\\n").lstrip())
        for action in all_action
    ]
    actions = []
    for action_instance, raw_str in zip(parsed_actions, all_action):
        if action_instance == None:
            print(f"Action can't parse: {raw_str}")
            raise ValueError(f"Action can't parse: {raw_str}")
        action_type = action_instance["function"]
        params = action_instance["args"]

        # import pdb; pdb.set_trace()
        action_inputs = {}
        for param_name, param in params.items():
            if param == "": continue
            param = param.lstrip()  # 去掉引号和多余的空格
            # 处理start_box或者end_box参数格式 '<bbox>x1 y1 x2 y2</bbox>'
            action_inputs[param_name.strip()] = param

            if "start_box" in param_name or "end_box" in param_name:
                ori_box = param
                # Remove parentheses and split the string by commas
                numbers = ori_box.replace("(", "").replace(")", "").split(",")

                # Convert to float and scale by 1000
                # Qwen2.5vl output absolute coordinates, qwen2vl output relative coordinates
                if model_type == "qwen25vl":
                    float_numbers = []
                    for num_idx, num in enumerate(numbers):
                        num = float(num)
                        if (num_idx + 1) % 2 == 0:
                            float_numbers.append(
                                float(num / smart_resize_height))
                        else:
                            float_numbers.append(
                                float(num / smart_resize_width))
                else:
                    float_numbers = [float(num) / factor for num in numbers]

                if len(float_numbers) == 2:
                    float_numbers = [
                        float_numbers[0], float_numbers[1], float_numbers[0],
                        float_numbers[1]
                    ]
                action_inputs[param_name.strip()] = str(float_numbers)

        # import pdb; pdb.set_trace()
        actions.append({
            "reflection": reflection,
            "thought": thought,
            "action_type": action_type,
            "action_inputs": action_inputs,
            "text": text
        })
    return actions


def parsing_response_to_pyautogui_code(responses,
                                       image_height: int,
                                       image_width: int,
                                       input_swap: bool = True) -> str:
    '''
    将M模型的输出解析为OSWorld中的action,生成pyautogui代码字符串
    参数:
        response: 包含模型输出的字典,结构类似于:
        {
            "action_type": "hotkey",
            "action_inputs": {
                "hotkey": "v ctrl",
                "start_box": None,
                "end_box": None
            }
        }
    返回:
        生成的pyautogui代码字符串
    '''

    pyautogui_code = f"import pyautogui\nimport time\n"
    if isinstance(responses, dict):
        responses = [responses]
    for response_id, response in enumerate(responses):
        if "observation" in response:
            observation = response["observation"]
        else:
            observation = ""

        if "thought" in response:
            thought = response["thought"]
        else:
            thought = ""

        if response_id == 0:
            pyautogui_code += f"'''\nObservation:\n{observation}\n\nThought:\n{thought}\n'''\n"
        else:
            pyautogui_code += f"\ntime.sleep(1)\n"

        action_dict = response
        action_type = action_dict.get("action_type")
        action_inputs = action_dict.get("action_inputs", {})

        if action_type == "hotkey":
            # Parsing hotkey action
            if "key" in action_inputs:
                hotkey = action_inputs.get("key", "")
            else:
                hotkey = action_inputs.get("hotkey", "")

            if hotkey == "arrowleft":
                hotkey = "left"

            elif hotkey == "arrowright":
                hotkey = "right"

            elif hotkey == "arrowup":
                hotkey = "up"

            elif hotkey == "arrowdown":
                hotkey = "down"

            if hotkey:
                # Handle other hotkeys
                keys = hotkey.split()  # Split the keys by space
                convert_keys = []
                for key in keys:
                    if key == "space":
                        key = ' '
                    convert_keys.append(key)
                pyautogui_code += f"\npyautogui.hotkey({', '.join([repr(k) for k in convert_keys])})"

        elif action_type in ["press", "keydown"]:
            # Parsing press action
            if "key" in action_inputs:
                key_to_press = action_inputs.get("key", "")
            else:
                key_to_press = action_inputs.get("press", "")

            if key_to_press == "arrowleft":
                key_to_press = "left"

            elif key_to_press == "arrowright":
                key_to_press = "right"

            elif key_to_press == "arrowup":
                key_to_press = "up"

            elif key_to_press == "arrowdown":
                key_to_press = "down"

            elif key_to_press == "space":
                key_to_press = " "

            if key_to_press:
                # Simulate pressing a single key
                pyautogui_code += f"\npyautogui.keyDown({repr(key_to_press)})"

        elif action_type in ["release", "keyup"]:
            # Parsing press action
            if "key" in action_inputs:
                key_to_press = action_inputs.get("key", "")
            else:
                key_to_press = action_inputs.get("press", "")

            if key_to_press == "arrowleft":
                key_to_press = "left"

            elif key_to_press == "arrowright":
                key_to_press = "right"

            elif key_to_press == "arrowup":
                key_to_press = "up"

            elif key_to_press == "arrowdown":
                key_to_press = "down"

            elif key_to_press == "space":
                key_to_press = " "

            if key_to_press:
                # Simulate pressing a single key
                pyautogui_code += f"\npyautogui.keyUp({repr(key_to_press)})"

        elif action_type == "type":
            # Parsing typing action using clipboard
            content = action_inputs.get("content", "")
            content = escape_single_quotes(content)
            stripped_content = content
            if content.endswith("\n") or content.endswith("\\n"):
                stripped_content = stripped_content.rstrip("\\n").rstrip("\n")
            if content:
                if input_swap:
                    pyautogui_code += f"\nimport pyperclip"
                    pyautogui_code += f"\npyperclip.copy('{stripped_content}')"
                    pyautogui_code += f"\npyautogui.hotkey('ctrl', 'v')"
                    pyautogui_code += f"\ntime.sleep(0.5)\n"
                    if content.endswith("\n") or content.endswith("\\n"):
                        pyautogui_code += f"\npyautogui.press('enter')"
                else:
                    pyautogui_code += f"\npyautogui.write('{stripped_content}', interval=0.1)"
                    pyautogui_code += f"\ntime.sleep(0.5)\n"
                    if content.endswith("\n") or content.endswith("\\n"):
                        pyautogui_code += f"\npyautogui.press('enter')"

        elif action_type in ["drag", "select"]:
            # Parsing drag or select action based on start and end_boxes
            start_box = action_inputs.get("start_box")
            end_box = action_inputs.get("end_box")
            if start_box and end_box:
                x1, y1, x2, y2 = eval(
                    start_box)  # Assuming box is in [x1, y1, x2, y2]
                sx = round(float((x1 + x2) / 2) * image_width, 3)
                sy = round(float((y1 + y2) / 2) * image_height, 3)
                x1, y1, x2, y2 = eval(
                    end_box)  # Assuming box is in [x1, y1, x2, y2]
                ex = round(float((x1 + x2) / 2) * image_width, 3)
                ey = round(float((y1 + y2) / 2) * image_height, 3)
                pyautogui_code += (
                    f"\npyautogui.moveTo({sx}, {sy})\n"
                    f"\npyautogui.dragTo({ex}, {ey}, duration=1.0)\n")

        elif action_type == "scroll":
            # Parsing scroll action
            start_box = action_inputs.get("start_box")
            if start_box:
                x1, y1, x2, y2 = eval(
                    start_box)  # Assuming box is in [x1, y1, x2, y2]
                x = round(float((x1 + x2) / 2) * image_width, 3)
                y = round(float((y1 + y2) / 2) * image_height, 3)

                # # 先点对应区域,再滚动
                # pyautogui_code += f"\npyautogui.click({x}, {y}, button='left')"
            else:
                x = None
                y = None
            direction = action_inputs.get("direction", "")

            if x == None:
                if "up" in direction.lower():
                    pyautogui_code += f"\npyautogui.scroll(5)"
                elif "down" in direction.lower():
                    pyautogui_code += f"\npyautogui.scroll(-5)"
            else:
                if "up" in direction.lower():
                    pyautogui_code += f"\npyautogui.scroll(5, x={x}, y={y})"
                elif "down" in direction.lower():
                    pyautogui_code += f"\npyautogui.scroll(-5, x={x}, y={y})"

        elif action_type in [
                "click", "left_single", "left_double", "right_single", "hover"
        ]:
            # Parsing mouse click actions
            start_box = action_inputs.get("start_box")
            start_box = str(start_box)
            if start_box:
                start_box = eval(start_box)
                if len(start_box) == 4:
                    x1, y1, x2, y2 = start_box  # Assuming box is in [x1, y1, x2, y2]
                elif len(start_box) == 2:
                    x1, y1 = start_box
                    x2 = x1
                    y2 = y1
                x = round(float((x1 + x2) / 2) * image_width, 3)
                y = round(float((y1 + y2) / 2) * image_height, 3)
                if action_type == "left_single" or action_type == "click":
                    pyautogui_code += f"\npyautogui.click({x}, {y}, button='left')"
                elif action_type == "left_double":
                    pyautogui_code += f"\npyautogui.doubleClick({x}, {y}, button='left')"
                elif action_type == "right_single":
                    pyautogui_code += f"\npyautogui.click({x}, {y}, button='right')"
                elif action_type == "hover":
                    pyautogui_code += f"\npyautogui.moveTo({x}, {y})"

        elif action_type in ["finished"]:
            pyautogui_code = f"DONE"

        else:
            pyautogui_code += f"\n# Unrecognized action type: {action_type}"

    return pyautogui_code


def add_box_token(input_string):
    # Step 1: Split the string into individual actions
    if "Action: " in input_string and "start_box=" in input_string:
        suffix = input_string.split("Action: ")[0] + "Action: "
        actions = input_string.split("Action: ")[1:]
        processed_actions = []
        for action in actions:
            action = action.strip()
            # Step 2: Extract coordinates (start_box or end_box) using regex
            coordinates = re.findall(
                r"(start_box|end_box)='\((\d+),\s*(\d+)\)'", action)

            updated_action = action  # Start with the original action
            for coord_type, x, y in coordinates:
                # Convert x and y to integers
                updated_action = updated_action.replace(
                    f"{coord_type}='({x},{y})'",
                    f"{coord_type}='<|box_start|>({x},{y})<|box_end|>'")
            processed_actions.append(updated_action)

        # Step 5: Reconstruct the final string
        final_string = suffix + "\n\n".join(processed_actions)
    else:
        final_string = input_string
    return final_string


================================================
FILE: codes/ui_tars/prompt.py
================================================
# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
# SPDX-License-Identifier: Apache-2.0
COMPUTER_USE_DOUBAO = """You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.

## Output Format
```
Thought: ...
Action: ...
```

## Action Space

click(point='<point>x1 y1</point>')
left_double(point='<point>x1 y1</point>')
right_single(point='<point>x1 y1</point>')
drag(start_point='<point>x1 y1</point>', end_point='<point>x2 y2</point>')
hotkey(key='ctrl c') # Split keys with a space and use lowercase. Also, do not use more than 3 keys in one hotkey action.
type(content='xxx') # Use escape characters \\', \\\", and \\n in content part to ensure we can parse the content in normal python string format. If you want to submit your input, use \\n at the end of content. 
scroll(point='<point>x1 y1</point>', direction='down or up or right or left') # Show more information on the `direction` side.
wait() #Sleep for 5s and take a screenshot to check for any changes.
finished(content='xxx') # Use escape characters \\', \\", and \\n in content part to ensure we can parse the content in normal python string format.


## Note
- Use {language} in `Thought` part.
- Write a small plan and finally summarize your next action (with its target element) in one sentence in `Thought` part.

## User Instruction
{instruction}
"""

MOBILE_USE_DOUBAO = """You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. 
## Output Format
```
Thought: ...
Action: ...
```
## Action Space

click(point='<point>x1 y1</point>')
long_press(point='<point>x1 y1</point>')
type(content='') #If you want to submit your input, use "\\n" at the end of `content`.
scroll(point='<point>x1 y1</point>', direction='down or up or right or left')
open_app(app_name=\'\')
drag(start_point='<point>x1 y1</point>', end_point='<point>x2 y2</point>')
press_home()
press_back()
finished(content='xxx') # Use escape characters \\', \\", and \\n in content part to ensure we can parse the content in normal python string format.


## Note
- Use {language} in `Thought` part.
- Write a small plan and finally summarize your next action (with its target element) in one sentence in `Thought` part.

## User Instruction
{instruction}
"""

GROUNDING_DOUBAO = """You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. \n\n## Output Format\n\nAction: ...\n\n\n## Action Space\nclick(point='<point>x1 y1</point>'')\n\n## User Instruction
{instruction}"""


================================================
FILE: data/test_messages.json
================================================
[
    {
        "role": "user",
        "content": "You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task. \n\n## Output Format\n```\nThought: ...\nAction: ...\n```\n\n## Action Space\n\nclick(start_box='<|box_start|>(x1, y1)<|box_end|>')\nleft_double(start_box='<|box_start|>(x1, y1)<|box_end|>')\nright_single(start_box='<|box_start|>(x1, y1)<|box_end|>')\ndrag(start_box='<|box_start|>(x1, y1)<|box_end|>', end_box='<|box_start|>(x3, y3)<|box_end|>')\nhotkey(key='')\ntype(content='') #If you want to submit your input, use \"\\n\" at the end of `content`.\nscroll(start_box='<|box_start|>(x1, y1)<|box_end|>', direction='down or up or right or left')\nwait() #Sleep for 5s and take a screenshot to check for any changes.\nfinished(content='xxx') # Use escape characters \\', \\\", and \\n in content part to ensure we can parse the content in normal python string format.\n\n\n## Note\n- Use Chinese in `Thought` part.\n- Write a small plan and finally summarize your next action (with its target element) in one sentence in `Thought` part.\n\n## User Instruction\nCould you help me set the image to Palette-Based?"
    },
    {
        "role": "assistant",
        "content": "Thought: 我看到屏幕上弹出了一个颜色配置文件转换的对话框,要继续操作的话得先处理掉它。对话框右下角有个\"Convert\"按钮,我需要点击它来确认这个转换操作。\nAction: click(start_box='(607,647)')"
    },
    {
        "role": "assistant",
        "content": "Thought: 看到这张复古电视机的照片,我需要把它设置成基于调色板的方式。让我先点击顶部菜单栏的\"Tools\"选项,这样就能找到相关的颜色设置选项了。\nAction: click(start_box='(220,71)')"
    },
    {
        "role": "assistant",
        "content": "Thought: 刚才点开了Tools菜单,但发现这不是正确的路径。要设置图片为基于调色板的方式,我需要先关闭当前打开的Tools菜单,然后重新寻找正确的颜色设置选项。让我点击一下Tools按钮把它关掉。\nAction: click(start_box='(220,71)')"
    },
    {
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "data:image/png;base64,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
Download .txt
gitextract_cmtoxgu7/

├── .github/
│   └── workflows/
│       └── test.yml
├── LICENSE
├── README.md
├── README_coordinates.md
├── README_deploy.md
├── README_v1.md
├── codes/
│   ├── .gitignore
│   ├── .python-version
│   ├── README.md
│   ├── makefile
│   ├── pyproject.toml
│   ├── tests/
│   │   ├── action_parser_test.py
│   │   └── inference_test.py
│   └── ui_tars/
│       ├── __init__.py
│       ├── action_parser.py
│       └── prompt.py
└── data/
    ├── test_messages.json
    ├── test_messages_single_image.json
    └── training_example.json
Download .txt
SYMBOL INDEX (19 symbols across 3 files)

FILE: codes/tests/action_parser_test.py
  class TestActionParser (line 15) | class TestActionParser(unittest.TestCase):
    method test_parse_action (line 16) | def test_parse_action(self):
    method test_parse_action_to_structure_output (line 22) | def test_parse_action_to_structure_output(self):
    method test_parsing_response_to_pyautogui_code (line 30) | def test_parsing_response_to_pyautogui_code(self):

FILE: codes/tests/inference_test.py
  function round_by_factor (line 20) | def round_by_factor(number: int, factor: int) -> int:
  function ceil_by_factor (line 25) | def ceil_by_factor(number: int, factor: int) -> int:
  function floor_by_factor (line 30) | def floor_by_factor(number: int, factor: int) -> int:
  function smart_resize (line 35) | def smart_resize(

FILE: codes/ui_tars/action_parser.py
  function convert_point_to_coordinates (line 13) | def convert_point_to_coordinates(text, is_answer=False):
  function parse_action (line 31) | def parse_action(action_str):
  function escape_single_quotes (line 75) | def escape_single_quotes(text):
  function round_by_factor (line 81) | def round_by_factor(number: int, factor: int) -> int:
  function ceil_by_factor (line 86) | def ceil_by_factor(number: int, factor: int) -> int:
  function floor_by_factor (line 91) | def floor_by_factor(number: int, factor: int) -> int:
  function linear_resize (line 96) | def linear_resize(height: int,
  function smart_resize (line 115) | def smart_resize(height: int,
  function parse_action_to_structure_output (line 146) | def parse_action_to_structure_output(text,
  function parsing_response_to_pyautogui_code (line 279) | def parsing_response_to_pyautogui_code(responses,
  function add_box_token (line 502) | def add_box_token(input_string):
Condensed preview — 19 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,401K chars).
[
  {
    "path": ".github/workflows/test.yml",
    "chars": 594,
    "preview": "name: Test\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n    branches:\n      - \"**\"\n  push:\n    branch"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 14580,
    "preview": "<!-- <p align=\"center\">\n  <img alt=\"UI-TARS\"  width=\"260\" src=\"figures/icon.png\">\n</p>\n\n# UI-TARS: Pioneering Automated "
  },
  {
    "path": "README_coordinates.md",
    "chars": 3789,
    "preview": "\n# Tutorial: Processing Model Coordinate Outputs\n\n**Note**: For complete action space parsing, please refer to [OSWorld "
  },
  {
    "path": "README_deploy.md",
    "chars": 5049,
    "preview": "# UI-TARS 1.5 HuggingFace Endpoint Deployment Guide\n\n## 1. HuggingFace Inference Endpoints Cloud Deployment\n\nWe use Hugg"
  },
  {
    "path": "README_v1.md",
    "chars": 29169,
    "preview": "<!-- <p align=\"center\">\n  <img alt=\"UI-TARS\"  width=\"260\" src=\"figures/icon.png\">\n</p>\n\n# UI-TARS: Pioneering Automated "
  },
  {
    "path": "codes/.gitignore",
    "chars": 134,
    "preview": "# Python-generated files\n__pycache__/\n.pytest_cache/\n*.py[oc]\nbuild/\ndist/\nwheels/\n*.egg-info\n\n# Virtual environments\n.v"
  },
  {
    "path": "codes/.python-version",
    "chars": 5,
    "preview": "3.10\n"
  },
  {
    "path": "codes/README.md",
    "chars": 3788,
    "preview": "# ui-tars\n\nA python package for parsing VLM-generated GUI action instructions into executable pyautogui codes.\n\n---\n\n## "
  },
  {
    "path": "codes/makefile",
    "chars": 61,
    "preview": "test:\n\tuv run python3 -m unittest discover tests '*_test.py'\n"
  },
  {
    "path": "codes/pyproject.toml",
    "chars": 959,
    "preview": "[project]\nname = \"ui-tars\"\nversion = \"0.1.4\"\ndescription = \"Parsing LLM-generated GUI action instructions, automatically"
  },
  {
    "path": "codes/tests/action_parser_test.py",
    "chars": 1273,
    "preview": "import unittest\n\nimport os\nimport sys\n\nsys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))\n\nfro"
  },
  {
    "path": "codes/tests/inference_test.py",
    "chars": 3206,
    "preview": "import os\nimport sys\n\nsys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))\n\n\nfrom PIL import Ima"
  },
  {
    "path": "codes/ui_tars/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "codes/ui_tars/action_parser.py",
    "chars": 19945,
    "preview": "# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n# SPDX-License-Identifier: Apache-2.0\nimport re\nimport ast\nimp"
  },
  {
    "path": "codes/ui_tars/prompt.py",
    "chars": 2672,
    "preview": "# Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n# SPDX-License-Identifier: Apache-2.0\nCOMPUTER_USE_DOUBAO = \"\""
  },
  {
    "path": "data/test_messages.json",
    "chars": 7710111,
    "preview": "[\n    {\n        \"role\": \"user\",\n        \"content\": \"You are a GUI agent. You are given a task and your action history, w"
  },
  {
    "path": "data/test_messages_single_image.json",
    "chars": 1586857,
    "preview": "[\n    {\n        \"role\": \"user\",\n        \"content\": \"You are a GUI agent. You are given a task and your action history, w"
  },
  {
    "path": "data/training_example.json",
    "chars": 2574,
    "preview": "[\n    {\n        \"role\": \"system\",\n        \"content\": \"You are a helpful assistant.\",\n        \"loss_mask\": 0\n    },\n    {"
  }
]

About this extraction

This page contains the full source code of the bytedance/UI-TARS GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 19 files (9.0 MB), approximately 2.3M tokens, and a symbol index with 19 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!