@omnicross/core 0.1.0 → 0.1.2
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 +24 -0
- package/dist/ApiConverter.d.cts +82 -0
- package/dist/ApiConverter.d.ts +82 -0
- package/dist/ApiConverter.js +24 -0
- package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
- package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
- package/dist/CompletionService-D3a47vdU.d.cts +213 -0
- package/dist/CompletionService-DdWaAxq0.d.ts +213 -0
- package/dist/{ProviderProxy-f_8ziIhW.d.cts → ProviderProxy-C-xqrkKi.d.ts} +7 -2
- package/dist/{ProviderProxy-vjt8sQQk.d.ts → ProviderProxy-CnMQYN59.d.cts} +7 -2
- package/dist/auth/GeminiCodeAssistProjectResolver.cjs +27 -60
- package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -9
- 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-2FEVTJWG.js +4400 -0
- package/dist/chunk-3MEACFK3.js +193 -0
- package/dist/chunk-3OPYJG76.cjs +266 -0
- package/dist/chunk-46RLHI7D.js +0 -0
- package/dist/chunk-46ZIFWYG.cjs +277 -0
- package/dist/chunk-4NBS6KPV.cjs +43 -0
- package/dist/chunk-4VAVYUZS.cjs +991 -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-6VIXXLMX.cjs +14 -0
- package/dist/chunk-745DV5FL.js +147 -0
- package/dist/chunk-74TMJA7Z.js +53 -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-AQ5TNQB7.js +13 -0
- package/dist/chunk-AVYJ4YBN.js +58 -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-DK4A7DLE.js +266 -0
- package/dist/chunk-DRWHTIIZ.js +13 -0
- package/dist/chunk-DWKQZ2SK.cjs +254 -0
- package/dist/chunk-E3WHL7CO.js +14 -0
- package/dist/chunk-EYZYXJTJ.cjs +1 -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-G2FUJNA2.cjs +193 -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-JO5NLTLY.js +46 -0
- package/dist/chunk-JWC6APFQ.js +23 -0
- package/dist/chunk-KUU2RNG6.cjs +46 -0
- package/dist/chunk-LKZJEL6E.cjs +124 -0
- package/dist/chunk-MNYKI4CI.js +94 -0
- package/dist/chunk-MZNPGW5Q.js +26 -0
- package/dist/chunk-N3V2J5ZO.cjs +53 -0
- package/dist/chunk-NYUNU75A.cjs +44 -0
- package/dist/chunk-NZYN7C3P.cjs +179 -0
- package/dist/chunk-O466Y272.js +235 -0
- package/dist/chunk-PXUJF5HS.js +124 -0
- package/dist/chunk-QBZJ7P2T.cjs +13 -0
- package/dist/chunk-QOCNX236.js +46 -0
- package/dist/chunk-QXD4MV2X.cjs +23 -0
- package/dist/chunk-R3HK6R4B.cjs +13 -0
- package/dist/chunk-RSJ3TWJQ.cjs +186 -0
- package/dist/chunk-S4WBV25P.js +913 -0
- package/dist/chunk-SN3YWBX7.cjs +4400 -0
- package/dist/chunk-SPVWWUHX.cjs +46 -0
- package/dist/chunk-SUEGJ75D.cjs +764 -0
- package/dist/chunk-SVNDB62D.cjs +58 -0
- package/dist/chunk-UYPEN5XE.cjs +235 -0
- package/dist/chunk-V5KPWNYX.cjs +147 -0
- package/dist/chunk-VVEHS2LI.js +431 -0
- package/dist/chunk-XBSYYZIY.cjs +94 -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-ZSVQT3PW.js +43 -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 +12 -0
- package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
- package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
- package/dist/completion/BuiltinToolExecutor.js +12 -0
- package/dist/completion/CompletionService.cjs +38 -0
- package/dist/completion/CompletionService.d.cts +22 -0
- package/dist/completion/CompletionService.d.ts +22 -0
- package/dist/completion/CompletionService.js +38 -0
- package/dist/completion/NativeSearchInjector.cjs +12 -0
- package/dist/completion/NativeSearchInjector.d.cts +42 -0
- package/dist/completion/NativeSearchInjector.d.ts +42 -0
- package/dist/completion/NativeSearchInjector.js +12 -0
- package/dist/completion/ProviderSearchInjector.cjs +60 -0
- package/dist/completion/ProviderSearchInjector.d.cts +47 -0
- package/dist/completion/ProviderSearchInjector.d.ts +47 -0
- package/dist/completion/ProviderSearchInjector.js +60 -0
- package/dist/completion/native-search-types.cjs +14 -0
- package/dist/completion/native-search-types.d.cts +3 -0
- package/dist/completion/native-search-types.d.ts +3 -0
- package/dist/completion/native-search-types.js +14 -0
- package/dist/completion/openrouter-headers.cjs +16 -0
- package/dist/completion/openrouter-headers.d.cts +44 -0
- package/dist/completion/openrouter-headers.d.ts +44 -0
- package/dist/completion/openrouter-headers.js +16 -0
- package/dist/completion/openrouter-models.cjs +29 -0
- package/dist/completion/openrouter-models.d.cts +27 -0
- package/dist/completion/openrouter-models.d.ts +27 -0
- package/dist/completion/openrouter-models.js +29 -0
- package/dist/completion/types.cjs +1 -0
- package/dist/completion/types.d.cts +3 -0
- package/dist/completion/types.d.ts +3 -0
- package/dist/completion/types.js +0 -0
- package/dist/completion/url-builder.cjs +24 -0
- package/dist/completion/url-builder.d.cts +87 -0
- package/dist/completion/url-builder.d.ts +87 -0
- package/dist/completion/url-builder.js +24 -0
- package/dist/completion.cjs +55 -3989
- package/dist/completion.d.cts +150 -8
- package/dist/completion.d.ts +150 -8
- package/dist/completion.js +63 -3953
- package/dist/index.cjs +197 -10428
- package/dist/index.d.cts +35 -91
- package/dist/index.d.ts +35 -91
- package/dist/index.js +125 -10267
- package/dist/logger-4GvQNzhE.d.cts +22 -0
- package/dist/logger-4GvQNzhE.d.ts +22 -0
- package/dist/outbound-api/routeResolver.cjs +11 -0
- package/dist/outbound-api/routeResolver.d.cts +19 -0
- package/dist/outbound-api/routeResolver.d.ts +19 -0
- package/dist/outbound-api/routeResolver.js +11 -0
- package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
- package/dist/outbound-api/subscriptionRegistryPort.d.cts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.d.ts +7 -3
- package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
- package/dist/outbound-api/types.cjs +1 -0
- package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +18 -3
- package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +18 -3
- package/dist/outbound-api/types.js +0 -0
- package/dist/outbound-api.cjs +35 -5220
- package/dist/outbound-api.d.cts +16 -88
- package/dist/outbound-api.d.ts +16 -88
- package/dist/outbound-api.js +54 -5193
- package/dist/pipeline/AuthSource.cjs +1 -0
- package/dist/pipeline/AuthSource.d.cts +101 -0
- package/dist/pipeline/AuthSource.d.ts +101 -0
- package/dist/pipeline/AuthSource.js +0 -0
- package/dist/pipeline/LlmConfigProviderAuth.cjs +8 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.cts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.d.ts +87 -0
- package/dist/pipeline/LlmConfigProviderAuth.js +8 -0
- package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
- package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
- package/dist/pipeline/SubscriptionAuthSource.js +5 -99
- package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
- package/dist/pipeline/executeProviderCall.cjs +6 -0
- package/dist/pipeline/executeProviderCall.d.cts +149 -0
- package/dist/pipeline/executeProviderCall.d.ts +149 -0
- package/dist/pipeline/executeProviderCall.js +6 -0
- package/dist/pipeline/resolveProviderChain.cjs +6 -0
- package/dist/pipeline/resolveProviderChain.d.cts +58 -0
- package/dist/pipeline/resolveProviderChain.d.ts +58 -0
- package/dist/pipeline/resolveProviderChain.js +6 -0
- package/dist/pipeline/resolveSubscriptionChain.cjs +6 -0
- package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
- package/dist/pipeline/resolveSubscriptionChain.js +6 -0
- 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 -0
- package/dist/ports/provider-config-source.d.cts +51 -0
- package/dist/ports/provider-config-source.d.ts +51 -0
- package/dist/ports/provider-config-source.js +0 -0
- package/dist/ports/usage-event-store.cjs +1 -0
- package/dist/ports/usage-event-store.d.cts +29 -0
- package/dist/ports/usage-event-store.d.ts +29 -0
- package/dist/ports/usage-event-store.js +0 -0
- package/dist/ports/web-search-backend.cjs +1 -0
- package/dist/ports/web-search-backend.d.cts +29 -0
- package/dist/ports/web-search-backend.d.ts +29 -0
- package/dist/ports/web-search-backend.js +0 -0
- package/dist/ports.cjs +1 -18
- package/dist/ports.d.cts +16 -8
- package/dist/ports.d.ts +16 -8
- package/dist/provider-proxy/ProviderProxy.cjs +40 -0
- package/dist/provider-proxy/ProviderProxy.d.cts +17 -0
- package/dist/provider-proxy/ProviderProxy.d.ts +17 -0
- package/dist/provider-proxy/ProviderProxy.js +40 -0
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +35 -2941
- package/dist/provider-proxy/ingress/providerProxyShared.d.cts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.d.ts +7 -3
- package/dist/provider-proxy/ingress/providerProxyShared.js +41 -2914
- package/dist/provider-proxy/matchText.cjs +11 -72
- package/dist/provider-proxy/matchText.js +6 -39
- package/dist/provider-proxy/types.cjs +1 -18
- package/dist/provider-proxy/types.d.cts +407 -8
- package/dist/provider-proxy/types.d.ts +407 -8
- package/dist/provider-proxy.cjs +35 -4654
- package/dist/provider-proxy.d.cts +10 -6
- package/dist/provider-proxy.d.ts +10 -6
- package/dist/provider-proxy.js +39 -4627
- package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
- package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
- 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 +8 -0
- package/dist/transformer/anthropicBetaInject.d.cts +20 -0
- package/dist/transformer/anthropicBetaInject.d.ts +20 -0
- package/dist/transformer/anthropicBetaInject.js +8 -0
- package/dist/transformer/transformers/AnthropicTransformer.cjs +6 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
- package/dist/transformer/transformers/AnthropicTransformer.js +6 -0
- 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 +6 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
- package/dist/transformer/transformers/ReasoningTransformer.js +6 -0
- package/dist/transformer/transformers.cjs +39 -0
- package/dist/transformer/transformers.d.cts +100 -0
- package/dist/transformer/transformers.d.ts +100 -0
- package/dist/transformer/transformers.js +39 -0
- package/dist/transformer/types.cjs +1 -18
- package/dist/transformer.cjs +13 -3726
- package/dist/transformer.d.cts +8 -31
- package/dist/transformer.d.ts +8 -31
- package/dist/transformer.js +17 -3706
- package/dist/types-BScIHmPr.d.cts +153 -0
- package/dist/types-BScIHmPr.d.ts +153 -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 +73 -0
- package/dist/usage/usage-recorder.d.ts +73 -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 +3 -3
- package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
- package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
- package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
- package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
- package/dist/index-BTSmc9Sm.d.ts +0 -645
- package/dist/index-DXazdTzZ.d.cts +0 -645
- package/dist/types-DCzHkhJt.d.ts +0 -467
- package/dist/types-DZIQbgp0.d.cts +0 -467
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/openrouter.ts
|
|
2
|
+
function isOpenRouterProvider(provider) {
|
|
3
|
+
const baseUrl = (provider.api_base_url || "").toLowerCase();
|
|
4
|
+
return baseUrl.includes("openrouter.ai");
|
|
5
|
+
}
|
|
6
|
+
var OPENROUTER_APP_HEADERS = {
|
|
7
|
+
"HTTP-Referer": "https://omnicross.dev",
|
|
8
|
+
"X-Title": "omnicross"
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
exports.isOpenRouterProvider = isOpenRouterProvider; exports.OPENROUTER_APP_HEADERS = OPENROUTER_APP_HEADERS;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isOpenRouterProvider
|
|
3
|
+
} from "./chunk-E3WHL7CO.js";
|
|
4
|
+
import {
|
|
5
|
+
API_FORMAT_PROVIDER_MAP,
|
|
6
|
+
NATIVE_SEARCH_EXCLUDED_MODELS,
|
|
7
|
+
NATIVE_SEARCH_MODEL_PATTERNS,
|
|
8
|
+
OPENAI_CHAT_COMPLETION_SEARCH_MODELS
|
|
9
|
+
} from "./chunk-FMOBD2OQ.js";
|
|
10
|
+
|
|
11
|
+
// src/completion/NativeSearchInjector.ts
|
|
12
|
+
function detectNativeSearch(modelId, apiFormat, provider, userExplicit) {
|
|
13
|
+
if (isOpenRouterProvider(provider)) {
|
|
14
|
+
return { supported: true, nativeProvider: "openrouter" };
|
|
15
|
+
}
|
|
16
|
+
if (isXaiProvider(provider)) {
|
|
17
|
+
return { supported: true, nativeProvider: "xai" };
|
|
18
|
+
}
|
|
19
|
+
if (apiFormat === "openai" && OPENAI_CHAT_COMPLETION_SEARCH_MODELS.some((m) => modelId.startsWith(m))) {
|
|
20
|
+
return { supported: true, nativeProvider: "openai" };
|
|
21
|
+
}
|
|
22
|
+
const formatProvider = API_FORMAT_PROVIDER_MAP[apiFormat];
|
|
23
|
+
if (formatProvider) {
|
|
24
|
+
const patterns = NATIVE_SEARCH_MODEL_PATTERNS[formatProvider];
|
|
25
|
+
if (patterns.some((re) => re.test(modelId))) {
|
|
26
|
+
if (!NATIVE_SEARCH_EXCLUDED_MODELS.some((m) => modelId.startsWith(m))) {
|
|
27
|
+
return { supported: true, nativeProvider: formatProvider };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (userExplicit && formatProvider) {
|
|
32
|
+
return { supported: true, nativeProvider: formatProvider };
|
|
33
|
+
}
|
|
34
|
+
return { supported: false, nativeProvider: null };
|
|
35
|
+
}
|
|
36
|
+
function buildNativeSearchAugmentation(nativeProvider, config, _apiFormat, modelId) {
|
|
37
|
+
if (!config.enabled) return null;
|
|
38
|
+
switch (nativeProvider) {
|
|
39
|
+
case "openai":
|
|
40
|
+
return buildOpenAIAugmentation(config, modelId);
|
|
41
|
+
case "anthropic":
|
|
42
|
+
return buildAnthropicAugmentation(config);
|
|
43
|
+
case "google":
|
|
44
|
+
return buildGoogleAugmentation(modelId);
|
|
45
|
+
case "xai":
|
|
46
|
+
return buildXaiAugmentation(config);
|
|
47
|
+
case "openrouter":
|
|
48
|
+
return buildOpenRouterAugmentation(config);
|
|
49
|
+
default:
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function applyAugmentation(requestBody, augmentation) {
|
|
54
|
+
if (augmentation.additionalTools?.length) {
|
|
55
|
+
const existing = requestBody.tools ?? [];
|
|
56
|
+
requestBody.tools = [...existing, ...augmentation.additionalTools];
|
|
57
|
+
}
|
|
58
|
+
if (augmentation.bodyFields) {
|
|
59
|
+
Object.assign(requestBody, augmentation.bodyFields);
|
|
60
|
+
}
|
|
61
|
+
return requestBody;
|
|
62
|
+
}
|
|
63
|
+
function buildOpenAIAugmentation(config, modelId) {
|
|
64
|
+
const isChatCompletionSearch = OPENAI_CHAT_COMPLETION_SEARCH_MODELS.some(
|
|
65
|
+
(m) => modelId.startsWith(m)
|
|
66
|
+
);
|
|
67
|
+
if (isChatCompletionSearch) {
|
|
68
|
+
return {
|
|
69
|
+
bodyFields: {
|
|
70
|
+
web_search_options: {
|
|
71
|
+
search_context_size: config.maxResults ? mapMaxResultsToContextSize(config.maxResults) : "medium"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
additionalTools: [
|
|
78
|
+
{
|
|
79
|
+
type: "web_search",
|
|
80
|
+
web_search: {
|
|
81
|
+
search_context_size: config.maxResults ? mapMaxResultsToContextSize(config.maxResults) : "medium"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function buildAnthropicAugmentation(config) {
|
|
88
|
+
const toolDef = {
|
|
89
|
+
type: "web_search_20250305",
|
|
90
|
+
name: "web_search"
|
|
91
|
+
};
|
|
92
|
+
if (config.maxResults) {
|
|
93
|
+
toolDef.max_uses = config.maxResults;
|
|
94
|
+
}
|
|
95
|
+
if (config.blockedDomains?.length) {
|
|
96
|
+
toolDef.blocked_domains = config.blockedDomains;
|
|
97
|
+
}
|
|
98
|
+
return { additionalTools: [toolDef] };
|
|
99
|
+
}
|
|
100
|
+
function buildGoogleAugmentation(modelId) {
|
|
101
|
+
const isLegacy = /gemini-1[._]/.test(modelId);
|
|
102
|
+
if (isLegacy) {
|
|
103
|
+
return {
|
|
104
|
+
additionalTools: [
|
|
105
|
+
{ googleSearchRetrieval: {} }
|
|
106
|
+
]
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
additionalTools: [
|
|
111
|
+
{ google_search: {} }
|
|
112
|
+
]
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function buildXaiAugmentation(config) {
|
|
116
|
+
const searchParams = {
|
|
117
|
+
mode: config.searchMode ?? "auto",
|
|
118
|
+
return_citations: true,
|
|
119
|
+
max_search_results: config.maxResults ?? 5
|
|
120
|
+
};
|
|
121
|
+
if (config.sources?.length) {
|
|
122
|
+
searchParams.sources = config.sources;
|
|
123
|
+
}
|
|
124
|
+
return { bodyFields: { search_parameters: searchParams } };
|
|
125
|
+
}
|
|
126
|
+
function buildOpenRouterAugmentation(config) {
|
|
127
|
+
const plugin = { id: "web" };
|
|
128
|
+
if (config.maxResults) {
|
|
129
|
+
plugin.max_results = config.maxResults;
|
|
130
|
+
}
|
|
131
|
+
return { bodyFields: { plugins: [plugin] } };
|
|
132
|
+
}
|
|
133
|
+
function isXaiProvider(provider) {
|
|
134
|
+
const baseUrl = (provider.api_base_url || "").toLowerCase();
|
|
135
|
+
return baseUrl.includes("x.ai") || baseUrl.includes("xai.com");
|
|
136
|
+
}
|
|
137
|
+
function mapMaxResultsToContextSize(maxResults) {
|
|
138
|
+
if (maxResults <= 2) return "low";
|
|
139
|
+
if (maxResults <= 5) return "medium";
|
|
140
|
+
return "high";
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
detectNativeSearch,
|
|
145
|
+
buildNativeSearchAugmentation,
|
|
146
|
+
applyAugmentation
|
|
147
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
serializeError
|
|
3
|
+
} from "./chunk-AVYJ4YBN.js";
|
|
4
|
+
|
|
5
|
+
// src/pipeline/SubscriptionAuthSource.ts
|
|
6
|
+
function stripAuthHeaders(headers) {
|
|
7
|
+
delete headers.authorization;
|
|
8
|
+
delete headers.Authorization;
|
|
9
|
+
delete headers["x-api-key"];
|
|
10
|
+
delete headers["X-Api-Key"];
|
|
11
|
+
delete headers["x-goog-api-key"];
|
|
12
|
+
delete headers["X-Goog-Api-Key"];
|
|
13
|
+
}
|
|
14
|
+
var SubscriptionAuthSource = class {
|
|
15
|
+
constructor(profile) {
|
|
16
|
+
this.profile = profile;
|
|
17
|
+
}
|
|
18
|
+
profile;
|
|
19
|
+
/**
|
|
20
|
+
* Strip any transformer-set auth headers, then delegate to the bound
|
|
21
|
+
* strategy. Mirrors `SubscriptionDispatcher`'s
|
|
22
|
+
* `stripAuthHeaders(...)` + `applyHeadersWithRetry(...)` sequence, including
|
|
23
|
+
* the best-effort swallow-and-warn around a throwing `applyHeaders`.
|
|
24
|
+
*
|
|
25
|
+
* The strategy's looser `AuthApplyHints` (optional `upstreamUrl` /
|
|
26
|
+
* `resolvedModel`) is fed from the pipeline's required `{ upstreamUrl,
|
|
27
|
+
* model }` at the boundary.
|
|
28
|
+
*/
|
|
29
|
+
async applyHeaders(headers, hints) {
|
|
30
|
+
stripAuthHeaders(headers);
|
|
31
|
+
try {
|
|
32
|
+
await this.profile.authStrategy.applyHeaders(headers, {
|
|
33
|
+
upstreamUrl: hints.upstreamUrl,
|
|
34
|
+
resolvedModel: hints.model
|
|
35
|
+
});
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.warn("[SubscriptionAuthSource] authStrategy.applyHeaders threw:", serializeError(err));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Delegate the 401-refresh decision to the bound strategy. */
|
|
41
|
+
async onUnauthorized() {
|
|
42
|
+
return this.profile.authStrategy.onUnauthorized();
|
|
43
|
+
}
|
|
44
|
+
/** Resolve the upstream URL from the profile, when it provides one. */
|
|
45
|
+
resolveUpstreamUrl(model) {
|
|
46
|
+
return this.profile.resolveUpstreamUrl?.(model);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export {
|
|
51
|
+
stripAuthHeaders,
|
|
52
|
+
SubscriptionAuthSource
|
|
53
|
+
};
|
|
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,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,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
|
+
};
|