@absolutejs/ai 0.0.25 → 0.0.27

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/ai/index.js CHANGED
@@ -571,10 +571,15 @@ var flushPendingToolCalls = function* (pendingToolCalls) {
571
571
  }
572
572
  pendingToolCalls.clear();
573
573
  };
574
- var extractUsage = (parsedUsage) => ({
575
- inputTokens: parsedUsage.prompt_tokens ?? 0,
576
- outputTokens: parsedUsage.completion_tokens ?? 0
577
- });
574
+ var extractUsage = (parsedUsage) => {
575
+ const prompt = parsedUsage.prompt_tokens ?? 0;
576
+ const cached = parsedUsage.cached_tokens ?? 0;
577
+ return {
578
+ cacheReadInputTokens: cached,
579
+ inputTokens: Math.max(0, prompt - cached),
580
+ outputTokens: parsedUsage.completion_tokens ?? 0
581
+ };
582
+ };
578
583
  var resolveToolCallIndex = (toolCall) => {
579
584
  const raw = typeof toolCall.index === "number" ? toolCall.index : NOT_FOUND;
580
585
  return raw < 0 ? undefined : raw;
@@ -644,7 +649,9 @@ var narrowUsageRecord = (parsed) => {
644
649
  const { usage } = parsed;
645
650
  const promptTokens = typeof usage.prompt_tokens === "number" ? usage.prompt_tokens : 0;
646
651
  const completionTokens = typeof usage.completion_tokens === "number" ? usage.completion_tokens : 0;
652
+ const cachedTokens = isRecord(usage.prompt_tokens_details) && typeof usage.prompt_tokens_details.cached_tokens === "number" ? usage.prompt_tokens_details.cached_tokens : 0;
647
653
  return extractUsage({
654
+ cached_tokens: cachedTokens,
648
655
  completion_tokens: completionTokens,
649
656
  prompt_tokens: promptTokens
650
657
  });
@@ -978,8 +985,11 @@ var extractUsage2 = (response) => {
978
985
  return;
979
986
  }
980
987
  const { usage } = response;
988
+ const input = typeof usage.input_tokens === "number" ? usage.input_tokens : 0;
989
+ const cached = isRecord2(usage.input_tokens_details) && typeof usage.input_tokens_details.cached_tokens === "number" ? usage.input_tokens_details.cached_tokens : 0;
981
990
  return {
982
- inputTokens: typeof usage.input_tokens === "number" ? usage.input_tokens : 0,
991
+ cacheReadInputTokens: cached,
992
+ inputTokens: Math.max(0, input - cached),
983
993
  outputTokens: typeof usage.output_tokens === "number" ? usage.output_tokens : 0
984
994
  };
985
995
  };
@@ -2709,6 +2719,42 @@ var handleStreamError = async (socket, err, messageId, conversationId, signal, s
2709
2719
 
2710
2720
  // src/ai/streamAIToSSE.ts
2711
2721
  var DEFAULT_MAX_TURNS2 = 10;
2722
+ var DEFAULT_HEARTBEAT_MS = 15000;
2723
+ var HEARTBEAT_TICK = Symbol("heartbeat-tick");
2724
+ var withHeartbeat = async function* (source, signal, intervalMs) {
2725
+ if (!Number.isFinite(intervalMs) || intervalMs <= 0) {
2726
+ yield* source;
2727
+ return;
2728
+ }
2729
+ try {
2730
+ let next = source.next();
2731
+ for (;; ) {
2732
+ let timer;
2733
+ const tick = new Promise((resolve) => {
2734
+ timer = setTimeout(() => resolve(HEARTBEAT_TICK), intervalMs);
2735
+ });
2736
+ let winner;
2737
+ try {
2738
+ winner = await Promise.race([next, tick]);
2739
+ } finally {
2740
+ if (timer)
2741
+ clearTimeout(timer);
2742
+ }
2743
+ if (winner === HEARTBEAT_TICK) {
2744
+ if (signal.aborted)
2745
+ return;
2746
+ yield { data: "", event: "ping" };
2747
+ continue;
2748
+ }
2749
+ if (winner.done)
2750
+ return;
2751
+ yield winner.value;
2752
+ next = source.next();
2753
+ }
2754
+ } finally {
2755
+ await source.return?.(undefined);
2756
+ }
2757
+ };
2712
2758
  var buildToolDefinitions2 = (tools) => Object.entries(tools).map(([name, def]) => ({
2713
2759
  description: def.description,
2714
2760
  input_schema: def.input,
@@ -2732,7 +2778,7 @@ var streamAIToSSE = async function* (conversationId, messageId, options, rendere
2732
2778
  const maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS2;
2733
2779
  const messages = options.messages ? [...options.messages] : [];
2734
2780
  try {
2735
- yield* streamTurns(options, renderers, messages, signal, startTime, maxTurns);
2781
+ yield* withHeartbeat(streamTurns(options, renderers, messages, signal, startTime, maxTurns), signal, options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS);
2736
2782
  } catch (err) {
2737
2783
  if (signal.aborted)
2738
2784
  return;
@@ -4364,5 +4410,5 @@ export {
4364
4410
  PROVIDER_STATUS_PAGES
4365
4411
  };
4366
4412
 
4367
- //# debugId=A76D544D382AA89A64756E2164756E21
4413
+ //# debugId=4EA405589A58240564756E2164756E21
4368
4414
  //# sourceMappingURL=index.js.map