@mastra/client-js 1.56.0-alpha.1 → 1.56.0-alpha.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/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/index.cjs +583 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +577 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/agent.d.ts +2 -2
- package/dist/resources/agent.d.ts.map +1 -1
- package/dist/route-types.generated.d.ts +33 -0
- package/dist/route-types.generated.d.ts.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/ai-sdk-v4/data-stream-parts.d.ts +89 -0
- package/dist/utils/ai-sdk-v4/data-stream-parts.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/fix-json.d.ts +2 -0
- package/dist/utils/ai-sdk-v4/fix-json.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/index.d.ts +5 -0
- package/dist/utils/ai-sdk-v4/index.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/parse-partial-json.d.ts +6 -0
- package/dist/utils/ai-sdk-v4/parse-partial-json.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/process-data-stream.d.ts +53 -0
- package/dist/utils/ai-sdk-v4/process-data-stream.d.ts.map +1 -0
- package/dist/utils/ai-sdk-v4/types.d.ts +93 -0
- package/dist/utils/ai-sdk-v4/types.d.ts.map +1 -0
- package/package.json +4 -5
- package/dist/_types/@ai-sdk_provider/dist/index.d.ts +0 -1587
- package/dist/_types/@ai-sdk_provider/package.json +0 -1
- package/dist/_types/@ai-sdk_provider-utils/dist/index.d.ts +0 -379
- package/dist/_types/@ai-sdk_provider-utils/package.json +0 -1
- package/dist/_types/@ai-sdk_ui-utils/dist/index.d.ts +0 -820
- package/dist/_types/@ai-sdk_ui-utils/package.json +0 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { parsePartialJson, processDataStream } from "@ai-sdk/ui-utils";
|
|
2
1
|
import { v4 } from "@lukeed/uuid";
|
|
3
2
|
import { getErrorFromUnknown } from "@mastra/core/error";
|
|
4
3
|
import { standardSchemaToJSONSchema, toStandardSchema } from "@mastra/schema-compat/schema";
|
|
@@ -386,6 +385,583 @@ function isTerminalReconnectError(error) {
|
|
|
386
385
|
return isTerminalHttpError(error) && status !== 408 && status !== 429;
|
|
387
386
|
}
|
|
388
387
|
//#endregion
|
|
388
|
+
//#region src/utils/ai-sdk-v4/data-stream-parts.ts
|
|
389
|
+
const dataStreamParts = [
|
|
390
|
+
{
|
|
391
|
+
code: "0",
|
|
392
|
+
name: "text",
|
|
393
|
+
parse: (value) => {
|
|
394
|
+
if (typeof value !== "string") throw new Error("\"text\" parts expect a string value.");
|
|
395
|
+
return {
|
|
396
|
+
type: "text",
|
|
397
|
+
value
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
code: "2",
|
|
403
|
+
name: "data",
|
|
404
|
+
parse: (value) => {
|
|
405
|
+
if (!Array.isArray(value)) throw new Error("\"data\" parts expect an array value.");
|
|
406
|
+
return {
|
|
407
|
+
type: "data",
|
|
408
|
+
value
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
code: "3",
|
|
414
|
+
name: "error",
|
|
415
|
+
parse: (value) => {
|
|
416
|
+
if (typeof value !== "string") throw new Error("\"error\" parts expect a string value.");
|
|
417
|
+
return {
|
|
418
|
+
type: "error",
|
|
419
|
+
value
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
code: "8",
|
|
425
|
+
name: "message_annotations",
|
|
426
|
+
parse: (value) => {
|
|
427
|
+
if (!Array.isArray(value)) throw new Error("\"message_annotations\" parts expect an array value.");
|
|
428
|
+
return {
|
|
429
|
+
type: "message_annotations",
|
|
430
|
+
value
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
code: "9",
|
|
436
|
+
name: "tool_call",
|
|
437
|
+
parse: (value) => {
|
|
438
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("toolName" in value) || typeof value.toolName !== "string" || !("args" in value) || typeof value.args !== "object") throw new Error("\"tool_call\" parts expect an object with a \"toolCallId\", \"toolName\", and \"args\" property.");
|
|
439
|
+
return {
|
|
440
|
+
type: "tool_call",
|
|
441
|
+
value
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
code: "a",
|
|
447
|
+
name: "tool_result",
|
|
448
|
+
parse: (value) => {
|
|
449
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("result" in value)) throw new Error("\"tool_result\" parts expect an object with a \"toolCallId\" and a \"result\" property.");
|
|
450
|
+
return {
|
|
451
|
+
type: "tool_result",
|
|
452
|
+
value
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
code: "b",
|
|
458
|
+
name: "tool_call_streaming_start",
|
|
459
|
+
parse: (value) => {
|
|
460
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("toolName" in value) || typeof value.toolName !== "string") throw new Error("\"tool_call_streaming_start\" parts expect an object with a \"toolCallId\" and \"toolName\" property.");
|
|
461
|
+
return {
|
|
462
|
+
type: "tool_call_streaming_start",
|
|
463
|
+
value
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
code: "c",
|
|
469
|
+
name: "tool_call_delta",
|
|
470
|
+
parse: (value) => {
|
|
471
|
+
if (value == null || typeof value !== "object" || !("toolCallId" in value) || typeof value.toolCallId !== "string" || !("argsTextDelta" in value) || typeof value.argsTextDelta !== "string") throw new Error("\"tool_call_delta\" parts expect an object with a \"toolCallId\" and \"argsTextDelta\" property.");
|
|
472
|
+
return {
|
|
473
|
+
type: "tool_call_delta",
|
|
474
|
+
value
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
code: "d",
|
|
480
|
+
name: "finish_message",
|
|
481
|
+
parse: (value) => {
|
|
482
|
+
if (value == null || typeof value !== "object" || !("finishReason" in value) || typeof value.finishReason !== "string") throw new Error("\"finish_message\" parts expect an object with a \"finishReason\" property.");
|
|
483
|
+
const result = { finishReason: value.finishReason };
|
|
484
|
+
if ("usage" in value && value.usage != null && typeof value.usage === "object" && "promptTokens" in value.usage && "completionTokens" in value.usage) result.usage = {
|
|
485
|
+
promptTokens: typeof value.usage.promptTokens === "number" ? value.usage.promptTokens : NaN,
|
|
486
|
+
completionTokens: typeof value.usage.completionTokens === "number" ? value.usage.completionTokens : NaN
|
|
487
|
+
};
|
|
488
|
+
return {
|
|
489
|
+
type: "finish_message",
|
|
490
|
+
value: result
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
code: "e",
|
|
496
|
+
name: "finish_step",
|
|
497
|
+
parse: (value) => {
|
|
498
|
+
if (value == null || typeof value !== "object" || !("finishReason" in value) || typeof value.finishReason !== "string") throw new Error("\"finish_step\" parts expect an object with a \"finishReason\" property.");
|
|
499
|
+
const result = {
|
|
500
|
+
finishReason: value.finishReason,
|
|
501
|
+
isContinued: false
|
|
502
|
+
};
|
|
503
|
+
if ("usage" in value && value.usage != null && typeof value.usage === "object" && "promptTokens" in value.usage && "completionTokens" in value.usage) result.usage = {
|
|
504
|
+
promptTokens: typeof value.usage.promptTokens === "number" ? value.usage.promptTokens : NaN,
|
|
505
|
+
completionTokens: typeof value.usage.completionTokens === "number" ? value.usage.completionTokens : NaN
|
|
506
|
+
};
|
|
507
|
+
if ("isContinued" in value && typeof value.isContinued === "boolean") result.isContinued = value.isContinued;
|
|
508
|
+
return {
|
|
509
|
+
type: "finish_step",
|
|
510
|
+
value: result
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
code: "f",
|
|
516
|
+
name: "start_step",
|
|
517
|
+
parse: (value) => {
|
|
518
|
+
if (value == null || typeof value !== "object" || !("messageId" in value) || typeof value.messageId !== "string") throw new Error("\"start_step\" parts expect an object with an \"id\" property.");
|
|
519
|
+
return {
|
|
520
|
+
type: "start_step",
|
|
521
|
+
value: { messageId: value.messageId }
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
code: "g",
|
|
527
|
+
name: "reasoning",
|
|
528
|
+
parse: (value) => {
|
|
529
|
+
if (typeof value !== "string") throw new Error("\"reasoning\" parts expect a string value.");
|
|
530
|
+
return {
|
|
531
|
+
type: "reasoning",
|
|
532
|
+
value
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
code: "h",
|
|
538
|
+
name: "source",
|
|
539
|
+
parse: (value) => {
|
|
540
|
+
if (value == null || typeof value !== "object") throw new Error("\"source\" parts expect a Source object.");
|
|
541
|
+
return {
|
|
542
|
+
type: "source",
|
|
543
|
+
value
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
code: "i",
|
|
549
|
+
name: "redacted_reasoning",
|
|
550
|
+
parse: (value) => {
|
|
551
|
+
if (value == null || typeof value !== "object" || !("data" in value) || typeof value.data !== "string") throw new Error("\"redacted_reasoning\" parts expect an object with a \"data\" property.");
|
|
552
|
+
return {
|
|
553
|
+
type: "redacted_reasoning",
|
|
554
|
+
value: { data: value.data }
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
code: "j",
|
|
560
|
+
name: "reasoning_signature",
|
|
561
|
+
parse: (value) => {
|
|
562
|
+
if (value == null || typeof value !== "object" || !("signature" in value) || typeof value.signature !== "string") throw new Error("\"reasoning_signature\" parts expect an object with a \"signature\" property.");
|
|
563
|
+
return {
|
|
564
|
+
type: "reasoning_signature",
|
|
565
|
+
value: { signature: value.signature }
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
code: "k",
|
|
571
|
+
name: "file",
|
|
572
|
+
parse: (value) => {
|
|
573
|
+
if (value == null || typeof value !== "object" || !("data" in value) || typeof value.data !== "string" || !("mimeType" in value) || typeof value.mimeType !== "string") throw new Error("\"file\" parts expect an object with a \"data\" and \"mimeType\" property.");
|
|
574
|
+
return {
|
|
575
|
+
type: "file",
|
|
576
|
+
value
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
];
|
|
581
|
+
const dataStreamPartsByCode = Object.fromEntries(dataStreamParts.map((part) => [part.code, part]));
|
|
582
|
+
Object.fromEntries(dataStreamParts.map((part) => [part.name, part.code]));
|
|
583
|
+
const validCodes = dataStreamParts.map((part) => part.code);
|
|
584
|
+
/**
|
|
585
|
+
Parses a stream part from a string.
|
|
586
|
+
|
|
587
|
+
@param line The string to parse.
|
|
588
|
+
@returns The parsed stream part.
|
|
589
|
+
@throws An error if the string cannot be parsed.
|
|
590
|
+
*/
|
|
591
|
+
const parseDataStreamPart = (line) => {
|
|
592
|
+
const firstSeparatorIndex = line.indexOf(":");
|
|
593
|
+
if (firstSeparatorIndex === -1) throw new Error("Failed to parse stream string. No separator found.");
|
|
594
|
+
const prefix = line.slice(0, firstSeparatorIndex);
|
|
595
|
+
if (!validCodes.includes(prefix)) throw new Error(`Failed to parse stream string. Invalid code ${prefix}.`);
|
|
596
|
+
const code = prefix;
|
|
597
|
+
const textValue = line.slice(firstSeparatorIndex + 1);
|
|
598
|
+
const jsonValue = JSON.parse(textValue);
|
|
599
|
+
return dataStreamPartsByCode[code].parse(jsonValue);
|
|
600
|
+
};
|
|
601
|
+
//#endregion
|
|
602
|
+
//#region src/utils/ai-sdk-v4/fix-json.ts
|
|
603
|
+
function fixJson(input) {
|
|
604
|
+
const stack = ["ROOT"];
|
|
605
|
+
let lastValidIndex = -1;
|
|
606
|
+
let literalStart = null;
|
|
607
|
+
function processValueStart(char, i, swapState) {
|
|
608
|
+
switch (char) {
|
|
609
|
+
case "\"":
|
|
610
|
+
lastValidIndex = i;
|
|
611
|
+
stack.pop();
|
|
612
|
+
stack.push(swapState);
|
|
613
|
+
stack.push("INSIDE_STRING");
|
|
614
|
+
break;
|
|
615
|
+
case "f":
|
|
616
|
+
case "t":
|
|
617
|
+
case "n":
|
|
618
|
+
lastValidIndex = i;
|
|
619
|
+
literalStart = i;
|
|
620
|
+
stack.pop();
|
|
621
|
+
stack.push(swapState);
|
|
622
|
+
stack.push("INSIDE_LITERAL");
|
|
623
|
+
break;
|
|
624
|
+
case "-":
|
|
625
|
+
stack.pop();
|
|
626
|
+
stack.push(swapState);
|
|
627
|
+
stack.push("INSIDE_NUMBER");
|
|
628
|
+
break;
|
|
629
|
+
case "0":
|
|
630
|
+
case "1":
|
|
631
|
+
case "2":
|
|
632
|
+
case "3":
|
|
633
|
+
case "4":
|
|
634
|
+
case "5":
|
|
635
|
+
case "6":
|
|
636
|
+
case "7":
|
|
637
|
+
case "8":
|
|
638
|
+
case "9":
|
|
639
|
+
lastValidIndex = i;
|
|
640
|
+
stack.pop();
|
|
641
|
+
stack.push(swapState);
|
|
642
|
+
stack.push("INSIDE_NUMBER");
|
|
643
|
+
break;
|
|
644
|
+
case "{":
|
|
645
|
+
lastValidIndex = i;
|
|
646
|
+
stack.pop();
|
|
647
|
+
stack.push(swapState);
|
|
648
|
+
stack.push("INSIDE_OBJECT_START");
|
|
649
|
+
break;
|
|
650
|
+
case "[":
|
|
651
|
+
lastValidIndex = i;
|
|
652
|
+
stack.pop();
|
|
653
|
+
stack.push(swapState);
|
|
654
|
+
stack.push("INSIDE_ARRAY_START");
|
|
655
|
+
break;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
function processAfterObjectValue(char, i) {
|
|
659
|
+
switch (char) {
|
|
660
|
+
case ",":
|
|
661
|
+
stack.pop();
|
|
662
|
+
stack.push("INSIDE_OBJECT_AFTER_COMMA");
|
|
663
|
+
break;
|
|
664
|
+
case "}":
|
|
665
|
+
lastValidIndex = i;
|
|
666
|
+
stack.pop();
|
|
667
|
+
break;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
function processAfterArrayValue(char, i) {
|
|
671
|
+
switch (char) {
|
|
672
|
+
case ",":
|
|
673
|
+
stack.pop();
|
|
674
|
+
stack.push("INSIDE_ARRAY_AFTER_COMMA");
|
|
675
|
+
break;
|
|
676
|
+
case "]":
|
|
677
|
+
lastValidIndex = i;
|
|
678
|
+
stack.pop();
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
for (let i = 0; i < input.length; i++) {
|
|
683
|
+
const char = input[i];
|
|
684
|
+
switch (stack[stack.length - 1]) {
|
|
685
|
+
case "ROOT":
|
|
686
|
+
processValueStart(char, i, "FINISH");
|
|
687
|
+
break;
|
|
688
|
+
case "INSIDE_OBJECT_START":
|
|
689
|
+
switch (char) {
|
|
690
|
+
case "\"":
|
|
691
|
+
stack.pop();
|
|
692
|
+
stack.push("INSIDE_OBJECT_KEY");
|
|
693
|
+
break;
|
|
694
|
+
case "}":
|
|
695
|
+
lastValidIndex = i;
|
|
696
|
+
stack.pop();
|
|
697
|
+
break;
|
|
698
|
+
}
|
|
699
|
+
break;
|
|
700
|
+
case "INSIDE_OBJECT_AFTER_COMMA":
|
|
701
|
+
switch (char) {
|
|
702
|
+
case "\"":
|
|
703
|
+
stack.pop();
|
|
704
|
+
stack.push("INSIDE_OBJECT_KEY");
|
|
705
|
+
break;
|
|
706
|
+
}
|
|
707
|
+
break;
|
|
708
|
+
case "INSIDE_OBJECT_KEY":
|
|
709
|
+
switch (char) {
|
|
710
|
+
case "\"":
|
|
711
|
+
stack.pop();
|
|
712
|
+
stack.push("INSIDE_OBJECT_AFTER_KEY");
|
|
713
|
+
break;
|
|
714
|
+
}
|
|
715
|
+
break;
|
|
716
|
+
case "INSIDE_OBJECT_AFTER_KEY":
|
|
717
|
+
switch (char) {
|
|
718
|
+
case ":":
|
|
719
|
+
stack.pop();
|
|
720
|
+
stack.push("INSIDE_OBJECT_BEFORE_VALUE");
|
|
721
|
+
break;
|
|
722
|
+
}
|
|
723
|
+
break;
|
|
724
|
+
case "INSIDE_OBJECT_BEFORE_VALUE":
|
|
725
|
+
processValueStart(char, i, "INSIDE_OBJECT_AFTER_VALUE");
|
|
726
|
+
break;
|
|
727
|
+
case "INSIDE_OBJECT_AFTER_VALUE":
|
|
728
|
+
processAfterObjectValue(char, i);
|
|
729
|
+
break;
|
|
730
|
+
case "INSIDE_STRING":
|
|
731
|
+
switch (char) {
|
|
732
|
+
case "\"":
|
|
733
|
+
stack.pop();
|
|
734
|
+
lastValidIndex = i;
|
|
735
|
+
break;
|
|
736
|
+
case "\\":
|
|
737
|
+
stack.push("INSIDE_STRING_ESCAPE");
|
|
738
|
+
break;
|
|
739
|
+
default: lastValidIndex = i;
|
|
740
|
+
}
|
|
741
|
+
break;
|
|
742
|
+
case "INSIDE_ARRAY_START":
|
|
743
|
+
switch (char) {
|
|
744
|
+
case "]":
|
|
745
|
+
lastValidIndex = i;
|
|
746
|
+
stack.pop();
|
|
747
|
+
break;
|
|
748
|
+
default:
|
|
749
|
+
lastValidIndex = i;
|
|
750
|
+
processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
|
|
751
|
+
break;
|
|
752
|
+
}
|
|
753
|
+
break;
|
|
754
|
+
case "INSIDE_ARRAY_AFTER_VALUE":
|
|
755
|
+
switch (char) {
|
|
756
|
+
case ",":
|
|
757
|
+
stack.pop();
|
|
758
|
+
stack.push("INSIDE_ARRAY_AFTER_COMMA");
|
|
759
|
+
break;
|
|
760
|
+
case "]":
|
|
761
|
+
lastValidIndex = i;
|
|
762
|
+
stack.pop();
|
|
763
|
+
break;
|
|
764
|
+
default:
|
|
765
|
+
lastValidIndex = i;
|
|
766
|
+
break;
|
|
767
|
+
}
|
|
768
|
+
break;
|
|
769
|
+
case "INSIDE_ARRAY_AFTER_COMMA":
|
|
770
|
+
processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
|
|
771
|
+
break;
|
|
772
|
+
case "INSIDE_STRING_ESCAPE":
|
|
773
|
+
stack.pop();
|
|
774
|
+
lastValidIndex = i;
|
|
775
|
+
break;
|
|
776
|
+
case "INSIDE_NUMBER":
|
|
777
|
+
switch (char) {
|
|
778
|
+
case "0":
|
|
779
|
+
case "1":
|
|
780
|
+
case "2":
|
|
781
|
+
case "3":
|
|
782
|
+
case "4":
|
|
783
|
+
case "5":
|
|
784
|
+
case "6":
|
|
785
|
+
case "7":
|
|
786
|
+
case "8":
|
|
787
|
+
case "9":
|
|
788
|
+
lastValidIndex = i;
|
|
789
|
+
break;
|
|
790
|
+
case "e":
|
|
791
|
+
case "E":
|
|
792
|
+
case "-":
|
|
793
|
+
case ".": break;
|
|
794
|
+
case ",":
|
|
795
|
+
stack.pop();
|
|
796
|
+
if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
|
|
797
|
+
if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
|
|
798
|
+
break;
|
|
799
|
+
case "}":
|
|
800
|
+
stack.pop();
|
|
801
|
+
if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
|
|
802
|
+
break;
|
|
803
|
+
case "]":
|
|
804
|
+
stack.pop();
|
|
805
|
+
if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
|
|
806
|
+
break;
|
|
807
|
+
default:
|
|
808
|
+
stack.pop();
|
|
809
|
+
break;
|
|
810
|
+
}
|
|
811
|
+
break;
|
|
812
|
+
case "INSIDE_LITERAL": {
|
|
813
|
+
const partialLiteral = input.substring(literalStart, i + 1);
|
|
814
|
+
if (!"false".startsWith(partialLiteral) && !"true".startsWith(partialLiteral) && !"null".startsWith(partialLiteral)) {
|
|
815
|
+
stack.pop();
|
|
816
|
+
if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") processAfterObjectValue(char, i);
|
|
817
|
+
else if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") processAfterArrayValue(char, i);
|
|
818
|
+
} else lastValidIndex = i;
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
let result = input.slice(0, lastValidIndex + 1);
|
|
824
|
+
for (let i = stack.length - 1; i >= 0; i--) switch (stack[i]) {
|
|
825
|
+
case "INSIDE_STRING":
|
|
826
|
+
result += "\"";
|
|
827
|
+
break;
|
|
828
|
+
case "INSIDE_OBJECT_KEY":
|
|
829
|
+
case "INSIDE_OBJECT_AFTER_KEY":
|
|
830
|
+
case "INSIDE_OBJECT_AFTER_COMMA":
|
|
831
|
+
case "INSIDE_OBJECT_START":
|
|
832
|
+
case "INSIDE_OBJECT_BEFORE_VALUE":
|
|
833
|
+
case "INSIDE_OBJECT_AFTER_VALUE":
|
|
834
|
+
result += "}";
|
|
835
|
+
break;
|
|
836
|
+
case "INSIDE_ARRAY_START":
|
|
837
|
+
case "INSIDE_ARRAY_AFTER_COMMA":
|
|
838
|
+
case "INSIDE_ARRAY_AFTER_VALUE":
|
|
839
|
+
result += "]";
|
|
840
|
+
break;
|
|
841
|
+
case "INSIDE_LITERAL": {
|
|
842
|
+
const partialLiteral = input.substring(literalStart, input.length);
|
|
843
|
+
if ("true".startsWith(partialLiteral)) result += "true".slice(partialLiteral.length);
|
|
844
|
+
else if ("false".startsWith(partialLiteral)) result += "false".slice(partialLiteral.length);
|
|
845
|
+
else if ("null".startsWith(partialLiteral)) result += "null".slice(partialLiteral.length);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
return result;
|
|
849
|
+
}
|
|
850
|
+
//#endregion
|
|
851
|
+
//#region src/utils/ai-sdk-v4/parse-partial-json.ts
|
|
852
|
+
function tryParse(text) {
|
|
853
|
+
try {
|
|
854
|
+
return {
|
|
855
|
+
success: true,
|
|
856
|
+
value: JSON.parse(text)
|
|
857
|
+
};
|
|
858
|
+
} catch {
|
|
859
|
+
return { success: false };
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
function parsePartialJson(jsonText) {
|
|
863
|
+
if (jsonText === void 0) return {
|
|
864
|
+
value: void 0,
|
|
865
|
+
state: "undefined-input"
|
|
866
|
+
};
|
|
867
|
+
let result = tryParse(jsonText);
|
|
868
|
+
if (result.success) return {
|
|
869
|
+
value: result.value,
|
|
870
|
+
state: "successful-parse"
|
|
871
|
+
};
|
|
872
|
+
result = tryParse(fixJson(jsonText));
|
|
873
|
+
if (result.success) return {
|
|
874
|
+
value: result.value,
|
|
875
|
+
state: "repaired-parse"
|
|
876
|
+
};
|
|
877
|
+
return {
|
|
878
|
+
value: void 0,
|
|
879
|
+
state: "failed-parse"
|
|
880
|
+
};
|
|
881
|
+
}
|
|
882
|
+
//#endregion
|
|
883
|
+
//#region src/utils/ai-sdk-v4/process-data-stream.ts
|
|
884
|
+
const NEWLINE = "\n".charCodeAt(0);
|
|
885
|
+
function concatChunks(chunks, totalLength) {
|
|
886
|
+
const concatenatedChunks = new Uint8Array(totalLength);
|
|
887
|
+
let offset = 0;
|
|
888
|
+
for (const chunk of chunks) {
|
|
889
|
+
concatenatedChunks.set(chunk, offset);
|
|
890
|
+
offset += chunk.length;
|
|
891
|
+
}
|
|
892
|
+
chunks.length = 0;
|
|
893
|
+
return concatenatedChunks;
|
|
894
|
+
}
|
|
895
|
+
async function processDataStream({ stream, onTextPart, onReasoningPart, onReasoningSignaturePart, onRedactedReasoningPart, onSourcePart, onFilePart, onDataPart, onErrorPart, onToolCallStreamingStartPart, onToolCallDeltaPart, onToolCallPart, onToolResultPart, onMessageAnnotationsPart, onFinishMessagePart, onFinishStepPart, onStartStepPart }) {
|
|
896
|
+
const reader = stream.getReader();
|
|
897
|
+
const decoder = new TextDecoder();
|
|
898
|
+
const chunks = [];
|
|
899
|
+
let totalLength = 0;
|
|
900
|
+
while (true) {
|
|
901
|
+
const { value } = await reader.read();
|
|
902
|
+
if (value) {
|
|
903
|
+
chunks.push(value);
|
|
904
|
+
totalLength += value.length;
|
|
905
|
+
if (value[value.length - 1] !== NEWLINE) continue;
|
|
906
|
+
}
|
|
907
|
+
if (chunks.length === 0) break;
|
|
908
|
+
const concatenatedChunks = concatChunks(chunks, totalLength);
|
|
909
|
+
totalLength = 0;
|
|
910
|
+
const streamParts = decoder.decode(concatenatedChunks, { stream: true }).split("\n").filter((line) => line !== "").map(parseDataStreamPart);
|
|
911
|
+
for (const { type, value } of streamParts) switch (type) {
|
|
912
|
+
case "text":
|
|
913
|
+
await onTextPart?.(value);
|
|
914
|
+
break;
|
|
915
|
+
case "reasoning":
|
|
916
|
+
await onReasoningPart?.(value);
|
|
917
|
+
break;
|
|
918
|
+
case "reasoning_signature":
|
|
919
|
+
await onReasoningSignaturePart?.(value);
|
|
920
|
+
break;
|
|
921
|
+
case "redacted_reasoning":
|
|
922
|
+
await onRedactedReasoningPart?.(value);
|
|
923
|
+
break;
|
|
924
|
+
case "file":
|
|
925
|
+
await onFilePart?.(value);
|
|
926
|
+
break;
|
|
927
|
+
case "source":
|
|
928
|
+
await onSourcePart?.(value);
|
|
929
|
+
break;
|
|
930
|
+
case "data":
|
|
931
|
+
await onDataPart?.(value);
|
|
932
|
+
break;
|
|
933
|
+
case "error":
|
|
934
|
+
await onErrorPart?.(value);
|
|
935
|
+
break;
|
|
936
|
+
case "message_annotations":
|
|
937
|
+
await onMessageAnnotationsPart?.(value);
|
|
938
|
+
break;
|
|
939
|
+
case "tool_call_streaming_start":
|
|
940
|
+
await onToolCallStreamingStartPart?.(value);
|
|
941
|
+
break;
|
|
942
|
+
case "tool_call_delta":
|
|
943
|
+
await onToolCallDeltaPart?.(value);
|
|
944
|
+
break;
|
|
945
|
+
case "tool_call":
|
|
946
|
+
await onToolCallPart?.(value);
|
|
947
|
+
break;
|
|
948
|
+
case "tool_result":
|
|
949
|
+
await onToolResultPart?.(value);
|
|
950
|
+
break;
|
|
951
|
+
case "finish_message":
|
|
952
|
+
await onFinishMessagePart?.(value);
|
|
953
|
+
break;
|
|
954
|
+
case "finish_step":
|
|
955
|
+
await onFinishStepPart?.(value);
|
|
956
|
+
break;
|
|
957
|
+
case "start_step":
|
|
958
|
+
await onStartStepPart?.(value);
|
|
959
|
+
break;
|
|
960
|
+
default: throw new Error(`Unknown stream part type: ${type}`);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
//#endregion
|
|
389
965
|
//#region src/utils/client-tool-model-output.ts
|
|
390
966
|
/**
|
|
391
967
|
* Normalize modelOutput from toModelOutput() to the AI SDK V2 tool result
|