openrouter-free
Integrate OpenRouter's free AI models with dynamic discovery, local caching, and fallback routing.
Trigger
User invokes /openrouter-free [command] [args] or asks to "list free models", "chat with a free model", or "check OpenRouter status".
Process
- Environment Check: Ensure
OPENROUTER_API_KEYis set. If missing, show setup instructions and stop. - Initialization: If first run or
initcommand, fetch all models fromGET https://openrouter.ai/api/v1/models. - Caching:
- Store models in
~/.opencode/openrouter-model-cache.json. - Use
0o600permissions. - Respect
CACHE_TTL_MS(default 1h).
- Store models in
- Filtering & Discovery:
- Filter for models containing
:freeor specific capability tags. - Map short aliases (e.g.,
r1,qwen,gemma) to full IDs fromreferences/discovery.md.
- Filter for models containing
- Execution:
- Discovery: List models with
models [filter]. - Interactive: Start REPL with
use <model|alias>. - One-shot: Execute single message with
chat "<msg>" [--model <id>]. - Health: Ping models with
health [model]to report latency.
- Discovery: List models with
- Resilience:
- On 429/5xx, retry with exponential backoff (1s, 2s, 4s).
- On model failure during
useorchat, fallback to the next best model usingfallback-router.ts.
Output
- CLI Listings: Tabular or list format for models and health status.
- Chat: Streaming SSE response for interactive and one-shot modes.
- Cache File: Updated
openrouter-model-cache.jsononrefreshor TTL expiry. - Errors: Graceful exit messages with fix suggestions for common API/Config errors.
Error Handling
| Error | Fix |
|---|---|
| Missing API key | export OPENROUTER_API_KEY="sk-or-v1-..." |
| 429 Rate Limit | Exponential backoff, then notify user. |
| Model 404/503 | Fallback to next best model in registry. |
| Cache Expired | Auto-refresh from API. |
Token Efficiency Rules
- Use
openrouter-free models freeto list available models before suggesting one. - Prefer
openrouter-free healthover individual pings for bulk status. - Cache results locally to avoid redundant API calls.
- Limit model display to
OPENROUTER_MAX_DISPLAY(default 30).
Open-Weight Model Rules
- Strict Command Syntax: Always use the defined CLI commands; do not hallucinate flags.
- Model IDs: Use full provider/model strings (e.g.,
google/gemma-2-9b-it:free) unless an alias is confirmed. - Streaming: Ensure
--stream(if applicable) or default streaming behavior is respected for long outputs. - Environment: Do not modify
.envfiles directly unless instructed; guide the user to set variables.
Boundaries
- Does not manage paid OpenRouter models unless explicitly requested.
- Does not store user chat history beyond the current REPL session.
- Does not modify any project files outside of
~/.opencode/cache.
Usage Examples
# Discover all free models with vision support
openrouter-free models vision
# Chat with the longest-context free model
openrouter-free use best-free
# One-shot with a specific alias
openrouter-free chat "Write a Python HTTP server" --model r1
# Check which free models are responsive
openrouter-free health