@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 CHANGED
@@ -124207,11 +124207,17 @@ function serializeRequestBody$1(body) {
124207
124207
  payload
124208
124208
  };
124209
124209
  }
124210
- function calculateTokensPerSecond$2({ durationMs, totalTokens }) {
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 tokensPerSecond = totalTokens / (durationMs / 1000);
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: calculateTokensPerSecond$2({
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$2({
124413
+ tokensPerSecond: calculateTokensPerSecond$1({
124414
+ completionTokens,
124411
124415
  durationMs: latencyMs,
124412
- totalTokens
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$1({ durationMs, totalTokens }) {
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 = totalTokens / (durationMs / 1000);
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: null,
125061
- tokensPerSecond: calculateTokensPerSecond$1({
125070
+ timeToFirstTokenMs,
125071
+ tokensPerSecond: calculateTokensPerSecond({
125072
+ completionTokens,
125062
125073
  durationMs: latencyMs,
125063
- totalTokens
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, conduitConfiguration, configuration, logger, modelID, onRequest, onRequestEnd, onRequestStart, reportMetrics, signal }) {
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, conduitConfiguration, configuration, logger, modelID, onRequest, onRequestEnd, onRequestStart, reportMetrics, request, signal }) {
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
- const responseMetrics = await streamResponse({
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$2({ durationMs, totalTokens }) {
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 tokensPerSecond = totalTokens / (durationMs / 1000);
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: calculateTokensPerSecond$2({
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$2({
124428
+ tokensPerSecond: calculateTokensPerSecond$1({
124429
+ completionTokens,
124426
124430
  durationMs: latencyMs,
124427
- totalTokens
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$1({ durationMs, totalTokens }) {
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 = totalTokens / (durationMs / 1000);
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: null,
125076
- tokensPerSecond: calculateTokensPerSecond$1({
125085
+ timeToFirstTokenMs,
125086
+ tokensPerSecond: calculateTokensPerSecond({
125087
+ completionTokens,
125077
125088
  durationMs: latencyMs,
125078
- totalTokens
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, conduitConfiguration, configuration, logger, modelID, onRequest, onRequestEnd, onRequestStart, reportMetrics, signal }) {
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, conduitConfiguration, configuration, logger, modelID, onRequest, onRequestEnd, onRequestStart, reportMetrics, request, signal }) {
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
- const responseMetrics = await streamResponse({
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", {
@@ -1,18 +1,15 @@
1
- import { InferenceAgentConfiguration, InferenceAgentLLMMetricsPayload, type ULID, type APIResponse, type ServerToClientAPIRequest } from "@infersec/definitions";
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, conduitConfiguration, configuration, logger, modelID, onRequest, onRequestEnd, onRequestStart, reportMetrics, signal }: {
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>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@infersec/conduit",
3
3
  "description": "End user conduit agent for connecting local LLMs to the cloud.",
4
- "version": "1.98.1",
4
+ "version": "1.98.2",
5
5
  "bin": {
6
6
  "infersec-conduit": "./dist/cli.js"
7
7
  },