@providerprotocol/ai 0.0.11 → 0.0.13
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/anthropic/index.d.ts +51 -15
- package/dist/anthropic/index.js +54 -19
- package/dist/anthropic/index.js.map +1 -1
- package/dist/{chunk-SUNYWHTH.js → chunk-MOU4U3PO.js} +55 -3
- package/dist/chunk-MOU4U3PO.js.map +1 -0
- package/dist/{chunk-Y6Q7JCNP.js → chunk-MSR5P65T.js} +1 -1
- package/dist/chunk-MSR5P65T.js.map +1 -0
- package/dist/{chunk-W4BB4BG2.js → chunk-SVYROCLD.js} +31 -11
- package/dist/chunk-SVYROCLD.js.map +1 -0
- package/dist/chunk-U4JJC2YX.js +234 -0
- package/dist/chunk-U4JJC2YX.js.map +1 -0
- package/dist/{chunk-X5G4EHL7.js → chunk-Z7RBRCRN.js} +1 -1
- package/dist/chunk-Z7RBRCRN.js.map +1 -0
- package/dist/google/index.d.ts +376 -7
- package/dist/google/index.js +127 -15
- package/dist/google/index.js.map +1 -1
- package/dist/http/index.d.ts +222 -25
- package/dist/http/index.js +3 -3
- package/dist/index.d.ts +1482 -198
- package/dist/index.js +233 -49
- package/dist/index.js.map +1 -1
- package/dist/ollama/index.d.ts +92 -20
- package/dist/ollama/index.js +17 -7
- package/dist/ollama/index.js.map +1 -1
- package/dist/openai/index.d.ts +340 -61
- package/dist/openai/index.js +57 -15
- package/dist/openai/index.js.map +1 -1
- package/dist/openrouter/index.d.ts +107 -51
- package/dist/openrouter/index.js +36 -8
- package/dist/openrouter/index.js.map +1 -1
- package/dist/provider-mKkz7Q9U.d.ts +488 -0
- package/dist/retry-Dh70lgr0.d.ts +508 -0
- package/dist/xai/index.d.ts +97 -22
- package/dist/xai/index.js +55 -19
- package/dist/xai/index.js.map +1 -1
- package/package.json +8 -12
- package/dist/chunk-CUCRF5W6.js +0 -136
- package/dist/chunk-CUCRF5W6.js.map +0 -1
- package/dist/chunk-SUNYWHTH.js.map +0 -1
- package/dist/chunk-W4BB4BG2.js.map +0 -1
- package/dist/chunk-X5G4EHL7.js.map +0 -1
- package/dist/chunk-Y6Q7JCNP.js.map +0 -1
- package/dist/provider-CUJWjgNl.d.ts +0 -192
- package/dist/retry-I2661_rv.d.ts +0 -118
- package/src/anthropic/index.ts +0 -3
- package/src/core/image.ts +0 -188
- package/src/core/llm.ts +0 -650
- package/src/core/provider.ts +0 -92
- package/src/google/index.ts +0 -3
- package/src/http/errors.ts +0 -112
- package/src/http/fetch.ts +0 -210
- package/src/http/index.ts +0 -31
- package/src/http/keys.ts +0 -136
- package/src/http/retry.ts +0 -205
- package/src/http/sse.ts +0 -136
- package/src/index.ts +0 -32
- package/src/ollama/index.ts +0 -3
- package/src/openai/index.ts +0 -39
- package/src/openrouter/index.ts +0 -11
- package/src/providers/anthropic/index.ts +0 -17
- package/src/providers/anthropic/llm.ts +0 -196
- package/src/providers/anthropic/transform.ts +0 -434
- package/src/providers/anthropic/types.ts +0 -213
- package/src/providers/google/index.ts +0 -17
- package/src/providers/google/llm.ts +0 -203
- package/src/providers/google/transform.ts +0 -447
- package/src/providers/google/types.ts +0 -214
- package/src/providers/ollama/index.ts +0 -43
- package/src/providers/ollama/llm.ts +0 -272
- package/src/providers/ollama/transform.ts +0 -434
- package/src/providers/ollama/types.ts +0 -260
- package/src/providers/openai/index.ts +0 -186
- package/src/providers/openai/llm.completions.ts +0 -201
- package/src/providers/openai/llm.responses.ts +0 -211
- package/src/providers/openai/transform.completions.ts +0 -561
- package/src/providers/openai/transform.responses.ts +0 -708
- package/src/providers/openai/types.ts +0 -1249
- package/src/providers/openrouter/index.ts +0 -177
- package/src/providers/openrouter/llm.completions.ts +0 -201
- package/src/providers/openrouter/llm.responses.ts +0 -211
- package/src/providers/openrouter/transform.completions.ts +0 -538
- package/src/providers/openrouter/transform.responses.ts +0 -742
- package/src/providers/openrouter/types.ts +0 -717
- package/src/providers/xai/index.ts +0 -223
- package/src/providers/xai/llm.completions.ts +0 -201
- package/src/providers/xai/llm.messages.ts +0 -195
- package/src/providers/xai/llm.responses.ts +0 -211
- package/src/providers/xai/transform.completions.ts +0 -565
- package/src/providers/xai/transform.messages.ts +0 -448
- package/src/providers/xai/transform.responses.ts +0 -678
- package/src/providers/xai/types.ts +0 -938
- package/src/types/content.ts +0 -133
- package/src/types/errors.ts +0 -85
- package/src/types/index.ts +0 -105
- package/src/types/llm.ts +0 -211
- package/src/types/messages.ts +0 -205
- package/src/types/provider.ts +0 -195
- package/src/types/schema.ts +0 -58
- package/src/types/stream.ts +0 -188
- package/src/types/thread.ts +0 -226
- package/src/types/tool.ts +0 -88
- package/src/types/turn.ts +0 -118
- package/src/utils/id.ts +0 -28
- package/src/xai/index.ts +0 -41
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-MSR5P65T.js";
|
|
4
4
|
import {
|
|
5
5
|
AssistantMessage,
|
|
6
6
|
Message,
|
|
@@ -10,21 +10,21 @@ import {
|
|
|
10
10
|
isAssistantMessage,
|
|
11
11
|
isToolResultMessage,
|
|
12
12
|
isUserMessage
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-SVYROCLD.js";
|
|
14
14
|
import {
|
|
15
15
|
ExponentialBackoff,
|
|
16
16
|
LinearBackoff,
|
|
17
17
|
NoRetry,
|
|
18
18
|
RetryAfterStrategy,
|
|
19
19
|
TokenBucket
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
} from "./chunk-U4JJC2YX.js";
|
|
21
|
+
import "./chunk-Z7RBRCRN.js";
|
|
22
22
|
import {
|
|
23
23
|
DynamicKey,
|
|
24
24
|
RoundRobinKeys,
|
|
25
25
|
UPPError,
|
|
26
26
|
WeightedKeys
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-MOU4U3PO.js";
|
|
28
28
|
|
|
29
29
|
// src/types/turn.ts
|
|
30
30
|
function createTurn(messages, toolExecutions, usage, cycles, data) {
|
|
@@ -46,6 +46,8 @@ function emptyUsage() {
|
|
|
46
46
|
inputTokens: 0,
|
|
47
47
|
outputTokens: 0,
|
|
48
48
|
totalTokens: 0,
|
|
49
|
+
cacheReadTokens: 0,
|
|
50
|
+
cacheWriteTokens: 0,
|
|
49
51
|
cycles: []
|
|
50
52
|
};
|
|
51
53
|
}
|
|
@@ -53,9 +55,13 @@ function aggregateUsage(usages) {
|
|
|
53
55
|
const cycles = [];
|
|
54
56
|
let inputTokens = 0;
|
|
55
57
|
let outputTokens = 0;
|
|
58
|
+
let cacheReadTokens = 0;
|
|
59
|
+
let cacheWriteTokens = 0;
|
|
56
60
|
for (const usage of usages) {
|
|
57
61
|
inputTokens += usage.inputTokens;
|
|
58
62
|
outputTokens += usage.outputTokens;
|
|
63
|
+
cacheReadTokens += usage.cacheReadTokens;
|
|
64
|
+
cacheWriteTokens += usage.cacheWriteTokens;
|
|
59
65
|
cycles.push({
|
|
60
66
|
inputTokens: usage.inputTokens,
|
|
61
67
|
outputTokens: usage.outputTokens
|
|
@@ -65,6 +71,8 @@ function aggregateUsage(usages) {
|
|
|
65
71
|
inputTokens,
|
|
66
72
|
outputTokens,
|
|
67
73
|
totalTokens: inputTokens + outputTokens,
|
|
74
|
+
cacheReadTokens,
|
|
75
|
+
cacheWriteTokens,
|
|
68
76
|
cycles
|
|
69
77
|
};
|
|
70
78
|
}
|
|
@@ -313,7 +321,6 @@ async function executeGenerate(model, config, system, params, tools, toolStrateg
|
|
|
313
321
|
const data = structure ? structuredData : void 0;
|
|
314
322
|
return createTurn(
|
|
315
323
|
allMessages.slice(history.length),
|
|
316
|
-
// Only messages from this turn
|
|
317
324
|
toolExecutions,
|
|
318
325
|
aggregateUsage(usages),
|
|
319
326
|
cycles,
|
|
@@ -430,10 +437,25 @@ async function executeTools(message, tools, toolStrategy, executions, onEvent) {
|
|
|
430
437
|
}
|
|
431
438
|
const startTime = Date.now();
|
|
432
439
|
onEvent?.(toolExecutionStart(call.toolCallId, tool.name, startTime, index));
|
|
433
|
-
|
|
440
|
+
let effectiveParams = call.arguments;
|
|
441
|
+
await toolStrategy?.onToolCall?.(tool, effectiveParams);
|
|
434
442
|
if (toolStrategy?.onBeforeCall) {
|
|
435
|
-
const
|
|
436
|
-
|
|
443
|
+
const beforeResult = await toolStrategy.onBeforeCall(tool, effectiveParams);
|
|
444
|
+
const isBeforeCallResult = (value) => typeof value === "object" && value !== null && "proceed" in value;
|
|
445
|
+
if (isBeforeCallResult(beforeResult)) {
|
|
446
|
+
if (!beforeResult.proceed) {
|
|
447
|
+
const endTime = Date.now();
|
|
448
|
+
onEvent?.(toolExecutionEnd(call.toolCallId, tool.name, "Tool execution skipped", true, endTime, index));
|
|
449
|
+
return {
|
|
450
|
+
toolCallId: call.toolCallId,
|
|
451
|
+
result: "Tool execution skipped",
|
|
452
|
+
isError: true
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
if (beforeResult.params !== void 0) {
|
|
456
|
+
effectiveParams = beforeResult.params;
|
|
457
|
+
}
|
|
458
|
+
} else if (!beforeResult) {
|
|
437
459
|
const endTime = Date.now();
|
|
438
460
|
onEvent?.(toolExecutionEnd(call.toolCallId, tool.name, "Tool execution skipped", true, endTime, index));
|
|
439
461
|
return {
|
|
@@ -446,7 +468,7 @@ async function executeTools(message, tools, toolStrategy, executions, onEvent) {
|
|
|
446
468
|
let approved = true;
|
|
447
469
|
if (tool.approval) {
|
|
448
470
|
try {
|
|
449
|
-
approved = await tool.approval(
|
|
471
|
+
approved = await tool.approval(effectiveParams);
|
|
450
472
|
} catch (error) {
|
|
451
473
|
throw error;
|
|
452
474
|
}
|
|
@@ -456,7 +478,7 @@ async function executeTools(message, tools, toolStrategy, executions, onEvent) {
|
|
|
456
478
|
const execution = {
|
|
457
479
|
toolName: tool.name,
|
|
458
480
|
toolCallId: call.toolCallId,
|
|
459
|
-
arguments:
|
|
481
|
+
arguments: effectiveParams,
|
|
460
482
|
result: "Tool execution denied",
|
|
461
483
|
isError: true,
|
|
462
484
|
duration: endTime - startTime,
|
|
@@ -471,13 +493,19 @@ async function executeTools(message, tools, toolStrategy, executions, onEvent) {
|
|
|
471
493
|
};
|
|
472
494
|
}
|
|
473
495
|
try {
|
|
474
|
-
|
|
496
|
+
let result = await tool.run(effectiveParams);
|
|
475
497
|
const endTime = Date.now();
|
|
476
|
-
|
|
498
|
+
if (toolStrategy?.onAfterCall) {
|
|
499
|
+
const afterResult = await toolStrategy.onAfterCall(tool, effectiveParams, result);
|
|
500
|
+
const isAfterCallResult = (value) => typeof value === "object" && value !== null && "result" in value;
|
|
501
|
+
if (isAfterCallResult(afterResult)) {
|
|
502
|
+
result = afterResult.result;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
477
505
|
const execution = {
|
|
478
506
|
toolName: tool.name,
|
|
479
507
|
toolCallId: call.toolCallId,
|
|
480
|
-
arguments:
|
|
508
|
+
arguments: effectiveParams,
|
|
481
509
|
result,
|
|
482
510
|
isError: false,
|
|
483
511
|
duration: endTime - startTime,
|
|
@@ -492,12 +520,12 @@ async function executeTools(message, tools, toolStrategy, executions, onEvent) {
|
|
|
492
520
|
};
|
|
493
521
|
} catch (error) {
|
|
494
522
|
const endTime = Date.now();
|
|
495
|
-
await toolStrategy?.onError?.(tool,
|
|
523
|
+
await toolStrategy?.onError?.(tool, effectiveParams, error);
|
|
496
524
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
497
525
|
const execution = {
|
|
498
526
|
toolName: tool.name,
|
|
499
527
|
toolCallId: call.toolCallId,
|
|
500
|
-
arguments:
|
|
528
|
+
arguments: effectiveParams,
|
|
501
529
|
result: errorMessage,
|
|
502
530
|
isError: true,
|
|
503
531
|
duration: endTime - startTime,
|
|
@@ -548,10 +576,15 @@ function validateMediaCapabilities(messages, capabilities, providerName) {
|
|
|
548
576
|
}
|
|
549
577
|
|
|
550
578
|
// src/core/image.ts
|
|
579
|
+
import { readFile } from "fs/promises";
|
|
551
580
|
var Image = class _Image {
|
|
581
|
+
/** The underlying image source (bytes, base64, or URL) */
|
|
552
582
|
source;
|
|
583
|
+
/** MIME type of the image (e.g., 'image/jpeg', 'image/png') */
|
|
553
584
|
mimeType;
|
|
585
|
+
/** Image width in pixels, if known */
|
|
554
586
|
width;
|
|
587
|
+
/** Image height in pixels, if known */
|
|
555
588
|
height;
|
|
556
589
|
constructor(source, mimeType, width, height) {
|
|
557
590
|
this.source = source;
|
|
@@ -560,13 +593,19 @@ var Image = class _Image {
|
|
|
560
593
|
this.height = height;
|
|
561
594
|
}
|
|
562
595
|
/**
|
|
563
|
-
*
|
|
596
|
+
* Whether this image has data loaded in memory.
|
|
597
|
+
*
|
|
598
|
+
* Returns `false` for URL-sourced images that reference external resources.
|
|
599
|
+
* These must be fetched before their data can be accessed.
|
|
564
600
|
*/
|
|
565
601
|
get hasData() {
|
|
566
602
|
return this.source.type !== "url";
|
|
567
603
|
}
|
|
568
604
|
/**
|
|
569
|
-
*
|
|
605
|
+
* Converts the image to a base64-encoded string.
|
|
606
|
+
*
|
|
607
|
+
* @returns The image data as a base64 string
|
|
608
|
+
* @throws {Error} When the source is a URL (data must be fetched first)
|
|
570
609
|
*/
|
|
571
610
|
toBase64() {
|
|
572
611
|
if (this.source.type === "base64") {
|
|
@@ -580,14 +619,20 @@ var Image = class _Image {
|
|
|
580
619
|
throw new Error("Cannot convert URL image to base64. Fetch the image first.");
|
|
581
620
|
}
|
|
582
621
|
/**
|
|
583
|
-
*
|
|
622
|
+
* Converts the image to a data URL suitable for embedding in HTML or CSS.
|
|
623
|
+
*
|
|
624
|
+
* @returns A data URL in the format `data:{mimeType};base64,{data}`
|
|
625
|
+
* @throws {Error} When the source is a URL (data must be fetched first)
|
|
584
626
|
*/
|
|
585
627
|
toDataUrl() {
|
|
586
628
|
const base64 = this.toBase64();
|
|
587
629
|
return `data:${this.mimeType};base64,${base64}`;
|
|
588
630
|
}
|
|
589
631
|
/**
|
|
590
|
-
*
|
|
632
|
+
* Gets the image data as raw bytes.
|
|
633
|
+
*
|
|
634
|
+
* @returns The image data as a Uint8Array
|
|
635
|
+
* @throws {Error} When the source is a URL (data must be fetched first)
|
|
591
636
|
*/
|
|
592
637
|
toBytes() {
|
|
593
638
|
if (this.source.type === "bytes") {
|
|
@@ -604,7 +649,10 @@ var Image = class _Image {
|
|
|
604
649
|
throw new Error("Cannot get bytes from URL image. Fetch the image first.");
|
|
605
650
|
}
|
|
606
651
|
/**
|
|
607
|
-
*
|
|
652
|
+
* Gets the URL for URL-sourced images.
|
|
653
|
+
*
|
|
654
|
+
* @returns The image URL
|
|
655
|
+
* @throws {Error} When the source is not a URL
|
|
608
656
|
*/
|
|
609
657
|
toUrl() {
|
|
610
658
|
if (this.source.type === "url") {
|
|
@@ -613,7 +661,9 @@ var Image = class _Image {
|
|
|
613
661
|
throw new Error("This image does not have a URL source.");
|
|
614
662
|
}
|
|
615
663
|
/**
|
|
616
|
-
*
|
|
664
|
+
* Converts this Image to an ImageBlock for use in UPP messages.
|
|
665
|
+
*
|
|
666
|
+
* @returns An ImageBlock that can be included in message content arrays
|
|
617
667
|
*/
|
|
618
668
|
toBlock() {
|
|
619
669
|
return {
|
|
@@ -625,38 +675,85 @@ var Image = class _Image {
|
|
|
625
675
|
};
|
|
626
676
|
}
|
|
627
677
|
/**
|
|
628
|
-
*
|
|
678
|
+
* Creates an Image by reading a file from disk.
|
|
679
|
+
*
|
|
680
|
+
* The file is read into memory as bytes. MIME type is automatically
|
|
681
|
+
* detected from the file extension.
|
|
682
|
+
*
|
|
683
|
+
* @param path - Path to the image file
|
|
684
|
+
* @returns Promise resolving to an Image with the file contents
|
|
685
|
+
*
|
|
686
|
+
* @example
|
|
687
|
+
* ```typescript
|
|
688
|
+
* const image = await Image.fromPath('./photos/vacation.jpg');
|
|
689
|
+
* ```
|
|
629
690
|
*/
|
|
630
691
|
static async fromPath(path) {
|
|
631
|
-
const
|
|
632
|
-
const
|
|
633
|
-
const mimeType = file.type || detectMimeType(path);
|
|
692
|
+
const data = await readFile(path);
|
|
693
|
+
const mimeType = detectMimeType(path);
|
|
634
694
|
return new _Image(
|
|
635
695
|
{ type: "bytes", data: new Uint8Array(data) },
|
|
636
696
|
mimeType
|
|
637
697
|
);
|
|
638
698
|
}
|
|
639
699
|
/**
|
|
640
|
-
*
|
|
700
|
+
* Creates an Image from a URL reference.
|
|
701
|
+
*
|
|
702
|
+
* The URL is stored as a reference and not fetched. Providers will handle
|
|
703
|
+
* URL-to-data conversion if needed. MIME type is detected from the URL
|
|
704
|
+
* path if not provided.
|
|
705
|
+
*
|
|
706
|
+
* @param url - URL pointing to the image
|
|
707
|
+
* @param mimeType - Optional MIME type override
|
|
708
|
+
* @returns An Image referencing the URL
|
|
709
|
+
*
|
|
710
|
+
* @example
|
|
711
|
+
* ```typescript
|
|
712
|
+
* const image = Image.fromUrl('https://example.com/logo.png');
|
|
713
|
+
* ```
|
|
641
714
|
*/
|
|
642
715
|
static fromUrl(url, mimeType) {
|
|
643
716
|
const detected = mimeType || detectMimeTypeFromUrl(url);
|
|
644
717
|
return new _Image({ type: "url", url }, detected);
|
|
645
718
|
}
|
|
646
719
|
/**
|
|
647
|
-
*
|
|
720
|
+
* Creates an Image from raw byte data.
|
|
721
|
+
*
|
|
722
|
+
* @param data - The image data as a Uint8Array
|
|
723
|
+
* @param mimeType - The MIME type of the image
|
|
724
|
+
* @returns An Image containing the byte data
|
|
725
|
+
*
|
|
726
|
+
* @example
|
|
727
|
+
* ```typescript
|
|
728
|
+
* const image = Image.fromBytes(pngData, 'image/png');
|
|
729
|
+
* ```
|
|
648
730
|
*/
|
|
649
731
|
static fromBytes(data, mimeType) {
|
|
650
732
|
return new _Image({ type: "bytes", data }, mimeType);
|
|
651
733
|
}
|
|
652
734
|
/**
|
|
653
|
-
*
|
|
735
|
+
* Creates an Image from a base64-encoded string.
|
|
736
|
+
*
|
|
737
|
+
* @param base64 - The base64-encoded image data (without data URL prefix)
|
|
738
|
+
* @param mimeType - The MIME type of the image
|
|
739
|
+
* @returns An Image containing the base64 data
|
|
740
|
+
*
|
|
741
|
+
* @example
|
|
742
|
+
* ```typescript
|
|
743
|
+
* const image = Image.fromBase64(base64String, 'image/jpeg');
|
|
744
|
+
* ```
|
|
654
745
|
*/
|
|
655
746
|
static fromBase64(base64, mimeType) {
|
|
656
747
|
return new _Image({ type: "base64", data: base64 }, mimeType);
|
|
657
748
|
}
|
|
658
749
|
/**
|
|
659
|
-
*
|
|
750
|
+
* Creates an Image from an existing ImageBlock.
|
|
751
|
+
*
|
|
752
|
+
* Useful for converting content blocks received from providers back
|
|
753
|
+
* into Image instances for further processing.
|
|
754
|
+
*
|
|
755
|
+
* @param block - An ImageBlock from message content
|
|
756
|
+
* @returns An Image with the block's source and metadata
|
|
660
757
|
*/
|
|
661
758
|
static fromBlock(block) {
|
|
662
759
|
return new _Image(
|
|
@@ -729,7 +826,9 @@ var Thread = class _Thread {
|
|
|
729
826
|
/** Last update timestamp */
|
|
730
827
|
_updatedAt;
|
|
731
828
|
/**
|
|
732
|
-
*
|
|
829
|
+
* Creates a new thread instance.
|
|
830
|
+
*
|
|
831
|
+
* @param messages - Optional initial messages to populate the thread
|
|
733
832
|
*/
|
|
734
833
|
constructor(messages) {
|
|
735
834
|
this.id = generateId();
|
|
@@ -737,16 +836,23 @@ var Thread = class _Thread {
|
|
|
737
836
|
this._createdAt = /* @__PURE__ */ new Date();
|
|
738
837
|
this._updatedAt = /* @__PURE__ */ new Date();
|
|
739
838
|
}
|
|
740
|
-
/**
|
|
839
|
+
/**
|
|
840
|
+
* All messages in the thread (readonly).
|
|
841
|
+
*/
|
|
741
842
|
get messages() {
|
|
742
843
|
return this._messages;
|
|
743
844
|
}
|
|
744
|
-
/**
|
|
845
|
+
/**
|
|
846
|
+
* Number of messages in the thread.
|
|
847
|
+
*/
|
|
745
848
|
get length() {
|
|
746
849
|
return this._messages.length;
|
|
747
850
|
}
|
|
748
851
|
/**
|
|
749
|
-
*
|
|
852
|
+
* Appends all messages from a Turn to the thread.
|
|
853
|
+
*
|
|
854
|
+
* @param turn - The Turn containing messages to append
|
|
855
|
+
* @returns This thread instance for chaining
|
|
750
856
|
*/
|
|
751
857
|
append(turn) {
|
|
752
858
|
this._messages.push(...turn.messages);
|
|
@@ -754,7 +860,10 @@ var Thread = class _Thread {
|
|
|
754
860
|
return this;
|
|
755
861
|
}
|
|
756
862
|
/**
|
|
757
|
-
*
|
|
863
|
+
* Adds raw messages to the thread.
|
|
864
|
+
*
|
|
865
|
+
* @param messages - Messages to add
|
|
866
|
+
* @returns This thread instance for chaining
|
|
758
867
|
*/
|
|
759
868
|
push(...messages) {
|
|
760
869
|
this._messages.push(...messages);
|
|
@@ -762,7 +871,19 @@ var Thread = class _Thread {
|
|
|
762
871
|
return this;
|
|
763
872
|
}
|
|
764
873
|
/**
|
|
765
|
-
*
|
|
874
|
+
* Adds a user message to the thread.
|
|
875
|
+
*
|
|
876
|
+
* @param content - String or array of content blocks
|
|
877
|
+
* @returns This thread instance for chaining
|
|
878
|
+
*
|
|
879
|
+
* @example
|
|
880
|
+
* ```typescript
|
|
881
|
+
* thread.user('Hello, world!');
|
|
882
|
+
* thread.user([
|
|
883
|
+
* { type: 'text', text: 'Describe this image:' },
|
|
884
|
+
* { type: 'image', source: { type: 'url', url: '...' }, mimeType: 'image/png' }
|
|
885
|
+
* ]);
|
|
886
|
+
* ```
|
|
766
887
|
*/
|
|
767
888
|
user(content) {
|
|
768
889
|
this._messages.push(new UserMessage(content));
|
|
@@ -770,7 +891,15 @@ var Thread = class _Thread {
|
|
|
770
891
|
return this;
|
|
771
892
|
}
|
|
772
893
|
/**
|
|
773
|
-
*
|
|
894
|
+
* Adds an assistant message to the thread.
|
|
895
|
+
*
|
|
896
|
+
* @param content - String or array of content blocks
|
|
897
|
+
* @returns This thread instance for chaining
|
|
898
|
+
*
|
|
899
|
+
* @example
|
|
900
|
+
* ```typescript
|
|
901
|
+
* thread.assistant('I can help with that!');
|
|
902
|
+
* ```
|
|
774
903
|
*/
|
|
775
904
|
assistant(content) {
|
|
776
905
|
this._messages.push(new AssistantMessage(content));
|
|
@@ -778,25 +907,53 @@ var Thread = class _Thread {
|
|
|
778
907
|
return this;
|
|
779
908
|
}
|
|
780
909
|
/**
|
|
781
|
-
*
|
|
910
|
+
* Filters messages by type.
|
|
911
|
+
*
|
|
912
|
+
* @param type - The message type to filter by
|
|
913
|
+
* @returns Array of messages matching the type
|
|
914
|
+
*
|
|
915
|
+
* @example
|
|
916
|
+
* ```typescript
|
|
917
|
+
* const userMessages = thread.filter('user');
|
|
918
|
+
* const assistantMessages = thread.filter('assistant');
|
|
919
|
+
* ```
|
|
782
920
|
*/
|
|
783
921
|
filter(type) {
|
|
784
922
|
return this._messages.filter((m) => m.type === type);
|
|
785
923
|
}
|
|
786
924
|
/**
|
|
787
|
-
*
|
|
925
|
+
* Returns the last N messages from the thread.
|
|
926
|
+
*
|
|
927
|
+
* @param count - Number of messages to return
|
|
928
|
+
* @returns Array of the last N messages
|
|
929
|
+
*
|
|
930
|
+
* @example
|
|
931
|
+
* ```typescript
|
|
932
|
+
* const recent = thread.tail(5);
|
|
933
|
+
* ```
|
|
788
934
|
*/
|
|
789
935
|
tail(count) {
|
|
790
936
|
return this._messages.slice(-count);
|
|
791
937
|
}
|
|
792
938
|
/**
|
|
793
|
-
*
|
|
939
|
+
* Creates a new thread with a subset of messages.
|
|
940
|
+
*
|
|
941
|
+
* @param start - Start index (inclusive)
|
|
942
|
+
* @param end - End index (exclusive)
|
|
943
|
+
* @returns New Thread containing the sliced messages
|
|
944
|
+
*
|
|
945
|
+
* @example
|
|
946
|
+
* ```typescript
|
|
947
|
+
* const subset = thread.slice(0, 10);
|
|
948
|
+
* ```
|
|
794
949
|
*/
|
|
795
950
|
slice(start, end) {
|
|
796
951
|
return new _Thread(this._messages.slice(start, end));
|
|
797
952
|
}
|
|
798
953
|
/**
|
|
799
|
-
*
|
|
954
|
+
* Removes all messages from the thread.
|
|
955
|
+
*
|
|
956
|
+
* @returns This thread instance for chaining
|
|
800
957
|
*/
|
|
801
958
|
clear() {
|
|
802
959
|
this._messages = [];
|
|
@@ -804,13 +961,23 @@ var Thread = class _Thread {
|
|
|
804
961
|
return this;
|
|
805
962
|
}
|
|
806
963
|
/**
|
|
807
|
-
*
|
|
964
|
+
* Converts the thread to a plain message array.
|
|
965
|
+
*
|
|
966
|
+
* @returns Copy of the internal message array
|
|
808
967
|
*/
|
|
809
968
|
toMessages() {
|
|
810
969
|
return [...this._messages];
|
|
811
970
|
}
|
|
812
971
|
/**
|
|
813
|
-
*
|
|
972
|
+
* Serializes the thread to JSON format.
|
|
973
|
+
*
|
|
974
|
+
* @returns JSON-serializable representation of the thread
|
|
975
|
+
*
|
|
976
|
+
* @example
|
|
977
|
+
* ```typescript
|
|
978
|
+
* const json = thread.toJSON();
|
|
979
|
+
* localStorage.setItem('thread', JSON.stringify(json));
|
|
980
|
+
* ```
|
|
814
981
|
*/
|
|
815
982
|
toJSON() {
|
|
816
983
|
return {
|
|
@@ -821,7 +988,16 @@ var Thread = class _Thread {
|
|
|
821
988
|
};
|
|
822
989
|
}
|
|
823
990
|
/**
|
|
824
|
-
*
|
|
991
|
+
* Deserializes a thread from JSON format.
|
|
992
|
+
*
|
|
993
|
+
* @param json - The JSON representation to deserialize
|
|
994
|
+
* @returns Reconstructed Thread instance
|
|
995
|
+
*
|
|
996
|
+
* @example
|
|
997
|
+
* ```typescript
|
|
998
|
+
* const json = JSON.parse(localStorage.getItem('thread'));
|
|
999
|
+
* const thread = Thread.fromJSON(json);
|
|
1000
|
+
* ```
|
|
825
1001
|
*/
|
|
826
1002
|
static fromJSON(json) {
|
|
827
1003
|
const messages = json.messages.map((m) => _Thread.messageFromJSON(m));
|
|
@@ -832,13 +1008,22 @@ var Thread = class _Thread {
|
|
|
832
1008
|
return thread;
|
|
833
1009
|
}
|
|
834
1010
|
/**
|
|
835
|
-
*
|
|
1011
|
+
* Enables iteration over messages with for...of loops.
|
|
1012
|
+
*
|
|
1013
|
+
* @returns Iterator over the thread's messages
|
|
1014
|
+
*
|
|
1015
|
+
* @example
|
|
1016
|
+
* ```typescript
|
|
1017
|
+
* for (const message of thread) {
|
|
1018
|
+
* console.log(message.text);
|
|
1019
|
+
* }
|
|
1020
|
+
* ```
|
|
836
1021
|
*/
|
|
837
1022
|
[Symbol.iterator]() {
|
|
838
1023
|
return this._messages[Symbol.iterator]();
|
|
839
1024
|
}
|
|
840
1025
|
/**
|
|
841
|
-
*
|
|
1026
|
+
* Converts a message to JSON format.
|
|
842
1027
|
*/
|
|
843
1028
|
messageToJSON(m) {
|
|
844
1029
|
const base = {
|
|
@@ -859,7 +1044,7 @@ var Thread = class _Thread {
|
|
|
859
1044
|
return base;
|
|
860
1045
|
}
|
|
861
1046
|
/**
|
|
862
|
-
*
|
|
1047
|
+
* Reconstructs a message from JSON format.
|
|
863
1048
|
*/
|
|
864
1049
|
static messageFromJSON(json) {
|
|
865
1050
|
const options = {
|
|
@@ -885,9 +1070,8 @@ var Thread = class _Thread {
|
|
|
885
1070
|
|
|
886
1071
|
// src/index.ts
|
|
887
1072
|
var ai = {
|
|
1073
|
+
/** LLM instance factory */
|
|
888
1074
|
llm
|
|
889
|
-
// embedding, // Coming soon
|
|
890
|
-
// image, // Coming soon
|
|
891
1075
|
};
|
|
892
1076
|
export {
|
|
893
1077
|
AssistantMessage,
|