Skip to content
rainfantryPublic

About

VADER 1.2: Terminal + Web interface with Piper TTS and learnable STT

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

VADER 1.2 - Multi-Provider Terminal Agent

preview

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:

Buy Me A Coffee

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.

Wall of Legends

"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

Quick Start

pip install -r requirements.txt
python vader.py

Or batch mode:

python vader.py -b "run whoami"           # Ollama (default)
python vader.py -b -r "run whoami"        # OpenRouter

Providers

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

Tool Calling

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.

Commands

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

Setup

Ollama (Local)

# Install from https://ollama.com/download
ollama serve

# Pull a model
ollama pull qwen2.5:7b

Auto-detects localhost or LAN IP. Override with:

$env:OLLAMA_URL = "http://192.168.1.92:11434"

OpenRouter (Free Cloud)

  1. Get API key at https://openrouter.ai/keys
  2. 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

Issue: Openrouter Cert

or

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:

Option 1: Install it via pip (Recommended)

Run this command to install the package so Python automatically uses your Windows system certificate trust store:

pip install pip-system-certs

Option 2: Quick environment bypass (Fastest)

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).

Option 3: Patch your OpenRouterProvider code

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.

orfix

Architecture

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

Known Issues & Fixes

Issue: Ollama models output JSON as text instead of using tool_calls API

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


Issue: OpenRouter hangs when passing native tools parameter

Problem: Using tools=TOOL_SCHEMAS with httpx causes indefinite hang. The API returns eventually but httpx connection stalls.

Fix:

  1. Use requests library instead of httpx
  2. Don't pass native tools - use same text-based parsing as Ollama

Reference: https://openrouter.ai/docs/guides/features/tool-calling


Issue: OpenRouter SDK chat.stream() doesn't exist

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.


Issue: Ollama binds to LAN IP instead of localhost

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.


Issue: Unicode encoding errors on Windows (checkmark characters)

Problem: [+]/[-] status indicators using Unicode checkmarks fail on Windows cp1252.

Fix: Use ASCII [+]/[-] instead of Unicode checkmarks in recon.py.


Issue: Browser tool fails with ERR_FILE_NOT_FOUND

Problem: URLs without https:// prefix cause file:// protocol error.

Fix: Auto-add https:// prefix in browser.py if missing.


Testing

# 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

About

VADER 1.2: Terminal + Web interface with Piper TTS and learnable STT

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages