@jacobbd/relay-ai 0.3.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -14
- package/dist/chunk-DO5FAMNC.js +427 -0
- package/dist/chunk-DO5FAMNC.js.map +1 -0
- package/dist/chunk-RTZ3X3KZ.js +10196 -0
- package/dist/chunk-RTZ3X3KZ.js.map +1 -0
- package/dist/cli.js +9431 -12636
- package/dist/cli.js.map +1 -0
- package/dist/provider-templates-LYGIFRRT.js +20 -0
- package/dist/provider-templates-LYGIFRRT.js.map +1 -0
- package/dist/ui/public/app.js +2400 -0
- package/dist/ui/public/icon-antigravity-ide.png +0 -0
- package/dist/ui/public/icon-antigravity.png +0 -0
- package/dist/ui/public/index.html +228 -0
- package/dist/ui/public/style.css +1630 -0
- package/dist/ui-command-PJG4Y2QY.js +1415 -0
- package/dist/ui-command-PJG4Y2QY.js.map +1 -0
- package/package.json +6 -2
- package/.cursor/rules/post-change-build-link.mdc +0 -19
- package/.markdown-link-check.json +0 -7
- package/AGENTS.md +0 -169
- package/CHANGELOG.md +0 -113
- package/assets/banner.png +0 -0
- package/assets/vertex-models.example.json +0 -14
- package/jacobbd-relay-ai-0.3.4.tgz +0 -0
- package/scripts/refresh-models-dev-cache.mjs +0 -34
- package/test-proxy.ts +0 -19
- package/test-split.js +0 -1
package/README.md
CHANGED
|
@@ -13,10 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
<p align="center">
|
|
15
15
|
<a href="https://youtu.be/IvsUPHLhX0o">
|
|
16
|
-
<img src="
|
|
17
|
-
</a>
|
|
18
|
-
<a href="https://youtu.be/42oiOB8IAu4">
|
|
19
|
-
<img src="https://img.youtube.com/vi/42oiOB8IAu4/maxresdefault.jpg" alt="relay-ai demo — OpenAI Codex CLI & Codex Desktop App (Part 2)" width="49%">
|
|
16
|
+
<img src="assets/demo-part1-thumbnail.png" alt="relay-ai demo — installation, configuration, Claude Code, Claude Cowork & Claude Code Desktop (Part 1)" width="100%">
|
|
20
17
|
</a>
|
|
21
18
|
</p>
|
|
22
19
|
|
|
@@ -24,7 +21,7 @@
|
|
|
24
21
|
> - **Demo (Part 1):** Installation · Configuration · Claude Code · Claude Cowork & Claude Code Desktop — [watch on YouTube](https://youtu.be/IvsUPHLhX0o)
|
|
25
22
|
> - **Demo (Part 2):** OpenAI Codex CLI & Codex Desktop App — [watch on YouTube](https://youtu.be/42oiOB8IAu4)
|
|
26
23
|
|
|
27
|
-
**relay-ai** is an interactive CLI that
|
|
24
|
+
**relay-ai** is an interactive CLI — and now a **visual launcher** — that connects AI coding tools to any provider and runs local API gateways on your machine. It supports **Claude Code**, **Claude Desktop (Cowork + Code)**, the **OpenAI Codex CLI**, the **ChatGPT desktop app in Codex mode (macOS + Windows)**, **Google Gemini CLI**, and experimental **Antigravity CLI / IDE** support.
|
|
28
25
|
|
|
29
26
|
Pick your backend:
|
|
30
27
|
|
|
@@ -38,6 +35,7 @@ Pick your backend:
|
|
|
38
35
|
| Command | Description |
|
|
39
36
|
|---------|-------------|
|
|
40
37
|
| `relay-ai` | Print help (does not launch Claude Code) |
|
|
38
|
+
| `relay-ai ui` | **Open the visual launcher** — manage providers and launch any tool from a browser UI |
|
|
41
39
|
| `relay-ai claude` | Pick a provider → launch Claude Code |
|
|
42
40
|
| `relay-ai providers` | Add, import, list, remove, and refresh your AI providers |
|
|
43
41
|
| `relay-ai models` | Manage favorite models for mid-session `/model` switching |
|
|
@@ -45,12 +43,18 @@ Pick your backend:
|
|
|
45
43
|
| `relay-ai server --vertex` | Foreground Anthropic-compatible gateway to Claude on Vertex AI |
|
|
46
44
|
| `relay-ai claude-app` | Launch Claude Desktop app with registry providers ([guide](docs/CLAUDE_DESKTOP_SETUP.md)) |
|
|
47
45
|
| `relay-ai codex` | Launch OpenAI Codex CLI with registry providers ([guide](docs/CODEX.md)) |
|
|
48
|
-
| `relay-ai codex-app` | Launch
|
|
46
|
+
| `relay-ai codex-app` (alias `chatgpt`) | Launch ChatGPT desktop app in Codex mode with registry providers ([guide](docs/CODEX.md)) |
|
|
49
47
|
| `relay-ai gemini` | Launch Google Gemini CLI with registry providers |
|
|
48
|
+
| `relay-ai agy` | Launch Antigravity CLI with Relay models ([warning + guide](docs/ANTIGRAVITY.md)) |
|
|
49
|
+
| `relay-ai antigravity` | Launch Antigravity app with Relay models, macOS ([warning + guide](docs/ANTIGRAVITY.md)) |
|
|
50
|
+
| `relay-ai antigravity-ide` | Launch Antigravity IDE with Relay models, macOS ([warning + guide](docs/ANTIGRAVITY.md)) |
|
|
51
|
+
| `relay-ai providers auth <id>` | Authenticate an OAuth provider (GitHub Copilot, xAI, OpenAI) |
|
|
50
52
|
| `relay-ai --ai` | Full agent reference for scripts and alef-agent ([guide](docs/AI-AGENTS.md)) |
|
|
51
53
|
|
|
52
54
|
## Features
|
|
53
55
|
|
|
56
|
+
- **Visual launcher UI:** `relay-ai ui` opens a browser dashboard — launch any supported tool with a point-and-click model picker. Pick provider and model in the UI; the terminal opens straight to the running session with no second selection step. Manage providers and favorites without leaving the browser.
|
|
57
|
+
- **Server tab in the UI:** Run the same API gateway as `relay-ai server` — favorites-only or specific providers, discovery id masking for Claude Desktop / Cowork, local or network listen mode — from a browser form instead of a terminal wizard. Shows live URLs, the API key, and the full model catalog once started, with a one-click Stop.
|
|
54
58
|
- **Native provider registry:** `relay-ai providers` stores config in `~/.relay-ai/providers.json` and secrets in the OS keychain — no OpenCode binary required at launch. See **[docs/PROVIDERS.md](docs/PROVIDERS.md)** for a full list of providers and known issues.
|
|
55
59
|
- **Provider templates:** Add Groq, Mistral, Together, OpenRouter, and 15+ SDK-backed providers, plus custom OpenAI/Anthropic-compatible endpoints
|
|
56
60
|
- **OpenCode import:** One-time migration from OpenCode (`providers import`); validates API keys and skips placeholders like `anything`
|
|
@@ -60,8 +64,9 @@ Pick your backend:
|
|
|
60
64
|
- **Smart model pickers:** Recent models per provider, search for large lists (>25), paginated browse (15 per page)
|
|
61
65
|
- **Refresh model lists:** `relay-ai providers refresh-models` updates cached catalogs per provider
|
|
62
66
|
- **API server:** Run a local gateway on port **17645** for Claude Code, Claude Desktop, or any Anthropic-compatible client
|
|
63
|
-
- **Server wizard:** Filter exposed providers, mask discovery ids for Claude Desktop, optional favorites-only catalog, local vs network listen mode
|
|
67
|
+
- **Server wizard:** Filter exposed providers, mask discovery ids for Claude Desktop, optional favorites-only catalog, local vs network listen mode — available in the terminal (`relay-ai server`) or the `relay-ai ui` Server tab
|
|
64
68
|
- **Vertex gateway:** Anthropic-compatible Claude on Google Vertex AI using gcloud Application Default Credentials
|
|
69
|
+
- **Antigravity CLI / app / IDE support:** Experimental local Cloud Code gateway for Antigravity's native model picker. Read the account warning before using it
|
|
65
70
|
- **Clean environment isolation:** We strip 17 conflicting env vars (Vertex AI, Bedrock, AWS, Foundry, stale Anthropic config) from the child process only. We never touch `~/.claude/settings.json` (see caveat below)
|
|
66
71
|
- **Secure key storage:** Per-provider keys and the OpenCode API key go in the OS credential store (macOS Keychain, Windows Credential Manager, Linux Secret Service) or your shell profile
|
|
67
72
|
- **Cross-platform:** macOS, Windows, Linux (Ubuntu, Fedora, distros with GNOME Keyring or KWallet)
|
|
@@ -73,6 +78,7 @@ Pick your backend:
|
|
|
73
78
|
|
|
74
79
|
| Tool | Command | Status |
|
|
75
80
|
|------|---------|--------|
|
|
81
|
+
| **Visual launcher UI** | `relay-ai ui` | ✅ Supported — browser dashboard for all tools |
|
|
76
82
|
| Provider registry | `relay-ai providers` | ✅ Supported ([guide](docs/PROVIDERS.md)) |
|
|
77
83
|
| Claude Code | `relay-ai claude` | ✅ Supported |
|
|
78
84
|
| Favorite models | `relay-ai models` | ✅ Supported |
|
|
@@ -80,8 +86,14 @@ Pick your backend:
|
|
|
80
86
|
| Vertex API gateway | `relay-ai server --vertex` | ✅ Supported |
|
|
81
87
|
| Claude Desktop (Cowork + Code) | `relay-ai claude-app` | ✅ Supported macOS + Windows ([guide](docs/CLAUDE_DESKTOP_SETUP.md)) |
|
|
82
88
|
| Codex CLI | `relay-ai codex` | ✅ Supported ([guide](docs/CODEX.md)) |
|
|
83
|
-
|
|
|
89
|
+
| ChatGPT desktop app (Codex mode) | `relay-ai codex-app` (alias `chatgpt`) | ✅ Supported macOS + Windows ([guide](docs/CODEX.md)) |
|
|
84
90
|
| Google Gemini CLI | `relay-ai gemini` | ⚠️ Experimental, model switching is done via .model prompt |
|
|
91
|
+
| Antigravity CLI | `relay-ai agy` | ⚠️ Experimental, use a throwaway Google account ([guide](docs/ANTIGRAVITY.md)) |
|
|
92
|
+
| Antigravity app | `relay-ai antigravity` | ⚠️ Experimental macOS + Windows support, use a throwaway Google account ([guide](docs/ANTIGRAVITY.md)) |
|
|
93
|
+
| Antigravity IDE | `relay-ai antigravity-ide` | ⚠️ Experimental macOS + Windows support, use a throwaway Google account ([guide](docs/ANTIGRAVITY.md)) |
|
|
94
|
+
| GitHub Copilot OAuth | `relay-ai providers auth github-copilot` | ✅ Device code flow ([guide](docs/SUBSCRIPTION-OAUTH.md)) |
|
|
95
|
+
| xAI SuperGrok OAuth | `relay-ai providers auth xai-oauth` | ✅ Device code flow ([guide](docs/SUBSCRIPTION-OAUTH.md)) |
|
|
96
|
+
| OpenAI ChatGPT OAuth | `relay-ai providers auth openai-oauth` | ✅ Device code flow ([guide](docs/SUBSCRIPTION-OAUTH.md)) |
|
|
85
97
|
|
|
86
98
|
## Prerequisites
|
|
87
99
|
|
|
@@ -90,6 +102,7 @@ Pick your backend:
|
|
|
90
102
|
- At least one provider configured via `relay-ai providers add` or `import` — **or** an [OpenCode API key](https://opencode.ai/auth) for Zen/Go cloud backends
|
|
91
103
|
- [OpenCode CLI](https://opencode.ai) only if you want **one-time import** from an existing OpenCode setup (optional)
|
|
92
104
|
- For **Vertex gateway:** [Google Cloud SDK](https://cloud.google.com/sdk) with `gcloud auth application-default login`, a GCP project with Vertex AI enabled, and Claude partner models enabled in that project
|
|
105
|
+
- For **Antigravity CLI / IDE:** a Google account is still needed for Antigravity authentication. Do **not** use your main Google account. Use a throwaway or secondary account you can afford to lose.
|
|
93
106
|
|
|
94
107
|
**A note on providers:** relay-ai keeps your provider list in `~/.relay-ai/providers.json`. You can add providers directly (API key + template), import from OpenCode once, or use Zen/Go cloud backends. OpenCode is not required after setup.
|
|
95
108
|
|
|
@@ -164,6 +177,22 @@ The key is active in your current session right away, no matter which option you
|
|
|
164
177
|
|
|
165
178
|
## Usage
|
|
166
179
|
|
|
180
|
+
### Visual launcher (`relay-ai ui`)
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
relay-ai ui
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Opens a browser-based dashboard on a random local port. From the UI you can:
|
|
187
|
+
|
|
188
|
+
- **Launch any supported tool** — app cards for Claude Code CLI, Codex CLI, Gemini CLI, Antigravity CLI, Antigravity App, Antigravity IDE, Claude Code Desktop, and the ChatGPT Desktop app (Codex mode). Select a provider and model in the card, then click **Launch** — a native terminal opens with the selection pre-wired. No second picker in the terminal.
|
|
189
|
+
- **Manage General Favorites** — the sidebar shows your saved favorite models with a slot indicator (Slots used X/20). Favorites launch through all supported agents.
|
|
190
|
+
- **Manage Antigravity Favorites** — separate favorites panel for Antigravity sessions.
|
|
191
|
+
- **Manage providers** — add providers from templates, delete providers, and refresh model lists inline, all without leaving the browser.
|
|
192
|
+
- **Run the Server tab** — configure and start the same gateway as `relay-ai server` (favorites-only or specific providers, discovery id masking, local/network listen mode) and see the resulting URLs, API key, and model catalog right in the browser. Runs in the same process as the UI, so it stops when you close the dashboard. See [Registry gateway (`relay-ai server`)](#registry-gateway-relay-ai-server) below for what each option does.
|
|
193
|
+
|
|
194
|
+
Press `Ctrl+C` in the terminal where `relay-ai ui` is running to shut down the dashboard server (this also stops the gateway if you started it from the Server tab).
|
|
195
|
+
|
|
167
196
|
### Launch Claude Code
|
|
168
197
|
|
|
169
198
|
```bash
|
|
@@ -249,12 +278,34 @@ The wizard asks:
|
|
|
249
278
|
|
|
250
279
|
| Prompt | What it does |
|
|
251
280
|
|--------|--------------|
|
|
252
|
-
| **Configure & start** vs **Start with saved settings** | Full wizard or
|
|
281
|
+
| **Configure & start** vs **Start with saved settings** | Full wizard or one-step launch from saved server preferences |
|
|
253
282
|
| **Exposed providers** | Limit which providers appear in the catalog (Zen, Go, Groq, OpenAI, etc.) |
|
|
254
283
|
| **Mask gateway model ids for discovery?** | Recommended **Yes** for Claude Desktop — hides competitor vendor strings in model ids so discovery works |
|
|
255
284
|
| **Expose only favorite models?** | Optional cap at your favorites (manage with `relay-ai models`) |
|
|
256
285
|
| **Listen mode** | **Local only** (`127.0.0.1`) or **Network** (`0.0.0.0` + server password) |
|
|
257
286
|
|
|
287
|
+
The same options are available without a terminal in the [Server tab of `relay-ai ui`](#visual-launcher-relay-ai-ui), which also shows the resulting URLs, API key, and model catalog live.
|
|
288
|
+
|
|
289
|
+
After you configure the server once, start it without prompts:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
relay-ai server --quick
|
|
293
|
+
# same as:
|
|
294
|
+
relay-ai server --saved
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Any one-run server option also skips the wizard:
|
|
298
|
+
|
|
299
|
+
| Option | Meaning |
|
|
300
|
+
|--------|---------|
|
|
301
|
+
| `--listen local\|network` | Override the saved listen mode for this run |
|
|
302
|
+
| `--providers all\|favorites\|id1,id2` | Expose all providers, favorites only, or a comma-separated provider id list |
|
|
303
|
+
| `--free-only` / `--no-free-only` | Enable or disable the free/free-access model filter for this run |
|
|
304
|
+
| `--mask-gateway-ids` / `--no-mask-gateway-ids` | Enable or disable discovery id masking for this run |
|
|
305
|
+
| `--password <value>` | One-run password for network mode when you do not want to use a saved password |
|
|
306
|
+
|
|
307
|
+
Non-interactive shells (scripts, services, CI, pipes) use quick mode automatically. If quick mode resolves to network mode, relay-ai uses `--password` first, then a saved server password; without either it exits with a clear error instead of prompting.
|
|
308
|
+
|
|
258
309
|
**Local mode** — point any Anthropic-compatible client at your machine:
|
|
259
310
|
|
|
260
311
|
```bash
|
|
@@ -269,7 +320,7 @@ export ANTHROPIC_BASE_URL="http://<server-ip>:17645/anthropic"
|
|
|
269
320
|
export ANTHROPIC_API_KEY="<server-password>"
|
|
270
321
|
```
|
|
271
322
|
|
|
272
|
-
By default the server password stays in memory only. If you choose to save it, relay-ai stores it in `~/.relay-ai/config.json
|
|
323
|
+
By default the server password stays in memory only. If you choose to save it, relay-ai stores it in the OS credential store when available, with `~/.relay-ai/config.json` as a fallback.
|
|
273
324
|
|
|
274
325
|
OpenAI-format models also get an OpenAI-compatible endpoint:
|
|
275
326
|
|
|
@@ -319,6 +370,36 @@ export ANTHROPIC_API_KEY="anything"
|
|
|
319
370
|
unset CLAUDE_CODE_USE_VERTEX ANTHROPIC_VERTEX_PROJECT_ID CLOUD_ML_REGION
|
|
320
371
|
```
|
|
321
372
|
|
|
373
|
+
## Antigravity CLI, app, and IDE support
|
|
374
|
+
|
|
375
|
+
Relay AI can launch the Antigravity CLI, standalone Antigravity app, and Antigravity IDE through a local Cloud Code gateway. This lets Antigravity's native model picker show Relay models from your configured providers.
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
relay-ai agy
|
|
379
|
+
relay-ai antigravity
|
|
380
|
+
relay-ai antigravity-ide
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
> ⚠️ **Do not use your main Google account with Antigravity support.**
|
|
384
|
+
>
|
|
385
|
+
> Antigravity still requires Google authentication before it will run. Relay AI routes Cloud Code generation through your local gateway, but the Antigravity CLI, app, and IDE are still Google software and may contact Google for auth, telemetry, updates, or account checks.
|
|
386
|
+
>
|
|
387
|
+
> This kind of use is probably not what Google intended, may violate Google's terms of service, and could lead to account restrictions or bans. Use a throwaway Google account, a secondary account, or another account you can afford to lose. A free Google account should be enough for authentication. Seriously, don't risk your real Gmail, Workspace, YouTube, Drive, or business account for this.
|
|
388
|
+
|
|
389
|
+
Read the full setup and risk notes in **[docs/ANTIGRAVITY.md](docs/ANTIGRAVITY.md)** before launching any Antigravity surface.
|
|
390
|
+
|
|
391
|
+
## OAuth Providers
|
|
392
|
+
|
|
393
|
+
relay-ai supports OAuth providers that use device-code sign-in, so you can connect an existing subscription without pasting an API key. See **[docs/SUBSCRIPTION-OAUTH.md](docs/SUBSCRIPTION-OAUTH.md)** for setup details.
|
|
394
|
+
|
|
395
|
+
Device code flows for existing subscriptions:
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
relay-ai providers auth github-copilot # GitHub Copilot
|
|
399
|
+
relay-ai providers auth openai-oauth # ChatGPT Plus / Pro
|
|
400
|
+
relay-ai providers auth xai-oauth # xAI SuperGrok
|
|
401
|
+
```
|
|
402
|
+
|
|
322
403
|
### Codex CLI (`relay-ai codex`)
|
|
323
404
|
|
|
324
405
|
Launch [OpenAI Codex CLI](https://developers.openai.com/codex/cli) with registry providers. Requires `npm install -g @openai/codex`.
|
|
@@ -358,18 +439,22 @@ Full details: **[docs/CODEX.md](docs/CODEX.md)** — CLI + desktop app, configs,
|
|
|
358
439
|
|
|
359
440
|
For agent / alef-agent integration (boot flags, NDJSON, JSONL): **[docs/AI-AGENTS.md](docs/AI-AGENTS.md)** and `relay-ai --ai`.
|
|
360
441
|
|
|
361
|
-
###
|
|
442
|
+
### ChatGPT desktop app / Codex mode (`relay-ai codex-app`, alias `relay-ai chatgpt`)
|
|
443
|
+
|
|
444
|
+
> OpenAI merged the standalone Codex app into the ChatGPT desktop app on 2026-07-09 — it's now named "ChatGPT" on disk (bundle id and config format unchanged) and opens in Codex mode for existing Codex users. `relay-ai codex-app` and `relay-ai chatgpt` are the same command.
|
|
362
445
|
|
|
363
|
-
Launch the **Codex
|
|
446
|
+
Launch the **ChatGPT app in Codex mode** (macOS or Windows) with registry providers:
|
|
364
447
|
|
|
365
448
|
```bash
|
|
366
449
|
relay-ai codex-app
|
|
367
450
|
```
|
|
368
451
|
|
|
369
|
-
Patches `~/.codex/config.toml` with backup; **Ctrl+C** in the relay-ai terminal
|
|
452
|
+
Patches `~/.codex/config.toml` with backup; **Ctrl+C** in the relay-ai terminal asks whether to close ChatGPT Desktop and restore your config (choose "No, keep session running" to decline and keep going). The app keeps Codex's built-in `openai` provider active so existing conversation history remains visible, and routes the selected model through a foreground local proxy. Preview config without writing: `relay-ai codex-app --config`. Recovery: `relay-ai codex-app --restore`.
|
|
370
453
|
|
|
371
454
|
See **[docs/CODEX.md](docs/CODEX.md)** for CLI vs app differences, file ownership, and troubleshooting.
|
|
372
455
|
|
|
456
|
+
> **Known limitation — MCP tools (Context7, chrome-devtools, etc.) don't work with non-native models.** Codex wraps local `[mcp_servers.*]` tools in a proprietary, undocumented format that only Codex's own ChatGPT backend can dispatch. When routed through relay-ai (or *any* non-native model provider — this also affects Ollama, OpenRouter, LiteLLM, LM Studio identically), the model can see and call the tools, but Codex's own dispatcher rejects every call with `unsupported call: ...`. This is a confirmed, currently open upstream bug ([openai/codex#20652](https://github.com/openai/codex/issues/20652)) — there is no workaround on relay-ai's side. MCP tools work normally with Codex's native OpenAI/ChatGPT models. See the [MCP troubleshooting row in docs/CODEX.md](docs/CODEX.md#troubleshooting) for details.
|
|
457
|
+
|
|
373
458
|
**Reasoning effort:** Capable models show Codex's native reasoning picker (low/medium/high, etc.). relay-ai maps your choice to each provider's SDK options and preserves existing `model_reasoning_effort` in Codex config. Claude Code `/effort` and the `relay-ai server` gateway use the same mapping — see the [reasoning section in docs/CODEX.md](docs/CODEX.md#reasoning-effort).
|
|
374
459
|
|
|
375
460
|
### Google Gemini CLI (`relay-ai gemini`)
|
|
@@ -487,7 +572,7 @@ Private beta right now. Issues and PRs welcome on GitHub.
|
|
|
487
572
|
|
|
488
573
|
## Disclaimer
|
|
489
574
|
|
|
490
|
-
This project and its creator have **no affiliation** with OpenCode, Anthropic, Claude, Google, or any other vendor named or integrated here. Trademarks belong to their respective owners.
|
|
575
|
+
This project and its creator have **no affiliation** with OpenCode, Anthropic, Claude, Google, GitHub, OpenAI, xAI, or any other vendor named or integrated here. Trademarks belong to their respective owners.
|
|
491
576
|
|
|
492
577
|
relay-ai was built for **education and research**, and mostly for fun. It routes inference through services you configure yourself (OpenCode Zen/Go, OpenCode-configured providers, Vertex AI, and gateways you run locally). Use at your own risk.
|
|
493
578
|
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __esm = (fn, res) => function __init() {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
};
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
|
+
|
|
23
|
+
// src/provider-templates.ts
|
|
24
|
+
var provider_templates_exports = {};
|
|
25
|
+
__export(provider_templates_exports, {
|
|
26
|
+
PROVIDER_TEMPLATES: () => PROVIDER_TEMPLATES,
|
|
27
|
+
filterTemplates: () => filterTemplates,
|
|
28
|
+
getTemplateById: () => getTemplateById,
|
|
29
|
+
listAddableTemplates: () => listAddableTemplates,
|
|
30
|
+
listSupportedTemplates: () => listSupportedTemplates,
|
|
31
|
+
listVisibleOAuthTemplates: () => listVisibleOAuthTemplates
|
|
32
|
+
});
|
|
33
|
+
function listSupportedTemplates() {
|
|
34
|
+
return PROVIDER_TEMPLATES.filter((t) => t.supported && t.authType === "api" && t.addable !== false && !t.hidden).sort((a, b) => a.name.localeCompare(b.name));
|
|
35
|
+
}
|
|
36
|
+
function listAddableTemplates(configuredIds = []) {
|
|
37
|
+
const configured = new Set(configuredIds);
|
|
38
|
+
return listSupportedTemplates().filter((t) => {
|
|
39
|
+
if (t.id === "opencode-cloud") {
|
|
40
|
+
return !configured.has("zen") && !configured.has("go");
|
|
41
|
+
}
|
|
42
|
+
return !configured.has(t.id);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function listVisibleOAuthTemplates(configuredIds = []) {
|
|
46
|
+
const configured = new Set(configuredIds);
|
|
47
|
+
return PROVIDER_TEMPLATES.filter((t) => t.authType === "oauth" && t.supported && t.addable !== false && !t.hidden && !configured.has(t.id)).sort((a, b) => a.name.localeCompare(b.name));
|
|
48
|
+
}
|
|
49
|
+
function getTemplateById(id) {
|
|
50
|
+
return PROVIDER_TEMPLATES.find((t) => t.id === id);
|
|
51
|
+
}
|
|
52
|
+
function filterTemplates(templates, query) {
|
|
53
|
+
const q = query.trim().toLowerCase();
|
|
54
|
+
if (!q) return templates;
|
|
55
|
+
return templates.filter(
|
|
56
|
+
(t) => t.id.toLowerCase().includes(q) || t.name.toLowerCase().includes(q) || t.npm.toLowerCase().includes(q)
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
var PROVIDER_TEMPLATES;
|
|
60
|
+
var init_provider_templates = __esm({
|
|
61
|
+
"src/provider-templates.ts"() {
|
|
62
|
+
PROVIDER_TEMPLATES = [
|
|
63
|
+
{
|
|
64
|
+
id: "groq",
|
|
65
|
+
name: "Groq",
|
|
66
|
+
authType: "api",
|
|
67
|
+
npm: "@ai-sdk/groq",
|
|
68
|
+
defaultBaseUrl: "https://api.groq.com/openai/v1",
|
|
69
|
+
signupUrl: "https://console.groq.com/keys",
|
|
70
|
+
modelSource: "api-list",
|
|
71
|
+
supported: true
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "nvidia",
|
|
75
|
+
name: "Nvidia",
|
|
76
|
+
authType: "api",
|
|
77
|
+
npm: "@ai-sdk/openai-compatible",
|
|
78
|
+
defaultBaseUrl: "https://integrate.api.nvidia.com/v1",
|
|
79
|
+
signupUrl: "https://build.nvidia.com",
|
|
80
|
+
modelSource: "api-list",
|
|
81
|
+
supported: true
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "mistral",
|
|
85
|
+
name: "Mistral",
|
|
86
|
+
authType: "api",
|
|
87
|
+
npm: "@ai-sdk/mistral",
|
|
88
|
+
defaultBaseUrl: "https://api.mistral.ai/v1",
|
|
89
|
+
signupUrl: "https://console.mistral.ai/api-keys",
|
|
90
|
+
modelSource: "api-list",
|
|
91
|
+
supported: true
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "togetherai",
|
|
95
|
+
name: "Together AI",
|
|
96
|
+
authType: "api",
|
|
97
|
+
npm: "@ai-sdk/togetherai",
|
|
98
|
+
defaultBaseUrl: "https://api.together.xyz/v1",
|
|
99
|
+
signupUrl: "https://api.together.xyz/settings/api-keys",
|
|
100
|
+
modelSource: "api-list",
|
|
101
|
+
supported: true
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "cerebras",
|
|
105
|
+
name: "Cerebras",
|
|
106
|
+
authType: "api",
|
|
107
|
+
npm: "@ai-sdk/cerebras",
|
|
108
|
+
defaultBaseUrl: "https://api.cerebras.ai/v1",
|
|
109
|
+
signupUrl: "https://cloud.cerebras.ai",
|
|
110
|
+
modelSource: "api-list",
|
|
111
|
+
supported: true
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: "deepinfra",
|
|
115
|
+
name: "DeepInfra",
|
|
116
|
+
authType: "api",
|
|
117
|
+
npm: "@ai-sdk/deepinfra",
|
|
118
|
+
defaultBaseUrl: "https://api.deepinfra.com/v1/openai",
|
|
119
|
+
signupUrl: "https://deepinfra.com/dash/api_keys",
|
|
120
|
+
modelSource: "api-list",
|
|
121
|
+
supported: true
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "deepseek",
|
|
125
|
+
name: "DeepSeek",
|
|
126
|
+
authType: "api",
|
|
127
|
+
npm: "@ai-sdk/openai-compatible",
|
|
128
|
+
defaultBaseUrl: "https://api.deepseek.com/v1",
|
|
129
|
+
signupUrl: "https://platform.deepseek.com",
|
|
130
|
+
modelSource: "api-list",
|
|
131
|
+
supported: true
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "zhipu",
|
|
135
|
+
name: "Zhipu AI (GLM)",
|
|
136
|
+
authType: "api",
|
|
137
|
+
npm: "@ai-sdk/openai-compatible",
|
|
138
|
+
defaultBaseUrl: "https://open.bigmodel.cn/api/paas/v4",
|
|
139
|
+
signupUrl: "https://open.bigmodel.cn",
|
|
140
|
+
modelSource: "api-list",
|
|
141
|
+
supported: true
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "moonshot",
|
|
145
|
+
name: "Moonshot (Kimi)",
|
|
146
|
+
authType: "api",
|
|
147
|
+
npm: "@ai-sdk/openai-compatible",
|
|
148
|
+
defaultBaseUrl: "https://api.moonshot.cn/v1",
|
|
149
|
+
signupUrl: "https://platform.moonshot.cn",
|
|
150
|
+
modelSource: "api-list",
|
|
151
|
+
supported: true
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "moonshot-global",
|
|
155
|
+
name: "Moonshot Global (kimi.ai)",
|
|
156
|
+
authType: "api",
|
|
157
|
+
npm: "@ai-sdk/openai-compatible",
|
|
158
|
+
defaultBaseUrl: "https://api.moonshot.ai/v1",
|
|
159
|
+
signupUrl: "https://platform.kimi.ai",
|
|
160
|
+
modelSource: "api-list",
|
|
161
|
+
supported: true
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: "kimi-code",
|
|
165
|
+
name: "Kimi Code (Subscription Required)",
|
|
166
|
+
authType: "api",
|
|
167
|
+
npm: "@ai-sdk/openai-compatible",
|
|
168
|
+
defaultBaseUrl: "https://api.kimi.com/coding/v1",
|
|
169
|
+
modelSource: "static-seed",
|
|
170
|
+
staticModels: [
|
|
171
|
+
{ id: "kimi-for-coding", name: "Kimi Code K2.7 (Unified)" }
|
|
172
|
+
],
|
|
173
|
+
supported: true
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "xai",
|
|
177
|
+
name: "xAI",
|
|
178
|
+
authType: "api",
|
|
179
|
+
npm: "@ai-sdk/xai",
|
|
180
|
+
defaultBaseUrl: "https://api.x.ai/v1",
|
|
181
|
+
signupUrl: "https://console.x.ai",
|
|
182
|
+
modelSource: "api-list",
|
|
183
|
+
supported: true
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
id: "perplexity",
|
|
187
|
+
name: "Perplexity",
|
|
188
|
+
authType: "api",
|
|
189
|
+
npm: "@ai-sdk/perplexity",
|
|
190
|
+
defaultBaseUrl: "https://api.perplexity.ai",
|
|
191
|
+
signupUrl: "https://www.perplexity.ai/settings/api",
|
|
192
|
+
modelSource: "api-list",
|
|
193
|
+
supported: true
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: "cohere",
|
|
197
|
+
name: "Cohere",
|
|
198
|
+
authType: "api",
|
|
199
|
+
npm: "@ai-sdk/cohere",
|
|
200
|
+
defaultBaseUrl: "https://api.cohere.com/compatibility/v1",
|
|
201
|
+
signupUrl: "https://dashboard.cohere.com/api-keys",
|
|
202
|
+
modelSource: "api-list",
|
|
203
|
+
supported: true
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: "openai",
|
|
207
|
+
name: "OpenAI",
|
|
208
|
+
authType: "api",
|
|
209
|
+
npm: "@ai-sdk/openai",
|
|
210
|
+
defaultBaseUrl: "https://api.openai.com/v1",
|
|
211
|
+
signupUrl: "https://platform.openai.com/api-keys",
|
|
212
|
+
modelSource: "api-list",
|
|
213
|
+
supported: true
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
id: "google",
|
|
217
|
+
name: "Google Gemini",
|
|
218
|
+
authType: "api",
|
|
219
|
+
npm: "@ai-sdk/google",
|
|
220
|
+
defaultBaseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
|
|
221
|
+
signupUrl: "https://aistudio.google.com/apikey",
|
|
222
|
+
modelSource: "api-list",
|
|
223
|
+
supported: true
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
id: "alibaba",
|
|
227
|
+
name: "Alibaba DashScope",
|
|
228
|
+
authType: "api",
|
|
229
|
+
npm: "@ai-sdk/alibaba",
|
|
230
|
+
defaultBaseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
231
|
+
signupUrl: "https://dashscope.console.aliyun.com/apiKey",
|
|
232
|
+
modelSource: "api-list",
|
|
233
|
+
supported: true
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
id: "openrouter",
|
|
237
|
+
name: "OpenRouter",
|
|
238
|
+
authType: "api",
|
|
239
|
+
npm: "@openrouter/ai-sdk-provider",
|
|
240
|
+
defaultBaseUrl: "https://openrouter.ai/api/v1",
|
|
241
|
+
signupUrl: "https://openrouter.ai/keys",
|
|
242
|
+
modelSource: "api-list",
|
|
243
|
+
supported: true
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: "kilo",
|
|
247
|
+
name: "Kilo Code",
|
|
248
|
+
authType: "api",
|
|
249
|
+
npm: "@ai-sdk/openai-compatible",
|
|
250
|
+
defaultBaseUrl: "https://api.kilo.ai/api/gateway",
|
|
251
|
+
modelsPath: "/models",
|
|
252
|
+
signupUrl: "https://app.kilo.ai",
|
|
253
|
+
apiKeyOptional: true,
|
|
254
|
+
anonymousFreeModels: true,
|
|
255
|
+
modelSource: "api-list",
|
|
256
|
+
supported: true
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: "ollama",
|
|
260
|
+
name: "Ollama",
|
|
261
|
+
authType: "api",
|
|
262
|
+
npm: "@ai-sdk/openai-compatible",
|
|
263
|
+
defaultBaseUrl: "http://127.0.0.1:11434/v1",
|
|
264
|
+
urlPrompt: "Ollama API Base URL:",
|
|
265
|
+
apiKeyOptional: true,
|
|
266
|
+
modelSource: "api-list",
|
|
267
|
+
supported: true
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
id: "lmstudio",
|
|
271
|
+
name: "LM Studio",
|
|
272
|
+
authType: "api",
|
|
273
|
+
npm: "@ai-sdk/openai-compatible",
|
|
274
|
+
defaultBaseUrl: "http://127.0.0.1:1234/v1",
|
|
275
|
+
urlPrompt: "LM Studio API Base URL:",
|
|
276
|
+
apiKeyOptional: true,
|
|
277
|
+
modelSource: "api-list",
|
|
278
|
+
supported: true
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
id: "venice",
|
|
282
|
+
name: "Venice AI",
|
|
283
|
+
authType: "api",
|
|
284
|
+
npm: "venice-ai-sdk-provider",
|
|
285
|
+
defaultBaseUrl: "https://api.venice.ai/api/v1",
|
|
286
|
+
signupUrl: "https://venice.ai/settings/api",
|
|
287
|
+
modelSource: "api-list",
|
|
288
|
+
supported: true
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
id: "anthropic",
|
|
292
|
+
name: "Anthropic",
|
|
293
|
+
authType: "api",
|
|
294
|
+
npm: "@ai-sdk/anthropic",
|
|
295
|
+
defaultBaseUrl: "https://api.anthropic.com",
|
|
296
|
+
signupUrl: "https://console.anthropic.com/settings/keys",
|
|
297
|
+
modelSource: "api-list",
|
|
298
|
+
supported: true
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
id: "bedrock",
|
|
302
|
+
name: "Amazon Bedrock",
|
|
303
|
+
authType: "api",
|
|
304
|
+
npm: "@ai-sdk/amazon-bedrock",
|
|
305
|
+
modelSource: "manual-only",
|
|
306
|
+
supported: false,
|
|
307
|
+
unsupportedReason: "Requires AWS credentials \u2014 use relay-ai providers import from OpenCode for now."
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
id: "azure",
|
|
311
|
+
name: "Azure OpenAI",
|
|
312
|
+
authType: "api",
|
|
313
|
+
npm: "@ai-sdk/azure",
|
|
314
|
+
modelSource: "manual-only",
|
|
315
|
+
supported: false,
|
|
316
|
+
unsupportedReason: "Requires Azure deployment URLs \u2014 use relay-ai providers import from OpenCode for now."
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
id: "vertex",
|
|
320
|
+
name: "Google Vertex AI",
|
|
321
|
+
authType: "none",
|
|
322
|
+
npm: "@ai-sdk/google-vertex",
|
|
323
|
+
modelSource: "manual-only",
|
|
324
|
+
supported: false,
|
|
325
|
+
unsupportedReason: "Uses gcloud Application Default Credentials \u2014 not supported via API key import."
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
id: "opencode-cloud",
|
|
329
|
+
name: "OpenCode Zen / Go",
|
|
330
|
+
authType: "api",
|
|
331
|
+
npm: "@ai-sdk/openai-compatible",
|
|
332
|
+
signupUrl: "https://opencode.ai/auth",
|
|
333
|
+
modelSource: "zen-go-api",
|
|
334
|
+
supported: true
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
id: "zen",
|
|
338
|
+
name: "OpenCode Zen",
|
|
339
|
+
authType: "api",
|
|
340
|
+
npm: "@ai-sdk/openai-compatible",
|
|
341
|
+
signupUrl: "https://opencode.ai/auth",
|
|
342
|
+
modelSource: "zen-go-api",
|
|
343
|
+
supported: true,
|
|
344
|
+
addable: false
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
id: "go",
|
|
348
|
+
name: "OpenCode Go",
|
|
349
|
+
authType: "api",
|
|
350
|
+
npm: "@ai-sdk/openai-compatible",
|
|
351
|
+
signupUrl: "https://opencode.ai/auth",
|
|
352
|
+
modelSource: "zen-go-api",
|
|
353
|
+
supported: true,
|
|
354
|
+
addable: false
|
|
355
|
+
},
|
|
356
|
+
// Subscription OAuth providers — Authorization Code + PKCE (browser redirect)
|
|
357
|
+
// ⚠️ These extract tokens from paid subscriptions. Account risk — see plan docs.
|
|
358
|
+
{
|
|
359
|
+
id: "claude-code",
|
|
360
|
+
name: "Claude Code (Anthropic subscription)",
|
|
361
|
+
authType: "oauth",
|
|
362
|
+
npm: "@ai-sdk/anthropic",
|
|
363
|
+
defaultBaseUrl: "https://api.anthropic.com",
|
|
364
|
+
signupUrl: "https://claude.ai",
|
|
365
|
+
modelSource: "api-list",
|
|
366
|
+
supported: true,
|
|
367
|
+
hidden: true,
|
|
368
|
+
subscriptionRisk: true
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
id: "antigravity",
|
|
372
|
+
name: "Antigravity (Google Cloud Code Assist)",
|
|
373
|
+
authType: "oauth",
|
|
374
|
+
npm: "@ai-sdk/openai-compatible",
|
|
375
|
+
signupUrl: "https://antigravity.google",
|
|
376
|
+
modelSource: "api-list",
|
|
377
|
+
supported: true,
|
|
378
|
+
hidden: true,
|
|
379
|
+
subscriptionRisk: true
|
|
380
|
+
},
|
|
381
|
+
// OAuth-gated subscription providers — device code or broker sign-in
|
|
382
|
+
{
|
|
383
|
+
id: "xai-oauth",
|
|
384
|
+
name: "xAI Grok (SuperGrok)",
|
|
385
|
+
authType: "oauth",
|
|
386
|
+
npm: "@ai-sdk/xai",
|
|
387
|
+
signupUrl: "https://x.ai",
|
|
388
|
+
modelSource: "api-list",
|
|
389
|
+
supported: true
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
id: "openai-oauth",
|
|
393
|
+
name: "OpenAI (ChatGPT)",
|
|
394
|
+
authType: "oauth",
|
|
395
|
+
npm: "@ai-sdk/openai",
|
|
396
|
+
signupUrl: "https://chatgpt.com",
|
|
397
|
+
modelSource: "api-list",
|
|
398
|
+
supported: true
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
id: "github-copilot",
|
|
402
|
+
name: "GitHub Copilot",
|
|
403
|
+
authType: "oauth",
|
|
404
|
+
npm: "@ai-sdk/openai-compatible",
|
|
405
|
+
defaultBaseUrl: "https://api.githubcopilot.com",
|
|
406
|
+
modelsPath: "/models",
|
|
407
|
+
signupUrl: "https://github.com/features/copilot",
|
|
408
|
+
modelSource: "api-list",
|
|
409
|
+
headers: { "Editor-Version": "vscode/1.85.1" },
|
|
410
|
+
supported: true
|
|
411
|
+
}
|
|
412
|
+
];
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
export {
|
|
417
|
+
__toCommonJS,
|
|
418
|
+
PROVIDER_TEMPLATES,
|
|
419
|
+
listSupportedTemplates,
|
|
420
|
+
listAddableTemplates,
|
|
421
|
+
listVisibleOAuthTemplates,
|
|
422
|
+
getTemplateById,
|
|
423
|
+
filterTemplates,
|
|
424
|
+
provider_templates_exports,
|
|
425
|
+
init_provider_templates
|
|
426
|
+
};
|
|
427
|
+
//# sourceMappingURL=chunk-DO5FAMNC.js.map
|