@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 +53 -7
- package/dist/ai/index.js.map +5 -5
- package/dist/ai/providers/openai.js +12 -5
- package/dist/ai/providers/openai.js.map +3 -3
- package/dist/ai/providers/openaiCompatible.js +12 -5
- package/dist/ai/providers/openaiCompatible.js.map +3 -3
- package/dist/ai/providers/openaiResponses.js +5 -2
- package/dist/ai/providers/openaiResponses.js.map +3 -3
- package/dist/src/ai/streamAIToSSE.d.ts +4 -2
- package/dist/types/ai.d.ts +9 -0
- package/package.json +1 -1
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
|
-
|
|
576
|
-
|
|
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
|
-
|
|
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=
|
|
4413
|
+
//# debugId=4EA405589A58240564756E2164756E21
|
|
4368
4414
|
//# sourceMappingURL=index.js.map
|