Metadata-Version: 2.4
Name: legatolabs
Version: 0.1.1
Summary: Open computer-use harness for any OpenAI-compatible model (Qwen, DeepSeek, Claude, vLLM, OpenRouter): ready-wait instead of fixed sleeps, bounded calls, measured against the reference loops.
Author: Legato authors
License-Expression: Apache-2.0
Project-URL: Homepage, https://legato.computer
Project-URL: Documentation, https://legato.computer/docs
Project-URL: Benchmarks, https://legato.computer/docs/benchmarks
Project-URL: Source, https://github.com/legatolabs/legato
Project-URL: Issues, https://github.com/legatolabs/legato/issues
Keywords: computer-use,computer use agent,gui agent,desktop agent,osworld,qwen,openrouter,vllm,e2b,llm agents,reinforcement learning,rollouts
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: NOTICE
Requires-Dist: httpx>=0.27
Requires-Dist: Pillow>=10
Provides-Extra: e2b
Requires-Dist: e2b-desktop>=2.7; extra == "e2b"
Provides-Extra: office
Requires-Dist: python-pptx>=1.0; extra == "office"
Requires-Dist: openpyxl>=3.1; extra == "office"
Provides-Extra: mcp
Requires-Dist: mcp>=1.2; extra == "mcp"
Provides-Extra: video
Requires-Dist: imageio>=2.30; extra == "video"
Requires-Dist: imageio-ffmpeg>=0.5; extra == "video"
Requires-Dist: numpy; extra == "video"
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: mcp>=1.2; extra == "dev"
Requires-Dist: python-pptx>=1.0; extra == "dev"
Requires-Dist: openpyxl>=3.1; extra == "dev"
Requires-Dist: imageio>=2.30; extra == "dev"
Requires-Dist: imageio-ffmpeg>=0.5; extra == "dev"
Requires-Dist: numpy; extra == "dev"
Dynamic: license-file

# Legato

Open-source computer-use harness for any OpenAI-compatible model: Qwen, DeepSeek, Claude, or your own vLLM server.
It drives a desktop with a `computer` tool, waits for the screen instead of sleeping, and bounds every model call.

```bash
pip install "legatolabs[e2b]"      # PyPI name: legatolabs. Import name: legato.
```

```python
import os, legato
from e2b_desktop import Sandbox                       # needs E2B_API_KEY

agent = legato.Harness(model="qwen/qwen3.8-27b", base_url="https://openrouter.ai/api/v1",
                       api_key=os.environ["OPENROUTER_API_KEY"])
desk = Sandbox.create()
result = agent.run("Open the terminal and print the date", legato.attach(desk))
print(result.report())                                # where the time went
desk.kill()
```

Or from the shell: `legato run "Open the terminal and print the date" --model qwen/qwen3.8-27b --base-url https://openrouter.ai/api/v1`

## Results

Same model, same desktops, 24 office tasks per run. [Method and raw data](docs/benchmarks.md).

| Model | Compared with | Time | Success |
|---|---|---|---|
| Claude Sonnet 5.5 | Anthropic's reference loop | 1.48x faster | 48/48 vs 48/48 |
| Qwen3.8-27B | OSWorld's Qwen agent | same | 71/96 vs 53/96 |

## How

- Waits until the screen stops changing instead of a fixed 2 s sleep.
- Up to 3 actions per turn, one screenshot after them.
- Drops old screenshots in chunks so the prompt cache keeps hitting.
- A wall-clock timeout and a token budget on every model call.

## More

- [Models](docs/models.md) · [Sandboxes](docs/sandboxes.md) · [MCP server](docs/mcp.md) · [RL rollouts](docs/rl.md) · [FAQ](docs/faq.md)
- Compare: [Anthropic's demo](docs/compare/anthropic-computer-use-demo.md) · [OSWorld's Qwen agent](docs/compare/osworld-qwen-agent.md) · [Agent S3](docs/compare/agent-s3.md) · [UI-TARS-desktop](docs/compare/ui-tars-desktop.md)
- Migrate: [from cua-agent](docs/migrate/from-cua-agent.md) · [from Bytebot](docs/migrate/from-bytebot.md)
- For coding agents: [llms.txt](llms.txt) · [AGENTS.md](AGENTS.md)

Apache-2.0. Hosted desktops and models: [legato.computer](https://legato.computer).

<!-- mcp-name: io.github.legatolabs/legato -->
