Every Duel Agents integration is a client for one hosted proxy
CLI, SDK, and IDE plugins for Duel Agents
At a glance
- What is it?
- Duel Agents wires Claude Code, Cursor, Codex CLI and OpenClaw to a routing layer at duelagents.com that fans a prompt out to several models and keeps the cheapest answer that still wins. The repository is an integration package rather than a router you can run, and the configuration tables contain a contradiction worth reading twice.
- Who is it for?
- Duel Agents fits a team already paying for a duelagents.com subscription that wants Claude Code, Cursor, Codex or OpenClaw pointed at one routing endpoint instead of choosing a model per prompt. It does not fit anyone who wants to run routing locally or keep using provider keys directly, because every path in the repository terminates at the hosted proxy and the proxy URL override is marked staging only.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 98 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 5, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Nothing in the repository routes anything on your own machine
The position is stated once and then enforced everywhere: every tool in this repo routes LLM traffic through `https://duelagents.com/v1` with a Duel API key shaped `duel_<prefix>_<secret>`, and raw Anthropic or OpenAI keys cannot be used with these integrations. The routing described in the opening line, running prompts against multiple models and picking the cheapest answer that still wins, therefore happens on someone else's server, not in the CLI you installed. The configuration table offers one escape hatch, `DUEL_PROXY_URL`, and labels it staging only. Keys come from the dashboard after subscribing, which makes this a paid hosted service with client packages around it rather than a self-hostable router.
The documented key format does not match any documented key
The troubleshooting table defines the key precisely: `duel_`, then 8 characters, then a separator, then 32 characters. Every example on the page is shorter than that. The quick start exports `duel_yourprefix_yoursecret`, the OpenAI-compatible snippet for other clients repeats `duel_yourprefix_yoursecret`, and `.env.example` ships `duel_yourprefix_your32charactersecretkeyhere`, whose middle segment is a phrase rather than eight characters. A validation layer enforcing the 8 and 32 rule would therefore reject the project's own placeholders, which is exactly the state a first-time user tries first.
The Claude Code plugin step changes the directory name's case
Installing the plugin from a clone takes four commands, and the second one does not match what the first one produces. The clone URL ends in `Duel-Agents.git`, so Git creates a directory called `Duel-Agents`, and the next line changes into `duel-agents` in lowercase. On a case-sensitive filesystem that directory does not exist and the command fails before the plugin is ever installed. The same block then points Claude Code at a local path inside the clone and finishes with the installer:
git clone https://github.com/2aronS/Duel-Agents.git
cd duel-agents
claude plugin install ./integrations/claude-plugin
npx @duel-agents/install claude-codeOnce that works, `/duel-agents:setup` gives guided setup inside Claude Code. The simpler route skips the clone entirely and is what the table at the top of the page recommends.
Cursor is the one integration the installer cannot finish
The installer copies a skill into `.cursor/skills/duel-agents/` and writes `DUEL_API_KEY` into the project `.env`, and then the page stops and asks you to do a second job by hand: set Settings, Models, Override OpenAI Base URL to `https://duelagents.com/v1` with the Duel key. That manual step is why Cursor also has its own row in the troubleshooting table, where a report that Cursor still uses OpenAI is answered by confirming the override URL and that the key field holds a `duel_*` value. Codex CLI has no such gap: the installer writes `OPENAI_BASE_URL` and `OPENAI_API_KEY` to `.env` and asks for a restart. Two template files, `templates/cursor-models.override.md` and `templates/env.cursor.example`, hold the values.
The OpenClaw installer edits a global config and keeps a backup
OpenClaw is the most invasive of the four. The installer patches `~/.openclaw/openclaw.json`, adds a `duel` provider and sets the default model to `duel/duel-auto`, leaving Telegram and Discord channels untouched, so only the model backend changes. Two commands cover it:
npx @duel-agents/install openclaw
openclaw config validateThe validation step is not optional advice, since a row in the troubleshooting table tells you to run it when OpenClaw will not start and to restore from `openclaw.json.bak` if needed. A separate row covers `OPENCLAW_CONFIG_PATH`, which has to resolve inside `~/.openclaw`; unset it to fall back to the default. A reference config ships as `templates/openclaw.duel.json5`, so the shape of the patch is inspectable before you run it.
Skills ship inside the package, so an unbuilt clone has none
One troubleshooting entry explains a class of confusing failure: if the skill copy fails after an npm install, re-run `npm run build` in the repository or reinstall `@duel-agents/install`, because the skills ship inside the package rather than beside it. That means a clone that was never built has the sources but no artifacts, and the symptom appears as a missing feature rather than as a build error. The repository is an npm workspace with `packages/*`, laid out as `packages/core` for validation, env maps and connectivity, `packages/cli` for the installer published as `@duel-agents/install`, and `packages/sdk` for the TypeScript client. Development needs Node 20 or newer:
npm install
npm run build
npm testTwo ways into LangChain, one of them the plain OpenAI client
The page argues the endpoint is OpenAI wire compatible and gives two routes. Official packages are `langchain-duel` for LangChain and `llama-index-llms-duel` for LlamaIndex, with the source for both under `python/` in this repository, defaulting to `duel-auto` routing and the proxy. Anything else uses the framework's own OpenAI client pointed at the same endpoint. For a client that is not OpenAI-shaped, the same two variables do the job:
OPENAI_BASE_URL=https://duelagents.com/v1
OPENAI_API_KEY=duel_yourprefix_yoursecretHermes Agent and Venice are named as able to use that pattern, and the SDK offers both shapes in TypeScript, with `chat.completions.create` for OpenAI-style calls and `messages.create` for Anthropic-style ones, where `apiKey` is required.
Two different errors that both look like a broken install
The troubleshooting table separates failures that a newcomer will otherwise conflate. `Invalid API key format` is a shape problem and points at the 8 and 32 character rule. A `401` from doctor means the key was revoked or the subscription is inactive, and the fix is a new key on the billing or settings page. `Could not reach Duel API` is neither: it means the proxy at `duelagents.com/v1` is not running, and the table states plainly that the key format can still be valid in that state, so retrying later is the documented response. Since all four tools terminate at that one endpoint, an outage there surfaces in an editor as an authentication-looking message, which is the main reason to check `doctor` before assuming a local misconfiguration.
Editorial conclusion
Duel Agents fits a team already paying for a duelagents.com subscription that wants Claude Code, Cursor, Codex or OpenClaw pointed at one routing endpoint instead of choosing a model per prompt. It does not fit anyone who wants to run routing locally or keep using provider keys directly, because every path in the repository terminates at the hosted proxy and the proxy URL override is marked staging only. Before installing, compare the key format in the troubleshooting table against the placeholder you will actually paste, run `npx @duel-agents/install doctor` before and after, and if you use OpenClaw, keep the `openclaw.json.bak` the installer leaves behind.
Frequently asked questions
What is Duel Agents?
It is the official integration package for duelagents.com, described as an IDE-native routing layer that runs prompts against multiple models and picks the cheapest answer that still wins. It ships an installer CLI, a TypeScript SDK, IDE plugins and Python packages for LangChain and LlamaIndex, under the MIT licence.
Can I use my own OpenAI or Anthropic key with Duel Agents?
No. Every tool in the repository routes LLM traffic through `https://duelagents.com/v1` with a Duel API key, and the page states that raw Anthropic or OpenAI keys cannot be used with these integrations. `DUEL_PROXY_URL` exists but is documented as a staging override.
What is the Duel API key format?
The troubleshooting table says a key must be `duel_` followed by 8 characters, a separator and 32 characters. Keys are created from the dashboard at duelagents.com/dashboard/settings after subscribing, and the placeholders shown in the quick start and in `.env.example` are both shorter than that rule.
Which tools does the Duel Agents installer support?
Claude Code, Cursor, Codex CLI and OpenClaw, plus an `all` target, each run through `npx @duel-agents/install`. Claude Code additionally has a plugin installed from a clone of the repository, with `/duel-agents:setup` available inside Claude Code for guided setup.
How do I install the Duel Agents SDK?
Run `npm install @duel-agents/sdk`, then construct a `DuelClient` with an `apiKey`, which is required. The client exposes `chat.completions.create` for OpenAI-shaped calls and `messages.create` for Anthropic-shaped ones, and the examples use the `duel-auto` model.
Why does the Duel Agents doctor report that it could not reach the API?
The troubleshooting table attributes that message to the proxy at `duelagents.com/v1` not running, and notes the key format can still be valid in that case, so the documented response is to retry later. A `401` from doctor means something else: the key was revoked or the subscription is inactive.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/2arons-duel-agents)