` after every confirmed finding so they survive across iterations and assemble into the final report.
6. When `view` shows `[line_number] text`, those numbers are the file's real line numbers — quote them exactly in your report.
diff --git a/Auto_Use/windows_use/agent/cli/minions/view.py b/Auto_Use/windows_use/agent/minions/view.py
similarity index 100%
rename from Auto_Use/windows_use/agent/cli/minions/view.py
rename to Auto_Use/windows_use/agent/minions/view.py
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/__init__.py b/Auto_Use/windows_use/agent/skills/__init__.py
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/__init__.py
rename to Auto_Use/windows_use/agent/skills/__init__.py
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/browser.md b/Auto_Use/windows_use/agent/skills/browser.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/browser.md
rename to Auto_Use/windows_use/agent/skills/browser.md
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/google_colab.md b/Auto_Use/windows_use/agent/skills/google_colab.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/google_colab.md
rename to Auto_Use/windows_use/agent/skills/google_colab.md
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/google_services.md b/Auto_Use/windows_use/agent/skills/google_services.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/google_services.md
rename to Auto_Use/windows_use/agent/skills/google_services.md
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/libreoffice_calc.md b/Auto_Use/windows_use/agent/skills/libreoffice_calc.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/libreoffice_calc.md
rename to Auto_Use/windows_use/agent/skills/libreoffice_calc.md
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/microsoft_services.md b/Auto_Use/windows_use/agent/skills/microsoft_services.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/microsoft_services.md
rename to Auto_Use/windows_use/agent/skills/microsoft_services.md
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/service.py b/Auto_Use/windows_use/agent/skills/service.py
similarity index 96%
rename from Auto_Use/windows_use/agent/domain_knowledge/service.py
rename to Auto_Use/windows_use/agent/skills/service.py
index 9fa2535..f3a6357 100644
--- a/Auto_Use/windows_use/agent/domain_knowledge/service.py
+++ b/Auto_Use/windows_use/agent/skills/service.py
@@ -36,17 +36,17 @@ def __init__(self):
self.browser_keywords = ["chrome", "firefox", "edge", "opera", "brave", "safari", "vivaldi", "browser"]
def _load_mappings(self) -> dict:
- """Load domain_knowledge.json mapping file"""
+ """Load skills.json mapping file"""
try:
- json_path = os.path.join(self.current_dir, "domain_knowledge.json")
+ json_path = os.path.join(self.current_dir, "skills.json")
if os.path.exists(json_path):
with open(json_path, 'r', encoding='utf-8') as f:
return json.load(f)
else:
- logger.warning("domain_knowledge.json not found")
+ logger.warning("skills.json not found")
return {"browser": {}, "os": {}}
except Exception as e:
- logger.error(f"Error loading domain_knowledge.json: {str(e)}")
+ logger.error(f"Error loading skills.json: {str(e)}")
return {"browser": {}, "os": {}}
def _is_browser(self, application_name: str) -> bool:
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/domain_knowledge.json b/Auto_Use/windows_use/agent/skills/skills.json
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/domain_knowledge.json
rename to Auto_Use/windows_use/agent/skills/skills.json
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/skyscanner.md b/Auto_Use/windows_use/agent/skills/skyscanner.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/skyscanner.md
rename to Auto_Use/windows_use/agent/skills/skyscanner.md
diff --git a/Auto_Use/windows_use/agent/domain_knowledge/wikipedia.md b/Auto_Use/windows_use/agent/skills/wikipedia.md
similarity index 100%
rename from Auto_Use/windows_use/agent/domain_knowledge/wikipedia.md
rename to Auto_Use/windows_use/agent/skills/wikipedia.md
diff --git a/Auto_Use/windows_use/controller/view.py b/Auto_Use/windows_use/controller/view.py
index 42a0144..98c1ea0 100644
--- a/Auto_Use/windows_use/controller/view.py
+++ b/Auto_Use/windows_use/controller/view.py
@@ -569,7 +569,7 @@ def route_action(self, action_data):
]
else:
cli_cmd = [
- sys.executable, "-m", "Auto_Use.windows_use.agent.cli",
+ sys.executable, "-m", "Auto_Use.windows_use.agent.coder",
"--task", task_description,
"--provider", self.provider,
"--model", self.model,
@@ -706,7 +706,7 @@ def watch_cli_result(rf=result_file):
]
else:
cli_cmd = [
- sys.executable, "-m", "Auto_Use.windows_use.agent.cli.minions",
+ sys.executable, "-m", "Auto_Use.windows_use.agent.minions",
"--task", minion_query,
"--provider", self.provider,
"--model", self.model,
diff --git a/Auto_Use/windows_use/llm_provider/llm_manager.py b/Auto_Use/windows_use/llm_provider/llm_manager.py
index 0a49704..72e7682 100644
--- a/Auto_Use/windows_use/llm_provider/llm_manager.py
+++ b/Auto_Use/windows_use/llm_provider/llm_manager.py
@@ -17,6 +17,7 @@
# A small attribution goes a long way toward a healthy open-source
# community — thank you for contributing.
+import copy
import os
import time
from typing import Optional
@@ -438,55 +439,65 @@ def _initialize_provider(self):
raise ValueError(f"Unsupported provider: {self.provider}")
def send_request(self, messages: list, annotated_screenshot_base64: Optional[str] = None):
- """Send request to the selected provider"""
- # Retry up to 3 times with 1 second delay
+ """Send request to the selected provider with idempotent retries."""
+ last_error = None
for attempt in range(3):
+ # Providers may mutate messages in-place (e.g. wrapping the last user
+ # message into multimodal content blocks); deep-copy per attempt so
+ # those mutations cannot compound across retries.
+ attempt_messages = copy.deepcopy(messages)
try:
- response = self.provider_instance.send_request(messages, self.model, annotated_screenshot_base64)
-
- # Extract the assistant's response
+ response = self.provider_instance.send_request(
+ attempt_messages, self.model, annotated_screenshot_base64
+ )
return response['choices'][0]['message']['content']
except Exception as e:
- if attempt < 2: # If not the last attempt
- print(f"⚠️ API request failed (attempt {attempt + 1}/3), retrying in 1 second...")
+ last_error = e
+ if attempt < 2:
+ print(f"⚠️ API request failed (attempt {attempt + 1}/3): {e}")
+ print(" Retrying in 1 second with a fresh message copy...")
time.sleep(1)
continue
- else:
- # CLI agent: seamless fallback to secondary model (never die)
- if self.cli_agent and hasattr(self, '_cli_fallback_model') and self._cli_fallback_model:
- print(f"⚠️ CLI Agent: {self.display_name} failed after 3 attempts. Switching to fallback...")
- # Resolve fallback model info (same provider, different model)
- if self.provider == "openrouter":
- model_info = get_openrouter_model_info(self._cli_fallback_model)
- elif self.provider == "groq":
- model_info = get_groq_model_info(self._cli_fallback_model)
- elif self.provider == "openai":
- model_info = get_openai_model_info(self._cli_fallback_model)
- elif self.provider == "anthropic":
- model_info = get_anthropic_model_info(self._cli_fallback_model)
- elif self.provider == "google":
- model_info = get_google_model_info(self._cli_fallback_model)
- elif self.provider == "perplexity":
- model_info = get_perplexity_model_info(self._cli_fallback_model)
- else:
- raise e
- # Hot-swap model (provider stays the same, no re-init needed)
- self.model = model_info["api_name"]
- self.has_vision = model_info["vision"]
- self.display_name = model_info["display_name"]
- self.model_info = model_info
- # Clear fallback so we don't loop forever
- self._cli_fallback_model = None
- print(f"✅ CLI Agent: Now using {self.display_name}")
- # Retry with fallback (same messages, full history intact)
- try:
- response = self.provider_instance.send_request(messages, self.model, annotated_screenshot_base64)
- return response['choices'][0]['message']['content']
- except Exception as fallback_e:
- print(f"❌ CLI Agent: Fallback {self.display_name} also failed: {fallback_e}")
- raise fallback_e
- else:
- raise e
+ print(f"❌ API request failed after 3 attempts: {e}")
+ break
+
+ # All 3 attempts failed. CLI agent: seamless fallback to secondary model (never die)
+ if self.cli_agent and hasattr(self, '_cli_fallback_model') and self._cli_fallback_model:
+ print(f"⚠️ CLI Agent: {self.display_name} failed after 3 attempts. Switching to fallback...")
+ # Resolve fallback model info (same provider, different model)
+ if self.provider == "openrouter":
+ model_info = get_openrouter_model_info(self._cli_fallback_model)
+ elif self.provider == "groq":
+ model_info = get_groq_model_info(self._cli_fallback_model)
+ elif self.provider == "openai":
+ model_info = get_openai_model_info(self._cli_fallback_model)
+ elif self.provider == "anthropic":
+ model_info = get_anthropic_model_info(self._cli_fallback_model)
+ elif self.provider == "google":
+ model_info = get_google_model_info(self._cli_fallback_model)
+ elif self.provider == "perplexity":
+ model_info = get_perplexity_model_info(self._cli_fallback_model)
+ else:
+ raise last_error
+ # Hot-swap model (provider stays the same, no re-init needed)
+ self.model = model_info["api_name"]
+ self.has_vision = model_info["vision"]
+ self.display_name = model_info["display_name"]
+ self.model_info = model_info
+ # Clear fallback so we don't loop forever
+ self._cli_fallback_model = None
+ print(f"✅ CLI Agent: Now using {self.display_name}")
+ # Retry with fallback (fresh copy, full history intact)
+ try:
+ response = self.provider_instance.send_request(
+ copy.deepcopy(messages), self.model, annotated_screenshot_base64
+ )
+ return response['choices'][0]['message']['content']
+ except Exception as fallback_e:
+ print(f"❌ CLI Agent: Fallback {self.display_name} also failed: {fallback_e}")
+ raise fallback_e
+ else:
+ raise last_error
def get_model_name(self) -> str:
"""Get the current model short name (preserves vertex suffix for downstream routing)"""
diff --git a/Auto_Use/windows_use/llm_provider/openai/view.py b/Auto_Use/windows_use/llm_provider/openai/view.py
index 09a1d3c..bdabfb0 100644
--- a/Auto_Use/windows_use/llm_provider/openai/view.py
+++ b/Auto_Use/windows_use/llm_provider/openai/view.py
@@ -34,6 +34,20 @@
"display_name": "GPT-5.4",
"reasoning_support": True,
"json_mode": True
+ },
+ "gpt-5.5": {
+ "api_name": "gpt-5.5",
+ "vision": True,
+ "display_name": "GPT-5.5",
+ "reasoning_support": True,
+ "json_mode": True
+ },
+ "gpt-5.5-pro": {
+ "api_name": "gpt-5.5-pro",
+ "vision": True,
+ "display_name": "GPT-5.5 Pro",
+ "reasoning_support": True,
+ "json_mode": True
}
}
diff --git a/Auto_Use/windows_use/llm_provider/openrouter/view.py b/Auto_Use/windows_use/llm_provider/openrouter/view.py
index c4992a0..e8a0ab3 100644
--- a/Auto_Use/windows_use/llm_provider/openrouter/view.py
+++ b/Auto_Use/windows_use/llm_provider/openrouter/view.py
@@ -47,6 +47,18 @@
"display_name": "GPT-5.4 Pro",
"reasoning_support": False
},
+ "gpt-5.5": {
+ "api_name": "openai/gpt-5.5",
+ "vision": True,
+ "display_name": "GPT-5.5",
+ "reasoning_support": True
+ },
+ "gpt-5.5-pro": {
+ "api_name": "openai/gpt-5.5-pro",
+ "vision": True,
+ "display_name": "GPT-5.5 Pro",
+ "reasoning_support": True
+ },
"claude-opus-4.7": {
"api_name": "anthropic/claude-opus-4.7",
"vision": True,
@@ -75,11 +87,37 @@
"reasoning_support": True,
"reasoning_effort": "low"
},
+ "grok-4.3": {
+ "api_name": "x-ai/grok-4.3",
+ "vision": True,
+ "display_name": "Grok 4.3",
+ "reasoning_support": True,
+ "reasoning_effort": "low"
+ },
"kimi-k2.6": {
"api_name": "moonshotai/kimi-k2.6",
"vision": True,
"display_name": "Kimi K2.6",
"reasoning_support": False
+ },
+ "claude-opus-4.7-fast": {
+ "api_name": "anthropic/claude-opus-4.7-fast",
+ "vision": True,
+ "display_name": "Claude Opus 4.7 Fast",
+ "reasoning_support": True,
+ "reasoning_effort": "low"
+ },
+ "mistral-medium-3.5": {
+ "api_name": "mistralai/mistral-medium-3-5",
+ "vision": True,
+ "display_name": "Mistral Medium 3.5",
+ "reasoning_support": False
+ },
+ "qwen-3.6-plus": {
+ "api_name": "qwen/qwen3.6-plus",
+ "vision": True,
+ "display_name": "Qwen 3.6 Plus",
+ "reasoning_support": False
}
}
diff --git a/Auto_Use/windows_use/remote_connection/telegram/service.py b/Auto_Use/windows_use/remote_connection/telegram/service.py
index 55e2a5c..613b8ae 100644
--- a/Auto_Use/windows_use/remote_connection/telegram/service.py
+++ b/Auto_Use/windows_use/remote_connection/telegram/service.py
@@ -678,7 +678,7 @@ def _run_agent(task, provider, model, chat_id, bot, loop):
try:
# Imported lazily — pulls in tree/element → skimage etc., which we
# don't want to load until a task actually runs.
- from Auto_Use.windows_use.agent.service import AgentService
+ from Auto_Use.windows_use.agent.main_driver.service import AgentService
# Look up the runtime API key for the chosen provider so
# LLMManager doesn't fall back to an os.getenv() that the user
diff --git a/README.md b/README.md
index d97dd1a..10be53a 100644
--- a/README.md
+++ b/README.md
@@ -81,10 +81,10 @@ Each Minion runs in its own session-isolated scratchpad at `cli_minion/{session_
python cli.py
# CLI Agent with a specific task
-python -m Auto_Use.macOS_use.agent.cli --task "refactor the auth module"
+python -m Auto_Use.macOS_use.agent.coder --task "refactor the auth module"
# Single Minion for a quick read-only question
-python -m Auto_Use.macOS_use.agent.cli.minions --task "where is _validate_token defined and who calls it?"
+python -m Auto_Use.macOS_use.agent.minions --task "where is _validate_token defined and who calls it?"
```
diff --git a/app.py b/app.py
index 0aea3c8..bd69fdc 100644
--- a/app.py
+++ b/app.py
@@ -875,7 +875,7 @@ def monitor_milestones():
try:
AgentService = importlib.import_module(
- f"Auto_Use.{PLATFORM_PKG}.agent.service"
+ f"Auto_Use.{PLATFORM_PKG}.agent.main_driver.service"
).AgentService
agent = AgentService(
@@ -1027,7 +1027,7 @@ def main():
sys.argv.remove("--cli-mode")
try:
cli_main = importlib.import_module(
- f"Auto_Use.{PLATFORM_PKG}.agent.cli.__main__"
+ f"Auto_Use.{PLATFORM_PKG}.agent.coder.__main__"
).main
cli_main()
except Exception:
@@ -1041,7 +1041,7 @@ def main():
sys.argv.remove("--minion-mode")
try:
minion_main = importlib.import_module(
- f"Auto_Use.{PLATFORM_PKG}.agent.cli.minions.__main__"
+ f"Auto_Use.{PLATFORM_PKG}.agent.minions.__main__"
).main
minion_main()
except Exception:
diff --git a/cli.py b/cli.py
index 71d6790..bc4fa86 100644
--- a/cli.py
+++ b/cli.py
@@ -22,9 +22,9 @@
import platform
if platform.system() == "Darwin":
- from Auto_Use.macOS_use.agent.cli import AgentService
+ from Auto_Use.macOS_use.agent.coder import AgentService
elif platform.system() == "Windows":
- from Auto_Use.windows_use.agent.cli import AgentService
+ from Auto_Use.windows_use.agent.coder import AgentService
else:
raise RuntimeError(f"Unsupported OS: {platform.system()}")
diff --git a/main.py b/main.py
index 68a814d..2113a6f 100644
--- a/main.py
+++ b/main.py
@@ -21,15 +21,15 @@
import platform
if platform.system() == "Darwin":
- from Auto_Use.macOS_use.agent.service import AgentService
+ from Auto_Use.macOS_use.agent.main_driver.service import AgentService
elif platform.system() == "Windows":
- from Auto_Use.windows_use.agent.service import AgentService
+ from Auto_Use.windows_use.agent.main_driver.service import AgentService
else:
raise RuntimeError(f"Unsupported OS: {platform.system()}")
# Configuration
PROVIDER = "openrouter"
-MODEL = "gemini-3.5-flash" #refer to the model name correctly from model_list.txt.
+MODEL = "qwen-3.6-flash" #refer to the model name correctly from model_list.txt.
# Your task here
task = """
diff --git a/model_list.txt b/model_list.txt
index 9c261f0..85a343c 100644
--- a/model_list.txt
+++ b/model_list.txt
@@ -18,11 +18,17 @@ gemini-3.1-pro
gemini-3.5-flash
gpt-5.4-mini
gpt-5.4-pro
+gpt-5.5
+gpt-5.5-pro
claude-opus-4.6
+claude-opus-4.7-fast
claude-sonnet-4.6
grok-4-fast
grok-4.1-fast
-kimi-k2.5
+grok-4.3
+kimi-k2.6
+mistral-medium-3.5
+qwen-3.6-plus
--------------------------------------------------------------
@@ -40,6 +46,8 @@ MODEL name
--------------------------------------------------------------
gpt-5.4-mini
gpt-5.4
+gpt-5.5
+gpt-5.5-pro
--------------------------------------------------------------