@jacobbd/relay-ai 0.9.8 → 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-WIXM2H2D.js → chunk-2NXLK3O6.js} +173 -19
- package/dist/chunk-2NXLK3O6.js.map +1 -0
- package/dist/cli.js +66 -12
- package/dist/cli.js.map +1 -1
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.js +83 -4
- package/dist/core/index.js.map +1 -1
- package/dist/{ui-command-JIRLAHM6.js → ui-command-6ZMM5K5K.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-WIXM2H2D.js.map +0 -1
- /package/dist/{ui-command-JIRLAHM6.js.map → ui-command-6ZMM5K5K.js.map} +0 -0
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,
|
|
@@ -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") {
|