---
license: apache-2.0
base_model:
- Qwen/Qwen3.5-9B
language:
- ko
- en
pipeline_tag: image-text-to-text
library_name: transformers
tags:
- gui-agent
- web-agent
- computer-use
- browser
- korean
---
# KORMo-Web-9B
**KORMo-Web-9B** is a 9B vision-language agent that completes real browser tasks **from screenshots alone**. Give it a request in Korean or English; it plans, clicks, types and moves between sites and tabs until the task is done. In the same live-web evaluation, it beats every open-weight web agent we compared, **by +18.3 points in English and +27.9 points in Korean**.
On **Online-Mind2Web** it reaches **51.0% in English** and **48.1% in Korean**, which is **+26.3 / +31.4 points** over the base Qwen3.5-9B.
## Demo
KORMo-Web-9B books a movie ticket on the live CGV website from a single Korean request: it logs in, picks the theater, date and showtime, selects seats and goes to the payment step.
## Performance
All models below ran **the same 612 live-website tasks** (300 English, 312 Korean), each with its own prompt and action format, and were scored by **the same LLM judge**.
| Model | Size | Online-Mind2Web EN | Online-Mind2Web KO |
|---|---:|---:|---:|
| Qwen3.5-9B (base, no fine-tuning) | 9B | 24.7 | 16.7 |
| Fara-1.5-4B | 4B | 20.7 | 7.7 |
| UI-TARS-1.5-7B | 7B | 22.3 | 20.2 |
| OpenWebRL-4B | 4B | 32.7 | 15.4 |
| **KORMo-Web-9B (ours)** | **9B** | **51.0** | **48.1** |
| GPT-6-luna (proprietary) | – | 63.0 | 65.7 |
| Gemini-3.8-flash (proprietary) | – | 74.0 | 80.1 |
Success rate (%). The denominator is always the full task count, so crashed or empty runs count as failures.
KORMo-Web-9B outperforms open web agents of similar size in both English and Korean.
## Why KORMo-Web
- **Korean and English, natural requests.** Handles short commands as well as long, conversational instructions in either language.
- **Screenshot-only.** It needs no DOM or accessibility tree; it acts on what is on screen, like a person, and checks each action's result on the next screenshot.
- **Thinks, then acts.** A short reasoning step precedes every action, so its behaviour is easy to inspect and debug.
- **Multi-site, multi-tab workflows.** It can search on one site, verify on another and write the result into a third, managing tabs on its own.
- **Open and ready to run.** Apache-2.0 weights, a reference browser harness, the tool schema and the exact inference settings are all included.
## Quickstart
Tested with **vLLM 0.23.0** and **transformers 5.12.1**. The model runs on a single GPU (TP=1).
### Run the agent
**1. Install and download**
```bash
pip install -U "vllm>=0.23.0" openai playwright huggingface_hub
playwright install chromium
huggingface-cli download KORMo-VL/KORMo-Web-9B --local-dir KORMo-Web-9B
```
**2. Start the model server**
```bash
vllm serve ./KORMo-Web-9B --served-model-name KORMo-Web-9B \
--max-model-len 131072 --limit-mm-per-prompt '{"image":1,"video":0}'
```
**3. Run a browser task**
```bash
python KORMo-Web-9B/examples/agent_playwright.py --model KORMo-Web-9B \
--task "다나와에서 50만 원 이하, 10인치 이상 태블릿 3개를 찾아서 가격을 알려줘"
```
The agent opens Chromium, prints each action as it goes, and finishes with the model's answer.
### Inference example (one step)
Send one screenshot with the request and get back one action:
```python
import base64, json
from openai import OpenAI
SYSTEM = open("KORMo-Web-9B/system_prompt.md").read().strip()
TOOLS = json.load(open("KORMo-Web-9B/tools.json"))
shot = base64.b64encode(open("screen.png", "rb").read()).decode()
obs = ("
\nscreen size: 1280 x 720\nCurrent tab: 0\nAvailable tabs:\n"
"- Tab 0 (active): https://www.google.com/\n\nurl: https://www.google.com/\nscreenshot:\n")
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": [
{"type": "text", "text": "\n구글에서 KAIST 를 검색해서 공식 홈페이지를 열어줘.\n\n" + obs},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{shot}"}},
{"type": "text", "text": "\n"},
]},
]
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
out = client.chat.completions.create(
model="KORMo-Web-9B", messages=messages, tools=TOOLS,
temperature=0.6, top_p=0.95, max_tokens=16384,
extra_body={"top_k": 20, "chat_template_kwargs": {"enable_thinking": True}},
)
print(out.choices[0].message.content)
```
The output looks like this (illustrative):
```text
I can see the Google home page with an empty search box in the center. I have not searched yet.
My plan: 1. Click the search box. 2. Type "KAIST". 3. Press Enter and open the official site.
500
427
```
Coordinates in the tool call are normalized to 0–1000. Convert them to pixels with `x / 1000 × width` and `y / 1000 × height`.
## How It Works
```
user
task + observation (tabs, url, screenshot)
assistant
what I see · what is done · plan one action
tool action result + new observation (newest screenshot only)
… repeat until finished(answer)
```
- **Action space:** 22 browser tools: click, type, hotkey, scroll, drag, goto, tab control, `finished`, and others ([`tools.json`](tools.json)).
- **Memory:** the full text history of thoughts, actions and observations is kept. Only the current screenshot is sent.
- **Recommended settings:** temperature 0.6, top_p 0.95, top_k 20, thinking on, up to 16k tokens per step and 50 steps. These are already set in `generation_config.json`.
The exact message format, parsing rules and feedback strings are in **[HARNESS.md](HARNESS.md)**. Follow it if you build your own harness.
## Evaluation Details
| | |
|---|---|
| Tasks | Online-Mind2Web: 300 English, 312 Korean |
| Judge | GPT-6 |
## Files
| File | Description |
|---|---|
| `chat_template.jinja` | Chat template (Qwen3.5 XML tool calls, thinking on) |
| `system_prompt.md` · `tools.json` | System prompt and 22-tool schema, verbatim from training |
| `HARNESS.md` | Full harness specification |
| `examples/agent_playwright.py` | Reference browser agent (Playwright + OpenAI-compatible API). It does not execute `upload`. |
| `config.json` · `generation_config.json` · `processor_config.json` · `tokenizer*.json` | Model, sampling and processor configs |
## 한국어 요약
**KORMo-Web-9B**는 스크린샷만 보고 한국어·영어 웹 작업을 수행하는 9B 공개 웹 에이전트입니다. 같은 조건의 실제 웹 평가에서 비교한 공개 모델 중 가장 높은 점수를 받았습니다.
- **Online-Mind2Web:** EN 51.0, KO 48.1
- 비슷한 크기의 공개 웹 에이전트보다 영어·한국어 모두에서 높은 성능을 보입니다.
## Acknowledgements
Built on **[Qwen3.5-9B](https://huggingface.co/Qwen/Qwen3.5-9B)**. Evaluated on **Online-Mind2Web** and its Korean counterpart.