@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.
@@ -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-NYKVDBQC.js.map
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-BJ4AE3PS.js";
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-NYKVDBQC.js";
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
- { maxTools: maxToolsForNpm(route.npm) }
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
- { maxTools: maxToolsForNpm(route.npm) }
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, { maxTools: maxToolsForNpm(route.npm) })
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 requestOptions = reasoningEchoOptionsForRoute(route, parsed, reasoningEchoesByConversation);
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-NM4MNZLO.js");
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") {