Skip to content

Custom / OpenAI-compatible with Empryo

Any API that uses the OpenAI /v1/chat/completions format can become a provider in Empryo with one block of JSON config, with no plugin or code. Use it for Together, Fireworks, Cerebras, DashScope, a company gateway, or a local vLLM or llama.cpp server. Once added, it works like a built-in provider, including in the task router.

How you connect
Any compatible API
How you pay
Whatever your endpoint charges, or nothing for a local server

What you get

Example models

  • meta-llama/Llama-3.3-70B-Instruct (Together, Fireworks)
  • deepseek-ai/DeepSeek-V3
  • deepseek-ai/DeepSeek-R1 (reasoning)
  • Qwen/Qwen3-235B-A22B (DashScope / OpenAI-compatible mode)
  • qwen-plus / qwen-max (DashScope)
  • Qwen/Qwen2.5-Coder-32B-Instruct
  • moonshotai/Kimi-K2-Instruct
  • mistralai/Mixtral-8x22B-Instruct
  • llama-3.3-70b (Cerebras, high-throughput)
  • any local model served by vLLM / SGLang / llama.cpp on an OpenAI-compatible endpoint

When to use it

Use a custom provider when nothing built-in fits: a self-hosted model, a company LLM gateway with its own sign-in, a regional API like Alibaba DashScope, or an inference host (Together, Fireworks, Cerebras, Novita) whose exact model names you want to pin. If an endpoint accepts OpenAI's /v1/chat/completions, you can add it without code, and a project config can override the global one for a single repo. The trade-off: it is only as good as the model and endpoint you point it at. For mainstream frontier access you are usually better served by a built-in (Anthropic, OpenAI, Google) or a gateway like OpenRouter / LLM Gateway, which give you curated catalogs, correct context windows, and tested reasoning behavior out of the box. Custom is the right call specifically for self-hosting, data-residency or compliance requirements, vendor-specific open-weight models (Llama, Qwen, DeepSeek, Kimi), and squeezing cost or throughput from a provider Empryo doesn't ship natively. Coding agents lean hard on tool-calling, so confirm your chosen model and endpoint support OpenAI-style function calling before committing.

Set it up

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 configLink to this section

Edit ~/.empryo/config.json (global, applies everywhere) or .empryo/config.json in a repo (project scope wins on matching id):

json
{
  "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"]
    }
  ]
}
FieldRequiredPurpose
idyesPrefix in model strings (together/...) and the name you store the key under
baseURLyesThe OpenAI-compatible endpoint (must accept /v1/chat/completions)
namenoDisplay name in the picker
envVarnoEnv var Empryo reads for the key, omit for auth-less local servers
modelsnoFallback model list (plain strings, or {id, name, contextWindow})
modelsAPInoURL returning OpenAI /v1/models JSON, for dynamic discovery
reasoningnoThinking config (see below)

2. Store the key and select a modelLink to this section

bash
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)Link to this section

Drop envVar entirely for a server with no auth:

json
{
  "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 gatewaysLink to this section

For a corporate gateway, let Empryo pull the catalog instead of hardcoding it:

json
{
  "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 modelsLink to this section

Add a reasoning block in the style your endpoint accepts. Fields are injected into every request body:

json
{
  "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

NotesLink to this section

  • If your id collides with a built-in (e.g. anthropic), Empryo renames it {id}-custom rather than replacing the built-in. Custom providers always show [custom] in /keys and --list-providers.
  • Verify with empryo --list-providers and empryo --list-models together.
  • Inside the TUI, press Ctrl+L to switch models and /router to assign your custom model to specific task slots.

Keys or subscriptions

Custom / OpenAI-compatible connects the way marked below. You can mix ways across task-router slots.

  • API keyPaste a key once. Empryo keeps it in your system keychain, and you pay the provider for what you use.
  • Sign inApprove Empryo in your browser and use a plan or credits you already have. There is no key to copy.
  • On your machineRun open models on your own computer. No key, no per-token bill, and nothing has to leave your machine.
  • Any compatible APICustom / OpenAI-compatibleOne block of JSON config turns any OpenAI-compatible endpoint into a provider, including your own server.