@omnicross/core 0.1.1 → 0.1.3
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 +3 -778
- package/dist/ApiConverter.js +12 -751
- package/dist/{CompletionService-DtOF_War.d.cts → CompletionService-D3a47vdU.d.cts} +2 -1
- package/dist/{CompletionService-7fCmKAP3.d.ts → CompletionService-DdWaAxq0.d.ts} +2 -1
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +32 -60
- package/dist/auth/GeminiCodeAssistProjectResolver.js +11 -10
- package/dist/builtin-web-fetch-77JZUZGM.cjs +100 -0
- package/dist/builtin-web-fetch-IGLBX2XY.js +100 -0
- package/dist/chunk-2DCNB7DF.cjs +514 -0
- package/dist/chunk-2FMI2B6V.cjs +6196 -0
- package/dist/chunk-3OPYJG76.cjs +266 -0
- package/dist/chunk-3QOSDDNI.cjs +130 -0
- package/dist/chunk-46RLHI7D.js +0 -0
- package/dist/chunk-46ZIFWYG.cjs +277 -0
- package/dist/chunk-4DECIFU7.js +6196 -0
- package/dist/chunk-4IH4EL7M.cjs +9 -0
- package/dist/chunk-4VAVYUZS.cjs +991 -0
- package/dist/chunk-5ENKBSWO.js +311 -0
- package/dist/chunk-5ERIZW3D.js +44 -0
- package/dist/chunk-5HTVET6E.js +514 -0
- package/dist/chunk-5ZQBEOMD.js +764 -0
- package/dist/chunk-6RPZADX3.cjs +92 -0
- package/dist/chunk-7VU7V2E4.js +0 -0
- package/dist/chunk-7YN22L2H.cjs +87 -0
- package/dist/chunk-A2YMUCBT.cjs +105 -0
- package/dist/chunk-AEOZIDEB.cjs +32 -0
- package/dist/chunk-AQ5TNQB7.js +13 -0
- package/dist/chunk-AVYJ4YBN.js +58 -0
- package/dist/chunk-BO4RFWBR.js +89 -0
- package/dist/chunk-C72S6TTV.cjs +49 -0
- package/dist/chunk-C7PSERMH.js +87 -0
- package/dist/chunk-CDHS2QDC.js +179 -0
- package/dist/chunk-CWM2ZDU5.js +130 -0
- package/dist/chunk-CZHZGRU7.js +383 -0
- package/dist/chunk-DK4A7DLE.js +266 -0
- package/dist/chunk-DQ5VAYZ6.cjs +42 -0
- package/dist/chunk-DRWHTIIZ.js +13 -0
- package/dist/chunk-DWKQZ2SK.cjs +254 -0
- package/dist/chunk-EYZYXJTJ.cjs +1 -0
- package/dist/chunk-FFALUUZZ.cjs +235 -0
- package/dist/chunk-FMOBD2OQ.js +39 -0
- package/dist/chunk-FTQ7IQUC.js +991 -0
- package/dist/chunk-FZ46M34D.cjs +1 -0
- package/dist/chunk-G2UTNSGU.js +277 -0
- package/dist/chunk-GBHYAGX3.cjs +26 -0
- package/dist/chunk-GMMT7RVN.cjs +39 -0
- package/dist/chunk-H5JUT3KV.js +105 -0
- package/dist/chunk-HQP3K7PU.cjs +431 -0
- package/dist/chunk-HUZZZ3JL.js +32 -0
- package/dist/chunk-IAXWICZU.js +69 -0
- package/dist/chunk-JMJBSACD.cjs +147 -0
- package/dist/chunk-JO5NLTLY.js +46 -0
- package/dist/chunk-JWC6APFQ.js +23 -0
- package/dist/chunk-KUU2RNG6.cjs +46 -0
- package/dist/chunk-L74VDN4A.cjs +32 -0
- package/dist/chunk-MQNDWYPN.js +235 -0
- package/dist/chunk-MZNPGW5Q.js +26 -0
- package/dist/chunk-N5QFKSDO.js +56 -0
- package/dist/chunk-NYUNU75A.cjs +44 -0
- package/dist/chunk-NZYN7C3P.cjs +179 -0
- package/dist/chunk-Q27JY5RG.cjs +126 -0
- package/dist/chunk-QBZJ7P2T.cjs +13 -0
- package/dist/chunk-QWBWGODS.cjs +69 -0
- package/dist/chunk-QXD4MV2X.cjs +23 -0
- package/dist/chunk-R3HK6R4B.cjs +13 -0
- package/dist/chunk-RPII3E6Z.cjs +145 -0
- package/dist/chunk-RSJ3TWJQ.cjs +186 -0
- package/dist/chunk-S4WBV25P.js +913 -0
- package/dist/chunk-S6JGLF3G.cjs +89 -0
- package/dist/chunk-SUEGJ75D.cjs +764 -0
- package/dist/chunk-SVNDB62D.cjs +58 -0
- package/dist/chunk-SVXC36MU.cjs +383 -0
- package/dist/chunk-TKJMZBAH.js +32 -0
- package/dist/chunk-UBWEBKRC.js +42 -0
- package/dist/chunk-UNEFIWXI.cjs +32 -0
- package/dist/chunk-VQY5W4YW.cjs +311 -0
- package/dist/chunk-VVEHS2LI.js +431 -0
- package/dist/chunk-WNY4WMRF.js +32 -0
- package/dist/chunk-XEKD23J5.js +9 -0
- package/dist/chunk-XTEI64OU.js +145 -0
- package/dist/chunk-XX6NQJMA.js +92 -0
- package/dist/chunk-Y6OM7EV7.cjs +56 -0
- package/dist/chunk-Y7FO65VT.js +147 -0
- package/dist/chunk-YGXJGRFI.cjs +913 -0
- package/dist/chunk-YMFAJFQT.cjs +173 -0
- package/dist/chunk-Z7LUNECE.js +49 -0
- package/dist/chunk-Z7Y2NPHY.js +186 -0
- package/dist/chunk-ZJZAOKI7.js +254 -0
- package/dist/chunk-ZLX3KGXX.js +173 -0
- package/dist/chunk-ZY6KU6P3.js +126 -0
- package/dist/completion/ApiKeyPoolService.cjs +23 -48
- package/dist/completion/ApiKeyPoolService.d.cts +150 -2
- package/dist/completion/ApiKeyPoolService.d.ts +150 -2
- package/dist/completion/BuiltinToolExecutor.cjs +9 -324
- package/dist/completion/BuiltinToolExecutor.js +6 -290
- package/dist/completion/CompletionService.cjs +45 -3487
- package/dist/completion/CompletionService.d.cts +3 -2
- package/dist/completion/CompletionService.d.ts +3 -2
- package/dist/completion/CompletionService.js +41 -3457
- package/dist/completion/NativeSearchInjector.cjs +8 -192
- package/dist/completion/NativeSearchInjector.js +7 -162
- package/dist/completion/ProviderSearchInjector.cjs +12 -39
- package/dist/completion/native-search-types.cjs +13 -66
- package/dist/completion/native-search-types.js +7 -31
- package/dist/completion/openrouter-headers.cjs +12 -71
- package/dist/completion/openrouter-headers.d.cts +9 -12
- package/dist/completion/openrouter-headers.d.ts +9 -12
- package/dist/completion/openrouter-headers.js +7 -36
- package/dist/completion/openrouter-models.cjs +11 -67
- package/dist/completion/openrouter-models.js +5 -34
- package/dist/completion/types.cjs +1 -18
- package/dist/completion/url-builder.cjs +24 -138
- package/dist/completion/url-builder.js +12 -92
- package/dist/completion.cjs +62 -3989
- package/dist/completion.d.cts +3 -2
- package/dist/completion.d.ts +3 -2
- package/dist/completion.js +70 -3953
- package/dist/index.cjs +319 -10429
- package/dist/index.d.cts +49 -12
- package/dist/index.d.ts +49 -12
- package/dist/index.js +248 -10269
- package/dist/logger-4GvQNzhE.d.cts +22 -0
- package/dist/logger-4GvQNzhE.d.ts +22 -0
- package/dist/outbound-api/routeResolver.cjs +10 -217
- package/dist/outbound-api/routeResolver.d.cts +10 -3
- package/dist/outbound-api/routeResolver.d.ts +10 -3
- package/dist/outbound-api/routeResolver.js +9 -187
- package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +2 -1
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +2 -1
- package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
- package/dist/outbound-api/types.cjs +5 -17
- package/dist/outbound-api/types.d.cts +12 -144
- package/dist/outbound-api/types.d.ts +12 -144
- package/dist/outbound-api/types.js +6 -0
- package/dist/outbound-api.cjs +197 -5265
- package/dist/outbound-api.d.cts +787 -25
- package/dist/outbound-api.d.ts +787 -25
- package/dist/outbound-api.js +173 -5195
- package/dist/pipeline/AuthSource.cjs +1 -18
- package/dist/pipeline/AuthSource.d.cts +23 -1
- package/dist/pipeline/AuthSource.d.ts +23 -1
- package/dist/pipeline/LlmConfigProviderAuth.cjs +5 -166
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +2 -1
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +2 -1
- package/dist/pipeline/LlmConfigProviderAuth.js +5 -139
- package/dist/pipeline/SubscriptionAccountHealth.cjs +22 -0
- package/dist/pipeline/SubscriptionAccountHealth.d.cts +235 -0
- package/dist/pipeline/SubscriptionAccountHealth.d.ts +235 -0
- package/dist/pipeline/SubscriptionAccountHealth.js +22 -0
- package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
- package/dist/pipeline/SubscriptionAuthSource.d.cts +3 -2
- package/dist/pipeline/SubscriptionAuthSource.d.ts +3 -2
- package/dist/pipeline/SubscriptionAuthSource.js +5 -99
- package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
- package/dist/pipeline/SubscriptionAuthStrategy.d.cts +24 -1
- package/dist/pipeline/SubscriptionAuthStrategy.d.ts +24 -1
- package/dist/pipeline/auditSink.cjs +14 -0
- package/dist/pipeline/auditSink.d.cts +48 -0
- package/dist/pipeline/auditSink.d.ts +48 -0
- package/dist/pipeline/auditSink.js +14 -0
- package/dist/pipeline/billingEmit.cjs +14 -0
- package/dist/pipeline/billingEmit.d.cts +49 -0
- package/dist/pipeline/billingEmit.d.ts +49 -0
- package/dist/pipeline/billingEmit.js +14 -0
- package/dist/pipeline/executeProviderCall.cjs +5 -69
- package/dist/pipeline/executeProviderCall.js +3 -42
- package/dist/pipeline/resolveProviderChain.cjs +5 -46
- package/dist/pipeline/resolveProviderChain.js +3 -19
- package/dist/pipeline/resolveSubscriptionChain.cjs +5 -67
- package/dist/pipeline/resolveSubscriptionChain.js +3 -40
- package/dist/ports/gemini-code-assist-resolver.cjs +7 -37
- package/dist/ports/gemini-code-assist-resolver.js +4 -8
- package/dist/ports/pricing-store.cjs +1 -0
- package/dist/ports/pricing-store.d.cts +50 -0
- package/dist/ports/pricing-store.d.ts +50 -0
- package/dist/ports/pricing-store.js +0 -0
- package/dist/ports/provider-config-source.cjs +1 -18
- package/dist/ports/usage-event-store.cjs +1 -0
- package/dist/ports/usage-event-store.d.cts +54 -0
- package/dist/ports/usage-event-store.d.ts +54 -0
- package/dist/ports/usage-event-store.js +0 -0
- package/dist/ports/web-search-backend.cjs +1 -18
- package/dist/ports.cjs +1 -18
- package/dist/ports.d.cts +13 -2
- package/dist/ports.d.ts +13 -2
- package/dist/provider-proxy/ProviderProxy.cjs +47 -4643
- package/dist/provider-proxy/ProviderProxy.d.cts +2 -1
- package/dist/provider-proxy/ProviderProxy.d.ts +2 -1
- package/dist/provider-proxy/ProviderProxy.js +42 -4613
- package/dist/provider-proxy/identity/SubscriptionIdentityStore.cjs +15 -0
- package/dist/provider-proxy/identity/SubscriptionIdentityStore.d.cts +121 -0
- package/dist/provider-proxy/identity/SubscriptionIdentityStore.d.ts +121 -0
- package/dist/provider-proxy/identity/SubscriptionIdentityStore.js +15 -0
- package/dist/provider-proxy/identity/fingerprintHeaders.cjs +20 -0
- package/dist/provider-proxy/identity/fingerprintHeaders.d.cts +89 -0
- package/dist/provider-proxy/identity/fingerprintHeaders.d.ts +89 -0
- package/dist/provider-proxy/identity/fingerprintHeaders.js +20 -0
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +42 -2941
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +13 -3
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +13 -3
- package/dist/provider-proxy/ingress/providerProxyShared.js +48 -2914
- package/dist/provider-proxy/matchText.cjs +13 -72
- package/dist/provider-proxy/matchText.d.cts +14 -1
- package/dist/provider-proxy/matchText.d.ts +14 -1
- package/dist/provider-proxy/matchText.js +8 -39
- package/dist/provider-proxy/types.cjs +1 -18
- package/dist/provider-proxy/types.d.cts +25 -1
- package/dist/provider-proxy/types.d.ts +25 -1
- package/dist/provider-proxy.cjs +42 -4655
- package/dist/provider-proxy.d.cts +2 -1
- package/dist/provider-proxy.d.ts +2 -1
- package/dist/provider-proxy.js +46 -4628
- package/dist/{routeResolver-HE-ZO0fO.d.ts → routeResolver-B1NglTfe.d.ts} +36 -10
- package/dist/{routeResolver-BrbK6ja9.d.cts → routeResolver-CbG5uBgm.d.cts} +36 -10
- package/dist/serializeError.cjs +5 -81
- package/dist/serializeError.js +3 -54
- package/dist/sse-parser.cjs +7 -455
- package/dist/sse-parser.js +4 -426
- package/dist/transformer/TransformerChainExecutor.cjs +4 -318
- package/dist/transformer/TransformerChainExecutor.js +4 -291
- package/dist/transformer/TransformerService.cjs +5 -289
- package/dist/transformer/TransformerService.js +3 -262
- package/dist/transformer/anthropicBetaInject.cjs +7 -50
- package/dist/transformer/anthropicBetaInject.js +4 -21
- package/dist/transformer/transformers/AnthropicTransformer.cjs +3 -1014
- package/dist/transformer/transformers/AnthropicTransformer.js +3 -987
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +4 -1106
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +7 -1079
- package/dist/transformer/transformers/GeminiTransformer.cjs +4 -1010
- package/dist/transformer/transformers/GeminiTransformer.js +4 -983
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -535
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +3 -510
- package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +5 -72
- package/dist/transformer/transformers/OpenCodeGoTransformer.js +3 -45
- package/dist/transformer/transformers/ReasoningTransformer.cjs +3 -270
- package/dist/transformer/transformers/ReasoningTransformer.js +2 -249
- package/dist/transformer/transformers.cjs +10 -3177
- package/dist/transformer/transformers.js +23 -3158
- package/dist/transformer/types.cjs +1 -18
- package/dist/transformer.cjs +13 -3726
- package/dist/transformer.js +17 -3706
- package/dist/types-6OUY_xfA.d.ts +830 -0
- package/dist/types-aBFFXoBz.d.cts +830 -0
- package/dist/usage/pricing-engine.cjs +6 -0
- package/dist/usage/pricing-engine.d.cts +83 -0
- package/dist/usage/pricing-engine.d.ts +83 -0
- package/dist/usage/pricing-engine.js +6 -0
- package/dist/usage/usage-recorder.cjs +6 -0
- package/dist/usage/usage-recorder.d.cts +91 -0
- package/dist/usage/usage-recorder.d.ts +91 -0
- package/dist/usage/usage-recorder.js +6 -0
- package/dist/usage.cjs +11 -0
- package/dist/usage.d.cts +8 -0
- package/dist/usage.d.ts +8 -0
- package/dist/usage.js +11 -0
- package/package.json +4 -2
- package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
- package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/provider-proxy/identity/fingerprintHeaders.ts
|
|
2
|
+
var STAINLESS_PREFIX = "x-stainless-";
|
|
3
|
+
var FINGERPRINT_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
4
|
+
"user-agent",
|
|
5
|
+
"anthropic-beta",
|
|
6
|
+
"anthropic-version",
|
|
7
|
+
"anthropic-dangerous-direct-browser-access",
|
|
8
|
+
"x-app"
|
|
9
|
+
]);
|
|
10
|
+
var EXCLUDED_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
11
|
+
"authorization",
|
|
12
|
+
"x-api-key",
|
|
13
|
+
"cookie",
|
|
14
|
+
"proxy-authorization",
|
|
15
|
+
"set-cookie"
|
|
16
|
+
]);
|
|
17
|
+
var PROTECTED_OUTBOUND = /* @__PURE__ */ new Set(["authorization", "content-type"]);
|
|
18
|
+
function isStainless(name) {
|
|
19
|
+
return name.toLowerCase().startsWith(STAINLESS_PREFIX);
|
|
20
|
+
}
|
|
21
|
+
function extractFingerprintHeaders(reqHeaders) {
|
|
22
|
+
const out = {};
|
|
23
|
+
for (const [rawKey, rawVal] of Object.entries(reqHeaders)) {
|
|
24
|
+
if (rawVal === void 0) continue;
|
|
25
|
+
const key = rawKey.toLowerCase();
|
|
26
|
+
if (EXCLUDED_HEADER_NAMES.has(key)) continue;
|
|
27
|
+
const whitelisted = FINGERPRINT_HEADER_NAMES.has(key) || key.startsWith(STAINLESS_PREFIX);
|
|
28
|
+
if (!whitelisted) continue;
|
|
29
|
+
const value = Array.isArray(rawVal) ? rawVal.filter((v) => typeof v === "string").join(", ") : rawVal;
|
|
30
|
+
if (typeof value === "string" && value.length > 0) out[key] = value;
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function captureCallerIdentity(store, reqHeaders) {
|
|
35
|
+
if (!store.isEnabled()) return void 0;
|
|
36
|
+
return extractFingerprintHeaders(reqHeaders);
|
|
37
|
+
}
|
|
38
|
+
function sanitizeFrozenHeaders(headers) {
|
|
39
|
+
const out = {};
|
|
40
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
41
|
+
if (typeof v !== "string" || v.length === 0) continue;
|
|
42
|
+
const lower = k.toLowerCase();
|
|
43
|
+
if (EXCLUDED_HEADER_NAMES.has(lower) || PROTECTED_OUTBOUND.has(lower)) continue;
|
|
44
|
+
out[lower] = v;
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function refreshNonStainless(frozen, incoming) {
|
|
49
|
+
const out = {};
|
|
50
|
+
for (const [k, v] of Object.entries(frozen)) {
|
|
51
|
+
if (isStainless(k)) out[k] = v;
|
|
52
|
+
}
|
|
53
|
+
const nonStainlessKeys = /* @__PURE__ */ new Set();
|
|
54
|
+
for (const k of Object.keys(frozen)) if (!isStainless(k)) nonStainlessKeys.add(k);
|
|
55
|
+
for (const k of Object.keys(incoming)) if (!isStainless(k)) nonStainlessKeys.add(k);
|
|
56
|
+
for (const k of nonStainlessKeys) {
|
|
57
|
+
const v = _nullishCoalesce(incoming[k], () => ( frozen[k]));
|
|
58
|
+
if (typeof v === "string" && v.length > 0) out[k] = v;
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function mergeFrozenIdentity(headers, identity) {
|
|
63
|
+
const present = new Set(Object.keys(headers).map((k) => k.toLowerCase()));
|
|
64
|
+
for (const [k, v] of Object.entries(identity)) {
|
|
65
|
+
const lower = k.toLowerCase();
|
|
66
|
+
if (PROTECTED_OUTBOUND.has(lower)) continue;
|
|
67
|
+
if (present.has(lower)) continue;
|
|
68
|
+
headers[k] = v;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function applyFingerprint(store, headers, providerId, accountId, callerIdentity, now) {
|
|
72
|
+
if (!store.isEnabled() || !accountId) return;
|
|
73
|
+
if (callerIdentity) store.capture(providerId, accountId, callerIdentity, now);
|
|
74
|
+
const identity = store.replay(providerId, accountId);
|
|
75
|
+
if (identity) {
|
|
76
|
+
mergeFrozenIdentity(headers, identity);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const ua = store.uaBaseline();
|
|
80
|
+
if (ua) mergeFrozenIdentity(headers, { "user-agent": ua });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
exports.STAINLESS_PREFIX = STAINLESS_PREFIX; exports.isStainless = isStainless; exports.extractFingerprintHeaders = extractFingerprintHeaders; exports.captureCallerIdentity = captureCallerIdentity; exports.sanitizeFrozenHeaders = sanitizeFrozenHeaders; exports.refreshNonStainless = refreshNonStainless; exports.mergeFrozenIdentity = mergeFrozenIdentity; exports.applyFingerprint = applyFingerprint;
|
|
File without changes
|
|
@@ -0,0 +1,87 @@
|
|
|
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;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkYGXJGRFIcjs = require('./chunk-YGXJGRFI.cjs');
|
|
7
|
+
|
|
8
|
+
// src/transformer/transformers/GeminiTransformer.ts
|
|
9
|
+
var GeminiTransformer = (_class = class {
|
|
10
|
+
static __initStatic() {this.TransformerName = "gemini"}
|
|
11
|
+
__init() {this.name = "gemini"}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* API endpoint pattern for Gemini
|
|
15
|
+
* :modelAndAction will be replaced with actual model and action
|
|
16
|
+
*/
|
|
17
|
+
__init2() {this.endPoint = "/v1beta/models/:modelAndAction"}
|
|
18
|
+
/** Use Bearer token instead of x-goog-api-key (for relay providers) */
|
|
19
|
+
|
|
20
|
+
constructor(options) {;_class.prototype.__init.call(this);_class.prototype.__init2.call(this);
|
|
21
|
+
this.useBearer = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _ => _.UseBearer]), () => ( false));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Handle authentication
|
|
25
|
+
* - Official Gemini: x-goog-api-key header
|
|
26
|
+
* - Relay providers: Authorization: Bearer header
|
|
27
|
+
*/
|
|
28
|
+
async auth(request, provider, _context) {
|
|
29
|
+
const headers = {};
|
|
30
|
+
if (this.useBearer) {
|
|
31
|
+
headers["authorization"] = `Bearer ${provider.apiKey}`;
|
|
32
|
+
headers["x-goog-api-key"] = void 0;
|
|
33
|
+
} else {
|
|
34
|
+
headers["x-goog-api-key"] = provider.apiKey;
|
|
35
|
+
headers["authorization"] = void 0;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
body: request,
|
|
39
|
+
config: { headers }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Transform request from unified format to Gemini format
|
|
44
|
+
* Also builds the correct URL for the Gemini API
|
|
45
|
+
*/
|
|
46
|
+
async transformRequestIn(request, provider, _context) {
|
|
47
|
+
const body = _chunkYGXJGRFIcjs.buildRequestBody.call(void 0, request);
|
|
48
|
+
const action = request.stream ? "streamGenerateContent?alt=sse" : "generateContent";
|
|
49
|
+
const url = new URL(`./${request.model}:${action}`, provider.baseUrl);
|
|
50
|
+
const headers = {};
|
|
51
|
+
if (this.useBearer) {
|
|
52
|
+
headers["authorization"] = `Bearer ${provider.apiKey}`;
|
|
53
|
+
headers["x-goog-api-key"] = void 0;
|
|
54
|
+
} else {
|
|
55
|
+
headers["x-goog-api-key"] = provider.apiKey;
|
|
56
|
+
headers["Authorization"] = void 0;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
body,
|
|
60
|
+
config: { url, headers }
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Transform incoming request to unified format
|
|
65
|
+
* (For requests coming into the Gemini endpoint)
|
|
66
|
+
*/
|
|
67
|
+
async transformRequestOut(request, _context) {
|
|
68
|
+
return _chunkYGXJGRFIcjs.transformRequestOut.call(void 0, request);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Transform Gemini response to OpenAI-compatible format
|
|
72
|
+
*/
|
|
73
|
+
async transformResponseOut(response, _context) {
|
|
74
|
+
return _chunkYGXJGRFIcjs.transformResponseOut.call(void 0, response, this.name, this.logger);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Transform OpenAI-compatible response back to Gemini format
|
|
78
|
+
* (For endpoint mode — returning Gemini-format responses to the client)
|
|
79
|
+
*/
|
|
80
|
+
async transformResponseIn(response, _context) {
|
|
81
|
+
return _chunkYGXJGRFIcjs.transformResponseIn.call(void 0, response, this.logger);
|
|
82
|
+
}
|
|
83
|
+
}, _class.__initStatic(), _class);
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
exports.GeminiTransformer = GeminiTransformer;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/completion/url-builder.ts
|
|
2
|
+
var _endpointresolver = require('@omnicross/contracts/endpoint-resolver');
|
|
3
|
+
function resolveApiFormat(provider) {
|
|
4
|
+
if (provider.apiFormat) {
|
|
5
|
+
return provider.apiFormat;
|
|
6
|
+
}
|
|
7
|
+
if (provider.chatApiFormat) {
|
|
8
|
+
return provider.chatApiFormat;
|
|
9
|
+
}
|
|
10
|
+
if (provider.apiType === "claudecode" || provider.apiType === "anthropic") {
|
|
11
|
+
return "anthropic";
|
|
12
|
+
}
|
|
13
|
+
if (provider.apiType === "google") {
|
|
14
|
+
return "google";
|
|
15
|
+
}
|
|
16
|
+
return "openai";
|
|
17
|
+
}
|
|
18
|
+
function buildOpenAIApiUrl(baseUrl) {
|
|
19
|
+
const url = baseUrl.replace(/\/+$/, "");
|
|
20
|
+
if (url.endsWith("/chat/completions")) {
|
|
21
|
+
return url;
|
|
22
|
+
}
|
|
23
|
+
if (/\/v\d+$/.test(url)) {
|
|
24
|
+
return url + "/chat/completions";
|
|
25
|
+
}
|
|
26
|
+
if (url.includes("/chat/completions")) {
|
|
27
|
+
return url;
|
|
28
|
+
}
|
|
29
|
+
return url + "/v1/chat/completions";
|
|
30
|
+
}
|
|
31
|
+
function buildAnthropicApiUrl(baseUrl) {
|
|
32
|
+
const url = baseUrl.replace(/\/+$/, "");
|
|
33
|
+
if (url.endsWith("/messages")) {
|
|
34
|
+
return url;
|
|
35
|
+
}
|
|
36
|
+
if (url.includes("/messages")) {
|
|
37
|
+
return url;
|
|
38
|
+
}
|
|
39
|
+
if (/\/v\d+$/.test(url)) {
|
|
40
|
+
return url + "/messages";
|
|
41
|
+
}
|
|
42
|
+
return url + "/v1/messages";
|
|
43
|
+
}
|
|
44
|
+
function buildGeminiModelActionUrl(baseUrl, model, action) {
|
|
45
|
+
let url = baseUrl.replace(/\/+$/, "");
|
|
46
|
+
if (url.includes("/models/")) {
|
|
47
|
+
return url;
|
|
48
|
+
}
|
|
49
|
+
if (!/\/v\d+(?:beta)?(?:$|\/)/.test(url)) {
|
|
50
|
+
url += "/v1beta";
|
|
51
|
+
}
|
|
52
|
+
return `${url}/models/${model}:${action}`;
|
|
53
|
+
}
|
|
54
|
+
function buildGeminiApiUrl(baseUrl, model, stream) {
|
|
55
|
+
const action = stream ? "streamGenerateContent?alt=sse" : "generateContent";
|
|
56
|
+
return buildGeminiModelActionUrl(baseUrl, model, action);
|
|
57
|
+
}
|
|
58
|
+
function normalizeAzureEndpoint(endpoint) {
|
|
59
|
+
return endpoint.replace(/\/+$/, "").replace(/\/openai(\/v\d+)?$/, "");
|
|
60
|
+
}
|
|
61
|
+
function buildAzureOpenAIApiUrl(baseUrl, model, apiVersion) {
|
|
62
|
+
const endpoint = normalizeAzureEndpoint(baseUrl);
|
|
63
|
+
return `${endpoint}/openai/deployments/${model}/chat/completions?api-version=${apiVersion}`;
|
|
64
|
+
}
|
|
65
|
+
function buildOpenAIResponseApiUrl(baseUrl) {
|
|
66
|
+
const url = baseUrl.replace(/\/+$/, "");
|
|
67
|
+
if (url.endsWith("/responses")) {
|
|
68
|
+
return url;
|
|
69
|
+
}
|
|
70
|
+
if (/\/v\d+$/.test(url)) {
|
|
71
|
+
return url + "/responses";
|
|
72
|
+
}
|
|
73
|
+
return url + "/v1/responses";
|
|
74
|
+
}
|
|
75
|
+
var resolveProviderEndpoint = _endpointresolver.resolveProviderEndpoint;
|
|
76
|
+
function buildProviderApiUrl(provider, options = {}) {
|
|
77
|
+
const format = resolveApiFormat(provider);
|
|
78
|
+
const { baseUrl } = resolveProviderEndpoint(provider);
|
|
79
|
+
switch (format) {
|
|
80
|
+
case "anthropic":
|
|
81
|
+
return buildAnthropicApiUrl(baseUrl);
|
|
82
|
+
case "google":
|
|
83
|
+
return buildGeminiApiUrl(baseUrl, options.model || "", options.stream || false);
|
|
84
|
+
case "azure-openai":
|
|
85
|
+
return buildAzureOpenAIApiUrl(baseUrl, options.model || "", provider.apiVersion || "2024-08-01-preview");
|
|
86
|
+
case "openai-response":
|
|
87
|
+
return buildOpenAIResponseApiUrl(baseUrl);
|
|
88
|
+
case "openai":
|
|
89
|
+
default:
|
|
90
|
+
return buildOpenAIApiUrl(baseUrl);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
exports.resolveApiFormat = resolveApiFormat; exports.buildOpenAIApiUrl = buildOpenAIApiUrl; exports.buildAnthropicApiUrl = buildAnthropicApiUrl; exports.buildGeminiModelActionUrl = buildGeminiModelActionUrl; exports.buildGeminiApiUrl = buildGeminiApiUrl; exports.normalizeAzureEndpoint = normalizeAzureEndpoint; exports.buildAzureOpenAIApiUrl = buildAzureOpenAIApiUrl; exports.buildOpenAIResponseApiUrl = buildOpenAIResponseApiUrl; exports.resolveProviderEndpoint = resolveProviderEndpoint; exports.buildProviderApiUrl = buildProviderApiUrl;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/pipeline/auditSink.ts
|
|
2
|
+
var sink = null;
|
|
3
|
+
var captureConfig = null;
|
|
4
|
+
function setAuditSink(fn) {
|
|
5
|
+
sink = fn;
|
|
6
|
+
}
|
|
7
|
+
function setAuditCaptureConfig(config) {
|
|
8
|
+
captureConfig = config && config.enabled ? config : null;
|
|
9
|
+
}
|
|
10
|
+
function getAuditCaptureConfig() {
|
|
11
|
+
return captureConfig;
|
|
12
|
+
}
|
|
13
|
+
function recordAudit(record) {
|
|
14
|
+
const active = sink;
|
|
15
|
+
if (!active) return;
|
|
16
|
+
try {
|
|
17
|
+
active(record);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function __resetAuditSinkForTests() {
|
|
22
|
+
sink = null;
|
|
23
|
+
captureConfig = null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
exports.setAuditSink = setAuditSink; exports.setAuditCaptureConfig = setAuditCaptureConfig; exports.getAuditCaptureConfig = getAuditCaptureConfig; exports.recordAudit = recordAudit; exports.__resetAuditSinkForTests = __resetAuditSinkForTests;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// src/outbound-api/subscriptionRegistryPort.ts
|
|
2
|
+
var _registry = null;
|
|
3
|
+
function setSubscriptionRegistryForOutbound(registry) {
|
|
4
|
+
_registry = registry;
|
|
5
|
+
}
|
|
6
|
+
function getSubscriptionRegistryForOutbound() {
|
|
7
|
+
return _registry;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export {
|
|
11
|
+
setSubscriptionRegistryForOutbound,
|
|
12
|
+
getSubscriptionRegistryForOutbound
|
|
13
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/serializeError.ts
|
|
2
|
+
function serializeError(err) {
|
|
3
|
+
if (err == null) return "Unknown error (null)";
|
|
4
|
+
if (err instanceof Error) {
|
|
5
|
+
let msg = err.message || err.name || "Error";
|
|
6
|
+
if (err.cause) {
|
|
7
|
+
msg += ` [cause: ${serializeError(err.cause)}]`;
|
|
8
|
+
}
|
|
9
|
+
const anyErr = err;
|
|
10
|
+
if (anyErr.status != null) msg += ` (status: ${anyErr.status})`;
|
|
11
|
+
else if (anyErr.code != null) msg += ` (code: ${anyErr.code})`;
|
|
12
|
+
return msg;
|
|
13
|
+
}
|
|
14
|
+
if (typeof err === "string") return err || "Empty error string";
|
|
15
|
+
if (typeof err !== "object") return String(err);
|
|
16
|
+
const obj = err;
|
|
17
|
+
if (typeof obj.message === "string" && obj.message) {
|
|
18
|
+
let msg = obj.message;
|
|
19
|
+
if (obj.status != null) msg += ` (status: ${obj.status})`;
|
|
20
|
+
else if (obj.code != null) msg += ` (code: ${obj.code})`;
|
|
21
|
+
if (typeof obj.type === "string") msg += ` [type: ${obj.type}]`;
|
|
22
|
+
return msg;
|
|
23
|
+
}
|
|
24
|
+
if (typeof obj.error === "string" && obj.error) {
|
|
25
|
+
return obj.error;
|
|
26
|
+
}
|
|
27
|
+
if (obj.error && typeof obj.error === "object") {
|
|
28
|
+
const inner = obj.error;
|
|
29
|
+
if (typeof inner.message === "string" && inner.message) {
|
|
30
|
+
let msg = inner.message;
|
|
31
|
+
if (typeof inner.type === "string") msg += ` [type: ${inner.type}]`;
|
|
32
|
+
return msg;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const json = JSON.stringify(err, getCircularReplacer(), 2);
|
|
37
|
+
if (json && json.length > 1e3) {
|
|
38
|
+
return json.slice(0, 1e3) + "... (truncated)";
|
|
39
|
+
}
|
|
40
|
+
return json || "Unserializable error";
|
|
41
|
+
} catch {
|
|
42
|
+
return `Unserializable error: ${Object.prototype.toString.call(err)}`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function getCircularReplacer() {
|
|
46
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
47
|
+
return (_key, value) => {
|
|
48
|
+
if (typeof value === "object" && value !== null) {
|
|
49
|
+
if (seen.has(value)) return "[Circular]";
|
|
50
|
+
seen.add(value);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export {
|
|
57
|
+
serializeError
|
|
58
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// src/pipeline/upstreamFetch.ts
|
|
2
|
+
import { Agent, buildConnector, ProxyAgent } from "undici";
|
|
3
|
+
import { SocksClient } from "socks";
|
|
4
|
+
var resolver = null;
|
|
5
|
+
var generation = 0;
|
|
6
|
+
var cache = /* @__PURE__ */ new Map();
|
|
7
|
+
function normalizeProxy(cfg) {
|
|
8
|
+
if ("url" in cfg) {
|
|
9
|
+
let u;
|
|
10
|
+
try {
|
|
11
|
+
u = new URL(cfg.url);
|
|
12
|
+
} catch {
|
|
13
|
+
return void 0;
|
|
14
|
+
}
|
|
15
|
+
const proto = u.protocol.replace(/:$/, "").toLowerCase();
|
|
16
|
+
const kind2 = proto === "socks5" || proto === "socks" ? "socks5" : proto === "https" ? "https" : "http";
|
|
17
|
+
const port = u.port ? Number(u.port) : kind2 === "https" ? 443 : kind2 === "socks5" ? 1080 : 80;
|
|
18
|
+
if (!u.hostname || !Number.isFinite(port)) return void 0;
|
|
19
|
+
return {
|
|
20
|
+
kind: kind2,
|
|
21
|
+
host: u.hostname,
|
|
22
|
+
port,
|
|
23
|
+
username: u.username ? decodeURIComponent(u.username) : void 0,
|
|
24
|
+
password: u.password ? decodeURIComponent(u.password) : void 0
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const kind = cfg.type === "socks5" ? "socks5" : cfg.type === "https" ? "https" : "http";
|
|
28
|
+
if (!cfg.host || !Number.isFinite(cfg.port)) return void 0;
|
|
29
|
+
return {
|
|
30
|
+
kind,
|
|
31
|
+
host: cfg.host,
|
|
32
|
+
port: cfg.port,
|
|
33
|
+
username: cfg.username || void 0,
|
|
34
|
+
password: cfg.password || void 0
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function proxyKey(p) {
|
|
38
|
+
return `${p.kind}://${p.username ?? ""}:${p.password ?? ""}@${p.host}:${p.port}`;
|
|
39
|
+
}
|
|
40
|
+
function socksConnector(p) {
|
|
41
|
+
const base = buildConnector({});
|
|
42
|
+
return ((options, callback) => {
|
|
43
|
+
const destPort = Number(options.port) || (options.protocol === "https:" ? 443 : 80);
|
|
44
|
+
SocksClient.createConnection({
|
|
45
|
+
proxy: { host: p.host, port: p.port, type: 5, userId: p.username, password: p.password },
|
|
46
|
+
command: "connect",
|
|
47
|
+
destination: { host: options.hostname, port: destPort }
|
|
48
|
+
}).then(({ socket }) => {
|
|
49
|
+
base({ ...options, httpSocket: socket }, callback);
|
|
50
|
+
}).catch((err) => callback(err, null));
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function buildDispatcher(p) {
|
|
54
|
+
if (p.kind === "socks5") {
|
|
55
|
+
return new Agent({ connect: socksConnector(p) });
|
|
56
|
+
}
|
|
57
|
+
const auth = p.username != null ? `${encodeURIComponent(p.username)}:${encodeURIComponent(p.password ?? "")}@` : "";
|
|
58
|
+
const uri = `${p.kind}://${auth}${p.host}:${p.port}`;
|
|
59
|
+
return new ProxyAgent({ uri });
|
|
60
|
+
}
|
|
61
|
+
function resolveUpstreamDispatcher(ctx) {
|
|
62
|
+
const active = resolver;
|
|
63
|
+
if (!active) return void 0;
|
|
64
|
+
let cfg;
|
|
65
|
+
try {
|
|
66
|
+
cfg = active(ctx);
|
|
67
|
+
} catch {
|
|
68
|
+
return void 0;
|
|
69
|
+
}
|
|
70
|
+
if (!cfg) return void 0;
|
|
71
|
+
const norm = normalizeProxy(cfg);
|
|
72
|
+
if (!norm) return void 0;
|
|
73
|
+
const key = `${generation}\0${proxyKey(norm)}`;
|
|
74
|
+
let dispatcher = cache.get(key);
|
|
75
|
+
if (!dispatcher) {
|
|
76
|
+
dispatcher = buildDispatcher(norm);
|
|
77
|
+
cache.set(key, dispatcher);
|
|
78
|
+
}
|
|
79
|
+
return dispatcher;
|
|
80
|
+
}
|
|
81
|
+
function fetchUpstream(url, init, ctx) {
|
|
82
|
+
const dispatcher = resolveUpstreamDispatcher({ ...ctx ?? {}, url });
|
|
83
|
+
if (!dispatcher) return fetch(url, init);
|
|
84
|
+
return fetch(url, { ...init, dispatcher });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export {
|
|
88
|
+
fetchUpstream
|
|
89
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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/transformer/transformers/OpenCodeGoTransformer.ts
|
|
2
|
+
var OpenCodeGoTransformer = (_class = class {constructor() { _class.prototype.__init.call(this);_class.prototype.__init2.call(this); }
|
|
3
|
+
static __initStatic() {this.TransformerName = "opencodego"}
|
|
4
|
+
__init() {this.name = "opencodego"}
|
|
5
|
+
__init2() {this.endPoint = "/v1/chat/completions"}
|
|
6
|
+
|
|
7
|
+
async auth(request, _provider, _context) {
|
|
8
|
+
return { body: request, config: { headers: {} } };
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Unified → OpenAI Chat Completions.
|
|
12
|
+
* Unified IS chat completions shape; this is mostly stripping `meta` and
|
|
13
|
+
* normalizing string-content single-block messages.
|
|
14
|
+
*/
|
|
15
|
+
async transformRequestIn(request, _provider, _context) {
|
|
16
|
+
const messages = request.messages.map((m) => {
|
|
17
|
+
const content = m.content;
|
|
18
|
+
if (Array.isArray(content) && content.length === 1 && _optionalChain([content, 'access', _ => _[0], 'optionalAccess', _2 => _2.type]) === "text") {
|
|
19
|
+
return { ...m, content: content[0].text };
|
|
20
|
+
}
|
|
21
|
+
return m;
|
|
22
|
+
});
|
|
23
|
+
const out = {
|
|
24
|
+
model: request.model,
|
|
25
|
+
messages,
|
|
26
|
+
stream: request.stream
|
|
27
|
+
};
|
|
28
|
+
if (request.temperature !== void 0) out.temperature = request.temperature;
|
|
29
|
+
if (request.max_tokens !== void 0) out.max_tokens = request.max_tokens;
|
|
30
|
+
if (request.tools && request.tools.length > 0) out.tools = request.tools;
|
|
31
|
+
if (request.tool_choice !== void 0) out.tool_choice = request.tool_choice;
|
|
32
|
+
if (_optionalChain([request, 'access', _3 => _3.reasoning, 'optionalAccess', _4 => _4.effort]) && request.reasoning.effort !== "none") {
|
|
33
|
+
out.reasoning_effort = request.reasoning.effort;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* OpenAI Chat Completions response → Unified.
|
|
39
|
+
* The upstream's response shape already matches Unified — pass through.
|
|
40
|
+
* The endpoint AnthropicTransformer re-encodes to Anthropic for the SDK.
|
|
41
|
+
*/
|
|
42
|
+
async transformResponseOut(response, _context) {
|
|
43
|
+
return response;
|
|
44
|
+
}
|
|
45
|
+
}, _class.__initStatic(), _class);
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
exports.OpenCodeGoTransformer = OpenCodeGoTransformer;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildRequestBody,
|
|
3
|
+
transformRequestOut,
|
|
4
|
+
transformResponseIn,
|
|
5
|
+
transformResponseOut
|
|
6
|
+
} from "./chunk-S4WBV25P.js";
|
|
7
|
+
|
|
8
|
+
// src/transformer/transformers/GeminiTransformer.ts
|
|
9
|
+
var GeminiTransformer = class {
|
|
10
|
+
static TransformerName = "gemini";
|
|
11
|
+
name = "gemini";
|
|
12
|
+
logger;
|
|
13
|
+
/**
|
|
14
|
+
* API endpoint pattern for Gemini
|
|
15
|
+
* :modelAndAction will be replaced with actual model and action
|
|
16
|
+
*/
|
|
17
|
+
endPoint = "/v1beta/models/:modelAndAction";
|
|
18
|
+
/** Use Bearer token instead of x-goog-api-key (for relay providers) */
|
|
19
|
+
useBearer;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.useBearer = options?.UseBearer ?? false;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Handle authentication
|
|
25
|
+
* - Official Gemini: x-goog-api-key header
|
|
26
|
+
* - Relay providers: Authorization: Bearer header
|
|
27
|
+
*/
|
|
28
|
+
async auth(request, provider, _context) {
|
|
29
|
+
const headers = {};
|
|
30
|
+
if (this.useBearer) {
|
|
31
|
+
headers["authorization"] = `Bearer ${provider.apiKey}`;
|
|
32
|
+
headers["x-goog-api-key"] = void 0;
|
|
33
|
+
} else {
|
|
34
|
+
headers["x-goog-api-key"] = provider.apiKey;
|
|
35
|
+
headers["authorization"] = void 0;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
body: request,
|
|
39
|
+
config: { headers }
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Transform request from unified format to Gemini format
|
|
44
|
+
* Also builds the correct URL for the Gemini API
|
|
45
|
+
*/
|
|
46
|
+
async transformRequestIn(request, provider, _context) {
|
|
47
|
+
const body = buildRequestBody(request);
|
|
48
|
+
const action = request.stream ? "streamGenerateContent?alt=sse" : "generateContent";
|
|
49
|
+
const url = new URL(`./${request.model}:${action}`, provider.baseUrl);
|
|
50
|
+
const headers = {};
|
|
51
|
+
if (this.useBearer) {
|
|
52
|
+
headers["authorization"] = `Bearer ${provider.apiKey}`;
|
|
53
|
+
headers["x-goog-api-key"] = void 0;
|
|
54
|
+
} else {
|
|
55
|
+
headers["x-goog-api-key"] = provider.apiKey;
|
|
56
|
+
headers["Authorization"] = void 0;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
body,
|
|
60
|
+
config: { url, headers }
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Transform incoming request to unified format
|
|
65
|
+
* (For requests coming into the Gemini endpoint)
|
|
66
|
+
*/
|
|
67
|
+
async transformRequestOut(request, _context) {
|
|
68
|
+
return transformRequestOut(request);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Transform Gemini response to OpenAI-compatible format
|
|
72
|
+
*/
|
|
73
|
+
async transformResponseOut(response, _context) {
|
|
74
|
+
return transformResponseOut(response, this.name, this.logger);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Transform OpenAI-compatible response back to Gemini format
|
|
78
|
+
* (For endpoint mode — returning Gemini-format responses to the client)
|
|
79
|
+
*/
|
|
80
|
+
async transformResponseIn(response, _context) {
|
|
81
|
+
return transformResponseIn(response, this.logger);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
GeminiTransformer
|
|
87
|
+
};
|