Terminal agent with tool execution via Ollama (local), OpenRouter (free cloud), Venice, and Claude.
This project is free and open source. If you find it useful, consider supporting continued development:
We work tirelessly to build tools that help people get shit done - no paywalls, no subscriptions, just code that works. Your support helps keep it that way.
support my fan's work: https://github.com/GCastle-MTE/SentinelFusion
"I want to go back to the fundamentals, build things myself, break things in a lab, understand them from first principles... What you've shared is worth far more than the amount I'm sending."
— @ismailjaweedahmed, 10-year cybersecurity veteran
"For exposing pedo scum. Fan of your work, keep going."
— hxpnctrpstr
"For the children.. and also teach me c#nt"
— Qwenobi
pip install -r requirements.txt
python vader.pyOr batch mode:
python vader.py -b "run whoami" # Ollama (default)
python vader.py -b -r "run whoami" # OpenRouter| Provider | Command | Cost | Notes |
|---|---|---|---|
| Ollama | /model o |
Free | Local, offline, uncensored |
| OpenRouter | /model r |
Free | Cloud, nemotron model |
| Venice | /model v |
Paid | Top up at venice.ai |
| Claude | /model c |
Paid | Uses CLI subscription |
All providers use text-based tool format (no native function calling):
[bash] {"command": "whoami"}
[browser] {"action": "navigate", "url": "https://google.com"}
[whois] {"domain": "example.com"}
[dns] {"domain": "example.com"}
[ports] {"host": "example.com"}
Model outputs this format, VADER parses and executes.
| Command | Action |
|---|---|
/model o |
Switch to Ollama |
/model r |
Switch to OpenRouter |
/model v |
Switch to Venice |
/model c |
Switch to Claude |
/confirm |
Toggle tool confirmation |
/tts on/off |
Text-to-speech |
/stt on/off |
Speech-to-text |
/bypass |
Skip dangerous cmd confirm |
/reset |
Clear context |
/help |
Show all commands |
# Install from https://ollama.com/download
ollama serve
# Pull a model
ollama pull qwen2.5:7bAuto-detects localhost or LAN IP. Override with:
$env:OLLAMA_URL = "http://192.168.1.92:11434"- Get API key at https://openrouter.ai/keys
- Set in environment:
$env:OPENROUTER_API_KEY = "sk-or-v1-your-key"Or add to .env (copy from .env.example).
Default model: nvidia/nemotron-3.5-lightning:free
pip-system-certs is a Python package, not a standalone PowerShell command, which is why your terminal threw that error. To fix the SSLCertVerificationError when connecting to OpenRouter, run one of the following options in your PowerShell window:
Run this command to install the package so Python automatically uses your Windows system certificate trust store:
pip install pip-system-certs
If you are on a restricted network (like a corporate environment or behind a VPN using self-signed certificates) and the installation fails, tell Python's requests library to ignore SSL verification by setting this environment variable before running your script:
$env:CURL_CA_BUNDLE=""
(Note: This applies to the current terminal session. To make it permanent, add os.environ["CURL_CA_BUNDLE"] = "" to the top of your main.py or core.py script right under your imports).
Open your providers.py file, find the line where it makes the API call to openrouter.ai/api/v1/models, and add verify=False to the requests.get() or client initialization. For example:
response = requests.get("https://openrouter.ai", verify=False)
Try Option 1 first, restart your VADER CLI script, and run /ormodel again
Or throw it in AI and solve it yourself.
vader1.12/
├── vader/
│ ├── core.py # Main agent + chat methods
│ ├── providers/
│ │ ├── ollama.py # Ollama + text tool parsing
│ │ ├── openrouter.py # OpenRouter (requests)
│ │ ├── venice.py # Venice API
│ │ └── claude.py # Claude CLI
│ ├── tools/
│ │ ├── __init__.py # Tool registry + schemas
│ │ ├── terminal.py # bash/powershell
│ │ ├── files.py # read/write/glob/grep
│ │ ├── browser.py # kimi-webbridge MCP
│ │ └── recon.py # whois/dns/ports/ssl/headers
│ ├── commands/ # Slash commands
│ └── tts.py / stt.py # Voice
├── requirements.txt
├── .env.example
└── README.md
Problem: Models like qwen2.5 claim tool support but output [bash] {"command": "..."} as text content instead of using the native tool_calls field.
Fix: Text-based parsing in ollama.py:_parse_tool_calls() catches [tool_name] {"args"} format from content and converts to tool calls.
Reference: ollama/ollama#4386
Problem: Using tools=TOOL_SCHEMAS with httpx causes indefinite hang. The API returns eventually but httpx connection stalls.
Fix:
- Use
requestslibrary instead ofhttpx - Don't pass native tools - use same text-based parsing as Ollama
Reference: https://openrouter.ai/docs/guides/features/tool-calling
Problem: Official openrouter pip package SDK doesn't have streaming method that matches httpx patterns.
Fix: Use requests directly with stream=False. Streaming not critical for tool use.
Problem: ollama serve may bind to 0.0.0.0 and only respond on LAN IP (e.g., 192.168.1.92:11434), not localhost.
Fix: Auto-detection in ollama.py:_detect_ollama_url() tries localhost first, then LAN IP.
Problem: [+]/[-] status indicators using Unicode checkmarks fail on Windows cp1252.
Fix: Use ASCII [+]/[-] instead of Unicode checkmarks in recon.py.
Problem: URLs without https:// prefix cause file:// protocol error.
Fix: Auto-add https:// prefix in browser.py if missing.
# Test all tools directly (no LLM)
python test_all_tools.py
# Test CLI batch mode
python vader.py -b "hi"
python vader.py -b "run whoami"
python vader.py -b -r "run hostname"George Wu / 22DIV


