Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - DEschweiler/computer-use-agent · GitHub
Skip to content

Repository files navigation

Computer Use Agent

AI-powered agent that controls the foreground window on your desktop. A React + Flask web interface lets you submit tasks and watch the agent work in real time.

How it works

The agent captures the active foreground window and runs two perception signals in parallel:

  • RapidOCR (PPOCRv5, Latin) — detects text elements with confidence ≥ 0.9. Shown as orange boxes in the annotated screenshot.
  • OmniParser YOLOv8 (via ONNX Runtime) — detects interactive regions without text (buttons, icons, empty fields). Shown as blue boxes. YOLO boxes that overlap an OCR box by ≥ 5 % of the OCR box's area are suppressed to avoid redundancy.

Both element lists are sent together with the annotated screenshot to a vision LLM. The model returns tool calls (click, type, key press, …) which are executed via PyAutoGUI. This loop repeats until the task is complete.

Requirements

  • Python 3.10+
  • Node.js 18+ (for the web frontend)
  • A vision-capable LLM accessible via a chat completions API

Setup

1. Download models (one-time)

conda activate visualagent
python download_models.py

This downloads and verifies:

  • RapidOCR models → ~/.rapidocr/models/
  • OmniParser YOLO model → models/icon_detect.onnx (~100 MB from HuggingFace)

2. Python dependencies

pip install -r requirements.txt

3. Environment variables

Create a .env file in the project root. The agent uses a profile system: set ACTIVE_PROFILE to the name of the profile you want to use, then define the three variables for that profile using the pattern <PROFILE>_ENDPOINT, <PROFILE>_API_KEY, and <PROFILE>_MODEL. Multiple profiles can coexist in the same file.

# Select the active profile (case-insensitive)ACTIVE_PROFILE=myprofile# --- Profile: myprofile ---MYPROFILE_ENDPOINT=https://your-llm-endpoint/v1/chat/completionsMYPROFILE_API_KEY=your_api_keyMYPROFILE_MODEL=your-model-name# --- Profile: another ---ANOTHER_ENDPOINT=https://other-endpoint/v1/chat/completionsANOTHER_API_KEY=other_keyANOTHER_MODEL=other-model-name

Switching models is done by changing ACTIVE_PROFILE — no code changes required.

Optional tuning via environment variables:

VariableDefaultDescription
YOLO_IMGSZ1920Input resolution fed to YOLO (multiple of 32). Higher = better small-icon recall, slower.
YOLO_CONF_THRESH0.05YOLO confidence threshold.
YOLO_IOU_THRESH0.3IoU threshold for YOLO-internal NMS.
YOLO_OCR_OVERLAP_THRESH0.05Fraction of an OCR box that a YOLO box must cover to be suppressed.

4. Frontend dependencies

cd frontend
npm install

Running

The quickest way on Windows is the provided batch files (run each in its own terminal):

1_run_backend.bat # starts Flask on http://localhost:5000
2_run_frontend.bat # starts Vite dev server on http://localhost:3000
3_start_agent.bat # opens the localhost on port 3000 in your browser

Or start them manually:

# Terminal 1 — backendcd backend
python app.py
# Terminal 2 — frontendcd frontend
npm run dev
# Then open **http://localhost:3000** in your browser.

Web interface

  • Type a task in the chat input and press to start.
  • The agent's actions and log output stream in real time in the debug panel.
  • Click ⏹ Stop to immediately terminate the agent and re-enable the input.

Architecture

┌─────────────────┐
│ React Frontend │ (Port 3000)
│ Dark Mode UI │
└────────┬────────┘
│ HTTP + SSE
▼
┌─────────────────┐
│ Flask Backend │ (Port 5000)
│ Agent Runner │
└────────┬────────┘
│ subprocess
▼
┌──────────────────────────────┐
│ Computer Agent │
│ │
│ ┌───────────┐ ┌──────────┐ │
│ │ RapidOCR │ │ YOLO │ │ (parallel)
│ │ (text) │ │ (icons) │ │
│ └─────┬─────┘ └────┬─────┘ │
│ └──────┬──────┘ │
│ merge + dedup │
│ │ │
│ PyAutoGUI │
└──────────────────────────────┘

API reference

MethodEndpointDescription
POST/api/taskStart a new agent task ({"task": "..."})
POST/api/stopTerminate the running agent immediately
GET/api/logsStream agent logs via Server-Sent Events
GET/api/screenshotLatest annotated debug screenshot (PNG)
GET/api/healthHealth check
GET/api/infoAgent and model info

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages