@jacobbd/relay-ai 0.9.7 → 0.10.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/dist/{chunk-BJ4AE3PS.js → chunk-2NXLK3O6.js} +174 -20
- package/dist/chunk-2NXLK3O6.js.map +1 -0
- package/dist/{chunk-NYKVDBQC.js → chunk-P4IS6537.js} +7 -1
- package/dist/chunk-P4IS6537.js.map +1 -0
- package/dist/cli.js +67 -13
- package/dist/cli.js.map +1 -1
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.js +510 -4
- package/dist/core/index.js.map +1 -1
- package/dist/{provider-templates-CGWE66TD.js → provider-templates-7M24FAAI.js} +2 -2
- package/dist/{ui-command-NM4MNZLO.js → ui-command-6ZMM5K5K.js} +4 -4
- package/package.json +1 -1
- package/dist/chunk-BJ4AE3PS.js.map +0 -1
- package/dist/chunk-NYKVDBQC.js.map +0 -1
- /package/dist/{provider-templates-CGWE66TD.js.map → provider-templates-7M24FAAI.js.map} +0 -0
- /package/dist/{ui-command-NM4MNZLO.js.map → ui-command-6ZMM5K5K.js.map} +0 -0
|
@@ -251,6 +251,7 @@ var init_provider_templates = __esm({
|
|
|
251
251
|
{
|
|
252
252
|
id: "qwen-cloud-token-plan",
|
|
253
253
|
name: "Qwen Cloud (Token Plan)",
|
|
254
|
+
shortName: "Qwen Cloud",
|
|
254
255
|
authType: "api",
|
|
255
256
|
npm: "@ai-sdk/alibaba",
|
|
256
257
|
defaultBaseUrl: "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
|
|
@@ -261,6 +262,7 @@ var init_provider_templates = __esm({
|
|
|
261
262
|
{
|
|
262
263
|
id: "qwen-cloud-payg",
|
|
263
264
|
name: "Qwen Cloud (Pay-As-You-Go)",
|
|
265
|
+
shortName: "Qwen Cloud",
|
|
264
266
|
authType: "api",
|
|
265
267
|
npm: "@ai-sdk/alibaba",
|
|
266
268
|
defaultBaseUrl: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
|
|
@@ -406,6 +408,7 @@ var init_provider_templates = __esm({
|
|
|
406
408
|
{
|
|
407
409
|
id: "claude-code",
|
|
408
410
|
name: "Claude Code (Anthropic subscription)",
|
|
411
|
+
shortName: "Claude Code",
|
|
409
412
|
authType: "oauth",
|
|
410
413
|
npm: "@ai-sdk/anthropic",
|
|
411
414
|
defaultBaseUrl: "https://api.anthropic.com",
|
|
@@ -418,6 +421,7 @@ var init_provider_templates = __esm({
|
|
|
418
421
|
{
|
|
419
422
|
id: "antigravity",
|
|
420
423
|
name: "Cloud Code Assist OAuth (Google)",
|
|
424
|
+
shortName: "Cloud Code Assist",
|
|
421
425
|
authType: "oauth",
|
|
422
426
|
npm: "@ai-sdk/openai-compatible",
|
|
423
427
|
signupUrl: "https://antigravity.google",
|
|
@@ -430,6 +434,7 @@ var init_provider_templates = __esm({
|
|
|
430
434
|
{
|
|
431
435
|
id: "xai-oauth",
|
|
432
436
|
name: "xAI Grok (SuperGrok)",
|
|
437
|
+
shortName: "xAI Grok",
|
|
433
438
|
authType: "oauth",
|
|
434
439
|
npm: "@ai-sdk/xai",
|
|
435
440
|
signupUrl: "https://x.ai",
|
|
@@ -439,6 +444,7 @@ var init_provider_templates = __esm({
|
|
|
439
444
|
{
|
|
440
445
|
id: "openai-oauth",
|
|
441
446
|
name: "OpenAI (ChatGPT)",
|
|
447
|
+
shortName: "OpenAI",
|
|
442
448
|
authType: "oauth",
|
|
443
449
|
npm: "@ai-sdk/openai",
|
|
444
450
|
signupUrl: "https://chatgpt.com",
|
|
@@ -472,4 +478,4 @@ export {
|
|
|
472
478
|
provider_templates_exports,
|
|
473
479
|
init_provider_templates
|
|
474
480
|
};
|
|
475
|
-
//# sourceMappingURL=chunk-
|
|
481
|
+
//# sourceMappingURL=chunk-P4IS6537.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider-templates.ts"],"sourcesContent":["// src/provider-templates.ts — builtin provider templates for relay-ai providers add\n\nexport type ProviderAuthType = 'api' | 'oauth' | 'none';\nexport type ProviderModelSource = 'api-list' | 'static-seed' | 'manual-only' | 'zen-go-api' | 'cline-recommended';\n\nexport interface ProviderTemplate {\n id: string;\n name: string;\n /** Compact label for constrained model lists. */\n shortName?: string;\n authType: ProviderAuthType;\n /** Supported setup methods; defaults to the template's authType. */\n authMethods?: ProviderAuthType[];\n npm: string;\n defaultBaseUrl?: string;\n modelsPath?: string;\n signupUrl?: string;\n urlPlaceholder?: string;\n urlPrompt?: string;\n accountIdPrompt?: string;\n apiKeyOptional?: boolean;\n anonymousFreeModels?: boolean;\n /** Static headers this provider requires on every request (model listing and runtime). */\n headers?: Record<string, string>;\n modelSource: ProviderModelSource;\n staticModels?: Array<{ id: string; name: string }>;\n supported: boolean;\n addable?: boolean;\n hidden?: boolean;\n unsupportedReason?: string;\n /** True for providers that extract subscription tokens — carries account risk. */\n subscriptionRisk?: boolean;\n}\n\n/** Templates aligned with SDK packages shipped in package.json (API-key providers first). */\nexport const PROVIDER_TEMPLATES: ProviderTemplate[] = [\n {\n id: 'cline-pass',\n name: 'ClinePass',\n authType: 'api',\n authMethods: ['api', 'oauth'],\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.cline.bot/api/v1',\n signupUrl: 'https://app.cline.bot',\n modelSource: 'cline-recommended',\n headers: { 'HTTP-Referer': 'https://cline.bot', 'X-Title': 'Cline' },\n supported: true,\n subscriptionRisk: true,\n },\n {\n id: 'groq',\n name: 'Groq',\n authType: 'api',\n npm: '@ai-sdk/groq',\n defaultBaseUrl: 'https://api.groq.com/openai/v1',\n signupUrl: 'https://console.groq.com/keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'nvidia',\n name: 'Nvidia',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://integrate.api.nvidia.com/v1',\n signupUrl: 'https://build.nvidia.com',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'mistral',\n name: 'Mistral',\n authType: 'api',\n npm: '@ai-sdk/mistral',\n defaultBaseUrl: 'https://api.mistral.ai/v1',\n signupUrl: 'https://console.mistral.ai/api-keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'togetherai',\n name: 'Together AI',\n authType: 'api',\n npm: '@ai-sdk/togetherai',\n defaultBaseUrl: 'https://api.together.xyz/v1',\n signupUrl: 'https://api.together.xyz/settings/api-keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'cerebras',\n name: 'Cerebras',\n authType: 'api',\n npm: '@ai-sdk/cerebras',\n defaultBaseUrl: 'https://api.cerebras.ai/v1',\n signupUrl: 'https://cloud.cerebras.ai',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'deepinfra',\n name: 'DeepInfra',\n authType: 'api',\n npm: '@ai-sdk/deepinfra',\n defaultBaseUrl: 'https://api.deepinfra.com/v1/openai',\n signupUrl: 'https://deepinfra.com/dash/api_keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'deepseek',\n name: 'DeepSeek',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.deepseek.com/v1',\n signupUrl: 'https://platform.deepseek.com',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'zhipu',\n name: 'Zhipu AI (GLM)',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n signupUrl: 'https://open.bigmodel.cn',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'moonshot',\n name: 'Moonshot (Kimi)',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.moonshot.cn/v1',\n signupUrl: 'https://platform.moonshot.cn',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'moonshot-global',\n name: 'Moonshot Global (kimi.ai)',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.moonshot.ai/v1',\n signupUrl: 'https://platform.kimi.ai',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'kimi-code',\n name: 'Kimi Code (Subscription Required)',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.kimi.com/coding/v1',\n modelSource: 'static-seed',\n staticModels: [\n { id: 'kimi-for-coding', name: 'Kimi Code K2.7 (Unified)' }\n ],\n supported: true,\n },\n {\n id: 'xai',\n name: 'xAI',\n authType: 'api',\n npm: '@ai-sdk/xai',\n defaultBaseUrl: 'https://api.x.ai/v1',\n signupUrl: 'https://console.x.ai',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'perplexity',\n name: 'Perplexity',\n authType: 'api',\n npm: '@ai-sdk/perplexity',\n defaultBaseUrl: 'https://api.perplexity.ai',\n signupUrl: 'https://www.perplexity.ai/settings/api',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'cohere',\n name: 'Cohere',\n authType: 'api',\n npm: '@ai-sdk/cohere',\n defaultBaseUrl: 'https://api.cohere.com/compatibility/v1',\n signupUrl: 'https://dashboard.cohere.com/api-keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'openai',\n name: 'OpenAI',\n authType: 'api',\n npm: '@ai-sdk/openai',\n defaultBaseUrl: 'https://api.openai.com/v1',\n signupUrl: 'https://platform.openai.com/api-keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'google',\n name: 'Google Gemini',\n authType: 'api',\n npm: '@ai-sdk/google',\n defaultBaseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n signupUrl: 'https://aistudio.google.com/apikey',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'alibaba',\n name: 'Alibaba DashScope (China)',\n authType: 'api',\n npm: '@ai-sdk/alibaba',\n defaultBaseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n signupUrl: 'https://dashscope.console.aliyun.com/apiKey',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'qwen-cloud-token-plan',\n name: 'Qwen Cloud (Token Plan)',\n shortName: 'Qwen Cloud',\n authType: 'api',\n npm: '@ai-sdk/alibaba',\n defaultBaseUrl: 'https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1',\n signupUrl: 'https://home.qwencloud.com/api-keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'qwen-cloud-payg',\n name: 'Qwen Cloud (Pay-As-You-Go)',\n shortName: 'Qwen Cloud',\n authType: 'api',\n npm: '@ai-sdk/alibaba',\n defaultBaseUrl: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',\n signupUrl: 'https://home.qwencloud.com/api-keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'openrouter',\n name: 'OpenRouter',\n authType: 'api',\n npm: '@openrouter/ai-sdk-provider',\n defaultBaseUrl: 'https://openrouter.ai/api/v1',\n signupUrl: 'https://openrouter.ai/keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'kilo',\n name: 'Kilo Code',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.kilo.ai/api/gateway',\n modelsPath: '/models',\n signupUrl: 'https://app.kilo.ai',\n apiKeyOptional: true,\n anonymousFreeModels: true,\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'ollama',\n name: 'Ollama',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'http://127.0.0.1:11434/v1',\n urlPrompt: 'Ollama API Base URL:',\n apiKeyOptional: true,\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'lmstudio',\n name: 'LM Studio',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'http://127.0.0.1:1234/v1',\n urlPrompt: 'LM Studio API Base URL:',\n apiKeyOptional: true,\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'venice',\n name: 'Venice AI',\n authType: 'api',\n npm: 'venice-ai-sdk-provider',\n defaultBaseUrl: 'https://api.venice.ai/api/v1',\n signupUrl: 'https://venice.ai/settings/api',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'cloudflare',\n name: 'Cloudflare Workers AI',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/v1',\n modelsPath: '/models/search?task=Text%20Generation',\n signupUrl: 'https://dash.cloudflare.com',\n accountIdPrompt: 'Cloudflare Account ID:',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'anthropic',\n name: 'Anthropic',\n authType: 'api',\n npm: '@ai-sdk/anthropic',\n defaultBaseUrl: 'https://api.anthropic.com',\n signupUrl: 'https://console.anthropic.com/settings/keys',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'bedrock',\n name: 'Amazon Bedrock',\n authType: 'api',\n npm: '@ai-sdk/amazon-bedrock',\n modelSource: 'manual-only',\n supported: false,\n unsupportedReason: 'Not supported yet (requires AWS credentials). Optional: relay-ai providers import if already set up in OpenCode CLI.',\n },\n {\n id: 'azure',\n name: 'Azure OpenAI',\n authType: 'api',\n npm: '@ai-sdk/azure',\n modelSource: 'manual-only',\n supported: false,\n unsupportedReason: 'Not supported yet (requires Azure deployment URLs). Optional: relay-ai providers import if already set up in OpenCode CLI.',\n },\n {\n id: 'vertex',\n name: 'Google Vertex AI',\n authType: 'none',\n npm: '@ai-sdk/google-vertex',\n modelSource: 'manual-only',\n supported: false,\n unsupportedReason: 'Uses gcloud Application Default Credentials — use relay-ai server --vertex, not an API key.',\n },\n {\n id: 'opencode-cloud',\n name: 'OpenCode Zen / Go',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n signupUrl: 'https://opencode.ai/auth',\n modelSource: 'zen-go-api',\n supported: true,\n },\n {\n id: 'zen',\n name: 'OpenCode Zen',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n signupUrl: 'https://opencode.ai/auth',\n modelSource: 'zen-go-api',\n supported: true,\n addable: false,\n },\n {\n id: 'go',\n name: 'OpenCode Go',\n authType: 'api',\n npm: '@ai-sdk/openai-compatible',\n signupUrl: 'https://opencode.ai/auth',\n modelSource: 'zen-go-api',\n supported: true,\n addable: false,\n },\n // Subscription OAuth providers — Authorization Code + PKCE (browser redirect)\n // ⚠️ These extract tokens from paid subscriptions. Account risk — see plan docs.\n {\n id: 'claude-code',\n name: 'Claude Code (Anthropic subscription)',\n shortName: 'Claude Code',\n authType: 'oauth',\n npm: '@ai-sdk/anthropic',\n defaultBaseUrl: 'https://api.anthropic.com',\n signupUrl: 'https://claude.ai',\n modelSource: 'api-list',\n supported: true,\n hidden: true,\n subscriptionRisk: true,\n },\n {\n id: 'antigravity',\n name: 'Cloud Code Assist OAuth (Google)',\n shortName: 'Cloud Code Assist',\n authType: 'oauth',\n npm: '@ai-sdk/openai-compatible',\n signupUrl: 'https://antigravity.google',\n modelSource: 'api-list',\n supported: true,\n hidden: true,\n subscriptionRisk: true,\n },\n // OAuth-gated subscription providers — device code or broker sign-in\n {\n id: 'xai-oauth',\n name: 'xAI Grok (SuperGrok)',\n shortName: 'xAI Grok',\n authType: 'oauth',\n npm: '@ai-sdk/xai',\n signupUrl: 'https://x.ai',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'openai-oauth',\n name: 'OpenAI (ChatGPT)',\n shortName: 'OpenAI',\n authType: 'oauth',\n npm: '@ai-sdk/openai',\n signupUrl: 'https://chatgpt.com',\n modelSource: 'api-list',\n supported: true,\n },\n {\n id: 'github-copilot',\n name: 'GitHub Copilot',\n authType: 'oauth',\n npm: '@ai-sdk/openai-compatible',\n defaultBaseUrl: 'https://api.githubcopilot.com',\n modelsPath: '/models',\n signupUrl: 'https://github.com/features/copilot',\n modelSource: 'api-list',\n headers: { 'Editor-Version': 'vscode/1.85.1' },\n supported: true,\n },\n];\n\nexport function listSupportedTemplates(): ProviderTemplate[] {\n return PROVIDER_TEMPLATES\n .filter(t => t.supported && (t.authMethods ?? [t.authType]).includes('api') && t.addable !== false && !t.hidden)\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/** Supported templates not yet present in the user's registry. */\nexport function listAddableTemplates(configuredIds: Iterable<string> = []): ProviderTemplate[] {\n const configured = new Set(configuredIds);\n return listSupportedTemplates().filter(t => {\n if (t.id === 'opencode-cloud') {\n return !configured.has('zen') && !configured.has('go');\n }\n return !configured.has(t.id);\n });\n}\n\nexport function listVisibleOAuthTemplates(configuredIds: Iterable<string> = []): ProviderTemplate[] {\n const configured = new Set(configuredIds);\n return PROVIDER_TEMPLATES\n .filter(t => {\n const methods = t.authMethods ?? [t.authType];\n return methods.includes('oauth')\n && !methods.includes('api')\n && t.supported\n && t.addable !== false\n && !t.hidden\n && !configured.has(t.id);\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function getTemplateById(id: string): ProviderTemplate | undefined {\n return PROVIDER_TEMPLATES.find(t => t.id === id);\n}\n\nexport function filterTemplates(templates: ProviderTemplate[], query: string): ProviderTemplate[] {\n const q = query.trim().toLowerCase();\n if (!q) return templates;\n return templates.filter(\n t =>\n t.id.toLowerCase().includes(q) ||\n t.name.toLowerCase().includes(q) ||\n t.npm.toLowerCase().includes(q),\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
CONFLICTING_ENV_VARS,
|
|
12
12
|
GLOBAL_OPENCODE_KEYRING_ACCOUNT,
|
|
13
13
|
MAX_MODEL_CATALOG,
|
|
14
|
+
OPENCODE_SESSION_HEADER,
|
|
14
15
|
PREVIEW_PROXY_PORT,
|
|
15
16
|
VERSION,
|
|
16
17
|
VERTEX_ANTHROPIC_NPM,
|
|
@@ -56,6 +57,7 @@ import {
|
|
|
56
57
|
estimateAnthropicInputTokens,
|
|
57
58
|
evaluateAgySwitchCompatibility,
|
|
58
59
|
extractApiKey,
|
|
60
|
+
extractConversationId,
|
|
59
61
|
favoriteProviderDisplayName,
|
|
60
62
|
fetchAnthropicModels,
|
|
61
63
|
fetchProviderCatalog,
|
|
@@ -120,6 +122,7 @@ import {
|
|
|
120
122
|
navOption,
|
|
121
123
|
oauthAuthRef,
|
|
122
124
|
oauthCredentialToKeychainJson,
|
|
125
|
+
openCodeGoHeaders,
|
|
123
126
|
parseCodexAppModelSlug,
|
|
124
127
|
parseDsmlToolCalls,
|
|
125
128
|
parseToolArguments,
|
|
@@ -199,7 +202,7 @@ import {
|
|
|
199
202
|
waitForCodexAppQuit,
|
|
200
203
|
writeSecureLogLine,
|
|
201
204
|
zenRegistryStub
|
|
202
|
-
} from "./chunk-
|
|
205
|
+
} from "./chunk-2NXLK3O6.js";
|
|
203
206
|
import {
|
|
204
207
|
filterTemplates,
|
|
205
208
|
getTemplateById,
|
|
@@ -207,7 +210,7 @@ import {
|
|
|
207
210
|
listAddableTemplates,
|
|
208
211
|
listSupportedTemplates,
|
|
209
212
|
listVisibleOAuthTemplates
|
|
210
|
-
} from "./chunk-
|
|
213
|
+
} from "./chunk-P4IS6537.js";
|
|
211
214
|
|
|
212
215
|
// src/cli.ts
|
|
213
216
|
import pc12 from "picocolors";
|
|
@@ -2622,7 +2625,8 @@ function translateResponsesRequest(body, npm, metadata, options = {}) {
|
|
|
2622
2625
|
toolContext,
|
|
2623
2626
|
maxOutputTokens: body.max_output_tokens,
|
|
2624
2627
|
temperature: body.temperature,
|
|
2625
|
-
providerOptions
|
|
2628
|
+
providerOptions,
|
|
2629
|
+
headers: options.requestHeaders
|
|
2626
2630
|
};
|
|
2627
2631
|
}
|
|
2628
2632
|
function newResponseId() {
|
|
@@ -4354,6 +4358,12 @@ async function startCodexProxy(routes, options = {}) {
|
|
|
4354
4358
|
mixedNative,
|
|
4355
4359
|
headers: req.headers
|
|
4356
4360
|
});
|
|
4361
|
+
const requestHeaders = openCodeGoHeaders(
|
|
4362
|
+
route.providerId,
|
|
4363
|
+
route.baseURL,
|
|
4364
|
+
extractConversationId(req.headers, routedBody),
|
|
4365
|
+
route.headers
|
|
4366
|
+
);
|
|
4357
4367
|
let params = applyClaudeCodeOAuthIdentity(route, applyExternalCodexRuntimeIdentity(translateResponsesRequest(
|
|
4358
4368
|
routedBody,
|
|
4359
4369
|
route.npm,
|
|
@@ -4365,7 +4375,10 @@ async function startCodexProxy(routes, options = {}) {
|
|
|
4365
4375
|
interleavedReasoningField: route.interleavedReasoningField,
|
|
4366
4376
|
upstreamModelId: route.upstreamModelId
|
|
4367
4377
|
},
|
|
4368
|
-
{
|
|
4378
|
+
{
|
|
4379
|
+
maxTools: maxToolsForNpm(route.npm),
|
|
4380
|
+
...requestHeaders ? { requestHeaders } : {}
|
|
4381
|
+
}
|
|
4369
4382
|
), route));
|
|
4370
4383
|
if (route.contextWindow && route.contextWindow > 0) {
|
|
4371
4384
|
const before = params.messages.length;
|
|
@@ -4975,6 +4988,12 @@ data: ${JSON.stringify({ error: { message: `Unknown model: ${modelId}` } })}
|
|
|
4975
4988
|
mixedNative,
|
|
4976
4989
|
headers: req.headers
|
|
4977
4990
|
});
|
|
4991
|
+
const requestHeaders = openCodeGoHeaders(
|
|
4992
|
+
route.providerId,
|
|
4993
|
+
route.baseURL,
|
|
4994
|
+
extractConversationId(req.headers, routedBody),
|
|
4995
|
+
route.headers
|
|
4996
|
+
);
|
|
4978
4997
|
currentExternalStateInput = responsesInputItems(routedBody.input);
|
|
4979
4998
|
currentExternalConsumedResponseId = continuation.consumedResponseId;
|
|
4980
4999
|
let params = applyClaudeCodeOAuthIdentity(route, applyExternalCodexRuntimeIdentity(translateResponsesRequest(
|
|
@@ -4988,7 +5007,10 @@ data: ${JSON.stringify({ error: { message: `Unknown model: ${modelId}` } })}
|
|
|
4988
5007
|
interleavedReasoningField: route.interleavedReasoningField,
|
|
4989
5008
|
upstreamModelId: route.upstreamModelId
|
|
4990
5009
|
},
|
|
4991
|
-
{
|
|
5010
|
+
{
|
|
5011
|
+
maxTools: maxToolsForNpm(route.npm),
|
|
5012
|
+
...requestHeaders ? { requestHeaders } : {}
|
|
5013
|
+
}
|
|
4992
5014
|
), route));
|
|
4993
5015
|
if (route.contextWindow && route.contextWindow > 0) {
|
|
4994
5016
|
const before = params.messages.length;
|
|
@@ -7343,7 +7365,8 @@ function translateGeminiRequest(body, options = {}) {
|
|
|
7343
7365
|
toolChoice,
|
|
7344
7366
|
maxOutputTokens: generationConfig.maxOutputTokens,
|
|
7345
7367
|
temperature: generationConfig.temperature,
|
|
7346
|
-
responseFormat
|
|
7368
|
+
responseFormat,
|
|
7369
|
+
headers: options.requestHeaders
|
|
7347
7370
|
};
|
|
7348
7371
|
}
|
|
7349
7372
|
async function startGeminiProxy(routes, debug = false) {
|
|
@@ -7471,9 +7494,18 @@ Available: ${available}`, isStream);
|
|
|
7471
7494
|
plog(`Route selected: ${route.aliasId} (upstream model: ${route.realModelId})`);
|
|
7472
7495
|
body.contents = sanitizeModelSwitchTurns(body.contents || []);
|
|
7473
7496
|
const languageModel = await getOrInitModel(route);
|
|
7497
|
+
const requestHeaders = openCodeGoHeaders(
|
|
7498
|
+
route.providerId,
|
|
7499
|
+
route.baseURL,
|
|
7500
|
+
extractConversationId(req.headers, body),
|
|
7501
|
+
route.headers
|
|
7502
|
+
);
|
|
7474
7503
|
const params = applyClaudeCodeOAuthIdentity(
|
|
7475
7504
|
{ ...route, upstreamModelId: route.realModelId },
|
|
7476
|
-
translateGeminiRequest(body, {
|
|
7505
|
+
translateGeminiRequest(body, {
|
|
7506
|
+
maxTools: maxToolsForNpm(route.npm),
|
|
7507
|
+
...requestHeaders ? { requestHeaders } : {}
|
|
7508
|
+
})
|
|
7477
7509
|
);
|
|
7478
7510
|
params.providerOptions = deepMergeProviderOptions(
|
|
7479
7511
|
params.providerOptions,
|
|
@@ -8371,7 +8403,8 @@ function translateRequest(ccReq, options = {}) {
|
|
|
8371
8403
|
system,
|
|
8372
8404
|
messages: sdkMessages,
|
|
8373
8405
|
tools,
|
|
8374
|
-
toolChoice
|
|
8406
|
+
toolChoice,
|
|
8407
|
+
headers: options.requestHeaders
|
|
8375
8408
|
};
|
|
8376
8409
|
}
|
|
8377
8410
|
|
|
@@ -9566,7 +9599,16 @@ async function startCloudCodeGateway(routes, opts = {}) {
|
|
|
9566
9599
|
const baseProviderOptions = providerOptionsCache.get(route.catalogId);
|
|
9567
9600
|
const isStream = lowerUrl.includes("stream");
|
|
9568
9601
|
const conversationKey = conversationKeyFromRequest(parsed);
|
|
9569
|
-
const
|
|
9602
|
+
const requestHeaders = openCodeGoHeaders(
|
|
9603
|
+
route.providerId,
|
|
9604
|
+
route.baseURL,
|
|
9605
|
+
antigravityConversationId(parsed, req.headers),
|
|
9606
|
+
route.headers
|
|
9607
|
+
);
|
|
9608
|
+
const requestOptions = {
|
|
9609
|
+
...reasoningEchoOptionsForRoute(route, parsed, reasoningEchoesByConversation),
|
|
9610
|
+
...requestHeaders ? { requestHeaders } : {}
|
|
9611
|
+
};
|
|
9570
9612
|
const rememberReasoning = (reasoning) => {
|
|
9571
9613
|
if (!shouldEchoReasoningForRoute(route)) return;
|
|
9572
9614
|
rememberReasoningEcho(reasoningEchoesByConversation, conversationKey, reasoning);
|
|
@@ -9749,6 +9791,14 @@ function conversationKeyFromRequest(parsed) {
|
|
|
9749
9791
|
}
|
|
9750
9792
|
return "global";
|
|
9751
9793
|
}
|
|
9794
|
+
function antigravityConversationId(parsed, headers) {
|
|
9795
|
+
const explicit = extractConversationId(headers, parsed);
|
|
9796
|
+
if (explicit) return explicit;
|
|
9797
|
+
const requestId = typeof parsed?.requestId === "string" ? parsed.requestId : "";
|
|
9798
|
+
const segments = requestId.split("/");
|
|
9799
|
+
if (segments.length >= 2 && segments[0] && segments[1]) return `${segments[0]}/${segments[1]}`;
|
|
9800
|
+
return void 0;
|
|
9801
|
+
}
|
|
9752
9802
|
function shouldEchoReasoningForRoute(route) {
|
|
9753
9803
|
if (route.npm !== "@ai-sdk/openai-compatible") return false;
|
|
9754
9804
|
const routeIdentity = [
|
|
@@ -9988,7 +10038,8 @@ async function handleStreamingRequest(res, route, providerOptions, parsed, log14
|
|
|
9988
10038
|
messages: sdkParams.messages,
|
|
9989
10039
|
tools: sdkParams.tools,
|
|
9990
10040
|
toolChoice: sdkParams.toolChoice,
|
|
9991
|
-
providerOptions: effectiveProviderOptions
|
|
10041
|
+
providerOptions: effectiveProviderOptions,
|
|
10042
|
+
headers: sdkParams.headers
|
|
9992
10043
|
});
|
|
9993
10044
|
const startSse = () => {
|
|
9994
10045
|
if (res.headersSent) return;
|
|
@@ -10165,7 +10216,8 @@ async function handleUnaryRequest(res, route, providerOptions, parsed, log14, op
|
|
|
10165
10216
|
messages: sdkParams.messages,
|
|
10166
10217
|
tools: sdkParams.tools,
|
|
10167
10218
|
toolChoice: sdkParams.toolChoice,
|
|
10168
|
-
providerOptions: effectiveProviderOptions
|
|
10219
|
+
providerOptions: effectiveProviderOptions,
|
|
10220
|
+
headers: sdkParams.headers
|
|
10169
10221
|
});
|
|
10170
10222
|
const parts = [];
|
|
10171
10223
|
const reasoning = reasoningOutputText(result.reasoning);
|
|
@@ -13932,6 +13984,7 @@ function forwardToAdapter(req, res, rawBody, adapter) {
|
|
|
13932
13984
|
resolve2();
|
|
13933
13985
|
};
|
|
13934
13986
|
const sessionId = req.headers["x-claude-code-session-id"];
|
|
13987
|
+
const opencodeSession = req.headers[OPENCODE_SESSION_HEADER];
|
|
13935
13988
|
const upstream = http2.request({
|
|
13936
13989
|
hostname: "127.0.0.1",
|
|
13937
13990
|
port: adapter.port,
|
|
@@ -13941,7 +13994,8 @@ function forwardToAdapter(req, res, rawBody, adapter) {
|
|
|
13941
13994
|
"Content-Type": "application/json",
|
|
13942
13995
|
"Content-Length": String(rawBody.length),
|
|
13943
13996
|
"x-api-key": adapter.token,
|
|
13944
|
-
...typeof sessionId === "string" ? { "x-claude-code-session-id": sessionId } : {}
|
|
13997
|
+
...typeof sessionId === "string" ? { "x-claude-code-session-id": sessionId } : Array.isArray(sessionId) && sessionId[0] ? { "x-claude-code-session-id": sessionId[0] } : {},
|
|
13998
|
+
...typeof opencodeSession === "string" ? { [OPENCODE_SESSION_HEADER]: opencodeSession } : Array.isArray(opencodeSession) && opencodeSession[0] ? { [OPENCODE_SESSION_HEADER]: opencodeSession[0] } : {}
|
|
13945
13999
|
}
|
|
13946
14000
|
}, (upstreamRes) => {
|
|
13947
14001
|
copyResponse(upstreamRes, res);
|
|
@@ -15792,7 +15846,7 @@ Options:
|
|
|
15792
15846
|
--trace Write debug logs under ~/.relay-ai/logs/`);
|
|
15793
15847
|
return 0;
|
|
15794
15848
|
}
|
|
15795
|
-
const { runUiCommand } = await import("./ui-command-
|
|
15849
|
+
const { runUiCommand } = await import("./ui-command-6ZMM5K5K.js");
|
|
15796
15850
|
return runUiCommand({ trace: parsed.trace, serverMode: parsed.uiServerMode });
|
|
15797
15851
|
}
|
|
15798
15852
|
if (parsed.command === "models") {
|