@dxos/assistant 0.7.5-labs.e27f9b9 → 0.7.5-labs.f400bbc

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.
Files changed (56) hide show
  1. package/dist/lib/browser/index.mjs +91 -60
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/browser/testing/index.mjs +20 -20
  5. package/dist/lib/browser/testing/index.mjs.map +2 -2
  6. package/dist/lib/node/index.cjs +94 -63
  7. package/dist/lib/node/index.cjs.map +4 -4
  8. package/dist/lib/node/meta.json +1 -1
  9. package/dist/lib/node/testing/index.cjs +20 -20
  10. package/dist/lib/node/testing/index.cjs.map +2 -2
  11. package/dist/lib/node-esm/index.mjs +91 -60
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +20 -20
  15. package/dist/lib/node-esm/testing/index.mjs.map +2 -2
  16. package/dist/types/src/ai-service/client.d.ts +7 -14
  17. package/dist/types/src/ai-service/client.d.ts.map +1 -1
  18. package/dist/types/src/ai-service/defs.d.ts +3 -0
  19. package/dist/types/src/ai-service/defs.d.ts.map +1 -0
  20. package/dist/types/src/ai-service/index.d.ts +1 -0
  21. package/dist/types/src/ai-service/index.d.ts.map +1 -1
  22. package/dist/types/src/ai-service/parser.d.ts +3 -3
  23. package/dist/types/src/ai-service/parser.d.ts.map +1 -1
  24. package/dist/types/src/ai-service/stream.d.ts.map +1 -1
  25. package/dist/types/src/ai-service/testing/index.d.ts +3 -0
  26. package/dist/types/src/ai-service/testing/index.d.ts.map +1 -0
  27. package/dist/types/src/ai-service/testing/mock.d.ts +7 -0
  28. package/dist/types/src/ai-service/testing/mock.d.ts.map +1 -0
  29. package/dist/types/src/ai-service/{testing.d.ts → testing/test-stream.d.ts} +1 -1
  30. package/dist/types/src/ai-service/testing/test-stream.d.ts.map +1 -0
  31. package/dist/types/src/ai-service/transform.d.ts.map +1 -1
  32. package/dist/types/src/ai-service/types.d.ts +97 -14
  33. package/dist/types/src/ai-service/types.d.ts.map +1 -1
  34. package/dist/types/src/conversation/conversation.d.ts.map +1 -1
  35. package/dist/types/src/testing/defs.d.ts.map +1 -1
  36. package/package.json +14 -14
  37. package/src/ai-service/client.test.ts +9 -8
  38. package/src/ai-service/client.ts +16 -29
  39. package/src/ai-service/defs.ts +24 -0
  40. package/src/ai-service/index.ts +1 -0
  41. package/src/ai-service/parser.ts +21 -6
  42. package/src/ai-service/stream.ts +1 -1
  43. package/src/ai-service/testing/index.ts +6 -0
  44. package/src/ai-service/testing/mock.ts +17 -0
  45. package/src/ai-service/{testing.ts → testing/test-stream.ts} +1 -1
  46. package/src/ai-service/transform.ts +0 -1
  47. package/src/ai-service/types.ts +12 -16
  48. package/src/bin/chat.ts +4 -3
  49. package/src/conversation/conversation.test.ts +4 -4
  50. package/src/conversation/conversation.ts +1 -1
  51. package/src/testing/artifacts.test.ts +9 -9
  52. package/src/testing/defs.ts +1 -0
  53. package/src/testing/object-extraction.test.ts +1 -1
  54. package/src/testing/query-promts.ts +20 -20
  55. package/src/testing/query.test.ts +3 -3
  56. package/dist/types/src/ai-service/testing.d.ts.map +0 -1
