@infersec/conduit 1.98.1 → 1.98.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/cli.js +39 -99
- package/dist/cli.sea.cjs +39 -99
- package/dist/sse/handler.d.ts +2 -5
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -124207,11 +124207,17 @@ function serializeRequestBody$1(body) {
|
|
|
124207
124207
|
payload
|
|
124208
124208
|
};
|
|
124209
124209
|
}
|
|
124210
|
-
function calculateTokensPerSecond$
|
|
124211
|
-
if (durationMs <= 0) {
|
|
124210
|
+
function calculateTokensPerSecond$1({ completionTokens, durationMs, streamRequested, timeToFirstTokenMs }) {
|
|
124211
|
+
if (completionTokens <= 0 || durationMs <= 0) {
|
|
124212
124212
|
return 0;
|
|
124213
124213
|
}
|
|
124214
|
-
const
|
|
124214
|
+
const decodeMs = streamRequested && timeToFirstTokenMs !== null && timeToFirstTokenMs > 0
|
|
124215
|
+
? Math.max(0, durationMs - timeToFirstTokenMs)
|
|
124216
|
+
: durationMs;
|
|
124217
|
+
if (decodeMs <= 0) {
|
|
124218
|
+
return 0;
|
|
124219
|
+
}
|
|
124220
|
+
const tokensPerSecond = completionTokens / (decodeMs / 1000);
|
|
124215
124221
|
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0) {
|
|
124216
124222
|
return 0;
|
|
124217
124223
|
}
|
|
@@ -124261,10 +124267,7 @@ async function proxyEmbeddingsRoute({ body, conduitConfiguration, endpointId, lo
|
|
|
124261
124267
|
responseBytes,
|
|
124262
124268
|
successful: upstreamResponseOk && !error,
|
|
124263
124269
|
timeToFirstTokenMs: null,
|
|
124264
|
-
tokensPerSecond:
|
|
124265
|
-
durationMs: latencyMs,
|
|
124266
|
-
totalTokens
|
|
124267
|
-
}),
|
|
124270
|
+
tokensPerSecond: 0,
|
|
124268
124271
|
totalTokens
|
|
124269
124272
|
});
|
|
124270
124273
|
};
|
|
@@ -124407,9 +124410,11 @@ async function proxyOpenAIStreamingRoute({ body, conduitConfiguration, endpointI
|
|
|
124407
124410
|
responseBytes,
|
|
124408
124411
|
successful: upstreamResponseOk && !error,
|
|
124409
124412
|
timeToFirstTokenMs,
|
|
124410
|
-
tokensPerSecond: calculateTokensPerSecond$
|
|
124413
|
+
tokensPerSecond: calculateTokensPerSecond$1({
|
|
124414
|
+
completionTokens,
|
|
124411
124415
|
durationMs: latencyMs,
|
|
124412
|
-
|
|
124416
|
+
streamRequested,
|
|
124417
|
+
timeToFirstTokenMs
|
|
124413
124418
|
}),
|
|
124414
124419
|
totalTokens
|
|
124415
124420
|
});
|
|
@@ -124857,10 +124862,15 @@ function serializeRequestBody(body) {
|
|
|
124857
124862
|
payload
|
|
124858
124863
|
};
|
|
124859
124864
|
}
|
|
124860
|
-
function calculateTokensPerSecond
|
|
124861
|
-
if (durationMs <= 0)
|
|
124865
|
+
function calculateTokensPerSecond({ completionTokens, durationMs, streamRequested, timeToFirstTokenMs }) {
|
|
124866
|
+
if (completionTokens <= 0 || durationMs <= 0)
|
|
124867
|
+
return 0;
|
|
124868
|
+
const decodeMs = streamRequested && timeToFirstTokenMs !== null && timeToFirstTokenMs > 0
|
|
124869
|
+
? Math.max(0, durationMs - timeToFirstTokenMs)
|
|
124870
|
+
: durationMs;
|
|
124871
|
+
if (decodeMs <= 0)
|
|
124862
124872
|
return 0;
|
|
124863
|
-
const tokensPerSecond =
|
|
124873
|
+
const tokensPerSecond = completionTokens / (decodeMs / 1000);
|
|
124864
124874
|
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0)
|
|
124865
124875
|
return 0;
|
|
124866
124876
|
return Math.round(tokensPerSecond);
|
|
@@ -125038,7 +125048,7 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125038
125048
|
const targetBody = needsTranslation
|
|
125039
125049
|
? translateAnthropicRequestToOpenAI(serializedBody).body
|
|
125040
125050
|
: serializedBody;
|
|
125041
|
-
const onMonitoringComplete = ({ durationMs, error, responseBytes, usage }) => {
|
|
125051
|
+
const onMonitoringComplete = ({ durationMs, error, responseBytes, timeToFirstTokenMs, usage }) => {
|
|
125042
125052
|
const promptTokens = normalizeTokenCount(usage?.inputTokens);
|
|
125043
125053
|
const completionTokens = normalizeTokenCount(usage?.outputTokens);
|
|
125044
125054
|
const totalTokens = promptTokens + completionTokens;
|
|
@@ -125057,10 +125067,12 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125057
125067
|
requestPath: "/v1/messages",
|
|
125058
125068
|
responseBytes,
|
|
125059
125069
|
successful: !error,
|
|
125060
|
-
timeToFirstTokenMs
|
|
125061
|
-
tokensPerSecond: calculateTokensPerSecond
|
|
125070
|
+
timeToFirstTokenMs,
|
|
125071
|
+
tokensPerSecond: calculateTokensPerSecond({
|
|
125072
|
+
completionTokens,
|
|
125062
125073
|
durationMs: latencyMs,
|
|
125063
|
-
|
|
125074
|
+
streamRequested,
|
|
125075
|
+
timeToFirstTokenMs
|
|
125064
125076
|
}),
|
|
125065
125077
|
totalTokens
|
|
125066
125078
|
});
|
|
@@ -125157,6 +125169,7 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125157
125169
|
const passThrough = new PassThrough();
|
|
125158
125170
|
let responseBytes = 0;
|
|
125159
125171
|
let completed = false;
|
|
125172
|
+
let firstChunkAt = null;
|
|
125160
125173
|
const usage = { inputTokens: null, outputTokens: null };
|
|
125161
125174
|
const upstreamError = response.ok
|
|
125162
125175
|
? null
|
|
@@ -125169,6 +125182,7 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125169
125182
|
durationMs: Math.max(0, Date.now() - requestStartedAt),
|
|
125170
125183
|
error,
|
|
125171
125184
|
responseBytes,
|
|
125185
|
+
timeToFirstTokenMs: firstChunkAt === null ? null : Math.max(0, firstChunkAt - requestStartedAt),
|
|
125172
125186
|
usage
|
|
125173
125187
|
});
|
|
125174
125188
|
}
|
|
@@ -125178,6 +125192,8 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125178
125192
|
const chunks = [];
|
|
125179
125193
|
rawBody.on("data", (chunk) => {
|
|
125180
125194
|
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
125195
|
+
if (firstChunkAt === null)
|
|
125196
|
+
firstChunkAt = Date.now();
|
|
125181
125197
|
responseBytes += chunkBuffer.length;
|
|
125182
125198
|
chunks.push(chunkBuffer);
|
|
125183
125199
|
});
|
|
@@ -125260,6 +125276,8 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125260
125276
|
let buffer = "";
|
|
125261
125277
|
rawBody.on("data", (chunk) => {
|
|
125262
125278
|
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
125279
|
+
if (firstChunkAt === null)
|
|
125280
|
+
firstChunkAt = Date.now();
|
|
125263
125281
|
responseBytes += chunkBuffer.length;
|
|
125264
125282
|
buffer += chunkBuffer.toString("utf8");
|
|
125265
125283
|
const lines = buffer.split("\n");
|
|
@@ -125330,6 +125348,8 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125330
125348
|
const chunks = [];
|
|
125331
125349
|
rawBody.on("data", (chunk) => {
|
|
125332
125350
|
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
125351
|
+
if (firstChunkAt === null)
|
|
125352
|
+
firstChunkAt = Date.now();
|
|
125333
125353
|
responseBytes += chunkBuffer.length;
|
|
125334
125354
|
chunks.push(chunkBuffer);
|
|
125335
125355
|
});
|
|
@@ -125480,7 +125500,7 @@ function createHealthHandler() {
|
|
|
125480
125500
|
};
|
|
125481
125501
|
}
|
|
125482
125502
|
|
|
125483
|
-
async function handleSSERequests({ apiURL,
|
|
125503
|
+
async function handleSSERequests({ apiURL, configuration, logger, onRequest, onRequestEnd, onRequestStart, signal }) {
|
|
125484
125504
|
const streamURL = `${apiURL}/conduit/api/v1/source/${configuration.inferenceSourceID}/requests/stream`;
|
|
125485
125505
|
const maxReconnectDelayMs = 30000;
|
|
125486
125506
|
let reconnectAttempt = 0;
|
|
@@ -125522,14 +125542,11 @@ async function handleSSERequests({ apiURL, conduitConfiguration, configuration,
|
|
|
125522
125542
|
handleRequest({
|
|
125523
125543
|
activeRequests,
|
|
125524
125544
|
apiURL,
|
|
125525
|
-
conduitConfiguration,
|
|
125526
125545
|
configuration,
|
|
125527
125546
|
logger,
|
|
125528
|
-
modelID,
|
|
125529
125547
|
onRequest,
|
|
125530
125548
|
onRequestEnd,
|
|
125531
125549
|
onRequestStart,
|
|
125532
|
-
reportMetrics,
|
|
125533
125550
|
request: payload,
|
|
125534
125551
|
signal: effectiveSignal
|
|
125535
125552
|
}).catch(error => {
|
|
@@ -125566,23 +125583,12 @@ async function handleSSERequests({ apiURL, conduitConfiguration, configuration,
|
|
|
125566
125583
|
}
|
|
125567
125584
|
}
|
|
125568
125585
|
}
|
|
125569
|
-
async function handleRequest({ activeRequests, apiURL,
|
|
125570
|
-
function reportMetricsSafe(payload) {
|
|
125571
|
-
reportMetrics(payload).catch(error => {
|
|
125572
|
-
logger.warn("Failed to upload LLM prompt metrics", {
|
|
125573
|
-
error: asError(error),
|
|
125574
|
-
requestUrl: request.path
|
|
125575
|
-
});
|
|
125576
|
-
});
|
|
125577
|
-
}
|
|
125578
|
-
const engineType = conduitConfiguration().engineConfig?.type ?? null;
|
|
125579
|
-
const endpointId = request.parameters?.endpointID ?? null;
|
|
125586
|
+
async function handleRequest({ activeRequests, apiURL, configuration, logger, onRequest, onRequestEnd, onRequestStart, request, signal }) {
|
|
125580
125587
|
const requestStartedAt = Date.now();
|
|
125581
|
-
const requestBytes = calculateRequestBytes(request.body ?? null);
|
|
125582
125588
|
try {
|
|
125583
125589
|
await onRequestStart?.(request);
|
|
125584
125590
|
const response = await onRequest({ request, signal });
|
|
125585
|
-
|
|
125591
|
+
await streamResponse({
|
|
125586
125592
|
apiURL,
|
|
125587
125593
|
configuration,
|
|
125588
125594
|
logger,
|
|
@@ -125591,30 +125597,6 @@ async function handleRequest({ activeRequests, apiURL, conduitConfiguration, con
|
|
|
125591
125597
|
response,
|
|
125592
125598
|
signal
|
|
125593
125599
|
});
|
|
125594
|
-
const latencyMs = Math.max(0, Date.now() - requestStartedAt);
|
|
125595
|
-
const totalTokens = 0;
|
|
125596
|
-
const tokensPerSecond = calculateTokensPerSecond({
|
|
125597
|
-
durationMs: latencyMs,
|
|
125598
|
-
totalTokens
|
|
125599
|
-
});
|
|
125600
|
-
reportMetricsSafe({
|
|
125601
|
-
bytes: requestBytes + responseMetrics.responseBytes,
|
|
125602
|
-
completionTokens: 0,
|
|
125603
|
-
engine: engineType,
|
|
125604
|
-
endpointId,
|
|
125605
|
-
latencyMs,
|
|
125606
|
-
modelId: modelID,
|
|
125607
|
-
promptTokens: 0,
|
|
125608
|
-
requestBytes,
|
|
125609
|
-
requestId: request.requestID,
|
|
125610
|
-
requestMethod: request.method,
|
|
125611
|
-
requestPath: request.path,
|
|
125612
|
-
responseBytes: responseMetrics.responseBytes,
|
|
125613
|
-
successful: responseMetrics.status < 400,
|
|
125614
|
-
timeToFirstTokenMs: responseMetrics.timeToFirstTokenMs,
|
|
125615
|
-
tokensPerSecond,
|
|
125616
|
-
totalTokens
|
|
125617
|
-
});
|
|
125618
125600
|
}
|
|
125619
125601
|
catch (error) {
|
|
125620
125602
|
const isCancelled = signal?.aborted;
|
|
@@ -125630,8 +125612,6 @@ async function handleRequest({ activeRequests, apiURL, conduitConfiguration, con
|
|
|
125630
125612
|
});
|
|
125631
125613
|
}
|
|
125632
125614
|
const failureMessage = "Bad gateway\n\nProxying failed";
|
|
125633
|
-
const failureBytes = Buffer.byteLength(failureMessage, "utf8");
|
|
125634
|
-
const latencyMs = Math.max(0, Date.now() - requestStartedAt);
|
|
125635
125615
|
if (!isCancelled) {
|
|
125636
125616
|
const streamHandler = await sendChunkStream({
|
|
125637
125617
|
apiURL,
|
|
@@ -125651,24 +125631,6 @@ async function handleRequest({ activeRequests, apiURL, conduitConfiguration, con
|
|
|
125651
125631
|
});
|
|
125652
125632
|
await streamHandler.end();
|
|
125653
125633
|
}
|
|
125654
|
-
reportMetricsSafe({
|
|
125655
|
-
bytes: isCancelled ? requestBytes : requestBytes + failureBytes,
|
|
125656
|
-
completionTokens: 0,
|
|
125657
|
-
engine: engineType,
|
|
125658
|
-
endpointId,
|
|
125659
|
-
latencyMs,
|
|
125660
|
-
modelId: modelID,
|
|
125661
|
-
promptTokens: 0,
|
|
125662
|
-
requestBytes,
|
|
125663
|
-
requestId: request.requestID,
|
|
125664
|
-
requestMethod: request.method,
|
|
125665
|
-
requestPath: request.path,
|
|
125666
|
-
responseBytes: isCancelled ? 0 : failureBytes,
|
|
125667
|
-
successful: false,
|
|
125668
|
-
timeToFirstTokenMs: isCancelled ? null : latencyMs,
|
|
125669
|
-
tokensPerSecond: 0,
|
|
125670
|
-
totalTokens: 0
|
|
125671
|
-
});
|
|
125672
125634
|
}
|
|
125673
125635
|
finally {
|
|
125674
125636
|
activeRequests.delete(request.requestID);
|
|
@@ -125856,25 +125818,6 @@ async function sendChunkStream({ apiURL, configuration, requestID, logger }) {
|
|
|
125856
125818
|
abort
|
|
125857
125819
|
};
|
|
125858
125820
|
}
|
|
125859
|
-
function calculateRequestBytes(body) {
|
|
125860
|
-
if (body === null || body === undefined) {
|
|
125861
|
-
return 0;
|
|
125862
|
-
}
|
|
125863
|
-
if (typeof body === "string") {
|
|
125864
|
-
return Buffer.byteLength(body, "utf8");
|
|
125865
|
-
}
|
|
125866
|
-
return Buffer.byteLength(JSON.stringify(body), "utf8");
|
|
125867
|
-
}
|
|
125868
|
-
function calculateTokensPerSecond({ durationMs, totalTokens }) {
|
|
125869
|
-
if (durationMs <= 0) {
|
|
125870
|
-
return 0;
|
|
125871
|
-
}
|
|
125872
|
-
const tokensPerSecond = totalTokens / (durationMs / 1000);
|
|
125873
|
-
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0) {
|
|
125874
|
-
return 0;
|
|
125875
|
-
}
|
|
125876
|
-
return Math.round(tokensPerSecond);
|
|
125877
|
-
}
|
|
125878
125821
|
|
|
125879
125822
|
const ENGINE_FETCH_TIMEOUT_MS = 7_200_000;
|
|
125880
125823
|
const LOOPBACK_AGENT = new undiciExports.Agent({
|
|
@@ -136047,10 +135990,8 @@ async function createApplication({ abortController, apiClient, configuration, lo
|
|
|
136047
135990
|
});
|
|
136048
135991
|
handleSSERequests({
|
|
136049
135992
|
apiURL: configuration.apiURL,
|
|
136050
|
-
conduitConfiguration: () => conduitConfiguration,
|
|
136051
135993
|
configuration,
|
|
136052
135994
|
logger,
|
|
136053
|
-
modelID: conduitConfiguration.targetModel.id,
|
|
136054
135995
|
onRequest: async ({ request, signal }) => {
|
|
136055
135996
|
return proxyRequest({
|
|
136056
135997
|
configuration,
|
|
@@ -136067,7 +136008,6 @@ async function createApplication({ abortController, apiClient, configuration, lo
|
|
|
136067
136008
|
conduitStateManager.incrementActiveRequestCount();
|
|
136068
136009
|
conduitStateReportManager.reportStateChange();
|
|
136069
136010
|
},
|
|
136070
|
-
reportMetrics: apiClient.reportPromptMetrics,
|
|
136071
136011
|
signal: abortController.signal
|
|
136072
136012
|
}).catch(error => {
|
|
136073
136013
|
logger.error("SSE handler failed", {
|
package/dist/cli.sea.cjs
CHANGED
|
@@ -124222,11 +124222,17 @@ function serializeRequestBody$1(body) {
|
|
|
124222
124222
|
payload
|
|
124223
124223
|
};
|
|
124224
124224
|
}
|
|
124225
|
-
function calculateTokensPerSecond$
|
|
124226
|
-
if (durationMs <= 0) {
|
|
124225
|
+
function calculateTokensPerSecond$1({ completionTokens, durationMs, streamRequested, timeToFirstTokenMs }) {
|
|
124226
|
+
if (completionTokens <= 0 || durationMs <= 0) {
|
|
124227
124227
|
return 0;
|
|
124228
124228
|
}
|
|
124229
|
-
const
|
|
124229
|
+
const decodeMs = streamRequested && timeToFirstTokenMs !== null && timeToFirstTokenMs > 0
|
|
124230
|
+
? Math.max(0, durationMs - timeToFirstTokenMs)
|
|
124231
|
+
: durationMs;
|
|
124232
|
+
if (decodeMs <= 0) {
|
|
124233
|
+
return 0;
|
|
124234
|
+
}
|
|
124235
|
+
const tokensPerSecond = completionTokens / (decodeMs / 1000);
|
|
124230
124236
|
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0) {
|
|
124231
124237
|
return 0;
|
|
124232
124238
|
}
|
|
@@ -124276,10 +124282,7 @@ async function proxyEmbeddingsRoute({ body, conduitConfiguration, endpointId, lo
|
|
|
124276
124282
|
responseBytes,
|
|
124277
124283
|
successful: upstreamResponseOk && !error,
|
|
124278
124284
|
timeToFirstTokenMs: null,
|
|
124279
|
-
tokensPerSecond:
|
|
124280
|
-
durationMs: latencyMs,
|
|
124281
|
-
totalTokens
|
|
124282
|
-
}),
|
|
124285
|
+
tokensPerSecond: 0,
|
|
124283
124286
|
totalTokens
|
|
124284
124287
|
});
|
|
124285
124288
|
};
|
|
@@ -124422,9 +124425,11 @@ async function proxyOpenAIStreamingRoute({ body, conduitConfiguration, endpointI
|
|
|
124422
124425
|
responseBytes,
|
|
124423
124426
|
successful: upstreamResponseOk && !error,
|
|
124424
124427
|
timeToFirstTokenMs,
|
|
124425
|
-
tokensPerSecond: calculateTokensPerSecond$
|
|
124428
|
+
tokensPerSecond: calculateTokensPerSecond$1({
|
|
124429
|
+
completionTokens,
|
|
124426
124430
|
durationMs: latencyMs,
|
|
124427
|
-
|
|
124431
|
+
streamRequested,
|
|
124432
|
+
timeToFirstTokenMs
|
|
124428
124433
|
}),
|
|
124429
124434
|
totalTokens
|
|
124430
124435
|
});
|
|
@@ -124872,10 +124877,15 @@ function serializeRequestBody(body) {
|
|
|
124872
124877
|
payload
|
|
124873
124878
|
};
|
|
124874
124879
|
}
|
|
124875
|
-
function calculateTokensPerSecond
|
|
124876
|
-
if (durationMs <= 0)
|
|
124880
|
+
function calculateTokensPerSecond({ completionTokens, durationMs, streamRequested, timeToFirstTokenMs }) {
|
|
124881
|
+
if (completionTokens <= 0 || durationMs <= 0)
|
|
124882
|
+
return 0;
|
|
124883
|
+
const decodeMs = streamRequested && timeToFirstTokenMs !== null && timeToFirstTokenMs > 0
|
|
124884
|
+
? Math.max(0, durationMs - timeToFirstTokenMs)
|
|
124885
|
+
: durationMs;
|
|
124886
|
+
if (decodeMs <= 0)
|
|
124877
124887
|
return 0;
|
|
124878
|
-
const tokensPerSecond =
|
|
124888
|
+
const tokensPerSecond = completionTokens / (decodeMs / 1000);
|
|
124879
124889
|
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0)
|
|
124880
124890
|
return 0;
|
|
124881
124891
|
return Math.round(tokensPerSecond);
|
|
@@ -125053,7 +125063,7 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125053
125063
|
const targetBody = needsTranslation
|
|
125054
125064
|
? translateAnthropicRequestToOpenAI(serializedBody).body
|
|
125055
125065
|
: serializedBody;
|
|
125056
|
-
const onMonitoringComplete = ({ durationMs, error, responseBytes, usage }) => {
|
|
125066
|
+
const onMonitoringComplete = ({ durationMs, error, responseBytes, timeToFirstTokenMs, usage }) => {
|
|
125057
125067
|
const promptTokens = normalizeTokenCount(usage?.inputTokens);
|
|
125058
125068
|
const completionTokens = normalizeTokenCount(usage?.outputTokens);
|
|
125059
125069
|
const totalTokens = promptTokens + completionTokens;
|
|
@@ -125072,10 +125082,12 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125072
125082
|
requestPath: "/v1/messages",
|
|
125073
125083
|
responseBytes,
|
|
125074
125084
|
successful: !error,
|
|
125075
|
-
timeToFirstTokenMs
|
|
125076
|
-
tokensPerSecond: calculateTokensPerSecond
|
|
125085
|
+
timeToFirstTokenMs,
|
|
125086
|
+
tokensPerSecond: calculateTokensPerSecond({
|
|
125087
|
+
completionTokens,
|
|
125077
125088
|
durationMs: latencyMs,
|
|
125078
|
-
|
|
125089
|
+
streamRequested,
|
|
125090
|
+
timeToFirstTokenMs
|
|
125079
125091
|
}),
|
|
125080
125092
|
totalTokens
|
|
125081
125093
|
});
|
|
@@ -125172,6 +125184,7 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125172
125184
|
const passThrough = new require$$0$8.PassThrough();
|
|
125173
125185
|
let responseBytes = 0;
|
|
125174
125186
|
let completed = false;
|
|
125187
|
+
let firstChunkAt = null;
|
|
125175
125188
|
const usage = { inputTokens: null, outputTokens: null };
|
|
125176
125189
|
const upstreamError = response.ok
|
|
125177
125190
|
? null
|
|
@@ -125184,6 +125197,7 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125184
125197
|
durationMs: Math.max(0, Date.now() - requestStartedAt),
|
|
125185
125198
|
error,
|
|
125186
125199
|
responseBytes,
|
|
125200
|
+
timeToFirstTokenMs: firstChunkAt === null ? null : Math.max(0, firstChunkAt - requestStartedAt),
|
|
125187
125201
|
usage
|
|
125188
125202
|
});
|
|
125189
125203
|
}
|
|
@@ -125193,6 +125207,8 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125193
125207
|
const chunks = [];
|
|
125194
125208
|
rawBody.on("data", (chunk) => {
|
|
125195
125209
|
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
125210
|
+
if (firstChunkAt === null)
|
|
125211
|
+
firstChunkAt = Date.now();
|
|
125196
125212
|
responseBytes += chunkBuffer.length;
|
|
125197
125213
|
chunks.push(chunkBuffer);
|
|
125198
125214
|
});
|
|
@@ -125275,6 +125291,8 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125275
125291
|
let buffer = "";
|
|
125276
125292
|
rawBody.on("data", (chunk) => {
|
|
125277
125293
|
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
125294
|
+
if (firstChunkAt === null)
|
|
125295
|
+
firstChunkAt = Date.now();
|
|
125278
125296
|
responseBytes += chunkBuffer.length;
|
|
125279
125297
|
buffer += chunkBuffer.toString("utf8");
|
|
125280
125298
|
const lines = buffer.split("\n");
|
|
@@ -125345,6 +125363,8 @@ async function proxyAnthropicStreamingRoute({ body, conduitConfiguration, endpoi
|
|
|
125345
125363
|
const chunks = [];
|
|
125346
125364
|
rawBody.on("data", (chunk) => {
|
|
125347
125365
|
const chunkBuffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
125366
|
+
if (firstChunkAt === null)
|
|
125367
|
+
firstChunkAt = Date.now();
|
|
125348
125368
|
responseBytes += chunkBuffer.length;
|
|
125349
125369
|
chunks.push(chunkBuffer);
|
|
125350
125370
|
});
|
|
@@ -125495,7 +125515,7 @@ function createHealthHandler() {
|
|
|
125495
125515
|
};
|
|
125496
125516
|
}
|
|
125497
125517
|
|
|
125498
|
-
async function handleSSERequests({ apiURL,
|
|
125518
|
+
async function handleSSERequests({ apiURL, configuration, logger, onRequest, onRequestEnd, onRequestStart, signal }) {
|
|
125499
125519
|
const streamURL = `${apiURL}/conduit/api/v1/source/${configuration.inferenceSourceID}/requests/stream`;
|
|
125500
125520
|
const maxReconnectDelayMs = 30000;
|
|
125501
125521
|
let reconnectAttempt = 0;
|
|
@@ -125537,14 +125557,11 @@ async function handleSSERequests({ apiURL, conduitConfiguration, configuration,
|
|
|
125537
125557
|
handleRequest({
|
|
125538
125558
|
activeRequests,
|
|
125539
125559
|
apiURL,
|
|
125540
|
-
conduitConfiguration,
|
|
125541
125560
|
configuration,
|
|
125542
125561
|
logger,
|
|
125543
|
-
modelID,
|
|
125544
125562
|
onRequest,
|
|
125545
125563
|
onRequestEnd,
|
|
125546
125564
|
onRequestStart,
|
|
125547
|
-
reportMetrics,
|
|
125548
125565
|
request: payload,
|
|
125549
125566
|
signal: effectiveSignal
|
|
125550
125567
|
}).catch(error => {
|
|
@@ -125581,23 +125598,12 @@ async function handleSSERequests({ apiURL, conduitConfiguration, configuration,
|
|
|
125581
125598
|
}
|
|
125582
125599
|
}
|
|
125583
125600
|
}
|
|
125584
|
-
async function handleRequest({ activeRequests, apiURL,
|
|
125585
|
-
function reportMetricsSafe(payload) {
|
|
125586
|
-
reportMetrics(payload).catch(error => {
|
|
125587
|
-
logger.warn("Failed to upload LLM prompt metrics", {
|
|
125588
|
-
error: asError(error),
|
|
125589
|
-
requestUrl: request.path
|
|
125590
|
-
});
|
|
125591
|
-
});
|
|
125592
|
-
}
|
|
125593
|
-
const engineType = conduitConfiguration().engineConfig?.type ?? null;
|
|
125594
|
-
const endpointId = request.parameters?.endpointID ?? null;
|
|
125601
|
+
async function handleRequest({ activeRequests, apiURL, configuration, logger, onRequest, onRequestEnd, onRequestStart, request, signal }) {
|
|
125595
125602
|
const requestStartedAt = Date.now();
|
|
125596
|
-
const requestBytes = calculateRequestBytes(request.body ?? null);
|
|
125597
125603
|
try {
|
|
125598
125604
|
await onRequestStart?.(request);
|
|
125599
125605
|
const response = await onRequest({ request, signal });
|
|
125600
|
-
|
|
125606
|
+
await streamResponse({
|
|
125601
125607
|
apiURL,
|
|
125602
125608
|
configuration,
|
|
125603
125609
|
logger,
|
|
@@ -125606,30 +125612,6 @@ async function handleRequest({ activeRequests, apiURL, conduitConfiguration, con
|
|
|
125606
125612
|
response,
|
|
125607
125613
|
signal
|
|
125608
125614
|
});
|
|
125609
|
-
const latencyMs = Math.max(0, Date.now() - requestStartedAt);
|
|
125610
|
-
const totalTokens = 0;
|
|
125611
|
-
const tokensPerSecond = calculateTokensPerSecond({
|
|
125612
|
-
durationMs: latencyMs,
|
|
125613
|
-
totalTokens
|
|
125614
|
-
});
|
|
125615
|
-
reportMetricsSafe({
|
|
125616
|
-
bytes: requestBytes + responseMetrics.responseBytes,
|
|
125617
|
-
completionTokens: 0,
|
|
125618
|
-
engine: engineType,
|
|
125619
|
-
endpointId,
|
|
125620
|
-
latencyMs,
|
|
125621
|
-
modelId: modelID,
|
|
125622
|
-
promptTokens: 0,
|
|
125623
|
-
requestBytes,
|
|
125624
|
-
requestId: request.requestID,
|
|
125625
|
-
requestMethod: request.method,
|
|
125626
|
-
requestPath: request.path,
|
|
125627
|
-
responseBytes: responseMetrics.responseBytes,
|
|
125628
|
-
successful: responseMetrics.status < 400,
|
|
125629
|
-
timeToFirstTokenMs: responseMetrics.timeToFirstTokenMs,
|
|
125630
|
-
tokensPerSecond,
|
|
125631
|
-
totalTokens
|
|
125632
|
-
});
|
|
125633
125615
|
}
|
|
125634
125616
|
catch (error) {
|
|
125635
125617
|
const isCancelled = signal?.aborted;
|
|
@@ -125645,8 +125627,6 @@ async function handleRequest({ activeRequests, apiURL, conduitConfiguration, con
|
|
|
125645
125627
|
});
|
|
125646
125628
|
}
|
|
125647
125629
|
const failureMessage = "Bad gateway\n\nProxying failed";
|
|
125648
|
-
const failureBytes = Buffer.byteLength(failureMessage, "utf8");
|
|
125649
|
-
const latencyMs = Math.max(0, Date.now() - requestStartedAt);
|
|
125650
125630
|
if (!isCancelled) {
|
|
125651
125631
|
const streamHandler = await sendChunkStream({
|
|
125652
125632
|
apiURL,
|
|
@@ -125666,24 +125646,6 @@ async function handleRequest({ activeRequests, apiURL, conduitConfiguration, con
|
|
|
125666
125646
|
});
|
|
125667
125647
|
await streamHandler.end();
|
|
125668
125648
|
}
|
|
125669
|
-
reportMetricsSafe({
|
|
125670
|
-
bytes: isCancelled ? requestBytes : requestBytes + failureBytes,
|
|
125671
|
-
completionTokens: 0,
|
|
125672
|
-
engine: engineType,
|
|
125673
|
-
endpointId,
|
|
125674
|
-
latencyMs,
|
|
125675
|
-
modelId: modelID,
|
|
125676
|
-
promptTokens: 0,
|
|
125677
|
-
requestBytes,
|
|
125678
|
-
requestId: request.requestID,
|
|
125679
|
-
requestMethod: request.method,
|
|
125680
|
-
requestPath: request.path,
|
|
125681
|
-
responseBytes: isCancelled ? 0 : failureBytes,
|
|
125682
|
-
successful: false,
|
|
125683
|
-
timeToFirstTokenMs: isCancelled ? null : latencyMs,
|
|
125684
|
-
tokensPerSecond: 0,
|
|
125685
|
-
totalTokens: 0
|
|
125686
|
-
});
|
|
125687
125649
|
}
|
|
125688
125650
|
finally {
|
|
125689
125651
|
activeRequests.delete(request.requestID);
|
|
@@ -125871,25 +125833,6 @@ async function sendChunkStream({ apiURL, configuration, requestID, logger }) {
|
|
|
125871
125833
|
abort
|
|
125872
125834
|
};
|
|
125873
125835
|
}
|
|
125874
|
-
function calculateRequestBytes(body) {
|
|
125875
|
-
if (body === null || body === undefined) {
|
|
125876
|
-
return 0;
|
|
125877
|
-
}
|
|
125878
|
-
if (typeof body === "string") {
|
|
125879
|
-
return Buffer.byteLength(body, "utf8");
|
|
125880
|
-
}
|
|
125881
|
-
return Buffer.byteLength(JSON.stringify(body), "utf8");
|
|
125882
|
-
}
|
|
125883
|
-
function calculateTokensPerSecond({ durationMs, totalTokens }) {
|
|
125884
|
-
if (durationMs <= 0) {
|
|
125885
|
-
return 0;
|
|
125886
|
-
}
|
|
125887
|
-
const tokensPerSecond = totalTokens / (durationMs / 1000);
|
|
125888
|
-
if (!Number.isFinite(tokensPerSecond) || tokensPerSecond <= 0) {
|
|
125889
|
-
return 0;
|
|
125890
|
-
}
|
|
125891
|
-
return Math.round(tokensPerSecond);
|
|
125892
|
-
}
|
|
125893
125836
|
|
|
125894
125837
|
const ENGINE_FETCH_TIMEOUT_MS = 7_200_000;
|
|
125895
125838
|
const LOOPBACK_AGENT = new undiciExports.Agent({
|
|
@@ -156277,10 +156220,8 @@ async function createApplication({ abortController, apiClient, configuration, lo
|
|
|
156277
156220
|
});
|
|
156278
156221
|
handleSSERequests({
|
|
156279
156222
|
apiURL: configuration.apiURL,
|
|
156280
|
-
conduitConfiguration: () => conduitConfiguration,
|
|
156281
156223
|
configuration,
|
|
156282
156224
|
logger,
|
|
156283
|
-
modelID: conduitConfiguration.targetModel.id,
|
|
156284
156225
|
onRequest: async ({ request, signal }) => {
|
|
156285
156226
|
return proxyRequest({
|
|
156286
156227
|
configuration,
|
|
@@ -156297,7 +156238,6 @@ async function createApplication({ abortController, apiClient, configuration, lo
|
|
|
156297
156238
|
conduitStateManager.incrementActiveRequestCount();
|
|
156298
156239
|
conduitStateReportManager.reportStateChange();
|
|
156299
156240
|
},
|
|
156300
|
-
reportMetrics: apiClient.reportPromptMetrics,
|
|
156301
156241
|
signal: abortController.signal
|
|
156302
156242
|
}).catch(error => {
|
|
156303
156243
|
logger.error("SSE handler failed", {
|
package/dist/sse/handler.d.ts
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type APIResponse, type ServerToClientAPIRequest } from "@infersec/definitions";
|
|
2
2
|
import { Logger } from "@infersec/logger";
|
|
3
3
|
import { Configuration } from "../configuration.js";
|
|
4
|
-
export declare function handleSSERequests({ apiURL,
|
|
4
|
+
export declare function handleSSERequests({ apiURL, configuration, logger, onRequest, onRequestEnd, onRequestStart, signal }: {
|
|
5
5
|
apiURL: string;
|
|
6
|
-
conduitConfiguration: () => InferenceAgentConfiguration;
|
|
7
6
|
configuration: Configuration;
|
|
8
7
|
logger: Logger;
|
|
9
|
-
modelID: ULID;
|
|
10
8
|
onRequest: ({ request, signal }: {
|
|
11
9
|
request: ServerToClientAPIRequest;
|
|
12
10
|
signal?: AbortSignal;
|
|
13
11
|
}) => Promise<APIResponse>;
|
|
14
12
|
onRequestEnd?: (request: ServerToClientAPIRequest) => Promise<void> | void;
|
|
15
13
|
onRequestStart?: (request: ServerToClientAPIRequest) => Promise<void> | void;
|
|
16
|
-
reportMetrics: (payload: InferenceAgentLLMMetricsPayload) => Promise<void>;
|
|
17
14
|
signal?: AbortSignal;
|
|
18
15
|
}): Promise<void>;
|