Update dependencies and enhance installation scripts

- Added `prompt_toolkit` as a direct dependency for interactive CLI support.
- Updated `modal` optional dependency to require `swe-rex[modal]>=1.4.0` for improved cloud execution capabilities.
- Enhanced `messaging` optional dependencies to include `aiohttp>=3.9.0` for WhatsApp bridge communication.
- Refined installation scripts to check for Python version requirements, emphasizing the need for Python 3.11+ for RL training tools.
- Improved setup scripts to ensure proper installation of submodules and dependencies, enhancing user experience during setup.
This commit is contained in:
teknium 2026-02-07 00:05:04 +00:00
parent 8dd38318fc
commit ac79725923
11 changed files with 553 additions and 128 deletions

2
.gitignore vendored
View file

@ -39,6 +39,8 @@ agent-browser/
*.pem *.pem
privvy* privvy*
images/ images/
__pycache__/
hermes_agent.egg-info/
# CLI config (may contain sensitive SSH paths) # CLI config (may contain sensitive SSH paths)
cli-config.yaml cli-config.yaml

343
README.md
View file

@ -15,9 +15,9 @@ irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/ins
``` ```
The installer will: The installer will:
- Clone to `~/.hermes-agent` (with submodules: mini-swe-agent, tinker-atropos) - Clone to `~/.hermes/hermes-agent` (with submodules: mini-swe-agent, tinker-atropos)
- Create a virtual environment - Create a virtual environment (Python 3.11+ recommended)
- Install all dependencies - Install all dependencies and submodule packages
- Run the interactive setup wizard - Run the interactive setup wizard
- Add `hermes` to your PATH - Add `hermes` to your PATH
@ -179,8 +179,8 @@ hermes config set terminal.singularity_image ~/python.sif
**Modal** (serverless cloud): **Modal** (serverless cloud):
```bash ```bash
pip install modal boto3 pip install "swe-rex[modal]" # Installs swe-rex + modal + boto3
modal setup # Authenticate modal setup # Authenticate with Modal
hermes config set terminal.backend modal hermes config set terminal.backend modal
``` ```
@ -275,16 +275,19 @@ See [docs/messaging.md](docs/messaging.md) for WhatsApp and advanced setup.
Train language models with reinforcement learning using the Tinker API and Atropos framework. Train language models with reinforcement learning using the Tinker API and Atropos framework.
> **Note:** RL training tools require **Python 3.11+** (the upstream `tinker` package has this requirement). On Python 3.10, the RL toolset will be automatically disabled — all other features work fine.
#### Requirements #### Requirements
1. **API Keys:** Add to `~/.hermes/.env`: 1. **Python 3.11+** (check with `python3 --version`)
2. **API Keys:** Add to `~/.hermes/.env`:
```bash ```bash
TINKER_API_KEY=your-tinker-key # Get from https://tinker-console.thinkingmachines.ai/keys TINKER_API_KEY=your-tinker-key # Get from https://tinker-console.thinkingmachines.ai/keys
WANDB_API_KEY=your-wandb-key # Get from https://wandb.ai/authorize WANDB_API_KEY=your-wandb-key # Get from https://wandb.ai/authorize
OPENROUTER_API_KEY=your-key # Optional: for rl_test_inference OPENROUTER_API_KEY=your-key # Optional: for rl_test_inference
``` ```
2. **That's it!** tinker-atropos is included as a submodule - no separate installation needed. 3. **That's it!** tinker-atropos is included as a submodule — the installer handles it automatically.
#### Using RL Tools #### Using RL Tools
@ -425,26 +428,332 @@ skills/
## Manual Installation ## Manual Installation
If you prefer not to use the installer: If you prefer full control over the installation process (or the quick-install script doesn't suit your environment), follow these steps to set everything up by hand.
### Prerequisites
| Requirement | Minimum Version | Check Command | Notes |
|-------------|----------------|---------------|-------|
| **Python** | 3.11+ recommended (3.10 minimum) | `python3 --version` | Required. 3.11+ needed for RL training tools |
| **Git** | Any recent | `git --version` | Required |
| **pip** | 21+ | `pip --version` | Comes with Python |
| **Node.js** | 18+ | `node --version` | Optional — needed for browser automation tools |
| **ripgrep** | Any | `rg --version` | Optional — faster file search in terminal tool (falls back to grep) |
<details>
<summary><strong>Installing prerequisites by platform</strong></summary>
**Ubuntu / Debian:**
```bash
sudo apt update
sudo apt install python3.11 python3.11-venv python3-pip git
# Optional:
sudo apt install ripgrep nodejs npm
```
**macOS (Homebrew):**
```bash
brew install python@3.11 git
# Optional:
brew install ripgrep node
```
**Windows (WSL recommended):**
Use the [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/install) and follow the Ubuntu instructions above. Alternatively, use the PowerShell quick-install script at the top of this README.
</details>
---
### Step 1: Clone the Repository
Clone with `--recurse-submodules` to pull the required submodules ([mini-swe-agent](https://github.com/SWE-agent/mini-swe-agent) for the terminal tool backend and [tinker-atropos](https://github.com/nousresearch/tinker-atropos) for RL training):
```bash ```bash
# Clone the repository (with submodules) git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git
cd hermes-agent
```
If you already cloned without `--recurse-submodules`, initialize them manually:
```bash
git submodule update --init --recursive
```
---
### Step 2: Create & Activate a Virtual Environment
A virtual environment keeps Hermes dependencies isolated from your system Python:
```bash
python3 -m venv venv
source venv/bin/activate
# Upgrade core packaging tools
pip install --upgrade pip wheel setuptools
```
> **Tip:** Every time you open a new terminal to use Hermes, activate the venv first:
> `source /path/to/hermes-agent/venv/bin/activate`
---
### Step 3: Install Python Dependencies
Install the main package in editable mode with all optional extras (messaging, cron, CLI menus):
```bash
pip install -e ".[all]"
```
If you only want the core agent (no Telegram/Discord/cron support):
```bash
pip install -e "."
```
<details>
<summary><strong>Optional extras breakdown</strong></summary>
| Extra | What it adds | Install command |
|-------|-------------|-----------------|
| `all` | Everything below | `pip install -e ".[all]"` |
| `messaging` | Telegram & Discord gateway | `pip install -e ".[messaging]"` |
| `cron` | Cron expression parsing for scheduled tasks | `pip install -e ".[cron]"` |
| `cli` | Terminal menu UI for setup wizard | `pip install -e ".[cli]"` |
| `modal` | Modal cloud execution backend (swe-rex + modal + boto3) | `pip install -e ".[modal]"` |
| `dev` | pytest & test utilities | `pip install -e ".[dev]"` |
You can combine extras: `pip install -e ".[messaging,cron]"`
</details>
---
### Step 4: Install Submodule Packages
These are local packages checked out as Git submodules. Install them in editable mode:
```bash
# Terminal tool backend (required for the terminal/command-execution tool)
pip install -e "./mini-swe-agent"
# RL training backend (requires Python 3.11+)
pip install -e "./tinker-atropos"
```
Both are optional — if you skip them, the corresponding toolsets simply won't be available.
> **Note:** `tinker-atropos` requires Python 3.11+ (the upstream `tinker` package has this constraint). On Python 3.10, skip this line — RL tools will be disabled but everything else works.
---
### Step 5: Install Node.js Dependencies (Optional)
Only needed if you plan to use the **browser automation** toolset (Browserbase-powered):
```bash
npm install
```
This installs the `agent-browser` package defined in `package.json`. Skip this step if you don't need browser tools.
---
### Step 6: Create the Configuration Directory
Hermes stores all user configuration in `~/.hermes/`:
```bash
# Create the directory structure
mkdir -p ~/.hermes/{cron,sessions,logs}
# Copy the example config file
cp cli-config.yaml.example ~/.hermes/config.yaml
# Create an empty .env file for API keys
touch ~/.hermes/.env
```
Your `~/.hermes/` directory should now look like:
```
~/.hermes/
├── config.yaml # Agent settings (model, terminal, toolsets, compression, etc.)
├── .env # API keys and secrets (one per line: KEY=value)
├── cron/ # Scheduled job data
├── sessions/ # Messaging gateway sessions
└── logs/ # Conversation logs
```
---
### Step 7: Add Your API Keys
Open `~/.hermes/.env` in your editor and add at minimum an LLM provider key:
```bash
# Required — at least one LLM provider:
OPENROUTER_API_KEY=sk-or-v1-your-key-here
# Optional — enable additional tools:
FIRECRAWL_API_KEY=fc-your-key # Web search & scraping
BROWSERBASE_API_KEY=bb-your-key # Browser automation
BROWSERBASE_PROJECT_ID=your-project-id # Browser automation
FAL_KEY=your-fal-key # Image generation (FLUX)
TINKER_API_KEY=your-tinker-key # RL training
WANDB_API_KEY=your-wandb-key # RL training metrics
# Optional — messaging gateway:
TELEGRAM_BOT_TOKEN=123456:ABC-DEF # From @BotFather
TELEGRAM_ALLOWED_USERS=your-user-id # Comma-separated
DISCORD_BOT_TOKEN=MTIz... # From Developer Portal
DISCORD_ALLOWED_USERS=your-user-id # Comma-separated
```
Or set them one at a time via the CLI:
```bash
hermes config set OPENROUTER_API_KEY sk-or-v1-your-key-here
```
---
### Step 8: Add `hermes` to Your PATH
The `hermes` command is installed into the virtual environment's `bin/` directory. Add it to your shell PATH so you can run `hermes` from anywhere:
**Bash** (`~/.bashrc`):
```bash
echo '' >> ~/.bashrc
echo '# Hermes Agent' >> ~/.bashrc
echo 'export PATH="$HOME/hermes-agent/venv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```
**Zsh** (`~/.zshrc`):
```bash
echo '' >> ~/.zshrc
echo '# Hermes Agent' >> ~/.zshrc
echo 'export PATH="$HOME/hermes-agent/venv/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```
**Fish** (`~/.config/fish/config.fish`):
```fish
fish_add_path $HOME/hermes-agent/venv/bin
```
> **Note:** Adjust the path if you cloned to a different location. The key is to add the `venv/bin` directory inside your clone to your PATH.
Alternatively, if you don't want to modify your PATH, you can create a symlink:
```bash
mkdir -p ~/.local/bin
ln -sf "$(pwd)/venv/bin/hermes" ~/.local/bin/hermes
```
(Most distributions already have `~/.local/bin` on the PATH.)
---
### Step 9: Run the Setup Wizard (Optional)
The interactive setup wizard walks you through configuring your API keys and preferences:
```bash
hermes setup
```
This is optional if you already configured `~/.hermes/.env` and `~/.hermes/config.yaml` manually in the steps above.
---
### Step 10: Verify the Installation
```bash
# Check that the command is available
hermes version
# Run diagnostics to verify everything is working
hermes doctor
# Check your configuration
hermes status
# Test with a quick query
hermes chat -q "Hello! What tools do you have available?"
```
If `hermes doctor` reports issues, it will tell you exactly what's missing and how to fix it.
---
### Quick-Reference: Manual Install (Condensed)
For those who just want the commands without the explanations:
```bash
# Clone & enter
git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git
cd hermes-agent cd hermes-agent
# Run setup script # Virtual environment
./setup-hermes.sh
# Or manually:
python3 -m venv venv python3 -m venv venv
source venv/bin/activate source venv/bin/activate
pip install --upgrade pip wheel setuptools
# Install everything
pip install -e ".[all]" pip install -e ".[all]"
pip install -e "./mini-swe-agent"
pip install -e "./tinker-atropos"
npm install # optional, for browser tools
# Install submodules (required for terminal and RL tools) # Configure
pip install -e "./mini-swe-agent" # Terminal tool backend mkdir -p ~/.hermes/{cron,sessions,logs}
pip install -e "./tinker-atropos" # RL training backend cp cli-config.yaml.example ~/.hermes/config.yaml
touch ~/.hermes/.env
echo 'OPENROUTER_API_KEY=sk-or-v1-your-key' >> ~/.hermes/.env
hermes setup # Add to PATH (adjust for your shell)
echo 'export PATH="'$(pwd)'/venv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
# Verify
hermes doctor
hermes
```
---
### Updating a Manual Installation
To update an existing manual install to the latest version:
```bash
cd /path/to/hermes-agent
source venv/bin/activate
# Pull latest code and submodules
git pull origin main
git submodule update --init --recursive
# Reinstall (picks up new dependencies)
pip install -e ".[all]"
pip install -e "./mini-swe-agent"
pip install -e "./tinker-atropos"
# Check for new config options added since your last update
hermes config check
hermes config migrate # Interactively add any missing options
```
### Uninstalling a Manual Installation
```bash
# Remove the cloned repository
rm -rf /path/to/hermes-agent
# Remove user configuration (optional — keep if you plan to reinstall)
rm -rf ~/.hermes
# Remove the PATH line from your shell config (~/.bashrc or ~/.zshrc)
# Look for the "# Hermes Agent" comment and remove that block
``` ```
--- ---

View file

@ -1,70 +0,0 @@
---
name: example-skill
description: An example skill demonstrating the skill file format and structure
---
# Example Skill
This is an example skill file that demonstrates how to create skills for the Hermes Agent.
## Skill File Format
Skills are markdown files with YAML frontmatter at the top:
```yaml
---
name: your-skill-name
description: A brief one-line description of what this skill does
---
```
The frontmatter fields:
- **name**: The identifier used to reference this skill (lowercase, hyphens for spaces)
- **description**: A brief description shown when listing skills (keep under 200 chars)
## Writing Effective Skills
### 1. Be Specific and Actionable
Good skills provide clear, actionable instructions:
```
When reviewing code:
1. Check for security vulnerabilities first
2. Verify error handling is comprehensive
3. Ensure tests cover edge cases
```
### 2. Include Examples
Show concrete examples of what you want:
```python
# Good: Descriptive variable names
user_authentication_token = get_token()
# Bad: Cryptic abbreviations
uat = gt()
```
### 3. Define When to Use
Help the agent understand when this skill applies:
> Use this skill when: reviewing pull requests, auditing security, or checking code quality.
## Skill Categories
Consider organizing skills by purpose:
- **Conventions**: Coding standards, API patterns, naming rules
- **Workflows**: Step-by-step processes for deployments, reviews, releases
- **Knowledge**: Domain-specific information, system architecture, gotchas
- **Templates**: Boilerplate for common tasks, response formats
## Tips
1. Keep the description concise - it's shown in the skills list
2. Use headers to organize longer skills
3. Include code examples where helpful
4. Reference other skills if they're related

View file

@ -58,8 +58,11 @@ def run_doctor(args):
print(color("◆ Python Environment", Colors.CYAN, Colors.BOLD)) print(color("◆ Python Environment", Colors.CYAN, Colors.BOLD))
py_version = sys.version_info py_version = sys.version_info
if py_version >= (3, 10): if py_version >= (3, 11):
check_ok(f"Python {py_version.major}.{py_version.minor}.{py_version.micro}") check_ok(f"Python {py_version.major}.{py_version.minor}.{py_version.micro}")
elif py_version >= (3, 10):
check_ok(f"Python {py_version.major}.{py_version.minor}.{py_version.micro}")
check_warn("Python 3.11+ recommended for RL Training tools (tinker requires >= 3.11)")
elif py_version >= (3, 8): elif py_version >= (3, 8):
check_warn(f"Python {py_version.major}.{py_version.minor}.{py_version.micro}", "(3.10+ recommended)") check_warn(f"Python {py_version.major}.{py_version.minor}.{py_version.micro}", "(3.10+ recommended)")
else: else:
@ -263,6 +266,39 @@ def run_doctor(args):
except Exception as e: except Exception as e:
check_warn("Anthropic API", f"({e})") check_warn("Anthropic API", f"({e})")
# =========================================================================
# Check: Submodules
# =========================================================================
print()
print(color("◆ Submodules", Colors.CYAN, Colors.BOLD))
# mini-swe-agent (terminal tool backend)
mini_swe_dir = PROJECT_ROOT / "mini-swe-agent"
if mini_swe_dir.exists() and (mini_swe_dir / "pyproject.toml").exists():
try:
__import__("minisweagent")
check_ok("mini-swe-agent", "(terminal backend)")
except ImportError:
check_warn("mini-swe-agent found but not installed", "(run: pip install -e ./mini-swe-agent)")
issues.append("Install mini-swe-agent: pip install -e ./mini-swe-agent")
else:
check_warn("mini-swe-agent not found", "(run: git submodule update --init --recursive)")
# tinker-atropos (RL training backend)
tinker_dir = PROJECT_ROOT / "tinker-atropos"
if tinker_dir.exists() and (tinker_dir / "pyproject.toml").exists():
if py_version >= (3, 11):
try:
__import__("tinker_atropos")
check_ok("tinker-atropos", "(RL training backend)")
except ImportError:
check_warn("tinker-atropos found but not installed", "(run: pip install -e ./tinker-atropos)")
issues.append("Install tinker-atropos: pip install -e ./tinker-atropos")
else:
check_warn("tinker-atropos requires Python 3.11+", f"(current: {py_version.major}.{py_version.minor})")
else:
check_warn("tinker-atropos not found", "(run: git submodule update --init --recursive)")
# ========================================================================= # =========================================================================
# Check: Tool Availability # Check: Tool Availability
# ========================================================================= # =========================================================================

View file

@ -652,6 +652,23 @@ def run_setup_wizard(args):
print_info("Modal Cloud Configuration:") print_info("Modal Cloud Configuration:")
print_info("Get credentials at: https://modal.com/settings") print_info("Get credentials at: https://modal.com/settings")
# Check if swe-rex[modal] is installed, install if missing
try:
from swerex.deployment.modal import ModalDeployment
print_info("swe-rex[modal] package: installed ✓")
except ImportError:
print_info("Installing required package: swe-rex[modal]...")
import subprocess
result = subprocess.run(
[sys.executable, "-m", "pip", "install", "swe-rex[modal]>=1.4.0"],
capture_output=True, text=True
)
if result.returncode == 0:
print_success("swe-rex[modal] installed (includes modal + boto3)")
else:
print_warning("Failed to install swe-rex[modal] — install manually:")
print_info(' pip install "swe-rex[modal]>=1.4.0"')
# Always show current status and allow reconfiguration # Always show current status and allow reconfiguration
current_token = get_env_value('MODAL_TOKEN_ID') current_token = get_env_value('MODAL_TOKEN_ID')
if current_token: if current_token:
@ -917,6 +934,24 @@ def run_setup_wizard(args):
save_env_value("BROWSERBASE_API_KEY", api_key) save_env_value("BROWSERBASE_API_KEY", api_key)
if project_id: if project_id:
save_env_value("BROWSERBASE_PROJECT_ID", project_id) save_env_value("BROWSERBASE_PROJECT_ID", project_id)
# Check if Node.js dependencies are installed (required for browser tools)
import shutil
node_modules = PROJECT_ROOT / "node_modules" / "agent-browser"
if not node_modules.exists() and shutil.which("npm"):
print_info(" Installing Node.js dependencies for browser tools...")
import subprocess
result = subprocess.run(
["npm", "install", "--silent"],
capture_output=True, text=True, cwd=str(PROJECT_ROOT)
)
if result.returncode == 0:
print_success(" Node.js dependencies installed")
else:
print_warning(" npm install failed — run manually: cd ~/.hermes/hermes-agent && npm install")
elif not node_modules.exists():
print_warning(" Node.js not found — browser tools require: npm install (in the hermes-agent directory)")
print_success(" Configured ✓") print_success(" Configured ✓")
print() print()
@ -950,6 +985,11 @@ def run_setup_wizard(args):
tinker_configured = get_env_value('TINKER_API_KEY') tinker_configured = get_env_value('TINKER_API_KEY')
wandb_configured = get_env_value('WANDB_API_KEY') wandb_configured = get_env_value('WANDB_API_KEY')
# Check Python version requirement upfront
rl_python_ok = sys.version_info >= (3, 11)
if not rl_python_ok:
print_warning(f" Requires Python 3.11+ (current: {sys.version_info.major}.{sys.version_info.minor})")
if tinker_configured and wandb_configured: if tinker_configured and wandb_configured:
print_success(" Status: Configured ✓") print_success(" Status: Configured ✓")
if prompt_yes_no(" Update RL training credentials?", False): if prompt_yes_no(" Update RL training credentials?", False):
@ -969,6 +1009,11 @@ def run_setup_wizard(args):
print_warning(" Status: Not configured (tools will be disabled)") print_warning(" Status: Not configured (tools will be disabled)")
if prompt_yes_no(" Set up RL Training?", False): if prompt_yes_no(" Set up RL Training?", False):
# Check Python version before proceeding
if not rl_python_ok:
print_error(f" Python 3.11+ required (current: {sys.version_info.major}.{sys.version_info.minor})")
print_info(" Upgrade Python and reinstall to enable RL training tools")
else:
print_info(" Get Tinker key at: https://tinker-console.thinkingmachines.ai/keys") print_info(" Get Tinker key at: https://tinker-console.thinkingmachines.ai/keys")
print_info(" Get WandB key at: https://wandb.ai/authorize") print_info(" Get WandB key at: https://wandb.ai/authorize")
api_key = prompt(" Tinker API key", password=True) api_key = prompt(" Tinker API key", password=True)
@ -977,6 +1022,29 @@ def run_setup_wizard(args):
wandb_key = prompt(" WandB API key", password=True) wandb_key = prompt(" WandB API key", password=True)
if wandb_key: if wandb_key:
save_env_value("WANDB_API_KEY", wandb_key) save_env_value("WANDB_API_KEY", wandb_key)
# Check if tinker-atropos submodule is installed
try:
__import__("tinker_atropos")
except ImportError:
tinker_dir = PROJECT_ROOT / "tinker-atropos"
if tinker_dir.exists() and (tinker_dir / "pyproject.toml").exists():
print_info(" Installing tinker-atropos submodule...")
import subprocess
result = subprocess.run(
[sys.executable, "-m", "pip", "install", "-e", str(tinker_dir)],
capture_output=True, text=True
)
if result.returncode == 0:
print_success(" tinker-atropos installed")
else:
print_warning(" tinker-atropos install failed — run manually:")
print_info(' pip install -e "./tinker-atropos"')
else:
print_warning(" tinker-atropos submodule not found — run:")
print_info(" git submodule update --init --recursive")
print_info(' pip install -e "./tinker-atropos"')
if api_key and wandb_key: if api_key and wandb_key:
print_success(" Configured ✓") print_success(" Configured ✓")
else: else:

View file

@ -22,6 +22,8 @@ dependencies = [
"requests", "requests",
"jinja2", "jinja2",
"pydantic>=2.0", "pydantic>=2.0",
# Interactive CLI (prompt_toolkit is used directly by cli.py)
"prompt_toolkit",
# Tools # Tools
"firecrawl-py", "firecrawl-py",
"fal-client", "fal-client",
@ -32,12 +34,12 @@ dependencies = [
] ]
[project.optional-dependencies] [project.optional-dependencies]
modal = ["modal", "boto3"] modal = ["swe-rex[modal]>=1.4.0"]
dev = ["pytest", "pytest-asyncio"] dev = ["pytest", "pytest-asyncio"]
messaging = ["python-telegram-bot>=20.0", "discord.py>=2.0"] messaging = ["python-telegram-bot>=20.0", "discord.py>=2.0", "aiohttp>=3.9.0"]
cron = ["croniter"] cron = ["croniter"]
cli = ["simple-term-menu"] cli = ["simple-term-menu"]
all = ["croniter", "python-telegram-bot>=20.0", "discord.py>=2.0", "simple-term-menu"] all = ["croniter", "python-telegram-bot>=20.0", "discord.py>=2.0", "aiohttp>=3.9.0", "simple-term-menu"]
[project.scripts] [project.scripts]
hermes = "hermes_cli.main:main" hermes = "hermes_cli.main:main"

View file

@ -6,6 +6,10 @@ httpx
rich rich
tenacity tenacity
prompt_toolkit prompt_toolkit
pyyaml
requests
jinja2
pydantic>=2.0
# Web tools # Web tools
firecrawl-py firecrawl-py
@ -15,10 +19,6 @@ fal-client
# mini-swe-agent dependencies (for terminal tool) # mini-swe-agent dependencies (for terminal tool)
# Note: Install mini-swe-agent itself with: pip install -e ./mini-swe-agent # Note: Install mini-swe-agent itself with: pip install -e ./mini-swe-agent
pyyaml
requests
jinja2
pydantic>=2.0
litellm>=1.75.5 litellm>=1.75.5
typer typer
platformdirs platformdirs
@ -27,18 +27,17 @@ platformdirs
# Requires Docker installed and user in 'docker' group # Requires Docker installed and user in 'docker' group
# Optional: For Modal backend (cloud execution) # Optional: For Modal backend (cloud execution)
# modal # swe-rex[modal]>=1.4.0 # Includes modal + boto3 + swe-rex runtime
# boto3
# Optional: For cron expression parsing (cronjob scheduling) # Optional: For cron expression parsing (cronjob scheduling)
croniter croniter
# Optional: For messaging platform integrations (gateway) # Optional: For messaging platform integrations (gateway)
# Telegram: pip install python-telegram-bot # Telegram
python-telegram-bot>=20.0 python-telegram-bot>=20.0
# Discord: pip install discord.py # Discord
discord.py>=2.0 discord.py>=2.0
# WhatsApp: Requires Node.js bridge (see docs/messaging.md) # WhatsApp bridge communication + general async HTTP (used by gateway)
# aiohttp # For WhatsApp bridge communication aiohttp>=3.9.0

View file

@ -69,7 +69,7 @@ function Write-Error {
function Test-Python { function Test-Python {
Write-Info "Checking Python..." Write-Info "Checking Python..."
# Try different python commands # Try different python commands (prefer 3.11+ for full feature support)
$pythonCmds = @("python3", "python", "py -3") $pythonCmds = @("python3", "python", "py -3")
foreach ($cmd in $pythonCmds) { foreach ($cmd in $pythonCmds) {
@ -79,7 +79,15 @@ function Test-Python {
$major, $minor = $version.Split('.') $major, $minor = $version.Split('.')
if ([int]$major -ge 3 -and [int]$minor -ge 10) { if ([int]$major -ge 3 -and [int]$minor -ge 10) {
$script:PythonCmd = $cmd $script:PythonCmd = $cmd
$script:PythonVersion = $version
Write-Success "Python $version found" Write-Success "Python $version found"
# Warn if < 3.11 (RL training tools require 3.11+)
if ([int]$minor -lt 11) {
Write-Warning "Python 3.11+ recommended — RL Training tools (tinker-atropos) require >= 3.11"
Write-Info "Core agent features will work fine on $version"
}
return $true return $true
} }
} }
@ -89,7 +97,7 @@ function Test-Python {
} }
Write-Error "Python 3.10+ not found" Write-Error "Python 3.10+ not found"
Write-Info "Please install Python 3.10 or newer from:" Write-Info "Please install Python 3.11 or newer (recommended) from:"
Write-Info " https://www.python.org/downloads/" Write-Info " https://www.python.org/downloads/"
Write-Info "" Write-Info ""
Write-Info "Make sure to check 'Add Python to PATH' during installation" Write-Info "Make sure to check 'Add Python to PATH' during installation"
@ -312,12 +320,19 @@ function Install-Dependencies {
Write-Info "Installing tinker-atropos (RL training backend)..." Write-Info "Installing tinker-atropos (RL training backend)..."
if (Test-Path "tinker-atropos\pyproject.toml") { if (Test-Path "tinker-atropos\pyproject.toml") {
# tinker-atropos depends on the 'tinker' package which requires Python >= 3.11
$major, $minor = $PythonVersion.Split('.')
if ([int]$minor -ge 11) {
try { try {
pip install -e ".\tinker-atropos" 2>&1 | Out-Null pip install -e ".\tinker-atropos" 2>&1 | Out-Null
Write-Success "tinker-atropos installed" Write-Success "tinker-atropos installed"
} catch { } catch {
Write-Warning "tinker-atropos install failed (RL tools may not work)" Write-Warning "tinker-atropos install failed (RL tools may not work)"
} }
} else {
Write-Warning "tinker-atropos requires Python 3.11+ (skipping — RL training tools won't be available)"
Write-Info "Upgrade to Python 3.11+ to enable RL training features"
}
} else { } else {
Write-Warning "tinker-atropos not found (run: git submodule update --init)" Write-Warning "tinker-atropos not found (run: git submodule update --init)"
} }

View file

@ -149,22 +149,29 @@ detect_os() {
check_python() { check_python() {
log_info "Checking Python..." log_info "Checking Python..."
# Try different python commands # Try different python commands (prefer 3.11+ for full feature support)
for cmd in python3.12 python3.11 python3.10 python3 python; do for cmd in python3.12 python3.11 python3.10 python3 python; do
if command -v $cmd &> /dev/null; then if command -v $cmd &> /dev/null; then
PYTHON_CMD=$cmd PYTHON_CMD=$cmd
PYTHON_VERSION=$($cmd -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') PYTHON_VERSION=$($cmd -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
# Check version # Check minimum version (3.10)
if python3 -c "import sys; exit(0 if sys.version_info >= (3, 10) else 1)" 2>/dev/null; then if $cmd -c "import sys; exit(0 if sys.version_info >= (3, 10) else 1)" 2>/dev/null; then
log_success "Python $PYTHON_VERSION found" log_success "Python $PYTHON_VERSION found"
# Warn if < 3.11 (RL training tools require 3.11+)
if ! $cmd -c "import sys; exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
log_warn "Python 3.11+ recommended — RL Training tools (tinker-atropos) require >= 3.11"
log_info "Core agent features will work fine on $PYTHON_VERSION"
fi
return 0 return 0
fi fi
fi fi
done done
log_error "Python 3.10+ not found" log_error "Python 3.10+ not found"
log_info "Please install Python 3.10 or newer:" log_info "Please install Python 3.11 or newer (recommended):"
case "$OS" in case "$OS" in
linux) linux)
@ -179,7 +186,7 @@ check_python() {
log_info " sudo pacman -S python" log_info " sudo pacman -S python"
;; ;;
*) *)
log_info " Use your package manager to install Python 3.10+" log_info " Use your package manager to install Python 3.11+"
;; ;;
esac esac
;; ;;
@ -480,8 +487,14 @@ install_deps() {
log_info "Installing tinker-atropos (RL training backend)..." log_info "Installing tinker-atropos (RL training backend)..."
if [ -d "tinker-atropos" ] && [ -f "tinker-atropos/pyproject.toml" ]; then if [ -d "tinker-atropos" ] && [ -f "tinker-atropos/pyproject.toml" ]; then
# tinker-atropos depends on the 'tinker' package which requires Python >= 3.11
if $PYTHON_CMD -c "import sys; exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
pip install -e "./tinker-atropos" > /dev/null 2>&1 || log_warn "tinker-atropos install failed (RL tools may not work)" pip install -e "./tinker-atropos" > /dev/null 2>&1 || log_warn "tinker-atropos install failed (RL tools may not work)"
log_success "tinker-atropos installed" log_success "tinker-atropos installed"
else
log_warn "tinker-atropos requires Python 3.11+ (skipping — RL training tools won't be available)"
log_info "Upgrade to Python 3.11+ to enable RL training features"
fi
else else
log_warn "tinker-atropos not found (run: git submodule update --init)" log_warn "tinker-atropos not found (run: git submodule update --init)"
fi fi

View file

@ -54,6 +54,11 @@ fi
PYTHON_VERSION=$($PYTHON_CMD -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') PYTHON_VERSION=$($PYTHON_CMD -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
echo -e "${GREEN}${NC} Python $PYTHON_VERSION found" echo -e "${GREEN}${NC} Python $PYTHON_VERSION found"
# Warn if < 3.11 (RL training tools require 3.11+)
if ! $PYTHON_CMD -c "import sys; exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
echo -e "${YELLOW}${NC} Python 3.11+ recommended — RL Training tools (tinker-atropos) require >= 3.11"
fi
# ============================================================================ # ============================================================================
# Virtual environment # Virtual environment
# ============================================================================ # ============================================================================
@ -80,6 +85,34 @@ pip install -e ".[all]" > /dev/null 2>&1 || pip install -e "." > /dev/null
echo -e "${GREEN}${NC} Dependencies installed" echo -e "${GREEN}${NC} Dependencies installed"
# ============================================================================
# Submodules (terminal backend + RL training)
# ============================================================================
echo -e "${CYAN}${NC} Installing submodules..."
# mini-swe-agent (terminal tool backend)
if [ -d "mini-swe-agent" ] && [ -f "mini-swe-agent/pyproject.toml" ]; then
pip install -e "./mini-swe-agent" > /dev/null 2>&1 && \
echo -e "${GREEN}${NC} mini-swe-agent installed" || \
echo -e "${YELLOW}${NC} mini-swe-agent install failed (terminal tools may not work)"
else
echo -e "${YELLOW}${NC} mini-swe-agent not found (run: git submodule update --init --recursive)"
fi
# tinker-atropos (RL training backend — requires Python 3.11+)
if [ -d "tinker-atropos" ] && [ -f "tinker-atropos/pyproject.toml" ]; then
if $PYTHON_CMD -c "import sys; exit(0 if sys.version_info >= (3, 11) else 1)" 2>/dev/null; then
pip install -e "./tinker-atropos" > /dev/null 2>&1 && \
echo -e "${GREEN}${NC} tinker-atropos installed" || \
echo -e "${YELLOW}${NC} tinker-atropos install failed (RL tools may not work)"
else
echo -e "${YELLOW}${NC} tinker-atropos requires Python 3.11+ (skipping — RL training tools won't be available)"
fi
else
echo -e "${YELLOW}${NC} tinker-atropos not found (run: git submodule update --init --recursive)"
fi
# ============================================================================ # ============================================================================
# Optional: ripgrep (for faster file search) # Optional: ripgrep (for faster file search)
# ============================================================================ # ============================================================================

View file

@ -1300,10 +1300,26 @@ async def rl_test_inference(
# Requirements Check # Requirements Check
# ============================================================================ # ============================================================================
def check_rl_python_version() -> bool:
"""
Check if Python version meets the minimum for RL tools.
tinker-atropos depends on the 'tinker' package which requires Python >= 3.11.
"""
return sys.version_info >= (3, 11)
def check_rl_api_keys() -> bool: def check_rl_api_keys() -> bool:
""" """
Check if required API keys are available. Check if required API keys and Python version are available.
RL training requires:
- Python >= 3.11 (tinker package requirement)
- TINKER_API_KEY for the Tinker training API
- WANDB_API_KEY for Weights & Biases metrics
""" """
if not check_rl_python_version():
return False
tinker_key = os.getenv("TINKER_API_KEY") tinker_key = os.getenv("TINKER_API_KEY")
wandb_key = os.getenv("WANDB_API_KEY") wandb_key = os.getenv("WANDB_API_KEY")
return bool(tinker_key) and bool(wandb_key) return bool(tinker_key) and bool(wandb_key)
@ -1311,9 +1327,11 @@ def check_rl_api_keys() -> bool:
def get_missing_keys() -> List[str]: def get_missing_keys() -> List[str]:
""" """
Get list of missing required API keys. Get list of missing requirements for RL tools (API keys and Python version).
""" """
missing = [] missing = []
if not check_rl_python_version():
missing.append(f"Python >= 3.11 (current: {sys.version_info.major}.{sys.version_info.minor})")
if not os.getenv("TINKER_API_KEY"): if not os.getenv("TINKER_API_KEY"):
missing.append("TINKER_API_KEY") missing.append("TINKER_API_KEY")
if not os.getenv("WANDB_API_KEY"): if not os.getenv("WANDB_API_KEY"):