LLM orchestrator - route prompts to any model via litellm
Project description
orcx
LLM orchestrator - route prompts to any model via litellm.
Alpha - Core functionality works, API may change.
Why orcx?
- 100+ providers via litellm - OpenRouter, OpenAI, Anthropic, Google, etc.
- Agent presets - Save model + system prompt + parameters as reusable configs
- Conversations - Multi-turn with
-ccontinue and--resume ID - OpenRouter routing - Control quantization, provider selection, sorting
- Cost tracking - See what each request costs
- Simple - Just route prompts, not a full agent framework
Install
uv tool install orcx
# or
pip install orcx
Quick Start
# Set your API key
export OPENROUTER_API_KEY=sk-or-...
# Run a prompt
orcx run -m openrouter/deepseek/deepseek-v3.2 "hello"
# With file context
orcx run -m openrouter/deepseek/deepseek-v3.2 -f code.py "review this"
# Show cost
orcx run -m openrouter/deepseek/deepseek-v3.2 "hello" --cost
Usage
# Direct model (provider/model format)
orcx run -m openrouter/deepseek/deepseek-v3.2 "hello"
# Using model alias (if configured)
orcx run -m deepseek "hello"
# Using agent preset
orcx run -a reviewer "review this code"
# With file context
orcx run -a reviewer -f src/main.py "review this"
# Multiple files
orcx run -m deepseek -f code.py -f tests.py "explain the tests"
# Pipe from stdin
cat code.py | orcx run -a reviewer "review this"
# JSON output (includes usage/cost)
orcx run -m deepseek "hello" --json
# Custom system prompt
orcx run -m deepseek -s "You are a pirate" "greet me"
# Save response to file
orcx run -m deepseek "explain async" -o response.md
Conversations
Conversations are saved automatically. Continue or resume them:
# Start a conversation (prints ID like [a1b2])
orcx run -m deepseek "explain python decorators"
# [a1b2]
# Continue last conversation
orcx run -c "show me an example"
# Resume specific conversation
orcx run --resume a1b2 "what about class decorators?"
# Don't save this exchange
orcx run --no-save -m deepseek "quick question"
# List recent conversations
orcx conversations
# Show full conversation
orcx conversations show a1b2
# Delete conversation
orcx conversations delete a1b2
# Clean old conversations (default: 30 days)
orcx conversations clean --days 7
Conversations are stored in ~/.config/orcx/conversations.db.
Configuration
Config location: ~/.config/orcx/
config.yaml
# Default model (used when no -m or -a specified)
default_model: openrouter/deepseek/deepseek-v3.2
# Model aliases for shorthand
aliases:
deepseek: deepseek/deepseek-v3.2
sonnet: anthropic/claude-4.5-sonnet
# API keys (env vars take precedence)
keys:
openrouter: sk-or-...
agents.yaml
agents:
fast:
model: openrouter/deepseek/deepseek-v3.2
description: Fast, cheap reasoning
temperature: 0.7
max_tokens: 4096
reviewer:
model: anthropic/claude-4.5-sonnet
system_prompt: You are a code reviewer. Be concise and actionable.
# With OpenRouter provider preferences
quality:
model: openrouter/deepseek/deepseek-v3.2
provider_prefs:
min_bits: 8 # fp8+ only (excludes fp4)
ignore: [DeepInfra] # blacklist providers
prefer: [Together] # soft preference
sort: throughput # or: price, latency
Provider Preferences
OpenRouter-specific routing options:
| Option | Type | Description |
|---|---|---|
min_bits |
int | Minimum quantization (8 = fp8+) |
quantizations |
list | Explicit whitelist: [fp8, fp16, bf16] |
exclude_quants |
list | Blacklist: [fp4, int4] |
ignore |
list | Blacklist providers |
only |
list | Whitelist providers (strict) |
prefer |
list | Soft preference (tries first, falls back) |
order |
list | Explicit order |
sort |
str | "price", "throughput", "latency" |
Commands
orcx run "prompt" # Run prompt (uses default model/agent)
orcx run -m MODEL "..." # Use specific model or alias
orcx run -a AGENT "..." # Use agent preset
orcx run -c "..." # Continue last conversation
orcx agents # List configured agents
orcx models # Show model format and examples
orcx conversations # List/manage conversations
orcx --version # Show version
orcx --debug # Show full tracebacks on error
CLI Options
| Option | Short | Description |
|---|---|---|
--model |
-m |
Model or alias to use |
--agent |
-a |
Agent preset to use |
--system |
-s |
System prompt |
--context |
Context to prepend | |
--file |
-f |
Files to include (repeatable) |
--output |
-o |
Write response to file |
--continue |
-c |
Continue last conversation |
--resume |
Resume conversation by ID | |
--no-save |
Don't save conversation | |
--no-stream |
Disable streaming output | |
--cost |
Show cost after response | |
--json |
-j |
Output as JSON |
Environment Variables
API keys loaded from env vars (take precedence over config file):
OPENROUTER_API_KEYOPENAI_API_KEYANTHROPIC_API_KEYDEEPSEEK_API_KEYGOOGLE_API_KEYMISTRAL_API_KEYGROQ_API_KEYTOGETHER_API_KEY
Model Format
Models use provider/model-name format. See your provider's docs for available models:
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file orcx-0.0.4.tar.gz.
File metadata
- Download URL: orcx-0.0.4.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93dd09ea023366aa6b04f324abd75b8d77100f212b1ba7759e464d4a35a2f391
|
|
| MD5 |
25269ddb9a86b5b3a893127f3d0d3ce7
|
|
| BLAKE2b-256 |
c40ef5869d6ca0920d9443e3dc6d9c9bab9a0f5671cce32e3d0fd46cfc3f839f
|
Provenance
The following attestation bundles were made for orcx-0.0.4.tar.gz:
Publisher:
release.yml on nijaru/orcx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orcx-0.0.4.tar.gz -
Subject digest:
93dd09ea023366aa6b04f324abd75b8d77100f212b1ba7759e464d4a35a2f391 - Sigstore transparency entry: 808752950
- Sigstore integration time:
-
Permalink:
nijaru/orcx@43cc55b90d6229abf757537eddc19716fa74b7b6 -
Branch / Tag:
refs/tags/v0.0.4 - Owner: https://github.com/nijaru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@43cc55b90d6229abf757537eddc19716fa74b7b6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file orcx-0.0.4-py3-none-any.whl.
File metadata
- Download URL: orcx-0.0.4-py3-none-any.whl
- Upload date:
- Size: 17.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53992d9dc6453f10aa3b77fbf8d4fb6f2b965adf3ea4e27f9bdea7f0f415633c
|
|
| MD5 |
822c08ea56e85f69f5f47f924ed033f1
|
|
| BLAKE2b-256 |
84f64f81bff17bb0f4be416f3d33c1e531528cd365af30abc3a5fd7f8297ee5a
|
Provenance
The following attestation bundles were made for orcx-0.0.4-py3-none-any.whl:
Publisher:
release.yml on nijaru/orcx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orcx-0.0.4-py3-none-any.whl -
Subject digest:
53992d9dc6453f10aa3b77fbf8d4fb6f2b965adf3ea4e27f9bdea7f0f415633c - Sigstore transparency entry: 808752951
- Sigstore integration time:
-
Permalink:
nijaru/orcx@43cc55b90d6229abf757537eddc19716fa74b7b6 -
Branch / Tag:
refs/tags/v0.0.4 - Owner: https://github.com/nijaru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@43cc55b90d6229abf757537eddc19716fa74b7b6 -
Trigger Event:
release
-
Statement type: