Custom / OpenAI-compatible with Empryo
Empryo treats "custom" as the universal escape hatch: any API that speaks the OpenAI `/v1/chat/completions` format becomes a first-class provider with one block of JSON, no plugin and no code. Use it to wire up Together, Fireworks, Cerebras, DashScope, a corporate gateway, or a local vLLM/llama.cpp server, then drive it with Empryo's Genome, AST editing, and task router exactly like a built-in.
Popular models
Setup
Empryo has no separate "custom" key to set — you define one or more providers in config, then store each one's key by its id. There is no plugin and no code.
1. Add the provider to config
Edit ~/.empryo/config.json (global, applies everywhere) or .empryo/config.json in a repo (project scope wins on matching id):
{
"providers": [
{
"id": "together",
"name": "Together AI",
"baseURL": "https://api.together.xyz/v1",
"envVar": "TOGETHER_API_KEY",
"models": ["meta-llama/Llama-3.3-70B-Instruct-Turbo"]
}
]
}| Field | Required | Purpose |
|---|---|---|
id | yes | Prefix in model strings (together/...) and the name you store the key under |
baseURL | yes | The OpenAI-compatible endpoint (must accept /v1/chat/completions) |
name | no | Display name in the picker |
envVar | no | Env var Empryo reads for the key — omit for auth-less local servers |
models | no | Fallback model list (plain strings, or {id, name, contextWindow}) |
modelsAPI | no | URL returning OpenAI /v1/models JSON, for dynamic discovery |
reasoning | no | Thinking config (see below) |
2. Store the key and select a model
empryo --set-key together <your-key>
empryo --model together/meta-llama/Llama-3.3-70B-Instruct-Turbo--set-key together writes to your OS keychain (Login Keychain on macOS, libsecret on Linux, DPAPI on Windows), keyed off the provider id. You can also pass it per-launch with the env var and persist nothing: TOGETHER_API_KEY=... empryo.
3. Local server (no key)
Drop envVar entirely for a server with no auth:
{
"providers": [{
"id": "local",
"name": "Local LLM",
"baseURL": "http://localhost:8080/v1",
"models": ["llama-3.3-70b"]
}]
}(Ollama at localhost:11434 and LM Studio at localhost:1234 are already auto-detected as built-ins — only use a custom block to point at vLLM, SGLang, llama.cpp, or a non-default port.)
4. Dynamic model lists and gateways
For a corporate gateway, let Empryo pull the catalog instead of hardcoding it:
{
"providers": [{
"id": "corp",
"name": "Corp Gateway",
"baseURL": "https://llm.internal.corp.com/v1",
"envVar": "CORP_LLM_KEY",
"modelsAPI": "https://llm.internal.corp.com/v1/models"
}]
}5. Reasoning models
Add a reasoning block in the style your endpoint accepts — fields are injected into every request body:
{
"id": "dashscope",
"baseURL": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"envVar": "DASHSCOPE_API_KEY",
"models": ["qwen-plus"],
"reasoning": { "enabled": true, "budget": 8192 }
}- OpenAI-style:
effort: "low" | "medium" | "high" | "xhigh" | "none" - DashScope-style:
enabled: true,budget: 8192(Qwen/Alibaba) - Raw:
extraParams: { ... }forwarded verbatim, overriding other keys on collision
Notes
- If your
idcollides with a built-in (e.g.anthropic), Empryo renames it{id}-customrather than replacing the built-in. Custom providers always show[custom]in/keysand--list-providers. - Verify with
empryo --list-providersandempryo --list-models together. - Inside the TUI, press
Ctrl+Lto switch models and/routerto assign your custom model to specific task slots.