@omnicross/core 0.1.4 → 0.1.6
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/ApiConverter.cjs +2 -2
- package/dist/ApiConverter.js +1 -1
- package/dist/{CompletionService-DdWaAxq0.d.ts → CompletionService-C3BX0Ovy.d.ts} +4 -3
- package/dist/{CompletionService-D3a47vdU.d.cts → CompletionService-kNA17cfI.d.cts} +4 -3
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +7 -5
- package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -3
- package/dist/{chunk-HRRYG2AX.js → chunk-23S5OPIO.js} +10 -1
- package/dist/chunk-25GXJCEZ.cjs +40 -0
- package/dist/chunk-2JYRIADS.js +40 -0
- package/dist/chunk-3Z5BQZFM.cjs +52 -0
- package/dist/{chunk-4VAVYUZS.cjs → chunk-4VLRHHFE.cjs} +82 -40
- package/dist/{chunk-VACWOIRE.cjs → chunk-4VZX5F4T.cjs} +39 -15
- package/dist/{chunk-FTQ7IQUC.js → chunk-6CL5HTPQ.js} +52 -10
- package/dist/chunk-6QQG7YG3.cjs +153 -0
- package/dist/{chunk-SU2GCLAC.cjs → chunk-6VUQPOV3.cjs} +359 -60
- package/dist/chunk-7AK7B36B.cjs +44 -0
- package/dist/{chunk-5ZQBEOMD.js → chunk-AT7B7SOZ.js} +25 -2
- package/dist/{chunk-IK3KE3AU.js → chunk-DE2SRBFZ.js} +1 -1
- package/dist/chunk-DLXZEZWO.cjs +285 -0
- package/dist/{chunk-UHGVBFU3.js → chunk-EBLFCNPY.js} +38 -14
- package/dist/chunk-EJLH6NFT.cjs +166 -0
- package/dist/chunk-HVBBDBS3.cjs +350 -0
- package/dist/{chunk-7Y47UCF2.js → chunk-IFXJ2BG7.js} +5 -38
- package/dist/{chunk-46ZIFWYG.cjs → chunk-IIRPUVPH.cjs} +7 -1
- package/dist/{chunk-YGXJGRFI.cjs → chunk-KBM2W6UY.cjs} +111 -24
- package/dist/{chunk-OCEUVQHW.cjs → chunk-KCVJWJST.cjs} +73 -3
- package/dist/chunk-LB6EBS6Y.js +69 -0
- package/dist/{chunk-C7PSERMH.js → chunk-LVUCAWMK.js} +1 -1
- package/dist/chunk-MKF46GNZ.js +350 -0
- package/dist/{chunk-HYN75H6G.cjs → chunk-MUHWHQVM.cjs} +1 -1
- package/dist/{chunk-Z7Y2NPHY.js → chunk-N5T4M4GU.js} +1 -1
- package/dist/{chunk-TIER4SUC.js → chunk-OEWZUX4G.js} +346 -47
- package/dist/chunk-OF3BECU2.cjs +69 -0
- package/dist/{chunk-RSJ3TWJQ.cjs → chunk-OKMJLEXX.cjs} +5 -5
- package/dist/chunk-OPRS4IQZ.js +153 -0
- package/dist/{chunk-XK5CIRMQ.js → chunk-SIZQQD6T.js} +72 -2
- package/dist/{chunk-DKPXN34V.cjs → chunk-SQYVORNP.cjs} +1334 -510
- package/dist/chunk-SYQF7OIR.js +52 -0
- package/dist/{chunk-S4WBV25P.js → chunk-TOVPMMHM.js} +111 -24
- package/dist/{chunk-QYTT6GE3.js → chunk-UDCC7EMR.js} +1093 -269
- package/dist/{chunk-E3UCVHLP.cjs → chunk-UNWKG6EI.cjs} +5 -38
- package/dist/{chunk-ZLX3KGXX.js → chunk-UX7VWA46.js} +135 -23
- package/dist/{chunk-7YN22L2H.cjs → chunk-V4TXMEJS.cjs} +5 -5
- package/dist/chunk-VRFBB5DB.js +44 -0
- package/dist/chunk-WB6PH56J.js +166 -0
- package/dist/{chunk-G2UTNSGU.js → chunk-WNKWAEUR.js} +7 -1
- package/dist/{chunk-SUEGJ75D.cjs → chunk-WYTEQ4Q5.cjs} +25 -2
- package/dist/{chunk-5ENKBSWO.js → chunk-YJVHCHQX.js} +42 -6
- package/dist/{chunk-VQY5W4YW.cjs → chunk-YK57NMIF.cjs} +44 -8
- package/dist/{chunk-KFI44N2R.cjs → chunk-YNJNTCSQ.cjs} +10 -1
- package/dist/completion/ApiKeyPoolService.cjs +12 -0
- package/dist/completion/ApiKeyPoolService.d.cts +6 -0
- package/dist/completion/ApiKeyPoolService.d.ts +6 -0
- package/dist/completion/ApiKeyPoolService.js +12 -0
- package/dist/completion/CompletionService.cjs +27 -24
- package/dist/completion/CompletionService.d.cts +2 -1
- package/dist/completion/CompletionService.d.ts +2 -1
- package/dist/completion/CompletionService.js +26 -23
- package/dist/completion.cjs +27 -24
- package/dist/completion.d.cts +2 -1
- package/dist/completion.d.ts +2 -1
- package/dist/completion.js +26 -23
- package/dist/index.cjs +53 -29
- package/dist/index.d.cts +8 -8
- package/dist/index.d.ts +8 -8
- package/dist/index.js +56 -32
- package/dist/{keyPolicy-Cp0FntZl.d.cts → keyPolicy-zdWTu3CQ.d.cts} +1 -1
- package/dist/{keyPolicy-Cp0FntZl.d.ts → keyPolicy-zdWTu3CQ.d.ts} +1 -1
- package/dist/outbound-api/auditCapture.cjs +2 -2
- package/dist/outbound-api/auditCapture.d.cts +5 -3
- package/dist/outbound-api/auditCapture.d.ts +5 -3
- package/dist/outbound-api/auditCapture.js +1 -1
- package/dist/outbound-api/quotaWarn.d.cts +1 -1
- package/dist/outbound-api/quotaWarn.d.ts +1 -1
- package/dist/outbound-api/routeResolver.cjs +2 -2
- package/dist/outbound-api/routeResolver.d.cts +4 -3
- package/dist/outbound-api/routeResolver.d.ts +4 -3
- package/dist/outbound-api/routeResolver.js +1 -1
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +1 -0
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +1 -0
- package/dist/outbound-api/types.d.cts +3 -2
- package/dist/outbound-api/types.d.ts +3 -2
- package/dist/outbound-api.cjs +49 -25
- package/dist/outbound-api.d.cts +127 -85
- package/dist/outbound-api.d.ts +127 -85
- package/dist/outbound-api.js +52 -28
- package/dist/pipeline/AccountAllowanceScheduling.cjs +15 -0
- package/dist/pipeline/AccountAllowanceScheduling.d.cts +90 -0
- package/dist/pipeline/AccountAllowanceScheduling.d.ts +90 -0
- package/dist/pipeline/AccountAllowanceScheduling.js +15 -0
- package/dist/pipeline/AccountAllowanceStore.cjs +20 -0
- package/dist/pipeline/AccountAllowanceStore.d.cts +77 -0
- package/dist/pipeline/AccountAllowanceStore.d.ts +77 -0
- package/dist/pipeline/AccountAllowanceStore.js +20 -0
- package/dist/pipeline/AuthSource.d.cts +11 -2
- package/dist/pipeline/AuthSource.d.ts +11 -2
- package/dist/pipeline/BoundAccountSelectionError.cjs +10 -0
- package/dist/pipeline/BoundAccountSelectionError.d.cts +28 -0
- package/dist/pipeline/BoundAccountSelectionError.d.ts +28 -0
- package/dist/pipeline/BoundAccountSelectionError.js +10 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +1 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +1 -0
- package/dist/pipeline/SubscriptionAccountHealth.cjs +4 -2
- package/dist/pipeline/SubscriptionAccountHealth.d.cts +34 -6
- package/dist/pipeline/SubscriptionAccountHealth.d.ts +34 -6
- package/dist/pipeline/SubscriptionAccountHealth.js +3 -1
- package/dist/pipeline/SubscriptionAuthSource.cjs +5 -2
- package/dist/pipeline/SubscriptionAuthSource.d.cts +1 -0
- package/dist/pipeline/SubscriptionAuthSource.d.ts +1 -0
- package/dist/pipeline/SubscriptionAuthSource.js +4 -1
- package/dist/pipeline/SubscriptionAuthStrategy.d.cts +8 -3
- package/dist/pipeline/SubscriptionAuthStrategy.d.ts +8 -3
- package/dist/pipeline/executeProviderCall.cjs +2 -2
- package/dist/pipeline/executeProviderCall.d.cts +8 -3
- package/dist/pipeline/executeProviderCall.d.ts +8 -3
- package/dist/pipeline/executeProviderCall.js +1 -1
- package/dist/pipeline/resolveProviderChain.d.cts +2 -3
- package/dist/pipeline/resolveProviderChain.d.ts +2 -3
- package/dist/pipeline/resolveSubscriptionChain.d.cts +1 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +1 -0
- package/dist/pipeline/upstreamFetch.cjs +4 -2
- package/dist/pipeline/upstreamFetch.d.cts +6 -0
- package/dist/pipeline/upstreamFetch.d.ts +6 -0
- package/dist/pipeline/upstreamFetch.js +3 -1
- package/dist/pipeline/upstreamTrace.cjs +14 -0
- package/dist/pipeline/upstreamTrace.d.cts +85 -0
- package/dist/pipeline/upstreamTrace.d.ts +85 -0
- package/dist/pipeline/upstreamTrace.js +14 -0
- package/dist/ports/pricing-store.d.cts +4 -3
- package/dist/ports/pricing-store.d.ts +4 -3
- package/dist/ports.d.cts +4 -3
- package/dist/ports.d.ts +4 -3
- package/dist/provider-proxy/ProviderProxy.cjs +27 -24
- package/dist/provider-proxy/ProviderProxy.d.cts +1 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +1 -0
- package/dist/provider-proxy/ProviderProxy.js +26 -23
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +31 -24
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +50 -5
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +50 -5
- package/dist/provider-proxy/ingress/providerProxyShared.js +30 -23
- package/dist/provider-proxy/matchText.cjs +4 -2
- package/dist/provider-proxy/matchText.d.cts +41 -6
- package/dist/provider-proxy/matchText.d.ts +41 -6
- package/dist/provider-proxy/matchText.js +3 -1
- package/dist/provider-proxy/types.d.cts +30 -2
- package/dist/provider-proxy/types.d.ts +30 -2
- package/dist/provider-proxy.cjs +27 -24
- package/dist/provider-proxy.d.cts +1 -0
- package/dist/provider-proxy.d.ts +1 -0
- package/dist/provider-proxy.js +26 -23
- package/dist/{routeResolver-C4T7yClx.d.ts → routeResolver-CHTv_Bs5.d.ts} +1 -1
- package/dist/{routeResolver-CB3tvJKy.d.cts → routeResolver-kepxnfcC.d.cts} +1 -1
- package/dist/transformer/TransformerChainExecutor.cjs +2 -2
- package/dist/transformer/TransformerChainExecutor.js +1 -1
- package/dist/transformer/transformers/AnthropicTransformer.cjs +2 -2
- package/dist/transformer/transformers/AnthropicTransformer.js +1 -1
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +3 -3
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +2 -2
- package/dist/transformer/transformers/GeminiTransformer.cjs +3 -3
- package/dist/transformer/transformers/GeminiTransformer.js +2 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +2 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.d.cts +1 -1
- package/dist/transformer/transformers/OpenAIResponseTransformer.d.ts +1 -1
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +1 -1
- package/dist/transformer/transformers/OpenAITransformer.cjs +6 -0
- package/dist/transformer/transformers/OpenAITransformer.d.cts +68 -0
- package/dist/transformer/transformers/OpenAITransformer.d.ts +68 -0
- package/dist/transformer/transformers/OpenAITransformer.js +6 -0
- package/dist/transformer/transformers.cjs +8 -14
- package/dist/transformer/transformers.d.cts +12 -48
- package/dist/transformer/transformers.d.ts +12 -48
- package/dist/transformer/transformers.js +11 -17
- package/dist/transformer/types.d.cts +17 -0
- package/dist/transformer/types.d.ts +17 -0
- package/dist/transformer.cjs +11 -12
- package/dist/transformer.d.cts +1 -2
- package/dist/transformer.d.ts +1 -2
- package/dist/transformer.js +11 -12
- package/dist/{types-B8Arpxn0.d.cts → types-H3wGZSOo.d.cts} +134 -7
- package/dist/{types-lgPYQuZS.d.ts → types-hsoKrVQS.d.ts} +134 -7
- package/dist/usage/pricing-engine.cjs +2 -2
- package/dist/usage/pricing-engine.d.cts +9 -1
- package/dist/usage/pricing-engine.d.ts +9 -1
- package/dist/usage/pricing-engine.js +1 -1
- package/dist/usage.cjs +2 -2
- package/dist/usage.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-C72S6TTV.cjs +0 -49
- package/dist/chunk-DWKQZ2SK.cjs +0 -254
- package/dist/chunk-IAXWICZU.js +0 -69
- package/dist/chunk-QWBWGODS.cjs +0 -69
- package/dist/chunk-RGTR7CIO.cjs +0 -235
- package/dist/chunk-VPBAUQ2M.js +0 -235
- package/dist/chunk-YMFAJFQT.cjs +0 -173
- package/dist/chunk-Z7LUNECE.js +0 -49
- package/dist/chunk-ZJZAOKI7.js +0 -254
- package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +0 -6
- package/dist/transformer/transformers/OpenCodeGoTransformer.d.cts +0 -51
- package/dist/transformer/transformers/OpenCodeGoTransformer.d.ts +0 -51
- package/dist/transformer/transformers/OpenCodeGoTransformer.js +0 -6
- package/dist/transformer/transformers/ReasoningTransformer.cjs +0 -6
- package/dist/transformer/transformers/ReasoningTransformer.d.cts +0 -47
- package/dist/transformer/transformers/ReasoningTransformer.d.ts +0 -47
- package/dist/transformer/transformers/ReasoningTransformer.js +0 -6
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;// src/pipeline/AccountAllowanceStore.ts
|
|
2
|
+
var DEFAULT_CODEX_ALLOWANCE_FRESH_MS = 15 * 6e4;
|
|
3
|
+
var DEFAULT_ALLOWANCE_MAX_SNAPSHOTS = 256;
|
|
4
|
+
var MAX_WINDOWS_PER_SNAPSHOT = 8;
|
|
5
|
+
var MAX_TEXT_LENGTH = 200;
|
|
6
|
+
function snapshotKey(providerId, accountId) {
|
|
7
|
+
return `${providerId}\0${accountId}`;
|
|
8
|
+
}
|
|
9
|
+
function cloneWindow(window) {
|
|
10
|
+
return {
|
|
11
|
+
id: window.id,
|
|
12
|
+
label: window.label,
|
|
13
|
+
scope: window.scope,
|
|
14
|
+
...window.modelFamily === void 0 ? {} : { modelFamily: window.modelFamily },
|
|
15
|
+
usedPercent: window.usedPercent,
|
|
16
|
+
...window.windowMinutes === void 0 ? {} : { windowMinutes: window.windowMinutes },
|
|
17
|
+
...window.resetsAt === void 0 ? {} : { resetsAt: window.resetsAt },
|
|
18
|
+
...window.remainingSeconds === void 0 ? {} : { remainingSeconds: window.remainingSeconds },
|
|
19
|
+
state: window.state
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function cloneSnapshot(snapshot) {
|
|
23
|
+
return {
|
|
24
|
+
providerId: snapshot.providerId,
|
|
25
|
+
accountId: snapshot.accountId,
|
|
26
|
+
source: snapshot.source,
|
|
27
|
+
observedAt: snapshot.observedAt,
|
|
28
|
+
...snapshot.expiresAt === void 0 ? {} : { expiresAt: snapshot.expiresAt },
|
|
29
|
+
windows: snapshot.windows.map(cloneWindow),
|
|
30
|
+
...snapshot.lastErrorCode === void 0 ? {} : { lastErrorCode: snapshot.lastErrorCode },
|
|
31
|
+
...snapshot.primaryOverSecondaryLimitPercent === void 0 ? {} : { primaryOverSecondaryLimitPercent: snapshot.primaryOverSecondaryLimitPercent }
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function finiteNumber(value) {
|
|
35
|
+
if (value === null || value === void 0 || value === "") return void 0;
|
|
36
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
37
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : void 0;
|
|
38
|
+
}
|
|
39
|
+
function boundedText(value, max = MAX_TEXT_LENGTH) {
|
|
40
|
+
return typeof value === "string" && value.length > 0 && value.length <= max ? value : void 0;
|
|
41
|
+
}
|
|
42
|
+
function finitePercent(value) {
|
|
43
|
+
if (value === null) return null;
|
|
44
|
+
if (value === void 0 || value === "") return void 0;
|
|
45
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
46
|
+
return Number.isFinite(parsed) && parsed >= 0 && parsed <= 100 ? parsed : void 0;
|
|
47
|
+
}
|
|
48
|
+
function finiteNonNegativeInteger(value) {
|
|
49
|
+
const parsed = finiteNumber(value);
|
|
50
|
+
return parsed === void 0 ? void 0 : Math.floor(parsed);
|
|
51
|
+
}
|
|
52
|
+
function normalizedInstant(value) {
|
|
53
|
+
if (typeof value !== "string" || !value.trim()) return void 0;
|
|
54
|
+
const parsed = Date.parse(value);
|
|
55
|
+
return Number.isFinite(parsed) ? new Date(parsed).toISOString() : void 0;
|
|
56
|
+
}
|
|
57
|
+
function isAllowanceProvider(value) {
|
|
58
|
+
return value === "claude" || value === "codex" || value === "gemini" || value === "opencodego";
|
|
59
|
+
}
|
|
60
|
+
function isWindowState(value) {
|
|
61
|
+
return value === "fresh" || value === "stale" || value === "unavailable" || value === "unsupported";
|
|
62
|
+
}
|
|
63
|
+
function normalizeAccountAllowanceSnapshot(value) {
|
|
64
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
65
|
+
const raw = value;
|
|
66
|
+
const providerId = raw.providerId;
|
|
67
|
+
const accountId = boundedText(raw.accountId);
|
|
68
|
+
const source = raw.source;
|
|
69
|
+
const observedAt = normalizedInstant(raw.observedAt);
|
|
70
|
+
if (!isAllowanceProvider(providerId) || !accountId || source !== "oauth-usage-api" && source !== "response-headers" || !observedAt || !Array.isArray(raw.windows) || raw.windows.length > MAX_WINDOWS_PER_SNAPSHOT) return null;
|
|
71
|
+
const windows = [];
|
|
72
|
+
for (const item of raw.windows) {
|
|
73
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) return null;
|
|
74
|
+
const window = item;
|
|
75
|
+
const id = boundedText(window.id);
|
|
76
|
+
const label = boundedText(window.label);
|
|
77
|
+
const scope = window.scope;
|
|
78
|
+
const state = window.state;
|
|
79
|
+
const usedPercent = finitePercent(window.usedPercent);
|
|
80
|
+
if (!id || !label || scope !== "all" && scope !== "model-family" || !isWindowState(state) || window.usedPercent !== void 0 && usedPercent === void 0) return null;
|
|
81
|
+
const modelFamily = boundedText(window.modelFamily, 80);
|
|
82
|
+
if (scope === "model-family" && !modelFamily) return null;
|
|
83
|
+
const windowMinutes = window.windowMinutes === void 0 ? void 0 : finiteNonNegativeInteger(window.windowMinutes);
|
|
84
|
+
const remainingSeconds2 = window.remainingSeconds === void 0 ? void 0 : finiteNonNegativeInteger(window.remainingSeconds);
|
|
85
|
+
if (window.windowMinutes !== void 0 && windowMinutes === void 0 || window.remainingSeconds !== void 0 && remainingSeconds2 === void 0) return null;
|
|
86
|
+
const resetsAt = window.resetsAt === void 0 ? void 0 : normalizedInstant(window.resetsAt);
|
|
87
|
+
if (window.resetsAt !== void 0 && !resetsAt) return null;
|
|
88
|
+
windows.push({
|
|
89
|
+
id,
|
|
90
|
+
label,
|
|
91
|
+
scope,
|
|
92
|
+
...scope === "model-family" ? { modelFamily } : {},
|
|
93
|
+
usedPercent: _nullishCoalesce(usedPercent, () => ( null)),
|
|
94
|
+
...windowMinutes === void 0 ? {} : { windowMinutes },
|
|
95
|
+
...resetsAt === void 0 ? {} : { resetsAt },
|
|
96
|
+
...remainingSeconds2 === void 0 ? {} : { remainingSeconds: remainingSeconds2 },
|
|
97
|
+
state
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
const expiresAt = raw.expiresAt === void 0 ? void 0 : normalizedInstant(raw.expiresAt);
|
|
101
|
+
if (raw.expiresAt !== void 0 && !expiresAt) return null;
|
|
102
|
+
const lastErrorCode = raw.lastErrorCode === void 0 ? void 0 : typeof raw.lastErrorCode === "string" && /^[a-z0-9][a-z0-9_.-]{0,63}$/.test(raw.lastErrorCode) ? raw.lastErrorCode : void 0;
|
|
103
|
+
if (raw.lastErrorCode !== void 0 && lastErrorCode === void 0) return null;
|
|
104
|
+
let primaryOverSecondaryLimitPercent;
|
|
105
|
+
if (raw.primaryOverSecondaryLimitPercent !== void 0) {
|
|
106
|
+
if (raw.primaryOverSecondaryLimitPercent === null) return null;
|
|
107
|
+
const parsed = finitePercent(raw.primaryOverSecondaryLimitPercent);
|
|
108
|
+
if (parsed === void 0 || parsed === null) return null;
|
|
109
|
+
primaryOverSecondaryLimitPercent = parsed;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
providerId,
|
|
113
|
+
accountId,
|
|
114
|
+
source,
|
|
115
|
+
observedAt,
|
|
116
|
+
...expiresAt === void 0 ? {} : { expiresAt },
|
|
117
|
+
windows,
|
|
118
|
+
...lastErrorCode === void 0 ? {} : { lastErrorCode },
|
|
119
|
+
...primaryOverSecondaryLimitPercent === void 0 ? {} : { primaryOverSecondaryLimitPercent }
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function headerValue(headers, name) {
|
|
123
|
+
const getter = headers.get;
|
|
124
|
+
if (typeof getter === "function") return getter.call(headers, name);
|
|
125
|
+
const record = headers;
|
|
126
|
+
const wanted = name.toLowerCase();
|
|
127
|
+
for (const [key, value] of Object.entries(record)) {
|
|
128
|
+
if (key.toLowerCase() !== wanted) continue;
|
|
129
|
+
return Array.isArray(value) ? value[0] : value;
|
|
130
|
+
}
|
|
131
|
+
return void 0;
|
|
132
|
+
}
|
|
133
|
+
function parseWindow(headers, prefix) {
|
|
134
|
+
const usedPercent = _nullishCoalesce(finitePercent(headerValue(headers, `x-codex-${prefix}-used-percent`)), () => ( void 0));
|
|
135
|
+
const resetAfterSeconds = finiteNumber(
|
|
136
|
+
headerValue(headers, `x-codex-${prefix}-reset-after-seconds`)
|
|
137
|
+
);
|
|
138
|
+
const windowMinutes = finiteNumber(headerValue(headers, `x-codex-${prefix}-window-minutes`));
|
|
139
|
+
if (usedPercent === void 0 && resetAfterSeconds === void 0 && windowMinutes === void 0) {
|
|
140
|
+
return void 0;
|
|
141
|
+
}
|
|
142
|
+
return { usedPercent, resetAfterSeconds, windowMinutes };
|
|
143
|
+
}
|
|
144
|
+
function parseCodexAllowanceHeaders(headers) {
|
|
145
|
+
const primary = parseWindow(headers, "primary");
|
|
146
|
+
const secondary = parseWindow(headers, "secondary");
|
|
147
|
+
const primaryOverSecondaryLimitPercent = _nullishCoalesce(finitePercent(
|
|
148
|
+
headerValue(headers, "x-codex-primary-over-secondary-limit-percent")
|
|
149
|
+
), () => ( void 0));
|
|
150
|
+
if (!primary && !secondary && primaryOverSecondaryLimitPercent === void 0) return null;
|
|
151
|
+
return { primary, secondary, primaryOverSecondaryLimitPercent };
|
|
152
|
+
}
|
|
153
|
+
function durationLabel(minutes) {
|
|
154
|
+
if (minutes === void 0) return void 0;
|
|
155
|
+
if (minutes % (7 * 24 * 60) === 0) {
|
|
156
|
+
const weeks = minutes / (7 * 24 * 60);
|
|
157
|
+
return `${weeks} week${weeks === 1 ? "" : "s"}`;
|
|
158
|
+
}
|
|
159
|
+
if (minutes % (24 * 60) === 0) {
|
|
160
|
+
const days = minutes / (24 * 60);
|
|
161
|
+
return `${days} day${days === 1 ? "" : "s"}`;
|
|
162
|
+
}
|
|
163
|
+
if (minutes % 60 === 0) {
|
|
164
|
+
const hours = minutes / 60;
|
|
165
|
+
return `${hours} hour${hours === 1 ? "" : "s"}`;
|
|
166
|
+
}
|
|
167
|
+
return `${minutes} minutes`;
|
|
168
|
+
}
|
|
169
|
+
function codexLabel(id, minutes) {
|
|
170
|
+
const base = id === "primary" ? "Primary" : "Secondary";
|
|
171
|
+
const duration = durationLabel(minutes);
|
|
172
|
+
return duration ? `${base} \xB7 ${duration}` : base;
|
|
173
|
+
}
|
|
174
|
+
function resetAt(observedMs, seconds) {
|
|
175
|
+
if (seconds === void 0) return void 0;
|
|
176
|
+
return new Date(observedMs + seconds * 1e3).toISOString();
|
|
177
|
+
}
|
|
178
|
+
function remainingSeconds(resetsAt, now) {
|
|
179
|
+
if (!resetsAt) return void 0;
|
|
180
|
+
const resetMs = Date.parse(resetsAt);
|
|
181
|
+
if (!Number.isFinite(resetMs)) return void 0;
|
|
182
|
+
return Math.max(0, Math.floor((resetMs - now) / 1e3));
|
|
183
|
+
}
|
|
184
|
+
function mergeCodexWindow(id, observation, existing, observedMs) {
|
|
185
|
+
const windowMinutes = _nullishCoalesce(_optionalChain([observation, 'optionalAccess', _ => _.windowMinutes]), () => ( _optionalChain([existing, 'optionalAccess', _2 => _2.windowMinutes])));
|
|
186
|
+
const nextResetAt = _optionalChain([observation, 'optionalAccess', _3 => _3.resetAfterSeconds]) !== void 0 ? resetAt(observedMs, observation.resetAfterSeconds) : _optionalChain([existing, 'optionalAccess', _4 => _4.resetsAt]);
|
|
187
|
+
const hasExistingData = !!existing && (existing.usedPercent !== null || existing.windowMinutes !== void 0 || existing.resetsAt !== void 0);
|
|
188
|
+
return {
|
|
189
|
+
id,
|
|
190
|
+
label: codexLabel(id, windowMinutes),
|
|
191
|
+
scope: "all",
|
|
192
|
+
usedPercent: _nullishCoalesce(_nullishCoalesce(_optionalChain([observation, 'optionalAccess', _5 => _5.usedPercent]), () => ( _optionalChain([existing, 'optionalAccess', _6 => _6.usedPercent]))), () => ( null)),
|
|
193
|
+
windowMinutes,
|
|
194
|
+
resetsAt: nextResetAt,
|
|
195
|
+
remainingSeconds: remainingSeconds(nextResetAt, observedMs),
|
|
196
|
+
state: observation ? "fresh" : hasExistingData ? "stale" : "unavailable"
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function projectSnapshot(snapshot, now) {
|
|
200
|
+
const expiredAt = snapshot.expiresAt ? Date.parse(snapshot.expiresAt) : Number.POSITIVE_INFINITY;
|
|
201
|
+
const expired = Number.isFinite(expiredAt) && expiredAt <= now;
|
|
202
|
+
return {
|
|
203
|
+
...snapshot,
|
|
204
|
+
windows: snapshot.windows.map((window) => ({
|
|
205
|
+
...window,
|
|
206
|
+
state: expired && window.state === "fresh" ? "stale" : window.state,
|
|
207
|
+
remainingSeconds: remainingSeconds(window.resetsAt, now)
|
|
208
|
+
}))
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
var AccountAllowanceStore = (_class = class {
|
|
212
|
+
constructor(now = Date.now, codexFreshMs = DEFAULT_CODEX_ALLOWANCE_FRESH_MS, persistence, maxSnapshots = DEFAULT_ALLOWANCE_MAX_SNAPSHOTS) {;_class.prototype.__init.call(this);
|
|
213
|
+
this.now = now;
|
|
214
|
+
this.codexFreshMs = codexFreshMs;
|
|
215
|
+
this.persistence = persistence;
|
|
216
|
+
this.maxSnapshots = Number.isFinite(maxSnapshots) && maxSnapshots > 0 ? Math.floor(maxSnapshots) : DEFAULT_ALLOWANCE_MAX_SNAPSHOTS;
|
|
217
|
+
this.loadPersisted();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
__init() {this.snapshots = /* @__PURE__ */ new Map()}
|
|
223
|
+
|
|
224
|
+
set(snapshot) {
|
|
225
|
+
const normalized = normalizeAccountAllowanceSnapshot(snapshot);
|
|
226
|
+
if (!normalized) return;
|
|
227
|
+
this.snapshots.set(
|
|
228
|
+
snapshotKey(normalized.providerId, normalized.accountId),
|
|
229
|
+
normalized
|
|
230
|
+
);
|
|
231
|
+
while (this.snapshots.size > this.maxSnapshots) {
|
|
232
|
+
const oldest = this.snapshots.keys().next().value;
|
|
233
|
+
if (oldest === void 0) break;
|
|
234
|
+
this.snapshots.delete(oldest);
|
|
235
|
+
}
|
|
236
|
+
this.persist();
|
|
237
|
+
}
|
|
238
|
+
delete(providerId, accountId) {
|
|
239
|
+
if (this.snapshots.delete(snapshotKey(providerId, accountId))) this.persist();
|
|
240
|
+
}
|
|
241
|
+
/** Remove rows that no longer correspond to a configured account. */
|
|
242
|
+
pruneToKnownAccounts(accounts) {
|
|
243
|
+
const known = /* @__PURE__ */ new Set();
|
|
244
|
+
for (const account of accounts) {
|
|
245
|
+
if (account.accountId) known.add(snapshotKey(account.providerId, account.accountId));
|
|
246
|
+
}
|
|
247
|
+
let removed = 0;
|
|
248
|
+
for (const key of this.snapshots.keys()) {
|
|
249
|
+
if (!known.has(key)) {
|
|
250
|
+
this.snapshots.delete(key);
|
|
251
|
+
removed += 1;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (removed > 0) this.persist();
|
|
255
|
+
return removed;
|
|
256
|
+
}
|
|
257
|
+
get(providerId, accountId, now = this.now()) {
|
|
258
|
+
const snapshot = this.snapshots.get(snapshotKey(providerId, accountId));
|
|
259
|
+
return snapshot ? projectSnapshot(cloneSnapshot(snapshot), now) : null;
|
|
260
|
+
}
|
|
261
|
+
list(filter = {}, now = this.now()) {
|
|
262
|
+
const out = [];
|
|
263
|
+
for (const snapshot of this.snapshots.values()) {
|
|
264
|
+
if (filter.providerId && snapshot.providerId !== filter.providerId) continue;
|
|
265
|
+
if (filter.accountId && snapshot.accountId !== filter.accountId) continue;
|
|
266
|
+
out.push(projectSnapshot(cloneSnapshot(snapshot), now));
|
|
267
|
+
}
|
|
268
|
+
return out.sort(
|
|
269
|
+
(a, b) => a.providerId.localeCompare(b.providerId) || a.accountId.localeCompare(b.accountId)
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Merge one real Codex upstream response into the selected account's snapshot.
|
|
274
|
+
* A response with no recognized headers is a strict no-op, and a partial header
|
|
275
|
+
* set preserves previous values while marking untouched windows stale.
|
|
276
|
+
*/
|
|
277
|
+
recordCodexHeaders(accountId, headers, observedMs = this.now()) {
|
|
278
|
+
if (!accountId) return null;
|
|
279
|
+
const observation = parseCodexAllowanceHeaders(headers);
|
|
280
|
+
if (!observation) return this.get("codex", accountId, observedMs);
|
|
281
|
+
const previous = this.snapshots.get(snapshotKey("codex", accountId));
|
|
282
|
+
const previousPrimary = _optionalChain([previous, 'optionalAccess', _7 => _7.source]) === "response-headers" ? previous.windows.find((window) => window.id === "primary") : void 0;
|
|
283
|
+
const previousSecondary = _optionalChain([previous, 'optionalAccess', _8 => _8.source]) === "response-headers" ? previous.windows.find((window) => window.id === "secondary") : void 0;
|
|
284
|
+
const observedAt = new Date(observedMs).toISOString();
|
|
285
|
+
const snapshot = {
|
|
286
|
+
providerId: "codex",
|
|
287
|
+
accountId,
|
|
288
|
+
source: "response-headers",
|
|
289
|
+
observedAt,
|
|
290
|
+
expiresAt: new Date(observedMs + this.codexFreshMs).toISOString(),
|
|
291
|
+
windows: [
|
|
292
|
+
mergeCodexWindow("primary", observation.primary, previousPrimary, observedMs),
|
|
293
|
+
mergeCodexWindow("secondary", observation.secondary, previousSecondary, observedMs)
|
|
294
|
+
],
|
|
295
|
+
primaryOverSecondaryLimitPercent: _nullishCoalesce(observation.primaryOverSecondaryLimitPercent, () => ( _optionalChain([previous, 'optionalAccess', _9 => _9.primaryOverSecondaryLimitPercent])))
|
|
296
|
+
};
|
|
297
|
+
this.set(snapshot);
|
|
298
|
+
return this.get("codex", accountId, observedMs);
|
|
299
|
+
}
|
|
300
|
+
clear() {
|
|
301
|
+
if (this.snapshots.size === 0) return;
|
|
302
|
+
this.snapshots.clear();
|
|
303
|
+
this.persist();
|
|
304
|
+
}
|
|
305
|
+
loadPersisted() {
|
|
306
|
+
if (!this.persistence) return;
|
|
307
|
+
let payload;
|
|
308
|
+
try {
|
|
309
|
+
payload = this.persistence.load();
|
|
310
|
+
} catch (e) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (!Array.isArray(payload)) return;
|
|
314
|
+
for (const value of payload) {
|
|
315
|
+
const snapshot = normalizeAccountAllowanceSnapshot(value);
|
|
316
|
+
if (!snapshot) continue;
|
|
317
|
+
this.snapshots.set(snapshotKey(snapshot.providerId, snapshot.accountId), snapshot);
|
|
318
|
+
if (this.snapshots.size >= this.maxSnapshots) break;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
persist() {
|
|
322
|
+
if (!this.persistence) return;
|
|
323
|
+
try {
|
|
324
|
+
this.persistence.save(Array.from(this.snapshots.values(), cloneSnapshot));
|
|
325
|
+
} catch (e2) {
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}, _class);
|
|
329
|
+
var sharedAllowanceStore = null;
|
|
330
|
+
function getSharedAccountAllowanceStore() {
|
|
331
|
+
if (!sharedAllowanceStore) sharedAllowanceStore = new AccountAllowanceStore();
|
|
332
|
+
return sharedAllowanceStore;
|
|
333
|
+
}
|
|
334
|
+
function setSharedAccountAllowanceStore(store) {
|
|
335
|
+
sharedAllowanceStore = store;
|
|
336
|
+
}
|
|
337
|
+
function __resetSharedAccountAllowanceStoreForTests() {
|
|
338
|
+
sharedAllowanceStore = null;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
exports.DEFAULT_CODEX_ALLOWANCE_FRESH_MS = DEFAULT_CODEX_ALLOWANCE_FRESH_MS; exports.DEFAULT_ALLOWANCE_MAX_SNAPSHOTS = DEFAULT_ALLOWANCE_MAX_SNAPSHOTS; exports.normalizeAccountAllowanceSnapshot = normalizeAccountAllowanceSnapshot; exports.parseCodexAllowanceHeaders = parseCodexAllowanceHeaders; exports.AccountAllowanceStore = AccountAllowanceStore; exports.getSharedAccountAllowanceStore = getSharedAccountAllowanceStore; exports.setSharedAccountAllowanceStore = setSharedAccountAllowanceStore; exports.__resetSharedAccountAllowanceStoreForTests = __resetSharedAccountAllowanceStoreForTests;
|
|
@@ -11,11 +11,6 @@ import {
|
|
|
11
11
|
|
|
12
12
|
// src/outbound-api/auditCapture.ts
|
|
13
13
|
import { randomUUID } from "crypto";
|
|
14
|
-
function isStreamingContentType(res) {
|
|
15
|
-
const ct = res.getHeader("content-type");
|
|
16
|
-
const value = Array.isArray(ct) ? ct.join(";") : String(ct ?? "");
|
|
17
|
-
return value.toLowerCase().includes("text/event-stream");
|
|
18
|
-
}
|
|
19
14
|
function resolveClientIp(req, trustForwardedFor) {
|
|
20
15
|
if (trustForwardedFor) {
|
|
21
16
|
const xff = req.headers["x-forwarded-for"];
|
|
@@ -27,18 +22,11 @@ function resolveClientIp(req, trustForwardedFor) {
|
|
|
27
22
|
}
|
|
28
23
|
return req.socket?.remoteAddress ?? void 0;
|
|
29
24
|
}
|
|
30
|
-
function truncateToBytes(text, maxBytes) {
|
|
31
|
-
const buf = Buffer.from(text, "utf8");
|
|
32
|
-
if (buf.length <= maxBytes) return text;
|
|
33
|
-
return buf.subarray(0, maxBytes).toString("utf8");
|
|
34
|
-
}
|
|
35
25
|
function beginAuditCapture(req, res, now) {
|
|
36
26
|
const config = getAuditCaptureConfig();
|
|
37
27
|
if (!config) return null;
|
|
38
28
|
let rawRequestBody;
|
|
39
29
|
const responseChunks = [];
|
|
40
|
-
let responseBytes = 0;
|
|
41
|
-
let streamDetected = false;
|
|
42
30
|
let finished = false;
|
|
43
31
|
const ctx = {
|
|
44
32
|
setRequestBody(raw) {
|
|
@@ -46,19 +34,9 @@ function beginAuditCapture(req, res, now) {
|
|
|
46
34
|
}
|
|
47
35
|
};
|
|
48
36
|
if (config.captureBodies) {
|
|
49
|
-
installResponseCapture(res,
|
|
37
|
+
installResponseCapture(res, {
|
|
50
38
|
push(chunk) {
|
|
51
|
-
responseBytes += chunk.length;
|
|
52
39
|
responseChunks.push(chunk);
|
|
53
|
-
},
|
|
54
|
-
get bytes() {
|
|
55
|
-
return responseBytes;
|
|
56
|
-
},
|
|
57
|
-
markStream() {
|
|
58
|
-
streamDetected = true;
|
|
59
|
-
},
|
|
60
|
-
get isStream() {
|
|
61
|
-
return streamDetected;
|
|
62
40
|
}
|
|
63
41
|
});
|
|
64
42
|
}
|
|
@@ -92,9 +70,9 @@ function beginAuditCapture(req, res, now) {
|
|
|
92
70
|
if (ctx.error) record.error = redactAuditText(ctx.error);
|
|
93
71
|
if (config.captureBodies) {
|
|
94
72
|
if (rawRequestBody != null && rawRequestBody.length > 0) {
|
|
95
|
-
record.requestBody = redactAuditText(
|
|
73
|
+
record.requestBody = redactAuditText(rawRequestBody);
|
|
96
74
|
}
|
|
97
|
-
if (
|
|
75
|
+
if (responseChunks.length > 0) {
|
|
98
76
|
const body = Buffer.concat(responseChunks).toString("utf8");
|
|
99
77
|
record.responseBody = redactAuditText(body);
|
|
100
78
|
}
|
|
@@ -106,24 +84,13 @@ function beginAuditCapture(req, res, now) {
|
|
|
106
84
|
res.once("close", finalize);
|
|
107
85
|
return ctx;
|
|
108
86
|
}
|
|
109
|
-
function installResponseCapture(res,
|
|
110
|
-
let contentTypeChecked = false;
|
|
87
|
+
function installResponseCapture(res, sink) {
|
|
111
88
|
const capture = (chunk) => {
|
|
112
|
-
if (sink.isStream) return;
|
|
113
|
-
if (!contentTypeChecked) {
|
|
114
|
-
contentTypeChecked = true;
|
|
115
|
-
if (isStreamingContentType(res)) {
|
|
116
|
-
sink.markStream();
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (sink.bytes >= maxBodyBytes) return;
|
|
121
89
|
let buf = null;
|
|
122
90
|
if (Buffer.isBuffer(chunk)) buf = chunk;
|
|
123
91
|
else if (typeof chunk === "string") buf = Buffer.from(chunk, "utf8");
|
|
124
92
|
if (!buf || buf.length === 0) return;
|
|
125
|
-
|
|
126
|
-
sink.push(buf.length > remaining ? buf.subarray(0, remaining) : buf);
|
|
93
|
+
sink.push(buf);
|
|
127
94
|
};
|
|
128
95
|
const originalWrite = res.write.bind(res);
|
|
129
96
|
const originalEnd = res.end.bind(res);
|
|
@@ -134,7 +134,13 @@ var TransformerChainExecutor = class {
|
|
|
134
134
|
const { endpointTransformer } = options;
|
|
135
135
|
const context = {
|
|
136
136
|
logger: this.logger,
|
|
137
|
-
providerName: provider.name
|
|
137
|
+
providerName: provider.name,
|
|
138
|
+
// The unified REQUEST this response answers. Response encoders need it to
|
|
139
|
+
// restore request-scoped protocol state that the chat wire cannot carry —
|
|
140
|
+
// e.g. which codex tools were declared `custom` (see
|
|
141
|
+
// `UnifiedChatRequestMeta.codexTools`), which decides whether a tool call
|
|
142
|
+
// is encoded back as a `function_call` or a `custom_tool_call` item.
|
|
143
|
+
req: request
|
|
138
144
|
};
|
|
139
145
|
let finalResponse = response;
|
|
140
146
|
const bypass = this.shouldBypassTransformers(chain, endpointTransformer, request);
|
|
@@ -321,6 +321,7 @@ function handleStreamResponse(response, providerName, logger) {
|
|
|
321
321
|
let pendingContent = "";
|
|
322
322
|
let contentIndex = 0;
|
|
323
323
|
let toolCallIndex = -1;
|
|
324
|
+
let textBuffered = false;
|
|
324
325
|
const stream = new ReadableStream({
|
|
325
326
|
async start(controller) {
|
|
326
327
|
const reader = response.body.getReader();
|
|
@@ -338,6 +339,7 @@ function handleStreamResponse(response, providerName, logger) {
|
|
|
338
339
|
}
|
|
339
340
|
const candidate = chunk.candidates[0];
|
|
340
341
|
const parts = _optionalChain([candidate, 'access', _59 => _59.content, 'optionalAccess', _60 => _60.parts]) || [];
|
|
342
|
+
textBuffered = false;
|
|
341
343
|
parts.filter((part) => part.text && part.thought === true).forEach((part) => {
|
|
342
344
|
hasThinkingContent = true;
|
|
343
345
|
const thinkingChunk = createChunk({
|
|
@@ -415,7 +417,7 @@ function handleStreamResponse(response, providerName, logger) {
|
|
|
415
417
|
if (hasThinkingContent && textContent && !signatureSent) {
|
|
416
418
|
if (_optionalChain([chunk, 'access', _70 => _70.modelVersion, 'optionalAccess', _71 => _71.includes, 'call', _72 => _72("3")])) {
|
|
417
419
|
pendingContent += textContent;
|
|
418
|
-
|
|
420
|
+
textBuffered = true;
|
|
419
421
|
} else {
|
|
420
422
|
const signatureChunk = createChunk({
|
|
421
423
|
responseId: chunk.responseId,
|
|
@@ -433,7 +435,7 @@ function handleStreamResponse(response, providerName, logger) {
|
|
|
433
435
|
signatureSent = true;
|
|
434
436
|
}
|
|
435
437
|
}
|
|
436
|
-
if (textContent) {
|
|
438
|
+
if (textContent && !textBuffered) {
|
|
437
439
|
if (!pendingContent) contentIndex++;
|
|
438
440
|
const contentChunk = createChunk({
|
|
439
441
|
responseId: chunk.responseId,
|
|
@@ -790,6 +792,9 @@ function buildRequestBody(request) {
|
|
|
790
792
|
}
|
|
791
793
|
});
|
|
792
794
|
const generationConfig = {};
|
|
795
|
+
if (request.max_tokens !== void 0) {
|
|
796
|
+
generationConfig.maxOutputTokens = request.max_tokens;
|
|
797
|
+
}
|
|
793
798
|
if (_optionalChain([request, 'access', _117 => _117.reasoning, 'optionalAccess', _118 => _118.effort]) && request.reasoning.effort !== "none") {
|
|
794
799
|
generationConfig.thinkingConfig = {
|
|
795
800
|
includeThoughts: true
|
|
@@ -841,7 +846,8 @@ function transformRequestOut(request) {
|
|
|
841
846
|
const contents = request.contents;
|
|
842
847
|
const tools = request.tools;
|
|
843
848
|
const model = request.model;
|
|
844
|
-
const
|
|
849
|
+
const generationConfig = request.generationConfig;
|
|
850
|
+
const maxTokens = _nullishCoalesce(_optionalChain([generationConfig, 'optionalAccess', _122 => _122.maxOutputTokens]), () => ( request.max_tokens));
|
|
845
851
|
const temperature = request.temperature;
|
|
846
852
|
const stream = request.stream;
|
|
847
853
|
const toolChoice = request.tool_choice;
|
|
@@ -854,35 +860,116 @@ function transformRequestOut(request) {
|
|
|
854
860
|
tool_choice: toolChoice
|
|
855
861
|
};
|
|
856
862
|
if (Array.isArray(contents)) {
|
|
863
|
+
const toolCallIdsByName = /* @__PURE__ */ new Map();
|
|
857
864
|
for (const content of contents) {
|
|
858
865
|
if (typeof content === "string") {
|
|
859
|
-
unifiedRequest.messages.push({
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
} else if ("text" in content && typeof content.text === "string") {
|
|
866
|
+
unifiedRequest.messages.push({ role: "user", content });
|
|
867
|
+
continue;
|
|
868
|
+
}
|
|
869
|
+
if (content && typeof content === "object" && "text" in content && typeof content.text === "string" && !("parts" in content)) {
|
|
864
870
|
unifiedRequest.messages.push({
|
|
865
871
|
role: "user",
|
|
866
872
|
content: content.text || null
|
|
867
873
|
});
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
874
|
+
continue;
|
|
875
|
+
}
|
|
876
|
+
if (!content || typeof content !== "object" || !("role" in content)) {
|
|
877
|
+
continue;
|
|
878
|
+
}
|
|
879
|
+
const geminiContent = content;
|
|
880
|
+
const isModel = geminiContent.role === "model";
|
|
881
|
+
const role = isModel ? "assistant" : "user";
|
|
882
|
+
const parts = _nullishCoalesce(geminiContent.parts, () => ( []));
|
|
883
|
+
const functionResponses = [];
|
|
884
|
+
const functionCalls = [];
|
|
885
|
+
const textParts = [];
|
|
886
|
+
const contentParts = [];
|
|
887
|
+
let thinkingText = "";
|
|
888
|
+
let signature;
|
|
889
|
+
for (const part of parts) {
|
|
890
|
+
if ("thoughtSignature" in part) {
|
|
891
|
+
signature = part.thoughtSignature;
|
|
892
|
+
}
|
|
893
|
+
if ("functionResponse" in part) {
|
|
894
|
+
functionResponses.push(part);
|
|
895
|
+
} else if ("functionCall" in part) {
|
|
896
|
+
functionCalls.push(part);
|
|
897
|
+
} else if ("inlineData" in part || "file_data" in part) {
|
|
898
|
+
const inline = part.inlineData;
|
|
899
|
+
const fileData = part.file_data;
|
|
900
|
+
if (_optionalChain([inline, 'optionalAccess', _123 => _123.data])) {
|
|
901
|
+
const mime = inline.mime_type || "image/png";
|
|
902
|
+
contentParts.push({
|
|
903
|
+
type: "image_url",
|
|
904
|
+
image_url: { url: `data:${mime};base64,${inline.data}` },
|
|
905
|
+
media_type: mime
|
|
906
|
+
});
|
|
907
|
+
} else if (_optionalChain([fileData, 'optionalAccess', _124 => _124.file_uri])) {
|
|
908
|
+
contentParts.push({
|
|
909
|
+
type: "image_url",
|
|
910
|
+
image_url: { url: fileData.file_uri },
|
|
911
|
+
media_type: fileData.mime_type
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
} else if ("text" in part) {
|
|
915
|
+
if (part.thought === true) {
|
|
916
|
+
thinkingText += _nullishCoalesce(part.text, () => ( ""));
|
|
917
|
+
} else {
|
|
918
|
+
textParts.push(part);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
for (const fr of functionResponses) {
|
|
923
|
+
const fnName = _nullishCoalesce(fr.functionResponse.name, () => ( ""));
|
|
924
|
+
const queue = toolCallIdsByName.get(fnName);
|
|
925
|
+
const id = queue && queue.length > 0 ? queue.shift() : `tool_${Math.random().toString(36).substring(2, 15)}`;
|
|
926
|
+
const response = fr.functionResponse.response;
|
|
927
|
+
const result = _optionalChain([response, 'optionalAccess', _125 => _125.result]);
|
|
928
|
+
const toolContent = typeof result === "string" ? result : result !== void 0 ? JSON.stringify(result) : response !== void 0 ? JSON.stringify(response) : "";
|
|
878
929
|
unifiedRequest.messages.push({
|
|
879
|
-
role: "
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
text: part.text || ""
|
|
883
|
-
}))]) || []
|
|
930
|
+
role: "tool",
|
|
931
|
+
tool_call_id: id,
|
|
932
|
+
content: toolContent
|
|
884
933
|
});
|
|
885
934
|
}
|
|
935
|
+
const toolCalls = functionCalls.map((p) => {
|
|
936
|
+
const id = p.functionCall.id || `tool_${Math.random().toString(36).substring(2, 15)}`;
|
|
937
|
+
if (p.functionCall.name) {
|
|
938
|
+
const arr = _nullishCoalesce(toolCallIdsByName.get(p.functionCall.name), () => ( []));
|
|
939
|
+
arr.push(id);
|
|
940
|
+
toolCallIdsByName.set(p.functionCall.name, arr);
|
|
941
|
+
}
|
|
942
|
+
return {
|
|
943
|
+
id,
|
|
944
|
+
type: "function",
|
|
945
|
+
function: {
|
|
946
|
+
name: p.functionCall.name,
|
|
947
|
+
arguments: JSON.stringify(_nullishCoalesce(p.functionCall.args, () => ( {})))
|
|
948
|
+
}
|
|
949
|
+
};
|
|
950
|
+
});
|
|
951
|
+
const onlyToolResults = functionResponses.length > 0 && textParts.length === 0 && functionCalls.length === 0 && contentParts.length === 0 && !thinkingText && !signature;
|
|
952
|
+
if (onlyToolResults) continue;
|
|
953
|
+
let messageContent;
|
|
954
|
+
if (contentParts.length > 0) {
|
|
955
|
+
messageContent = [
|
|
956
|
+
...textParts.map((p) => ({ type: "text", text: p.text })),
|
|
957
|
+
...contentParts
|
|
958
|
+
];
|
|
959
|
+
} else {
|
|
960
|
+
messageContent = textParts.map((p) => p.text).join("\n") || null;
|
|
961
|
+
}
|
|
962
|
+
const message = {
|
|
963
|
+
role,
|
|
964
|
+
content: messageContent
|
|
965
|
+
};
|
|
966
|
+
if (toolCalls.length > 0) {
|
|
967
|
+
message.tool_calls = toolCalls;
|
|
968
|
+
}
|
|
969
|
+
if (signature || thinkingText) {
|
|
970
|
+
message.thinking = { content: thinkingText || "", signature };
|
|
971
|
+
}
|
|
972
|
+
unifiedRequest.messages.push(message);
|
|
886
973
|
}
|
|
887
974
|
}
|
|
888
975
|
if (Array.isArray(tools)) {
|
|
@@ -895,7 +982,7 @@ function transformRequestOut(request) {
|
|
|
895
982
|
function: {
|
|
896
983
|
name: funcDecl.name,
|
|
897
984
|
description: _nullishCoalesce(funcDecl.description, () => ( "")),
|
|
898
|
-
parameters: _nullishCoalesce(funcDecl.parameters, () => ( {}))
|
|
985
|
+
parameters: _nullishCoalesce(_nullishCoalesce(funcDecl.parameters, () => ( funcDecl.parametersJsonSchema)), () => ( {}))
|
|
899
986
|
}
|
|
900
987
|
});
|
|
901
988
|
}
|