@@ -13,6 +13,7 @@ import {
13
13
  import { Schema as S } from "@effect/schema";
14
14
  import { Message } from "@dxos/artifact";
15
15
  import { invariant } from "@dxos/invariant";
16
+ import { log as log2 } from "@dxos/log";
16
17
 
17
18
  // packages/experimental/assistant/src/ai-service/stream.ts
18
19
  import { Trigger } from "@dxos/async";
@@ -354,7 +355,7 @@ var AIServiceClientImpl = class {
354
355
  constructor({ endpoint }) {
355
356
  invariant(endpoint, "endpoint is required", {
356
357
  F: __dxlog_file2,
357
- L: 36,
358
+ L: 34,
358
359
  S: this,
359
360
  A: [
360
361
  "endpoint",
@@ -363,16 +364,6 @@ var AIServiceClientImpl = class {
363
364
  });
364
365
  this._endpoint = endpoint;
365
366
  }
366
- async getSpace(spaceId) {
367
- throw new Error("Not implemented");
368
- }
369
- async getThread(spaceId, threadId) {
370
- throw new Error("Not implemented");
371
- }
372
- async getMessages(spaceId, threadId) {
373
- const res = await fetch(`${this._endpoint}/space/${spaceId}/thread/${threadId}/message`);
374
- return S.decodePromise(S.Array(Message).pipe(S.mutable))((await res.json()).data.results);
375
- }
376
367
  async appendMessages(messages) {
377
368
  const url = `${this._endpoint}/message`;
378
369
  const res = await fetch(url, {
@@ -388,14 +379,22 @@ var AIServiceClientImpl = class {
388
379
  throw new Error(`${await res.text()} [${url}]`);
389
380
  }
390
381
  }
391
- // TODO(dmaretskyi): Accept partial message schema.
392
- async updateMessage(spaceId, threadId, messageId, message) {
393
- throw new Error("Not implemented");
394
- }
395
382
  /**
396
- * Open message stream.
383
+ * Process request and open message stream.
397
384
  */
398
- async generate(request) {
385
+ async exec(request) {
386
+ request = {
387
+ tools: request.tools ?? [],
388
+ ...request
389
+ };
390
+ log2.info("requesting", {
391
+ endpoint: this._endpoint
392
+ }, {
393
+ F: __dxlog_file2,
394
+ L: 63,
395
+ S: this,
396
+ C: (f, a) => f(...a)
397
+ });
399
398
  const controller = new AbortController();
400
399
  const response = await fetch(`${this._endpoint}/generate`, {
401
400
  signal: controller.signal,
@@ -407,7 +406,7 @@ var AIServiceClientImpl = class {
407
406
  });
408
407
  invariant(response.body instanceof ReadableStream, void 0, {
409
408
  F: __dxlog_file2,
410
- L: 85,
409
+ L: 72,
411
410
  S: this,
412
411
  A: [
413
412
  "response.body instanceof ReadableStream",
@@ -418,12 +417,29 @@ var AIServiceClientImpl = class {
418
417
  }
419
418
  };
420
419
 
420
+ // packages/experimental/assistant/src/ai-service/defs.ts
421
+ var DEFAULT_LLM_MODEL = "@anthropic/claude-3-5-sonnet-20241022";
422
+ var DEFAULT_LLM_MODELS = [
423
+ // AI Gateway.
424
+ // https://developers.cloudflare.com/ai-gateway
425
+ "@anthropic/claude-3-5-haiku-20241022",
426
+ "@anthropic/claude-3-5-sonnet-20241022",
427
+ "@anthropic/claude-3-7-sonnet-20250219",
428
+ // Workers AI.
429
+ // https://developers.cloudflare.com/workers-ai/models
430
+ "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b",
431
+ "@hf/nousresearch/hermes-2-pro-mistral-7b",
432
+ "@ollama/llama-3-1-nemotron-70b-instruct",
433
+ "@ollama/llama-3-1-nemotron-mini-4b-instruct",
434
+ "@ollama/llama-3-2-3b"
435
+ ];
436
+
421
437
  // packages/experimental/assistant/src/ai-service/parser.ts
422
438
  import { Message as Message2 } from "@dxos/artifact";
423
439
  import { Event } from "@dxos/async";
424
440
  import { createStatic } from "@dxos/echo-schema";
425
441
  import { invariant as invariant2 } from "@dxos/invariant";
426
- import { log as log2 } from "@dxos/log";
442
+ import { log as log3 } from "@dxos/log";
427
443
  import { isNotFalsy, safeParseJson } from "@dxos/util";
428
444
 
429
445
  // packages/experimental/assistant/src/ai-service/transform.ts
@@ -565,7 +581,8 @@ var MixedStreamParser = class {
565
581
  const transformer = new StreamTransform();
566
582
  let contentBlock;
567
583
  let streamBlock;
568
- let stack = [];
584
+ const stack = [];
585
+ const messagesCollected = [];
569
586
  for await (const event of stream) {
570
587
  switch (event.type) {
571
588
  //
@@ -573,9 +590,9 @@ var MixedStreamParser = class {
573
590
  //
574
591
  case "message_start": {
575
592
  if (this._message) {
576
- log2.warn("unexpected message_start", void 0, {
593
+ log3.warn("unexpected message_start", void 0, {
577
594
  F: __dxlog_file3,
578
- L: 86,
595
+ L: 88,
579
596
  S: this,
580
597
  C: (f, a) => f(...a)
581
598
  });
@@ -589,9 +606,9 @@ var MixedStreamParser = class {
589
606
  }
590
607
  case "message_delta": {
591
608
  if (!this._message) {
592
- log2.warn("unexpected message_delta", void 0, {
609
+ log3.warn("unexpected message_delta", void 0, {
593
610
  F: __dxlog_file3,
594
- L: 96,
611
+ L: 98,
595
612
  S: this,
596
613
  C: (f, a) => f(...a)
597
614
  });
@@ -600,13 +617,14 @@ var MixedStreamParser = class {
600
617
  }
601
618
  case "message_stop": {
602
619
  if (!this._message) {
603
- log2.warn("unexpected message_stop", void 0, {
620
+ log3.warn("unexpected message_stop", void 0, {
604
621
  F: __dxlog_file3,
605
- L: 104,
622
+ L: 106,
606
623
  S: this,
607
624
  C: (f, a) => f(...a)
608
625
  });
609
626
  } else {
627
+ messagesCollected.push(this._message);
610
628
  this._message = void 0;
611
629
  }
612
630
  break;
@@ -616,11 +634,11 @@ var MixedStreamParser = class {
616
634
  //
617
635
  case "content_block_start": {
618
636
  if (contentBlock) {
619
- log2.warn("unexpected content_block_start", {
637
+ log3.warn("unexpected content_block_start", {
620
638
  content: contentBlock
621
639
  }, {
622
640
  F: __dxlog_file3,
623
- L: 117,
641
+ L: 120,
624
642
  S: this,
625
643
  C: (f, a) => f(...a)
626
644
  });
@@ -630,9 +648,9 @@ var MixedStreamParser = class {
630
648
  }
631
649
  case "content_block_delta": {
632
650
  if (!contentBlock) {
633
- log2.warn("unexpected content_block_delta", void 0, {
651
+ log3.warn("unexpected content_block_delta", void 0, {
634
652
  F: __dxlog_file3,
635
- L: 127,
653
+ L: 130,
636
654
  S: this,
637
655
  C: (f, a) => f(...a)
638
656
  });
@@ -658,7 +676,7 @@ var MixedStreamParser = class {
658
676
  const top = stack.pop();
659
677
  invariant2(top && top.type === "tag", void 0, {
660
678
  F: __dxlog_file3,
661
- L: 151,
679
+ L: 154,
662
680
  S: this,
663
681
  A: [
664
682
  "top && top.type === 'tag'",
@@ -682,7 +700,7 @@ var MixedStreamParser = class {
682
700
  const last = streamBlock.content.at(-1);
683
701
  invariant2(last, void 0, {
684
702
  F: __dxlog_file3,
685
- L: 168,
703
+ L: 171,
686
704
  S: this,
687
705
  A: [
688
706
  "last",
@@ -734,11 +752,11 @@ var MixedStreamParser = class {
734
752
  //
735
753
  case "input_json_delta": {
736
754
  if (!contentBlock) {
737
- log2.warn("unexpected input_json_delta", {
755
+ log3.warn("unexpected input_json_delta", {
738
756
  contentBlock
739
757
  }, {
740
758
  F: __dxlog_file3,
741
- L: 218,
759
+ L: 221,
742
760
  S: this,
743
761
  C: (f, a) => f(...a)
744
762
  });
@@ -759,9 +777,9 @@ var MixedStreamParser = class {
759
777
  }
760
778
  case "content_block_stop": {
761
779
  if (!contentBlock) {
762
- log2.warn("unexpected content_block_stop", void 0, {
780
+ log3.warn("unexpected content_block_stop", void 0, {
763
781
  F: __dxlog_file3,
764
- L: 235,
782
+ L: 238,
765
783
  S: this,
766
784
  C: (f, a) => f(...a)
767
785
  });
@@ -777,15 +795,16 @@ var MixedStreamParser = class {
777
795
  this._emitUpdate(contentBlock, streamBlock);
778
796
  }
779
797
  }
798
+ return messagesCollected;
780
799
  }
781
800
  };
782
801
  var mergeMessageBlock = (contentBlock, streamBlock) => {
783
- log2("mergeMessageBlock", {
802
+ log3("mergeMessageBlock", {
784
803
  contentBlock,
785
804
  streamBlock
786
805
  }, {
787
806
  F: __dxlog_file3,
788
- L: 260,
807
+ L: 265,
789
808
  S: void 0,
790
809
  C: (f, a) => f(...a)
791
810
  });
@@ -839,18 +858,26 @@ var mergeMessageBlock = (contentBlock, streamBlock) => {
839
858
  })
840
859
  };
841
860
  }
861
+ break;
842
862
  }
843
863
  case "select": {
844
864
  return {
845
865
  type: "json",
846
866
  disposition: "select",
847
867
  json: JSON.stringify({
848
- options: streamBlock.content.flatMap((c) => c.type === "tag" && c.content.length === 1 && c.content[0].type === "text" ? [
849
- c.content[0].content
868
+ options: streamBlock.content.flatMap((content) => content.type === "tag" && content.content.length === 1 && content.content[0].type === "text" ? [
869
+ content.content[0].content
850
870
  ] : [])
851
871
  })
852
872
  };
853
873
  }
874
+ case "tool-list": {
875
+ return {
876
+ type: "json",
877
+ disposition: "tool_list",
878
+ json: JSON.stringify({})
879
+ };
880
+ }
854
881
  }
855
882
  break;
856
883
  }
@@ -862,7 +889,7 @@ var mergeMessageBlock = (contentBlock, streamBlock) => {
862
889
  case "tool_use": {
863
890
  return {
864
891
  ...contentBlock,
865
- input: safeParseJson(streamBlock.content) ?? "{}"
892
+ input: safeParseJson(streamBlock.content) ?? {}
866
893
  };
867
894
  }
868
895
  }
@@ -881,7 +908,7 @@ import { Schema as S2 } from "@effect/schema";
881
908
  import { Tool, Message as Message3, SpaceIdSchema } from "@dxos/artifact";
882
909
  import { ObjectId } from "@dxos/echo-schema";
883
910
  var createArtifactElement = (id) => `<artifact id=${id} />`;
884
- var LLMModel = S2.Literal("@anthropic/claude-3-5-haiku-20241022", "@anthropic/claude-3-5-sonnet-20241022", "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", "@hf/nousresearch/hermes-2-pro-mistral-7b", "@ollama/llama-3-2-3b", "@ollama/llama-3-1-nemotron-70b-instruct", "@ollama/llama-3-1-nemotron-mini-4b-instruct");
911
+ var LLMModel = S2.Literal(...DEFAULT_LLM_MODELS);
885
912
  var ToolTypes = Object.freeze({
886
913
  // TODO(dmaretskyi): Not implemented yet.
887
914
  // DatabaseQuery: 'database_query',
@@ -890,13 +917,14 @@ var ToolTypes = Object.freeze({
890
917
  var GenerateRequest = S2.Struct({
891
918
  spaceId: S2.optional(SpaceIdSchema),
892
919
  threadId: S2.optional(ObjectId),
893
- // TODO(burdon): Make optional with default.
894
- model: LLMModel,
895
920
  /**
896
- * Current request.
921
+ * Preferred model or system default.
897
922
  */
898
- // TODO(burdon): Remove from history.
899
- // prompt: Message,
923
+ model: S2.optional(LLMModel),
924
+ /**
925
+ * Tools available for the LLM.
926
+ */
927
+ tools: S2.optional(S2.Array(Tool).pipe(S2.mutable)),
900
928
  /**
901
929
  * System instructions to the LLM.
902
930
  */
@@ -904,24 +932,25 @@ var GenerateRequest = S2.Struct({
904
932
  /**
905
933
  * History of messages to include in the context window.
906
934
  */
935
+ // TODO(burdon): Rename messages.
907
936
  history: S2.optional(S2.Array(Message3)),
908
937
  /**
909
- * Tools available for the LLM.
938
+ * Current request.
910
939
  */
911
- tools: S2.optional(S2.Array(Tool).pipe(S2.mutable))
940
+ prompt: S2.optional(Message3)
912
941
  });
913
942
 
914
943
  // packages/experimental/assistant/src/conversation/conversation.ts
915
944
  import { ToolResult, Message as Message4 } from "@dxos/artifact";
916
945
  import { createStatic as createStatic2, ObjectId as ObjectId2 } from "@dxos/echo-schema";
917
946
  import { invariant as invariant3 } from "@dxos/invariant";
918
- import { log as log3 } from "@dxos/log";
947
+ import { log as log4 } from "@dxos/log";
919
948
  var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/experimental/assistant/src/conversation/conversation.ts";
920
949
  var runLLM = async (params) => {
921
950
  let conversationResult = null;
922
951
  const history = params.history ?? [];
923
952
  const generate = async () => {
924
- log3("llm generate", {
953
+ log4("llm generate", {
925
954
  tools: params.tools
926
955
  }, {
927
956
  F: __dxlog_file4,
@@ -930,7 +959,7 @@ var runLLM = async (params) => {
930
959
  C: (f, a) => f(...a)
931
960
  });
932
961
  const beginTs = Date.now();
933
- const stream = await params.client.generate({
962
+ const stream = await params.client.exec({
934
963
  model: params.model,
935
964
  spaceId: params.spaceId,
936
965
  threadId: params.threadId,
@@ -953,7 +982,7 @@ var runLLM = async (params) => {
953
982
  ""
954
983
  ]
955
984
  });
956
- log3("llm result", {
985
+ log4("llm result", {
957
986
  time: Date.now() - beginTs,
958
987
  message
959
988
  }, {
@@ -1008,7 +1037,7 @@ var runLLM = async (params) => {
1008
1037
  const toolResult = await tool.execute(toolCall.input);
1009
1038
  switch (toolResult.kind) {
1010
1039
  case "error": {
1011
- log3.warn("tool error", {
1040
+ log4.warn("tool error", {
1012
1041
  message: toolResult.message
1013
1042
  }, {
1014
1043
  F: __dxlog_file4,
@@ -1038,7 +1067,7 @@ var runLLM = async (params) => {
1038
1067
  return true;
1039
1068
  }
1040
1069
  case "success": {
1041
- log3("tool success", {
1070
+ log4("tool success", {
1042
1071
  result: toolResult.result
1043
1072
  }, {
1044
1073
  F: __dxlog_file4,
@@ -1067,7 +1096,7 @@ var runLLM = async (params) => {
1067
1096
  return true;
1068
1097
  }
1069
1098
  case "break": {
1070
- log3("tool break", {
1099
+ log4("tool break", {
1071
1100
  result: toolResult.result
1072
1101
  }, {
1073
1102
  F: __dxlog_file4,
@@ -1133,7 +1162,7 @@ var runTools = async ({ message, tools, extensions }) => {
1133
1162
  extensions
1134
1163
  });
1135
1164
  } catch (error) {
1136
- log3("tool error", {
1165
+ log4("tool error", {
1137
1166
  error
1138
1167
  }, {
1139
1168
  F: __dxlog_file4,
@@ -1145,7 +1174,7 @@ var runTools = async ({ message, tools, extensions }) => {
1145
1174
  }
1146
1175
  switch (toolResult.kind) {
1147
1176
  case "error": {
1148
- log3("tool error", {
1177
+ log4("tool error", {
1149
1178
  message: toolResult.message
1150
1179
  }, {
1151
1180
  F: __dxlog_file4,
@@ -1170,7 +1199,7 @@ var runTools = async ({ message, tools, extensions }) => {
1170
1199
  };
1171
1200
  }
1172
1201
  case "success": {
1173
- log3("tool success", {
1202
+ log4("tool success", {
1174
1203
  result: toolResult.result
1175
1204
  }, {
1176
1205
  F: __dxlog_file4,
@@ -1194,7 +1223,7 @@ var runTools = async ({ message, tools, extensions }) => {
1194
1223
  };
1195
1224
  }
1196
1225
  case "break": {
1197
- log3("tool break", {
1226
+ log4("tool break", {
1198
1227
  result: toolResult.result
1199
1228
  }, {
1200
1229
  F: __dxlog_file4,
@@ -1211,6 +1240,8 @@ var runTools = async ({ message, tools, extensions }) => {
1211
1240
  };
1212
1241
  export {
1213
1242
  AIServiceClientImpl,
1243
+ DEFAULT_LLM_MODEL,
1244
+ DEFAULT_LLM_MODELS,
1214
1245
  EchoDataSource,
1215
1246
  GenerateRequest,
1216
1247
  GenerationStream,