@omnicross/core 0.1.8 → 0.1.10
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/auth/GeminiCodeAssistProjectResolver.cjs +5 -3
- package/dist/auth/GeminiCodeAssistProjectResolver.js +4 -2
- package/dist/{chunk-N5T4M4GU.js → chunk-2UTGX6FM.js} +2 -2
- package/dist/{chunk-32O35CIF.js → chunk-45FHEOKW.js} +22 -7
- package/dist/{chunk-LVUCAWMK.js → chunk-55FMGZ3L.js} +13 -5
- package/dist/{chunk-OF3BECU2.cjs → chunk-56QD3YW6.cjs} +18 -5
- package/dist/{chunk-V4TXMEJS.cjs → chunk-5LNYGCIW.cjs} +15 -7
- package/dist/{chunk-EPN67EGP.cjs → chunk-5UK3KLE2.cjs} +9 -1
- package/dist/chunk-6D4W22P4.js +150 -0
- package/dist/chunk-77USGNRW.cjs +37 -0
- package/dist/chunk-AOFWNWLT.cjs +203 -0
- package/dist/{chunk-UAPBLNN2.js → chunk-AQDON6MB.js} +8 -0
- package/dist/{chunk-LB6EBS6Y.js → chunk-CCVRRJOX.js} +17 -4
- package/dist/{chunk-OVQBNVSV.cjs → chunk-CMVXX7ON.cjs} +42 -27
- package/dist/{chunk-QYC54PMG.js → chunk-FEBAQI5A.js} +255 -92
- package/dist/{chunk-7C7DET6S.js → chunk-GXEZ2R3E.js} +156 -1
- package/dist/{chunk-PEGTIPB3.js → chunk-HKB656B4.js} +37 -43
- package/dist/chunk-N2EIM2XJ.js +203 -0
- package/dist/{chunk-MYYR3HZL.js → chunk-NGYOO5TO.js} +5 -5
- package/dist/{chunk-OKMJLEXX.cjs → chunk-OC6DOOFX.cjs} +5 -5
- package/dist/{chunk-2Z4XM3H5.cjs → chunk-P7EM6BND.cjs} +10 -10
- package/dist/chunk-QUSEZNYS.cjs +150 -0
- package/dist/{chunk-KBM2W6UY.cjs → chunk-RICPANBY.cjs} +41 -24
- package/dist/{chunk-TOVPMMHM.js → chunk-S3DYFEBE.js} +37 -20
- package/dist/{chunk-26K6T2YS.cjs → chunk-TIT74RIL.cjs} +407 -244
- package/dist/{chunk-XPIOJQS2.cjs → chunk-UWDW6PN3.cjs} +159 -4
- package/dist/chunk-WYVGULTQ.js +37 -0
- package/dist/{chunk-OXHNSZ53.cjs → chunk-ZQQUD66M.cjs} +54 -60
- package/dist/completion/CompletionService.cjs +15 -13
- package/dist/completion/CompletionService.js +14 -12
- package/dist/completion.cjs +15 -13
- package/dist/completion.js +14 -12
- package/dist/index.cjs +15 -13
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +14 -12
- package/dist/outbound-api/auditCapture.cjs +2 -2
- package/dist/outbound-api/auditCapture.d.cts +6 -0
- package/dist/outbound-api/auditCapture.d.ts +6 -0
- package/dist/outbound-api/auditCapture.js +1 -1
- package/dist/outbound-api/routeResolver.d.cts +1 -1
- package/dist/outbound-api/routeResolver.d.ts +1 -1
- package/dist/outbound-api/types.d.cts +1 -1
- package/dist/outbound-api/types.d.ts +1 -1
- package/dist/outbound-api.cjs +15 -13
- package/dist/outbound-api.d.cts +3 -2
- package/dist/outbound-api.d.ts +3 -2
- package/dist/outbound-api.js +14 -12
- package/dist/pipeline/AccountAllowanceScheduling.d.cts +1 -1
- package/dist/pipeline/AccountAllowanceScheduling.d.ts +1 -1
- package/dist/pipeline/executeProviderCall.d.cts +2 -0
- package/dist/pipeline/executeProviderCall.d.ts +2 -0
- package/dist/pipeline/resolveProviderChain.d.cts +1 -0
- package/dist/pipeline/resolveProviderChain.d.ts +1 -0
- package/dist/pipeline/resolveSubscriptionChain.d.cts +2 -0
- package/dist/pipeline/resolveSubscriptionChain.d.ts +2 -0
- package/dist/ports/provider-config-source.d.cts +1 -0
- package/dist/ports/provider-config-source.d.ts +1 -0
- package/dist/ports.d.cts +1 -1
- package/dist/ports.d.ts +1 -1
- package/dist/provider-proxy/ProviderProxy.cjs +15 -13
- package/dist/provider-proxy/ProviderProxy.js +14 -12
- package/dist/provider-proxy/ingress/providerProxyShared.cjs +15 -13
- package/dist/provider-proxy/ingress/providerProxyShared.js +14 -12
- package/dist/provider-proxy.cjs +15 -13
- package/dist/provider-proxy.js +14 -12
- package/dist/transformer/TransformerChainExecutor.d.cts +2 -0
- package/dist/transformer/TransformerChainExecutor.d.ts +2 -0
- package/dist/transformer/TransformerService.d.cts +2 -0
- package/dist/transformer/TransformerService.d.ts +2 -0
- package/dist/transformer/transformers/AnthropicTransformer.cjs +4 -2
- package/dist/transformer/transformers/AnthropicTransformer.d.cts +7 -2
- package/dist/transformer/transformers/AnthropicTransformer.d.ts +7 -2
- package/dist/transformer/transformers/AnthropicTransformer.js +3 -1
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +5 -3
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.d.cts +2 -0
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.d.ts +2 -0
- package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +4 -2
- package/dist/transformer/transformers/GeminiTransformer.cjs +5 -3
- package/dist/transformer/transformers/GeminiTransformer.d.cts +4 -2
- package/dist/transformer/transformers/GeminiTransformer.d.ts +4 -2
- package/dist/transformer/transformers/GeminiTransformer.js +4 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.d.cts +4 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.d.ts +4 -2
- package/dist/transformer/transformers/OpenAIResponseTransformer.js +2 -1
- package/dist/transformer/transformers/OpenAITransformer.cjs +3 -2
- package/dist/transformer/transformers/OpenAITransformer.d.cts +3 -1
- package/dist/transformer/transformers/OpenAITransformer.d.ts +3 -1
- package/dist/transformer/transformers/OpenAITransformer.js +2 -1
- package/dist/transformer/transformers.cjs +10 -8
- package/dist/transformer/transformers.d.cts +2 -0
- package/dist/transformer/transformers.d.ts +2 -0
- package/dist/transformer/transformers.js +9 -7
- package/dist/transformer/types.d.cts +16 -5
- package/dist/transformer/types.d.ts +16 -5
- package/dist/transformer.cjs +28 -9
- package/dist/transformer.d.cts +76 -1
- package/dist/transformer.d.ts +76 -1
- package/dist/transformer.js +28 -9
- package/dist/usage/usage-recorder.cjs +2 -2
- package/dist/usage/usage-recorder.d.cts +12 -2
- package/dist/usage/usage-recorder.d.ts +12 -2
- package/dist/usage/usage-recorder.js +1 -1
- package/dist/usage.cjs +20 -3
- package/dist/usage.d.cts +149 -0
- package/dist/usage.d.ts +149 -0
- package/dist/usage.js +20 -3
- package/package.json +2 -2
- package/dist/chunk-7VU7V2E4.js +0 -0
- package/dist/chunk-FZ46M34D.cjs +0 -1
- /package/dist/{chunk-EYZYXJTJ.cjs → chunk-QVOB2DNX.cjs} +0 -0
- /package/dist/{chunk-46RLHI7D.js → chunk-WTQMX2Q6.js} +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
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
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('../chunk-
|
|
4
|
+
var _chunkOC6DOOFXcjs = require('../chunk-OC6DOOFX.cjs');
|
|
5
|
+
require('../chunk-RICPANBY.cjs');
|
|
6
|
+
require('../chunk-77USGNRW.cjs');
|
|
7
|
+
require('../chunk-AOFWNWLT.cjs');
|
|
6
8
|
|
|
7
9
|
|
|
8
10
|
var _chunkRJUONLUQcjs = require('../chunk-RJUONLUQ.cjs');
|
|
@@ -62,7 +64,7 @@ var GeminiCodeAssistProjectResolver = (_class = class {
|
|
|
62
64
|
return run;
|
|
63
65
|
}
|
|
64
66
|
codeAssistUrl(method) {
|
|
65
|
-
return `${
|
|
67
|
+
return `${_chunkOC6DOOFXcjs.resolveCodeAssistEndpoint.call(void 0, )}/${_chunkOC6DOOFXcjs.resolveCodeAssistApiVersion.call(void 0, )}:${method}`;
|
|
66
68
|
}
|
|
67
69
|
/** Seed project id from env; reject a purely-numeric value (project NUMBER). */
|
|
68
70
|
seedProjectId() {
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveCodeAssistApiVersion,
|
|
3
3
|
resolveCodeAssistEndpoint
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-2UTGX6FM.js";
|
|
5
|
+
import "../chunk-S3DYFEBE.js";
|
|
6
|
+
import "../chunk-WYVGULTQ.js";
|
|
7
|
+
import "../chunk-N2EIM2XJ.js";
|
|
6
8
|
import {
|
|
7
9
|
fetchUpstream
|
|
8
10
|
} from "../chunk-RJ5ZGNI3.js";
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
transformRequestOut,
|
|
4
4
|
transformResponseIn,
|
|
5
5
|
transformResponseOut
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-S3DYFEBE.js";
|
|
7
7
|
|
|
8
8
|
// src/transformer/transformers/GeminiCodeAssistTransformer.ts
|
|
9
9
|
var DEFAULT_CODE_ASSIST_ENDPOINT = "https://cloudcode-pa.googleapis.com";
|
|
@@ -117,7 +117,7 @@ var GeminiCodeAssistTransformer = class {
|
|
|
117
117
|
* openaiResponsesIngress). `undefined` is the valid fresh free-tier value.
|
|
118
118
|
*/
|
|
119
119
|
async transformRequestIn(request, provider, _context) {
|
|
120
|
-
const inner = buildRequestBody(request);
|
|
120
|
+
const inner = buildRequestBody(request, provider);
|
|
121
121
|
const envelope = {
|
|
122
122
|
model: request.model,
|
|
123
123
|
project: provider.geminiProject,
|
|
@@ -2,6 +2,11 @@ import {
|
|
|
2
2
|
chatUsageToResponsesUsage,
|
|
3
3
|
responsesUsageToChatUsage
|
|
4
4
|
} from "./chunk-FU7EAR73.js";
|
|
5
|
+
import {
|
|
6
|
+
extractReasoningIntent,
|
|
7
|
+
normalizeThinkLevel,
|
|
8
|
+
resolveReasoningPlan
|
|
9
|
+
} from "./chunk-N2EIM2XJ.js";
|
|
5
10
|
|
|
6
11
|
// src/transformer/transformers/OpenAIResponseTransformer.ts
|
|
7
12
|
var OpenAIResponseTransformer = class {
|
|
@@ -26,7 +31,7 @@ var OpenAIResponseTransformer = class {
|
|
|
26
31
|
/**
|
|
27
32
|
* Transform unified request → Response API format
|
|
28
33
|
*/
|
|
29
|
-
async transformRequestIn(request, provider,
|
|
34
|
+
async transformRequestIn(request, provider, context) {
|
|
30
35
|
const input = [];
|
|
31
36
|
for (const msg of request.messages) {
|
|
32
37
|
if (msg.role === "system") {
|
|
@@ -82,8 +87,16 @@ var OpenAIResponseTransformer = class {
|
|
|
82
87
|
// public provider ever needs it honored, gate that on an opt-out flag.
|
|
83
88
|
...request.temperature !== void 0 ? { temperature: request.temperature } : {}
|
|
84
89
|
};
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
const reasoningPlan = resolveReasoningPlan({
|
|
91
|
+
intent: extractReasoningIntent(request),
|
|
92
|
+
model: request.model,
|
|
93
|
+
provider,
|
|
94
|
+
target: "openai-responses",
|
|
95
|
+
requestMaxTokens: request.max_tokens,
|
|
96
|
+
preserveNativeEffort: context.reasoningSourceFormat === this.name
|
|
97
|
+
});
|
|
98
|
+
if (reasoningPlan?.kind === "level" && reasoningPlan.enabled) {
|
|
99
|
+
body.reasoning = { effort: reasoningPlan.effort, summary: "auto" };
|
|
87
100
|
}
|
|
88
101
|
if (request.tools?.length) {
|
|
89
102
|
body.tools = request.tools.map((tool) => ({
|
|
@@ -106,7 +119,7 @@ var OpenAIResponseTransformer = class {
|
|
|
106
119
|
/**
|
|
107
120
|
* Transform Response API request → unified format
|
|
108
121
|
*/
|
|
109
|
-
async transformRequestOut(request,
|
|
122
|
+
async transformRequestOut(request, context) {
|
|
110
123
|
const req = request;
|
|
111
124
|
const messages = [];
|
|
112
125
|
let codexTools = null;
|
|
@@ -192,10 +205,12 @@ var OpenAIResponseTransformer = class {
|
|
|
192
205
|
temperature: req.temperature,
|
|
193
206
|
stream: req.stream
|
|
194
207
|
};
|
|
195
|
-
|
|
208
|
+
const effort = normalizeThinkLevel(req.reasoning?.effort);
|
|
209
|
+
if (effort) {
|
|
210
|
+
context.reasoningSourceFormat = this.name;
|
|
196
211
|
result.reasoning = {
|
|
197
|
-
effort
|
|
198
|
-
enabled:
|
|
212
|
+
effort,
|
|
213
|
+
enabled: effort !== "none"
|
|
199
214
|
};
|
|
200
215
|
}
|
|
201
216
|
const tools = [];
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
transformRequestOut,
|
|
4
4
|
transformResponseIn,
|
|
5
5
|
transformResponseOut
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-S3DYFEBE.js";
|
|
7
7
|
|
|
8
8
|
// src/transformer/transformers/GeminiTransformer.ts
|
|
9
9
|
var GeminiTransformer = class {
|
|
@@ -43,8 +43,12 @@ var GeminiTransformer = class {
|
|
|
43
43
|
* Transform request from unified format to Gemini format
|
|
44
44
|
* Also builds the correct URL for the Gemini API
|
|
45
45
|
*/
|
|
46
|
-
async transformRequestIn(request, provider,
|
|
47
|
-
const body = buildRequestBody(
|
|
46
|
+
async transformRequestIn(request, provider, context) {
|
|
47
|
+
const body = buildRequestBody(
|
|
48
|
+
request,
|
|
49
|
+
provider,
|
|
50
|
+
context.reasoningSourceFormat === this.name
|
|
51
|
+
);
|
|
48
52
|
const action = request.stream ? "streamGenerateContent?alt=sse" : "generateContent";
|
|
49
53
|
const url = new URL(`./${request.model}:${action}`, provider.baseUrl);
|
|
50
54
|
const headers = {};
|
|
@@ -64,8 +68,12 @@ var GeminiTransformer = class {
|
|
|
64
68
|
* Transform incoming request to unified format
|
|
65
69
|
* (For requests coming into the Gemini endpoint)
|
|
66
70
|
*/
|
|
67
|
-
async transformRequestOut(request,
|
|
68
|
-
|
|
71
|
+
async transformRequestOut(request, context) {
|
|
72
|
+
const unifiedRequest = transformRequestOut(request);
|
|
73
|
+
if (unifiedRequest.reasoning?.effort) {
|
|
74
|
+
context.reasoningSourceFormat = this.name;
|
|
75
|
+
}
|
|
76
|
+
return unifiedRequest;
|
|
69
77
|
}
|
|
70
78
|
/**
|
|
71
79
|
* Transform Gemini response to OpenAI-compatible format
|
|
@@ -1,4 +1,9 @@
|
|
|
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
|
|
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;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkAOFWNWLTcjs = require('./chunk-AOFWNWLT.cjs');
|
|
5
|
+
|
|
6
|
+
// src/transformer/transformers/OpenAITransformer.ts
|
|
2
7
|
var FOREIGN_MESSAGE_KEYS = ["cache_control", "thinking"];
|
|
3
8
|
var FOREIGN_BODY_KEYS = ["meta", "reasoning", "thinking"];
|
|
4
9
|
function normalizeContent(content) {
|
|
@@ -24,7 +29,7 @@ var OpenAITransformer = (_class = class {constructor() { _class.prototype.__init
|
|
|
24
29
|
/**
|
|
25
30
|
* Unified → OpenAI Chat Completions.
|
|
26
31
|
*/
|
|
27
|
-
async transformRequestIn(request,
|
|
32
|
+
async transformRequestIn(request, provider, _context) {
|
|
28
33
|
const source = request;
|
|
29
34
|
const out = {};
|
|
30
35
|
for (const key of Object.keys(source)) {
|
|
@@ -49,9 +54,17 @@ var OpenAITransformer = (_class = class {constructor() { _class.prototype.__init
|
|
|
49
54
|
return encoded;
|
|
50
55
|
});
|
|
51
56
|
}
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
const reasoningPlan = request.reasoning ? _chunkAOFWNWLTcjs.resolveReasoningPlan.call(void 0, {
|
|
58
|
+
intent: _chunkAOFWNWLTcjs.extractReasoningIntent.call(void 0, request),
|
|
59
|
+
model: request.model,
|
|
60
|
+
provider,
|
|
61
|
+
target: "openai-chat",
|
|
62
|
+
requestMaxTokens: request.max_tokens
|
|
63
|
+
}) : void 0;
|
|
64
|
+
if (_optionalChain([reasoningPlan, 'optionalAccess', _4 => _4.kind]) === "level" && reasoningPlan.enabled) {
|
|
65
|
+
out.reasoning_effort = reasoningPlan.effort;
|
|
66
|
+
} else if (request.reasoning) {
|
|
67
|
+
delete out.reasoning_effort;
|
|
55
68
|
}
|
|
56
69
|
return out;
|
|
57
70
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkRICPANBYcjs = require('./chunk-RICPANBY.cjs');
|
|
7
7
|
|
|
8
8
|
// src/transformer/transformers/GeminiTransformer.ts
|
|
9
9
|
var GeminiTransformer = (_class = class {
|
|
@@ -43,8 +43,12 @@ var GeminiTransformer = (_class = class {
|
|
|
43
43
|
* Transform request from unified format to Gemini format
|
|
44
44
|
* Also builds the correct URL for the Gemini API
|
|
45
45
|
*/
|
|
46
|
-
async transformRequestIn(request, provider,
|
|
47
|
-
const body =
|
|
46
|
+
async transformRequestIn(request, provider, context) {
|
|
47
|
+
const body = _chunkRICPANBYcjs.buildRequestBody.call(void 0,
|
|
48
|
+
request,
|
|
49
|
+
provider,
|
|
50
|
+
context.reasoningSourceFormat === this.name
|
|
51
|
+
);
|
|
48
52
|
const action = request.stream ? "streamGenerateContent?alt=sse" : "generateContent";
|
|
49
53
|
const url = new URL(`./${request.model}:${action}`, provider.baseUrl);
|
|
50
54
|
const headers = {};
|
|
@@ -64,21 +68,25 @@ var GeminiTransformer = (_class = class {
|
|
|
64
68
|
* Transform incoming request to unified format
|
|
65
69
|
* (For requests coming into the Gemini endpoint)
|
|
66
70
|
*/
|
|
67
|
-
async transformRequestOut(request,
|
|
68
|
-
|
|
71
|
+
async transformRequestOut(request, context) {
|
|
72
|
+
const unifiedRequest = _chunkRICPANBYcjs.transformRequestOut.call(void 0, request);
|
|
73
|
+
if (_optionalChain([unifiedRequest, 'access', _2 => _2.reasoning, 'optionalAccess', _3 => _3.effort])) {
|
|
74
|
+
context.reasoningSourceFormat = this.name;
|
|
75
|
+
}
|
|
76
|
+
return unifiedRequest;
|
|
69
77
|
}
|
|
70
78
|
/**
|
|
71
79
|
* Transform Gemini response to OpenAI-compatible format
|
|
72
80
|
*/
|
|
73
81
|
async transformResponseOut(response, _context) {
|
|
74
|
-
return
|
|
82
|
+
return _chunkRICPANBYcjs.transformResponseOut.call(void 0, response, this.name, this.logger);
|
|
75
83
|
}
|
|
76
84
|
/**
|
|
77
85
|
* Transform OpenAI-compatible response back to Gemini format
|
|
78
86
|
* (For endpoint mode — returning Gemini-format responses to the client)
|
|
79
87
|
*/
|
|
80
88
|
async transformResponseIn(response, _context) {
|
|
81
|
-
return
|
|
89
|
+
return _chunkRICPANBYcjs.transformResponseIn.call(void 0, response, this.logger);
|
|
82
90
|
}
|
|
83
91
|
}, _class.__initStatic(), _class);
|
|
84
92
|
|
|
@@ -10,12 +10,14 @@ var UsageRecorder = class {
|
|
|
10
10
|
this.logger = logger;
|
|
11
11
|
this.defer = _nullishCoalesce(options.defer, () => ( ((fn) => setTimeout(fn, 0))));
|
|
12
12
|
this.onRecord = options.onRecord;
|
|
13
|
+
this.onEvent = options.onEvent;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
|
|
20
|
+
|
|
19
21
|
/**
|
|
20
22
|
* Record one LLM request. Returns immediately — the actual store insert is
|
|
21
23
|
* deferred so the caller's response path is unblocked.
|
|
@@ -85,6 +87,12 @@ var UsageRecorder = class {
|
|
|
85
87
|
...input.cacheKeySource !== void 0 ? { cacheKeySource: input.cacheKeySource } : {},
|
|
86
88
|
...input.cacheKeyInjected !== void 0 ? { cacheKeyInjected: input.cacheKeyInjected } : {}
|
|
87
89
|
};
|
|
90
|
+
if (this.onEvent) {
|
|
91
|
+
try {
|
|
92
|
+
this.onEvent(row, Date.now());
|
|
93
|
+
} catch (e3) {
|
|
94
|
+
}
|
|
95
|
+
}
|
|
88
96
|
try {
|
|
89
97
|
return await this.store.insert(row);
|
|
90
98
|
} catch (err) {
|
|
@@ -118,7 +126,7 @@ var UsageRecorder = class {
|
|
|
118
126
|
var safeStringify = (value) => {
|
|
119
127
|
try {
|
|
120
128
|
return JSON.stringify(value);
|
|
121
|
-
} catch (
|
|
129
|
+
} catch (e4) {
|
|
122
130
|
return "";
|
|
123
131
|
}
|
|
124
132
|
};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// src/usage/throughputTracker.ts
|
|
2
|
+
var THROUGHPUT_RETENTION_MS = 15 * 6e4;
|
|
3
|
+
var THROUGHPUT_SAMPLE_LIMIT = 2e4;
|
|
4
|
+
var THROUGHPUT_WINDOWS_MS = [6e4, 3e5, 9e5];
|
|
5
|
+
var THROUGHPUT_BUCKET_COUNT = 30;
|
|
6
|
+
var COMPACT_THRESHOLD = 1024;
|
|
7
|
+
var UsageThroughputTracker = class {
|
|
8
|
+
samples = [];
|
|
9
|
+
/** Index of the oldest live sample; slots before it are consumed. */
|
|
10
|
+
head = 0;
|
|
11
|
+
startedAt;
|
|
12
|
+
/** Newest ts dropped by the sample CAP (not by retention). Null when none. */
|
|
13
|
+
evictedThroughTs = null;
|
|
14
|
+
constructor(now = Date.now()) {
|
|
15
|
+
this.startedAt = now;
|
|
16
|
+
}
|
|
17
|
+
/** Record one served request. O(1) amortised; never touches disk. */
|
|
18
|
+
record(input, now = Date.now()) {
|
|
19
|
+
this.samples.push({
|
|
20
|
+
ts: input.ts ?? now,
|
|
21
|
+
inputTokens: input.inputTokens,
|
|
22
|
+
outputTokens: input.outputTokens,
|
|
23
|
+
cacheReadTokens: input.cacheReadTokens,
|
|
24
|
+
cacheCreationTokens: input.cacheCreationTokens,
|
|
25
|
+
reasoningTokens: input.reasoningTokens,
|
|
26
|
+
costUsd: input.costUsd
|
|
27
|
+
});
|
|
28
|
+
this.prune(now);
|
|
29
|
+
}
|
|
30
|
+
/** Aggregate every reported window plus the shared trend series. */
|
|
31
|
+
snapshot(now = Date.now()) {
|
|
32
|
+
this.prune(now);
|
|
33
|
+
return {
|
|
34
|
+
available: true,
|
|
35
|
+
collectedAt: now,
|
|
36
|
+
startedAt: this.startedAt,
|
|
37
|
+
retentionMs: THROUGHPUT_RETENTION_MS,
|
|
38
|
+
bucketMs: THROUGHPUT_RETENTION_MS / THROUGHPUT_BUCKET_COUNT,
|
|
39
|
+
windows: THROUGHPUT_WINDOWS_MS.map((windowMs) => this.window(windowMs, now)),
|
|
40
|
+
buckets: this.buckets(now)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Drop all samples (tests / teardown). `startedAt` is unchanged. */
|
|
44
|
+
clear() {
|
|
45
|
+
this.samples = [];
|
|
46
|
+
this.head = 0;
|
|
47
|
+
this.evictedThroughTs = null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Drop samples past the retention horizon, then enforce the sample cap.
|
|
51
|
+
*
|
|
52
|
+
* Retention pruning uses the CALLER's `now`, which is never later than a
|
|
53
|
+
* subsequent snapshot's `now`, so it can only ever keep MORE than the widest
|
|
54
|
+
* window needs — it can never shave data off the 15-minute window.
|
|
55
|
+
*/
|
|
56
|
+
prune(now) {
|
|
57
|
+
const cutoff = now - THROUGHPUT_RETENTION_MS;
|
|
58
|
+
while (this.head < this.samples.length && this.samples[this.head].ts < cutoff) {
|
|
59
|
+
this.head += 1;
|
|
60
|
+
}
|
|
61
|
+
while (this.samples.length - this.head > THROUGHPUT_SAMPLE_LIMIT) {
|
|
62
|
+
const dropped = this.samples[this.head];
|
|
63
|
+
this.evictedThroughTs = this.evictedThroughTs === null ? dropped.ts : Math.max(this.evictedThroughTs, dropped.ts);
|
|
64
|
+
this.head += 1;
|
|
65
|
+
}
|
|
66
|
+
if (this.head >= COMPACT_THRESHOLD) {
|
|
67
|
+
this.samples = this.samples.slice(this.head);
|
|
68
|
+
this.head = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
window(windowMs, now) {
|
|
72
|
+
const startTs = now - windowMs;
|
|
73
|
+
const row = {
|
|
74
|
+
windowMs,
|
|
75
|
+
requests: 0,
|
|
76
|
+
inputTokens: 0,
|
|
77
|
+
outputTokens: 0,
|
|
78
|
+
cacheReadTokens: 0,
|
|
79
|
+
cacheCreationTokens: 0,
|
|
80
|
+
reasoningTokens: 0,
|
|
81
|
+
totalTokens: 0,
|
|
82
|
+
costUsd: 0,
|
|
83
|
+
requestsPerMinute: 0,
|
|
84
|
+
tokensPerMinute: 0,
|
|
85
|
+
inputTokensPerMinute: 0,
|
|
86
|
+
outputTokensPerMinute: 0,
|
|
87
|
+
costUsdPerMinute: 0,
|
|
88
|
+
complete: this.evictedThroughTs === null || this.evictedThroughTs < startTs
|
|
89
|
+
};
|
|
90
|
+
for (let i = this.head; i < this.samples.length; i += 1) {
|
|
91
|
+
const sample = this.samples[i];
|
|
92
|
+
if (sample.ts < startTs) continue;
|
|
93
|
+
row.requests += 1;
|
|
94
|
+
row.inputTokens += sample.inputTokens;
|
|
95
|
+
row.outputTokens += sample.outputTokens;
|
|
96
|
+
row.cacheReadTokens += sample.cacheReadTokens;
|
|
97
|
+
row.cacheCreationTokens += sample.cacheCreationTokens;
|
|
98
|
+
row.reasoningTokens += sample.reasoningTokens;
|
|
99
|
+
row.costUsd += sample.costUsd;
|
|
100
|
+
}
|
|
101
|
+
row.totalTokens = row.inputTokens + row.outputTokens + row.cacheReadTokens + row.cacheCreationTokens;
|
|
102
|
+
const minutes = windowMs / 6e4;
|
|
103
|
+
row.requestsPerMinute = row.requests / minutes;
|
|
104
|
+
row.tokensPerMinute = row.totalTokens / minutes;
|
|
105
|
+
row.inputTokensPerMinute = row.inputTokens / minutes;
|
|
106
|
+
row.outputTokensPerMinute = row.outputTokens / minutes;
|
|
107
|
+
row.costUsdPerMinute = row.costUsd / minutes;
|
|
108
|
+
return row;
|
|
109
|
+
}
|
|
110
|
+
buckets(now) {
|
|
111
|
+
const bucketMs = THROUGHPUT_RETENTION_MS / THROUGHPUT_BUCKET_COUNT;
|
|
112
|
+
const endTs = Math.floor(now / bucketMs) * bucketMs + bucketMs;
|
|
113
|
+
const startTs = endTs - THROUGHPUT_RETENTION_MS;
|
|
114
|
+
const out = [];
|
|
115
|
+
for (let i = 0; i < THROUGHPUT_BUCKET_COUNT; i += 1) {
|
|
116
|
+
out.push({ startTs: startTs + i * bucketMs, requests: 0, tokens: 0 });
|
|
117
|
+
}
|
|
118
|
+
for (let i = this.head; i < this.samples.length; i += 1) {
|
|
119
|
+
const sample = this.samples[i];
|
|
120
|
+
if (sample.ts < startTs || sample.ts >= endTs) continue;
|
|
121
|
+
const bucket = out[Math.floor((sample.ts - startTs) / bucketMs)];
|
|
122
|
+
if (!bucket) continue;
|
|
123
|
+
bucket.requests += 1;
|
|
124
|
+
bucket.tokens += sample.inputTokens + sample.outputTokens + sample.cacheReadTokens + sample.cacheCreationTokens;
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
var sharedTracker = null;
|
|
130
|
+
function getSharedUsageThroughputTracker() {
|
|
131
|
+
if (!sharedTracker) sharedTracker = new UsageThroughputTracker();
|
|
132
|
+
return sharedTracker;
|
|
133
|
+
}
|
|
134
|
+
function setSharedUsageThroughputTracker(instance) {
|
|
135
|
+
sharedTracker = instance;
|
|
136
|
+
}
|
|
137
|
+
function __resetSharedUsageThroughputTrackerForTests() {
|
|
138
|
+
sharedTracker = null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export {
|
|
142
|
+
THROUGHPUT_RETENTION_MS,
|
|
143
|
+
THROUGHPUT_SAMPLE_LIMIT,
|
|
144
|
+
THROUGHPUT_WINDOWS_MS,
|
|
145
|
+
THROUGHPUT_BUCKET_COUNT,
|
|
146
|
+
UsageThroughputTracker,
|
|
147
|
+
getSharedUsageThroughputTracker,
|
|
148
|
+
setSharedUsageThroughputTracker,
|
|
149
|
+
__resetSharedUsageThroughputTrackerForTests
|
|
150
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/transformer/transformers/AnthropicTypes.ts
|
|
2
|
+
function getThinkLevel(budgetTokens) {
|
|
3
|
+
if (!budgetTokens || budgetTokens <= 0) return "none";
|
|
4
|
+
if (budgetTokens < 4096) return "low";
|
|
5
|
+
if (budgetTokens < 16384) return "medium";
|
|
6
|
+
return "high";
|
|
7
|
+
}
|
|
8
|
+
function formatBase64(data, mediaType) {
|
|
9
|
+
if (data.startsWith("data:")) return data;
|
|
10
|
+
return `data:${mediaType || "image/png"};base64,${data}`;
|
|
11
|
+
}
|
|
12
|
+
function flattenToolResultContent(content) {
|
|
13
|
+
if (typeof content === "string") return content;
|
|
14
|
+
if (content == null) return "";
|
|
15
|
+
if (!Array.isArray(content)) return JSON.stringify(content);
|
|
16
|
+
const parts = [];
|
|
17
|
+
for (const block of content) {
|
|
18
|
+
if (typeof block === "string") {
|
|
19
|
+
parts.push(block);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (!block || typeof block !== "object") continue;
|
|
23
|
+
const typed = block;
|
|
24
|
+
if (typed.type === "image" || typed.type === "image_url") {
|
|
25
|
+
parts.push("[image omitted]");
|
|
26
|
+
} else if (typeof typed.text === "string") {
|
|
27
|
+
parts.push(typed.text);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return parts.filter((text) => text !== "").join("\n");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
exports.getThinkLevel = getThinkLevel; exports.formatBase64 = formatBase64; exports.flattenToolResultContent = flattenToolResultContent;
|