@apia/ai 4.0.7 → 4.0.8

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/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import * as react from 'react';
2
2
  import { ReactNode, FC, ReactElement } from 'react';
3
3
  import * as _apia_util from '@apia/util';
4
4
  import { EventEmitter, AudioRecorder } from '@apia/util';
5
+ import { CollectorField } from '@apia/validations';
5
6
  import { ResponseStream as ResponseStream$1 } from '@apia/ai';
6
7
 
7
8
  declare const AutoscrollContainer: ({ children }: {
@@ -16,7 +17,8 @@ interface Reactive {
16
17
  Component: FC<any>;
17
18
  }
18
19
 
19
- declare class AIContent implements Reactive {
20
+ declare class AIContent extends CollectorField implements Reactive {
21
+ type: string;
20
22
  content: ReactNode;
21
23
  constructor(content?: ReactNode);
22
24
  Component: () => react.JSX.Element;
@@ -27,6 +29,7 @@ declare class AIMessageAttachments implements Reactive {
27
29
  role: AIMessageRole;
28
30
  content: AIContent;
29
31
  id: string;
32
+ customDescription: boolean;
30
33
  constructor(role: AIMessageRole, content: AIContent, close?: (() => void) | undefined);
31
34
  addDescription: () => Promise<void>;
32
35
  Component: (props: {
@@ -131,12 +134,12 @@ type RoutinesGenerationState = {
131
134
  isLoading: boolean;
132
135
  progress: number;
133
136
  };
134
- type TGenerateFromImage = {
137
+ type TGenerateFromImage$1 = {
135
138
  base64: string;
136
139
  description: string;
137
140
  };
138
141
  type TRoutineCompletion = Partial<{
139
- images: TGenerateFromImage[];
142
+ images: TGenerateFromImage$1[];
140
143
  parameters: Record<string, string>;
141
144
  stream: ResponseStream$1;
142
145
  }> & {
@@ -159,5 +162,25 @@ declare class RoutinesGeneration {
159
162
  } | null>;
160
163
  }
161
164
 
162
- export { AIMessageAttachments, AutoscrollContainer, ChatController, ChatMessage, MultipleChoiceMessage, ResponseStream, RoutinesGeneration, type TGenerateFromImage, type TMessageType, type TMultipleChoiceMessageOption, type TRoutineCompletion };
165
+ type RetrievedImage = {
166
+ base64: string;
167
+ path: string;
168
+ };
169
+ declare function getImageFromDisk(inputProps?: Partial<{
170
+ accept: string;
171
+ }>): Promise<RetrievedImage | null>;
172
+ declare function getImagesFromDisk(inputProps?: Partial<{
173
+ accept: string;
174
+ multiple: string;
175
+ }>): Promise<RetrievedImage[]>;
176
+
177
+ type TGenerateFromImage = {
178
+ base64: string;
179
+ description: string;
180
+ };
181
+ declare function getImagesWithDescription({ multiple, }: {
182
+ multiple?: boolean;
183
+ }): Promise<TGenerateFromImage[]>;
184
+
185
+ export { AIMessageAttachments, AutoscrollContainer, ChatController, ChatMessage, MultipleChoiceMessage, ResponseStream, RoutinesGeneration, type TGenerateFromImage$1 as TGenerateFromImage, type TMessageType, type TMultipleChoiceMessageOption, type TRoutineCompletion, getImageFromDisk, getImagesFromDisk, getImagesWithDescription };
163
186
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  import { jsx, jsxs, Fragment } from '@apia/theme/jsx-runtime';
2
2
  import { Box, getVariant, Textarea, Paragraph } from '@apia/theme';
3
3
  import { useRef, useCallback, useState } from 'react';
4
- import { IconButton, SimpleButton, ApiaUtil } from '@apia/components';
4
+ import { IconButton, SimpleButton, ApiaUtil, SortableList, SortableListItem } from '@apia/components';
5
5
  import { getLabel, noNaN, AudioRecorder, EventEmitter } from '@apia/util';
6
- import { makeObservable, observable, action } from 'mobx';
7
- import { FileIcon } from '@apia/icons';
6
+ import { makeObservable, observable, action, toJS, makeAutoObservable } from 'mobx';
7
+ import { CollectorField, Collector } from '@apia/validations';
8
8
  import { uniqueId } from '@apia/notifications';
9
- import { Collector } from '@apia/validations';
9
+ import { FileIcon } from '@apia/icons';
10
10
  import { observer } from 'mobx-react-lite';
11
11
  import axios from 'axios';
12
12
  import { ApiaApi, makeApiaUrl, parseSuccessfulResponse } from '@apia/api';
@@ -193,10 +193,10 @@ function useHandleFileUpload({
193
193
  return { progress, handleFileUpload };
194
194
  }
195
195
 
196
- var __defProp$6 = Object.defineProperty;
197
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
198
- var __publicField$6 = (obj, key, value) => {
199
- __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
196
+ var __defProp$7 = Object.defineProperty;
197
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
198
+ var __publicField$7 = (obj, key, value) => {
199
+ __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
200
200
  return value;
201
201
  };
202
202
  let maxId = 0;
@@ -205,9 +205,9 @@ class ChatMessage {
205
205
  this.message = message;
206
206
  this.messageType = messageType;
207
207
  this.attachments = attachments;
208
- __publicField$6(this, "id");
209
- __publicField$6(this, "copy", () => new ChatMessage(this.message, this.messageType, this.attachments));
210
- __publicField$6(this, "Component", () => {
208
+ __publicField$7(this, "id");
209
+ __publicField$7(this, "copy", () => new ChatMessage(this.message, this.messageType, this.attachments));
210
+ __publicField$7(this, "Component", () => {
211
211
  return /* @__PURE__ */ jsxs(
212
212
  Box,
213
213
  {
@@ -246,16 +246,19 @@ class ChatMessage {
246
246
  }
247
247
  }
248
248
 
249
- var __defProp$5 = Object.defineProperty;
250
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
251
- var __publicField$5 = (obj, key, value) => {
252
- __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
249
+ var __defProp$6 = Object.defineProperty;
250
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
251
+ var __publicField$6 = (obj, key, value) => {
252
+ __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
253
253
  return value;
254
254
  };
255
- class AIContent {
255
+ class AIContent extends CollectorField {
256
256
  constructor(content) {
257
- __publicField$5(this, "content");
258
- __publicField$5(this, "Component", () => {
257
+ super(uniqueId(), "");
258
+ __publicField$6(this, "type", "aiContent");
259
+ __publicField$6(this, "content");
260
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
261
+ __publicField$6(this, "Component", () => {
259
262
  return /* @__PURE__ */ jsx(Box, { variant: "layout.common.components.aiMessage.textBox", children: /* @__PURE__ */ jsx(Box, { variant: "layout.common.components.aiMessage.textSnippet", children: this.content }) });
260
263
  });
261
264
  this.content = content;
@@ -290,26 +293,27 @@ var AIMessageRole = /* @__PURE__ */ ((AIMessageRole2) => {
290
293
  return AIMessageRole2;
291
294
  })(AIMessageRole || {});
292
295
 
293
- var __defProp$4 = Object.defineProperty;
294
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
295
- var __publicField$4 = (obj, key, value) => {
296
- __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
296
+ var __defProp$5 = Object.defineProperty;
297
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
298
+ var __publicField$5 = (obj, key, value) => {
299
+ __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
297
300
  return value;
298
301
  };
299
302
  const _AIFileContent = class _AIFileContent extends AIContent {
300
303
  constructor(fileUrl, fileName, f, error) {
301
304
  const extension = _AIFileContent.getExtensionFromFileName(fileName);
302
305
  super();
303
- __publicField$4(this, "type");
304
- __publicField$4(this, "fileUrl");
305
- __publicField$4(this, "fileName");
306
- __publicField$4(this, "extension");
307
- __publicField$4(this, "__file");
308
- __publicField$4(this, "__error");
309
- __publicField$4(this, "inferContent", () => {
306
+ __publicField$5(this, "type");
307
+ __publicField$5(this, "fileUrl");
308
+ __publicField$5(this, "fileName");
309
+ __publicField$5(this, "extension");
310
+ __publicField$5(this, "__file");
311
+ __publicField$5(this, "__error");
312
+ __publicField$5(this, "overrideSize");
313
+ __publicField$5(this, "inferContent", () => {
310
314
  return `You must collect information contained in this ${this.type} as help to build your tool choice.`;
311
315
  });
312
- __publicField$4(this, "inferExtension", (extension) => {
316
+ __publicField$5(this, "inferExtension", (extension) => {
313
317
  switch (extension) {
314
318
  case AIFileContentAllowedExtensions.jpg:
315
319
  case AIFileContentAllowedExtensions.jpeg:
@@ -336,18 +340,33 @@ const _AIFileContent = class _AIFileContent extends AIContent {
336
340
  }
337
341
  });
338
342
  // COMPONENT METHODS
339
- __publicField$4(this, "Component", () => /* @__PURE__ */ jsxs(Box, { variant: "layout.common.components.aiMessage.fileBox", children: [
340
- FileType.IMAGE === this.type ? /* @__PURE__ */ jsx("img", { src: URL.createObjectURL(this.file), alt: this.fileName }) : /* @__PURE__ */ jsx(FileIcon, { iconSize: "lg", docName: this.fileName }),
341
- /* @__PURE__ */ jsx(
342
- Box,
343
- {
344
- as: "p",
345
- variant: "layout.common.components.aiMessage.fileName",
346
- title: this.fileName,
347
- children: this.fileName
348
- }
349
- )
350
- ] }));
343
+ __publicField$5(this, "Component", () => /* @__PURE__ */ jsxs(
344
+ Box,
345
+ {
346
+ sx: {
347
+ ...this.overrideSize ? {
348
+ ...this.overrideSize,
349
+ img: {
350
+ width: `${this.overrideSize.width - 20}px`,
351
+ height: `${this.overrideSize.height - 61}px`
352
+ }
353
+ } : {}
354
+ },
355
+ variant: "layout.common.components.aiMessage.fileBox",
356
+ children: [
357
+ FileType.IMAGE === this.type ? /* @__PURE__ */ jsx("img", { src: URL.createObjectURL(this.file), alt: this.fileName }) : /* @__PURE__ */ jsx(FileIcon, { iconSize: "lg", docName: this.fileName }),
358
+ /* @__PURE__ */ jsx(
359
+ Box,
360
+ {
361
+ as: "p",
362
+ variant: "layout.common.components.aiMessage.fileName",
363
+ title: this.fileName,
364
+ children: this.fileName
365
+ }
366
+ )
367
+ ]
368
+ }
369
+ ));
351
370
  this.__error = error;
352
371
  if (!_AIFileContent.isValidExtension(extension))
353
372
  this.__throwError(
@@ -362,6 +381,10 @@ const _AIFileContent = class _AIFileContent extends AIContent {
362
381
  this.content = this.inferContent();
363
382
  }
364
383
  // PUBLIC METHODS
384
+ setOverrideSize(overrideSize) {
385
+ this.overrideSize = overrideSize;
386
+ return this;
387
+ }
365
388
  get file() {
366
389
  if (!this.__file)
367
390
  throw new Error("File is undefined");
@@ -381,12 +404,12 @@ ${Object.keys(AIFileContentAllowedExtensions)}`;
381
404
  }
382
405
  };
383
406
  // STATIC METHODS
384
- __publicField$4(_AIFileContent, "isValidExtension", (extension) => {
407
+ __publicField$5(_AIFileContent, "isValidExtension", (extension) => {
385
408
  return Object.values(
386
409
  AIFileContentAllowedExtensions
387
410
  ).includes(extension);
388
411
  });
389
- __publicField$4(_AIFileContent, "blobToBase64", async (blob) => {
412
+ __publicField$5(_AIFileContent, "blobToBase64", async (blob) => {
390
413
  return await ((blob2) => new Promise((resolve, reject) => {
391
414
  const reader = new FileReader();
392
415
  reader.onloadend = () => {
@@ -397,7 +420,7 @@ __publicField$4(_AIFileContent, "blobToBase64", async (blob) => {
397
420
  reader.readAsDataURL(blob2);
398
421
  }))(blob);
399
422
  });
400
- __publicField$4(_AIFileContent, "fromFile", async (f, error) => {
423
+ __publicField$5(_AIFileContent, "fromFile", async (f, error) => {
401
424
  const fileUrl = await ((f2) => new Promise((resolve, reject) => {
402
425
  const reader = new FileReader();
403
426
  reader.readAsDataURL(f2);
@@ -408,31 +431,46 @@ __publicField$4(_AIFileContent, "fromFile", async (f, error) => {
408
431
  });
409
432
  let AIFileContent = _AIFileContent;
410
433
 
411
- var __defProp$3 = Object.defineProperty;
412
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
413
- var __publicField$3 = (obj, key, value) => {
414
- __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
434
+ var __defProp$4 = Object.defineProperty;
435
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
436
+ var __publicField$4 = (obj, key, value) => {
437
+ __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
415
438
  return value;
416
439
  };
417
440
  class AIMessageAttachments {
418
441
  constructor(role, content, close) {
419
442
  this.close = close;
420
- __publicField$3(this, "role");
421
- __publicField$3(this, "content");
422
- __publicField$3(this, "id", uniqueId());
423
- __publicField$3(this, "addDescription", async () => {
443
+ __publicField$4(this, "role");
444
+ __publicField$4(this, "content");
445
+ __publicField$4(this, "id", uniqueId());
446
+ __publicField$4(this, "customDescription", false);
447
+ __publicField$4(this, "addDescription", async () => {
424
448
  const collector = new Collector();
425
449
  const collected = await collector.add(
450
+ this.content instanceof AIFileContent ? this.content.setOverrideSize({ height: 320, width: 330 }) : this.content
451
+ ).add(
426
452
  new collector.fields.textarea(
427
453
  "addCommentTextArea",
428
- "TODO The description will help the assistant to understand the file content"
454
+ getLabel("lblAiAddImageCo").text,
455
+ {
456
+ initialValue: this.content instanceof AIFileContent && this.content.content !== this.content.inferContent() ? this.content.content : ""
457
+ }
429
458
  )
430
- ).show({ title: "TODO Add image Comment" }).catch((e) => {
459
+ ).show({
460
+ title: getLabel("btnAddComment").text
461
+ }).catch((e) => {
431
462
  throw e;
432
463
  });
433
- collected?.addCommentTextArea && (this.content.content = collected.addCommentTextArea);
464
+ if (collected?.addCommentTextArea) {
465
+ this.content.content = collected.addCommentTextArea;
466
+ this.customDescription = true;
467
+ } else {
468
+ if (this.content instanceof AIFileContent)
469
+ this.content.content = this.content.inferContent();
470
+ this.customDescription = false;
471
+ }
434
472
  });
435
- __publicField$3(this, "Component", (props) => /* @__PURE__ */ jsxs(Box, { ...getVariant("layout.common.components.aiMessage"), children: [
473
+ __publicField$4(this, "Component", (props) => /* @__PURE__ */ jsxs(Box, { ...getVariant("layout.common.components.aiMessage"), children: [
436
474
  props.closeButton ? /* @__PURE__ */ jsx(
437
475
  IconButton,
438
476
  {
@@ -737,10 +775,10 @@ const makeTextarea = (chatController) => {
737
775
  return NewTextarea;
738
776
  };
739
777
 
740
- var __defProp$2 = Object.defineProperty;
741
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
742
- var __publicField$2 = (obj, key, value) => {
743
- __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
778
+ var __defProp$3 = Object.defineProperty;
779
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
780
+ var __publicField$3 = (obj, key, value) => {
781
+ __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
744
782
  return value;
745
783
  };
746
784
  var __accessCheck = (obj, member, msg) => {
@@ -765,11 +803,11 @@ var _promptsHistory, _internalAudioRecorder;
765
803
  class ChatController {
766
804
  constructor(id, welcomeMessage) {
767
805
  this.id = id;
768
- __publicField$2(this, "state", {
806
+ __publicField$3(this, "state", {
769
807
  current: new ChatMessage(),
770
808
  messages: []
771
809
  });
772
- __publicField$2(this, "components", {
810
+ __publicField$3(this, "components", {
773
811
  MessageHistory: observer(() => {
774
812
  return /* @__PURE__ */ jsx(
775
813
  Box,
@@ -783,9 +821,9 @@ class ChatController {
783
821
  Textarea: makeTextarea(this)
784
822
  });
785
823
  __privateAdd(this, _promptsHistory, []);
786
- __publicField$2(this, "currentHistoryIndex", -1);
824
+ __publicField$3(this, "currentHistoryIndex", -1);
787
825
  __privateAdd(this, _internalAudioRecorder, new AudioRecorder());
788
- __publicField$2(this, "audioRecorder", {
826
+ __publicField$3(this, "audioRecorder", {
789
827
  start: () => __privateGet(this, _internalAudioRecorder).start().then(async (blob) => {
790
828
  const m = new AIMessageAttachments(
791
829
  AIMessageRole.USER,
@@ -803,7 +841,7 @@ class ChatController {
803
841
  record: 0,
804
842
  state: __privateGet(this, _internalAudioRecorder).state
805
843
  });
806
- __publicField$2(this, "history", {
844
+ __publicField$3(this, "history", {
807
845
  add: (message) => {
808
846
  this.currentHistoryIndex = -1;
809
847
  if (message === __privateGet(this, _promptsHistory)[__privateGet(this, _promptsHistory).length]) {
@@ -840,7 +878,7 @@ class ChatController {
840
878
  },
841
879
  size: () => this.state.messages.length
842
880
  });
843
- __publicField$2(this, "messages", {
881
+ __publicField$3(this, "messages", {
844
882
  add: (message, idx) => {
845
883
  if (idx !== void 0 && idx !== null) {
846
884
  this.state.messages.splice(idx, 0, message);
@@ -852,7 +890,7 @@ class ChatController {
852
890
  this.state.messages = [];
853
891
  }
854
892
  });
855
- __publicField$2(this, "attachments", {
893
+ __publicField$3(this, "attachments", {
856
894
  add: (...aiMessage) => {
857
895
  this.state.current.attachments.push(...aiMessage);
858
896
  },
@@ -905,25 +943,25 @@ class MultipleChoiceMessage extends ChatMessage {
905
943
  }
906
944
  }
907
945
 
908
- var __defProp$1 = Object.defineProperty;
909
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
910
- var __publicField$1 = (obj, key, value) => {
911
- __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
946
+ var __defProp$2 = Object.defineProperty;
947
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
948
+ var __publicField$2 = (obj, key, value) => {
949
+ __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
912
950
  return value;
913
951
  };
914
952
  class ResponseStream extends EventEmitter {
915
953
  constructor() {
916
954
  super(...arguments);
917
- __publicField$1(this, "buffer", "");
918
- __publicField$1(this, "isRunning", false);
919
- __publicField$1(this, "locked", false);
920
- __publicField$1(this, "maxCompletionTime", 2);
955
+ __publicField$2(this, "buffer", "");
956
+ __publicField$2(this, "isRunning", false);
957
+ __publicField$2(this, "locked", false);
958
+ __publicField$2(this, "maxCompletionTime", 2);
921
959
  // s
922
- __publicField$1(this, "minPartSize", 2);
923
- __publicField$1(this, "partSize", 2);
924
- __publicField$1(this, "timing", 5);
960
+ __publicField$2(this, "minPartSize", 2);
961
+ __publicField$2(this, "partSize", 2);
962
+ __publicField$2(this, "timing", 5);
925
963
  // ms
926
- __publicField$1(this, "waiting", []);
964
+ __publicField$2(this, "waiting", []);
927
965
  }
928
966
  close() {
929
967
  }
@@ -969,10 +1007,10 @@ class ResponseStream extends EventEmitter {
969
1007
  }
970
1008
  }
971
1009
 
972
- var __defProp = Object.defineProperty;
973
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
974
- var __publicField = (obj, key, value) => {
975
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1010
+ var __defProp$1 = Object.defineProperty;
1011
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1012
+ var __publicField$1 = (obj, key, value) => {
1013
+ __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
976
1014
  return value;
977
1015
  };
978
1016
  function isPollProgress(payload) {
@@ -980,9 +1018,9 @@ function isPollProgress(payload) {
980
1018
  }
981
1019
  class RoutinesGeneration {
982
1020
  constructor() {
983
- __publicField(this, "audioRecorder", new AudioRecorder());
984
- __publicField(this, "routineId", "");
985
- __publicField(this, "state", {
1021
+ __publicField$1(this, "audioRecorder", new AudioRecorder());
1022
+ __publicField$1(this, "routineId", "");
1023
+ __publicField$1(this, "state", {
986
1024
  isLoading: false,
987
1025
  progress: 0
988
1026
  });
@@ -1113,5 +1151,202 @@ class RoutinesGeneration {
1113
1151
  }
1114
1152
  }
1115
1153
 
1116
- export { AIMessageAttachments, AutoscrollContainer, ChatController, ChatMessage, MultipleChoiceMessage, ResponseStream, RoutinesGeneration };
1154
+ async function getImageFromDisk(inputProps) {
1155
+ return (await getImagesFromDisk({ ...inputProps, multiple: "false" }))[0] ?? null;
1156
+ }
1157
+ function getImagesFromDisk(inputProps) {
1158
+ return new Promise((resolve) => {
1159
+ const input = document.createElement("input");
1160
+ input.accept = "image/*";
1161
+ input.type = "file";
1162
+ input.style.display = "none";
1163
+ Object.assign(input, inputProps);
1164
+ document.body.append(input);
1165
+ input.addEventListener("change", (event) => {
1166
+ const target = event?.target;
1167
+ if (!target?.files)
1168
+ return;
1169
+ const retrievedImages = [];
1170
+ const sources = [...target.files ?? []];
1171
+ const checkResolve = () => {
1172
+ if (sources.length === retrievedImages.length) {
1173
+ resolve(retrievedImages.filter((c) => !!c));
1174
+ }
1175
+ };
1176
+ sources.forEach((file) => {
1177
+ if (file) {
1178
+ const reader = new FileReader();
1179
+ reader.onload = function(e) {
1180
+ const binary = e.target?.result?.split(",")[1];
1181
+ input.remove();
1182
+ retrievedImages.push({
1183
+ base64: binary,
1184
+ path: file.name
1185
+ });
1186
+ checkResolve();
1187
+ };
1188
+ reader.readAsDataURL(file);
1189
+ } else {
1190
+ retrievedImages.push(null);
1191
+ }
1192
+ checkResolve();
1193
+ });
1194
+ });
1195
+ input.click();
1196
+ });
1197
+ }
1198
+
1199
+ const ImageIcon = ({
1200
+ deletable,
1201
+ onClick,
1202
+ onRemove,
1203
+ src
1204
+ }) => {
1205
+ return /* @__PURE__ */ jsxs(Box, { className: "image_preview", children: [
1206
+ deletable && /* @__PURE__ */ jsx(IconButton, { icon: "Close", size: "Xs", iconSize: "Xs", onClick: onRemove }),
1207
+ /* @__PURE__ */ jsx("img", { src, onClick })
1208
+ ] });
1209
+ };
1210
+
1211
+ function getSrcFromBase64(base64) {
1212
+ return `data:image/jpg;base64,${base64}`;
1213
+ }
1214
+
1215
+ var __defProp = Object.defineProperty;
1216
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1217
+ var __publicField = (obj, key, value) => {
1218
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1219
+ return value;
1220
+ };
1221
+ class ImagesStore {
1222
+ constructor(images, multiple) {
1223
+ this.multiple = multiple;
1224
+ __publicField(this, "images", /* @__PURE__ */ new Map());
1225
+ __publicField(this, "selectedId", "");
1226
+ this.images = new Map(
1227
+ images.map((c) => {
1228
+ const id = uniqueId();
1229
+ return [id, { ...c, id }];
1230
+ })
1231
+ );
1232
+ this.selectedId = this.images.values().next().value.id;
1233
+ makeAutoObservable(this);
1234
+ }
1235
+ }
1236
+ const GetImagesDescription = observer(({ store }) => {
1237
+ return /* @__PURE__ */ jsxs(
1238
+ Box,
1239
+ {
1240
+ className: "images_description_generator",
1241
+ ...getVariant("layout.design.projectAnalysis.imagesLoader"),
1242
+ children: [
1243
+ /* @__PURE__ */ jsx(Box, { className: "images_sort_wrapper", children: /* @__PURE__ */ jsx(
1244
+ SortableList,
1245
+ {
1246
+ onSortChange: (ev) => {
1247
+ store.images = new Map(
1248
+ ev.map((c) => [
1249
+ c.props.id,
1250
+ c.props.additionalProps
1251
+ ])
1252
+ );
1253
+ },
1254
+ children: [...store.images].map(([k, c]) => /* @__PURE__ */ jsx(SortableListItem, { additionalProps: c, id: c.id, children: /* @__PURE__ */ jsx(
1255
+ ImageIcon,
1256
+ {
1257
+ deletable: store.multiple,
1258
+ onClick: () => {
1259
+ store.selectedId = c.id;
1260
+ },
1261
+ onRemove: () => {
1262
+ store.images.delete(k);
1263
+ },
1264
+ src: getSrcFromBase64(c.base64 ?? "")
1265
+ }
1266
+ ) }, c.id))
1267
+ }
1268
+ ) }),
1269
+ /* @__PURE__ */ jsxs(Box, { className: "image_editor", children: [
1270
+ /* @__PURE__ */ jsx(Box, { className: "image_preview", children: store.images.get(store.selectedId) && /* @__PURE__ */ jsx(
1271
+ "img",
1272
+ {
1273
+ src: getSrcFromBase64(
1274
+ store.images.get(store.selectedId).base64 ?? ""
1275
+ )
1276
+ }
1277
+ ) }),
1278
+ /* @__PURE__ */ jsxs(Box, { className: "image_description", children: [
1279
+ /* @__PURE__ */ jsx(
1280
+ Textarea,
1281
+ {
1282
+ autoFocus: true,
1283
+ disabled: !store.images.get(store.selectedId),
1284
+ onChange: (ev) => {
1285
+ const image = store.images.get(store.selectedId);
1286
+ if (image)
1287
+ image.description = ev.target.value;
1288
+ },
1289
+ value: store.images.get(store.selectedId)?.description
1290
+ }
1291
+ ),
1292
+ store.multiple && /* @__PURE__ */ jsx(
1293
+ IconButton,
1294
+ {
1295
+ icon: "Attach",
1296
+ onClick: () => {
1297
+ getImagesFromDisk({ multiple: "true" }).then((res) => {
1298
+ res.forEach((c) => {
1299
+ const id = uniqueId();
1300
+ store.images.set(id, {
1301
+ base64: c.base64,
1302
+ description: "",
1303
+ id
1304
+ });
1305
+ });
1306
+ });
1307
+ },
1308
+ size: "Md",
1309
+ iconSize: "Sm",
1310
+ variant: "icon-only"
1311
+ }
1312
+ )
1313
+ ] })
1314
+ ] })
1315
+ ]
1316
+ }
1317
+ );
1318
+ });
1319
+ function getImagesWithDescription({
1320
+ multiple
1321
+ }) {
1322
+ return new Promise((resolve) => {
1323
+ getImagesFromDisk({ multiple: multiple ? "true" : void 0 }).then(
1324
+ (images) => {
1325
+ const store = new ImagesStore(
1326
+ images.map((c) => ({
1327
+ base64: c.base64,
1328
+ description: ""
1329
+ })),
1330
+ multiple || false
1331
+ );
1332
+ ApiaUtil.instance.modals.open({
1333
+ children: /* @__PURE__ */ jsx(GetImagesDescription, { store }),
1334
+ initialFocusGetter(modalInnerRef) {
1335
+ return modalInnerRef.querySelector("textarea");
1336
+ },
1337
+ onConfirm: () => {
1338
+ resolve([...toJS(store.images).values()]);
1339
+ },
1340
+ onCancel() {
1341
+ resolve([]);
1342
+ },
1343
+ size: "xxxl-fixed",
1344
+ noHeader: true
1345
+ });
1346
+ }
1347
+ );
1348
+ });
1349
+ }
1350
+
1351
+ export { AIMessageAttachments, AutoscrollContainer, ChatController, ChatMessage, MultipleChoiceMessage, ResponseStream, RoutinesGeneration, getImageFromDisk, getImagesFromDisk, getImagesWithDescription };
1117
1352
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/chat/AutoscrollContainer.tsx","../src/files/ocr/getImageOcrMaker.ts","../src/files/pdf/getPdfReader.ts","../src/components/chat/files/useHandleFileUpload.ts","../src/components/chat/messages/ChatMessage.tsx","../src/components/chat/messages/aiMessage/AIContent.tsx","../src/components/chat/messages/aiMessage/types.ts","../src/components/chat/messages/aiMessage/AIFileContent.tsx","../src/components/chat/messages/aiMessage/AIMessageAttachments.tsx","../src/components/chat/files/handleFileUploadAsMessage.ts","../src/components/chat/Textarea.tsx","../src/components/chat/ChatController.tsx","../src/components/chat/messages/MultipleChoiceMessage.tsx","../src/stream/ResponseStream.ts","../src/routines/RoutinesGeneration.ts"],"sourcesContent":["import { getVariant } from '@apia/theme';\r\nimport { ReactNode, useCallback, useRef } from 'react';\r\nimport { Box } from '@apia/theme';\r\n\r\nexport const AutoscrollContainer = ({ children }: { children: ReactNode }) => {\r\n const observer = useRef<MutationObserver | null>(null);\r\n const unsuscribe = useRef<(() => void) | null>(null);\r\n const isFullScrolled = useRef(false);\r\n const hasInited = useRef(false);\r\n\r\n const ref = useCallback((el: HTMLElement) => {\r\n if (!el) return;\r\n\r\n if (!hasInited.current) {\r\n hasInited.current = true;\r\n el.scrollTo({\r\n top: el.getBoundingClientRect().height,\r\n behavior: 'auto',\r\n });\r\n isFullScrolled.current = true;\r\n }\r\n\r\n observer.current?.disconnect();\r\n unsuscribe.current?.();\r\n\r\n observer.current = new MutationObserver(([mutation]) => {\r\n if (\r\n mutation &&\r\n mutation.target instanceof HTMLElement &&\r\n mutation.target === el\r\n ) {\r\n if (\r\n isFullScrolled.current &&\r\n mutation.target.scrollTop !==\r\n mutation.target.scrollHeight - mutation.target.offsetHeight\r\n ) {\r\n // eslint-disable-next-line no-param-reassign\r\n mutation.target.scrollTo({\r\n top: mutation.target.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n }\r\n });\r\n observer.current.observe(el, { childList: true, subtree: true });\r\n\r\n const handleScroll = (ev: Event) => {\r\n if (ev.target === el && el instanceof HTMLElement) {\r\n setTimeout(() => {\r\n isFullScrolled.current =\r\n Math.abs(el.scrollTop - (el.scrollHeight - el.offsetHeight)) < 150;\r\n }, 100);\r\n }\r\n };\r\n el.addEventListener('scroll', handleScroll);\r\n unsuscribe.current = () => {\r\n el.removeEventListener('scroll', handleScroll);\r\n };\r\n }, []);\r\n\r\n return (\r\n <Box\r\n {...getVariant('layout.common.components.autoscrollContainer')}\r\n className=\"autoscrollContainer\"\r\n ref={ref}\r\n >\r\n {children}\r\n </Box>\r\n );\r\n};\r\n","import { FileProcessor } from '../FileProcessor';\r\n\r\nexport function isImageFile(file: File) {\r\n const IMAGE_EXTENSIONS = [\r\n 'jpg',\r\n 'jpeg',\r\n 'png',\r\n 'gif',\r\n 'bmp',\r\n 'webp',\r\n 'tiff',\r\n 'svg',\r\n 'jfif',\r\n ];\r\n\r\n return IMAGE_EXTENSIONS.includes(file.name.split('.').pop() as string);\r\n}\r\n\r\nexport default function getImageOcrMaker(lang: 'eng' | 'spa') {\r\n return new (class ImageOcrMaker implements FileProcessor {\r\n async processFile(\r\n file: File,\r\n onProgress?: (progress: number) => unknown,\r\n ): Promise<string[]> {\r\n const tesseract = await import('tesseract.js');\r\n\r\n const worker = await tesseract.createWorker(lang, 1, {\r\n logger(arg) {\r\n onProgress?.(arg.progress * 100);\r\n },\r\n });\r\n\r\n const result = (await worker.recognize(file)).data.text;\r\n return [result];\r\n }\r\n\r\n willProcessFile(file: File) {\r\n return isImageFile(file);\r\n }\r\n })();\r\n}\r\n","import { FileProcessor } from '../FileProcessor';\r\n\r\nexport function isPdfFile(file: File) {\r\n const IMAGE_EXTENSIONS = ['pdf'];\r\n\r\n return IMAGE_EXTENSIONS.includes(file.name.split('.').pop() as string);\r\n}\r\n\r\nexport default function getPdfReader() {\r\n return new (class PdfReader implements FileProcessor {\r\n async processFile(\r\n file: File,\r\n onProgress?: (progress: number) => void,\r\n ): Promise<string[]> {\r\n onProgress?.(0);\r\n const { getDocument, GlobalWorkerOptions } = await import('pdfjs-dist');\r\n\r\n async function getPdfTextFromArrayBuffer(\r\n buffer: ArrayBuffer,\r\n ): Promise<string[]> {\r\n GlobalWorkerOptions.workerSrc = '../includes/pdf.worker.min.js';\r\n\r\n const pdf = await getDocument({ data: buffer }).promise;\r\n\r\n const pages: string[] = [];\r\n\r\n for (let i = 1; i <= pdf.numPages; i++) {\r\n const page = await pdf.getPage(i);\r\n const textContent = await page.getTextContent();\r\n\r\n // Concatenar texto de cada página\r\n pages.push(\r\n textContent.items\r\n .map((item) => (item as { str: string }).str)\r\n .join(' '),\r\n );\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = async function (event: ProgressEvent<FileReader>) {\r\n if (!event.target?.result) {\r\n alert('Error al leer el archivo.');\r\n return;\r\n }\r\n\r\n const buffer: ArrayBuffer = event.target.result as ArrayBuffer;\r\n const text = await getPdfTextFromArrayBuffer(buffer);\r\n\r\n onProgress?.(100);\r\n resolve(text);\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n });\r\n }\r\n\r\n willProcessFile(file: File) {\r\n return isPdfFile(file);\r\n }\r\n })();\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { ChangeEvent, useCallback, useState } from 'react';\r\nimport getImageOcrMaker, {\r\n isImageFile,\r\n} from '../../../files/ocr/getImageOcrMaker';\r\nimport getPdfReader, { isPdfFile } from '../../../files/pdf/getPdfReader';\r\n\r\nexport class WrongFormatError extends Error {\r\n constructor(fileName: string) {\r\n super(`File format not supported: ${fileName}`);\r\n }\r\n}\r\n\r\nexport default function useHandleFileUpload({\r\n onContent,\r\n}: {\r\n onContent: (content: string[]) => unknown;\r\n}) {\r\n const [progress, setProgress] = useState(100);\r\n\r\n const handleFileUpload = useCallback(\r\n async (ev: ChangeEvent<HTMLInputElement>) => {\r\n setProgress(0);\r\n const imageProcessor = getImageOcrMaker('spa');\r\n const pdfProcessor = getPdfReader();\r\n\r\n await (async () => {\r\n const obtainedText: string[] = [];\r\n const files = ev.target.files;\r\n const filesLength = ev.target.files?.length ?? 0;\r\n if (files) {\r\n for (let i = 0; i < filesLength; i++) {\r\n const file = files[i];\r\n\r\n if (!isImageFile(file) && !isPdfFile(file)) {\r\n setProgress(100);\r\n throw new WrongFormatError(file.name);\r\n }\r\n\r\n const handleProgress = (progress: number) => {\r\n setProgress(\r\n (i / filesLength) * 100 +\r\n (1 / filesLength) * 100 * (progress / 100),\r\n );\r\n };\r\n\r\n let result = '';\r\n if (imageProcessor.willProcessFile(file)) {\r\n try {\r\n result = (\r\n await imageProcessor.processFile(file, handleProgress)\r\n )[0];\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n } else if (pdfProcessor.willProcessFile(file)) {\r\n result = (\r\n await pdfProcessor.processFile(file, handleProgress)\r\n ).join('\\n\\n');\r\n try {\r\n //\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n if (result) {\r\n obtainedText.push(result);\r\n }\r\n\r\n setProgress(((i + 1) / filesLength) * 100);\r\n }\r\n }\r\n onContent(obtainedText);\r\n })();\r\n\r\n ev.target.value = '';\r\n },\r\n [onContent],\r\n );\r\n\r\n return { progress, handleFileUpload };\r\n}\r\n","import { ReactNode } from 'react';\r\nimport { TMessageType } from '../ChatController';\r\nimport { AIMessageAttachments } from './aiMessage/AIMessageAttachments';\r\nimport { Box } from '@apia/theme';\r\nimport { makeObservable, observable } from 'mobx';\r\n\r\nlet maxId = 0;\r\n\r\nexport class ChatMessage {\r\n id: number;\r\n\r\n parseMessage(message: string) {\r\n let result = message;\r\n\r\n result = result.replaceAll('[strong]', '<strong>');\r\n result = result.replaceAll('[/strong]', '</strong>');\r\n\r\n return result;\r\n }\r\n\r\n constructor(\r\n public message: ReactNode = '',\r\n public messageType: TMessageType = 'user',\r\n public attachments: AIMessageAttachments[] = [],\r\n ) {\r\n this.id = maxId++;\r\n if (messageType === 'response') this.messageType = 'system';\r\n if (typeof message === 'string') this.message = this.parseMessage(message);\r\n\r\n makeObservable(this, {\r\n attachments: observable,\r\n message: observable,\r\n messageType: observable,\r\n });\r\n }\r\n\r\n copy = () =>\r\n new ChatMessage(this.message, this.messageType, this.attachments);\r\n\r\n Component = () => {\r\n return (\r\n <Box\r\n as=\"pre\"\r\n className={`history__message ${this.messageType}`}\r\n key={this.id}\r\n >\r\n <Box\r\n className=\"text_wrapper\"\r\n {...(typeof this.message === 'string'\r\n ? { dangerouslySetInnerHTML: { __html: this.message } }\r\n : { children: this.message })}\r\n />\r\n <Box className=\"additionalContent_wrapper\">\r\n {this.attachments.map((x) => (\r\n <x.Component key={x.id} />\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n };\r\n}\r\n","import { Box } from '@apia/theme';\r\nimport { Reactive } from './types';\r\nimport { ReactNode } from 'react';\r\n\r\nexport class AIContent implements Reactive {\r\n content: ReactNode;\r\n\r\n constructor(content?: ReactNode) {\r\n this.content = content;\r\n }\r\n\r\n Component = () => {\r\n return (\r\n <Box variant={'layout.common.components.aiMessage.textBox'}>\r\n <Box variant={'layout.common.components.aiMessage.textSnippet'}>\r\n {this.content}\r\n </Box>\r\n </Box>\r\n );\r\n };\r\n}\r\n","import { FC } from 'react';\r\n\r\n// CONSTANTS\r\nexport const AIFileContentAllowedExtensions = {\r\n svg: 'svg',\r\n png: 'png',\r\n jpg: 'jpg',\r\n jpeg: 'jpeg',\r\n txt: 'txt',\r\n doc: 'doc',\r\n pdf: 'pdf',\r\n docx: 'docx',\r\n csv: 'csv',\r\n xlsx: 'xlsx',\r\n xls: 'xls',\r\n mp3: 'mp3',\r\n wav: 'wav',\r\n} as const;\r\n\r\n// TYPES\r\nexport type AIFileContentAllowedExtension =\r\n keyof typeof AIFileContentAllowedExtensions;\r\n\r\nexport type TAttachmentErrorCallback = 'fileExtension' | 'blobGeneration';\r\n\r\n//ENUMS\r\nexport enum FileType {\r\n DOCUMENT = 'DOCUMENT',\r\n IMAGE = 'IMAGE',\r\n AUDIO = 'AUDIO',\r\n SHEET = 'SHEET',\r\n}\r\n\r\nexport enum AIMessageRole {\r\n USER = 'USER',\r\n SYSTEM = 'SYSTEM',\r\n}\r\n\r\n// INTERFACES\r\nexport interface Reactive {\r\n Component: FC<any>;\r\n}\r\n","import { Box } from '@apia/theme';\r\nimport { AIContent } from './AIContent';\r\nimport {\r\n AIFileContentAllowedExtension,\r\n AIFileContentAllowedExtensions,\r\n FileType,\r\n Reactive,\r\n TAttachmentErrorCallback,\r\n} from './types';\r\nimport { FileIcon } from '@apia/icons';\r\n\r\nexport class AIFileContent extends AIContent implements Reactive {\r\n type: FileType;\r\n fileUrl: string;\r\n fileName: string;\r\n extension: AIFileContentAllowedExtension;\r\n private __file: File | undefined;\r\n private __error?: Partial<Record<TAttachmentErrorCallback, () => void>>;\r\n\r\n constructor(\r\n fileUrl: string,\r\n fileName: string,\r\n f?: File,\r\n error?: Partial<Record<TAttachmentErrorCallback, () => void>>,\r\n ) {\r\n const extension = AIFileContent.getExtensionFromFileName(fileName);\r\n super();\r\n this.__error = error;\r\n if (!AIFileContent.isValidExtension(extension))\r\n this.__throwError(\r\n new Error(AIFileContent.__getExtensionErrorMessage(extension)),\r\n this.__error?.fileExtension,\r\n );\r\n this.fileUrl = fileUrl;\r\n this.extension = extension;\r\n this.type = this.inferExtension(this.extension) as FileType;\r\n this.fileName = fileName;\r\n this.__file = f;\r\n this.content = this.inferContent();\r\n }\r\n\r\n // PUBLIC METHODS\r\n\r\n public get file() {\r\n if (!this.__file) throw new Error('File is undefined');\r\n return this.__file;\r\n }\r\n\r\n public inferContent = () => {\r\n return `You must collect information contained in this ${this.type} as help to build your tool choice.`;\r\n };\r\n\r\n public inferExtension = (extension: AIFileContentAllowedExtension) => {\r\n switch (extension) {\r\n case AIFileContentAllowedExtensions.jpg:\r\n case AIFileContentAllowedExtensions.jpeg:\r\n case AIFileContentAllowedExtensions.png:\r\n case AIFileContentAllowedExtensions.svg:\r\n return FileType.IMAGE;\r\n case AIFileContentAllowedExtensions.txt:\r\n case AIFileContentAllowedExtensions.doc:\r\n case AIFileContentAllowedExtensions.pdf:\r\n case AIFileContentAllowedExtensions.docx:\r\n return FileType.DOCUMENT;\r\n case AIFileContentAllowedExtensions.csv:\r\n case AIFileContentAllowedExtensions.xlsx:\r\n case AIFileContentAllowedExtensions.xls:\r\n return FileType.SHEET;\r\n case AIFileContentAllowedExtensions.mp3:\r\n case AIFileContentAllowedExtensions.wav:\r\n return FileType.AUDIO;\r\n default:\r\n this.__throwError(\r\n new Error(AIFileContent.__getExtensionErrorMessage(extension)),\r\n this.__error?.fileExtension,\r\n );\r\n }\r\n };\r\n\r\n // STATIC METHODS\r\n\r\n static isValidExtension = (\r\n extension: string,\r\n ): extension is AIFileContentAllowedExtension => {\r\n return (\r\n Object.values(\r\n AIFileContentAllowedExtensions,\r\n ) as AIFileContentAllowedExtension[]\r\n ).includes(extension as AIFileContentAllowedExtension);\r\n };\r\n\r\n static blobToBase64 = async (blob: Blob) => {\r\n return await ((blob: Blob): Promise<string> =>\r\n new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onloadend = () => {\r\n const base64String = reader.result as string;\r\n resolve(base64String);\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(blob);\r\n }))(blob);\r\n };\r\n\r\n static fromFile = async (\r\n f: File,\r\n error?: Partial<Record<TAttachmentErrorCallback, () => void>>,\r\n ): Promise<AIFileContent> => {\r\n const fileUrl = await ((f: File) =>\r\n new Promise<string>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(f);\r\n reader.onload = () => resolve(reader.result as string);\r\n reader.onerror = () => reject();\r\n }))(f);\r\n return new AIFileContent(fileUrl, f.name, f, error);\r\n };\r\n\r\n static getExtensionFromFileName(fileName: string) {\r\n return fileName.split('.', 2).pop() as AIFileContentAllowedExtension;\r\n }\r\n\r\n // PRIVATE METHODS\r\n\r\n private static __getExtensionErrorMessage(extension: string) {\r\n return `extension \"${extension}\" is not included into valid types:\\n${Object.keys(AIFileContentAllowedExtensions)}`;\r\n }\r\n\r\n private __throwError(e: Error, callback?: () => void) {\r\n callback && callback();\r\n throw e;\r\n }\r\n\r\n // COMPONENT METHODS\r\n\r\n Component = () => (\r\n <Box variant={'layout.common.components.aiMessage.fileBox'}>\r\n {FileType.IMAGE === this.type ? (\r\n <img src={URL.createObjectURL(this.file)} alt={this.fileName}></img>\r\n ) : (\r\n <FileIcon iconSize=\"lg\" docName={this.fileName} />\r\n )}\r\n <Box\r\n as={'p'}\r\n variant={'layout.common.components.aiMessage.fileName'}\r\n title={this.fileName}\r\n >\r\n {this.fileName}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n","import { AIMessageRole, Reactive } from './types';\r\nimport { AIContent } from './AIContent';\r\nimport { IconButton } from '@apia/components';\r\nimport { Box, getVariant } from '@apia/theme';\r\nimport { uniqueId } from '@apia/notifications';\r\nimport { getLabel } from '@apia/util';\r\nimport { Collector } from '@apia/validations';\r\n\r\nexport class AIMessageAttachments implements Reactive {\r\n role: AIMessageRole;\r\n content: AIContent;\r\n id = uniqueId();\r\n\r\n constructor(\r\n role: AIMessageRole,\r\n content: AIContent,\r\n private close?: () => void,\r\n ) {\r\n this.role = role;\r\n this.content = content;\r\n }\r\n\r\n addDescription = async () => {\r\n const collector = new Collector();\r\n const collected = await collector\r\n .add(\r\n new collector.fields.textarea(\r\n 'addCommentTextArea',\r\n 'TODO The description will help the assistant to understand the file content',\r\n ),\r\n )\r\n .show<{ addCommentTextArea: string }>({ title: 'TODO Add image Comment' })\r\n .catch((e) => {\r\n throw e;\r\n });\r\n collected?.addCommentTextArea &&\r\n (this.content.content = collected.addCommentTextArea);\r\n };\r\n\r\n Component = (props: {\r\n closeButton?: boolean;\r\n canAddDescription?: boolean;\r\n }) => (\r\n <Box {...getVariant('layout.common.components.aiMessage')}>\r\n {props.closeButton ? (\r\n <IconButton\r\n className=\"closeButton\"\r\n size=\"Md\"\r\n icon=\"Close\"\r\n onClick={this.close}\r\n title={getLabel('lblDeleteItem').title}\r\n ></IconButton>\r\n ) : (\r\n <></>\r\n )}\r\n {props?.canAddDescription ? (\r\n <IconButton\r\n className=\"descriptionButton\"\r\n size=\"Md\"\r\n icon=\"Magic\"\r\n onClick={this.addDescription}\r\n ></IconButton>\r\n ) : (\r\n <></>\r\n )}\r\n <this.content.Component />\r\n </Box>\r\n );\r\n}\r\n","import { getLabel } from '@apia/util';\r\nimport { ChatController } from '../ChatController';\r\nimport { ChatMessage } from '../messages/ChatMessage';\r\nimport { AIFileContent } from '../messages/aiMessage/AIFileContent';\r\nimport { AIMessageAttachments } from '../messages/aiMessage/AIMessageAttachments';\r\nimport {\r\n AIFileContentAllowedExtensions,\r\n AIMessageRole,\r\n} from '../messages/aiMessage/types';\r\n\r\nexport const handleFileUploadAsMessage = async (\r\n fileInputElement: HTMLInputElement,\r\n chatController: ChatController,\r\n) => {\r\n if (fileInputElement.files) {\r\n [...fileInputElement.files].forEach(async (f) => {\r\n const m: AIMessageAttachments = new AIMessageAttachments(\r\n AIMessageRole.USER,\r\n await AIFileContent.fromFile(f, {\r\n fileExtension: () =>\r\n chatController.messages.add(\r\n new ChatMessage(\r\n getLabel('msgAiIncorrectFileExtensionError', {\r\n text: {\r\n TOK1: `[${Object.keys(AIFileContentAllowedExtensions).join(', ')}]`,\r\n },\r\n }).text,\r\n 'error',\r\n ),\r\n ),\r\n }),\r\n () => chatController.attachments.drop(m),\r\n );\r\n chatController.attachments.add(m);\r\n });\r\n }\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { FormEvent, KeyboardEvent, useCallback, useState } from 'react';\r\nimport { ChatController } from './ChatController';\r\nimport { IconButton, SimpleButton } from '@apia/components';\r\nimport { Box, Textarea } from '@apia/theme';\r\nimport useHandleFileUpload, {\r\n WrongFormatError,\r\n} from './files/useHandleFileUpload';\r\nimport { getLabel, noNaN } from '@apia/util';\r\nimport { ChatMessage } from './messages/ChatMessage';\r\nimport { handleFileUploadAsMessage } from './files/handleFileUploadAsMessage';\r\nimport { observer } from 'mobx-react-lite';\r\n\r\nexport const makeTextarea = (chatController: ChatController) => {\r\n const NewTextarea = observer(\r\n ({\r\n hideDeleteButton,\r\n isLoading: outIsLoading,\r\n onSubmit,\r\n preventAppendUserMessages,\r\n }: {\r\n hideDeleteButton?: boolean;\r\n isLoading?: boolean;\r\n onSubmit: (chatMessage: ChatMessage) => Promise<void>;\r\n preventAppendUserMessages?: boolean;\r\n }) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const submit = useCallback(() => {\r\n if (preventAppendUserMessages !== true)\r\n chatController.messages.add(chatController.state.current);\r\n\r\n chatController.history.add(chatController.state.current);\r\n\r\n onSubmit(chatController.state.current).finally(() => {\r\n setIsLoading(false);\r\n\r\n chatController.state.current = new ChatMessage();\r\n });\r\n }, [onSubmit, preventAppendUserMessages]);\r\n\r\n const handleSubmit = useCallback(\r\n (ev: FormEvent<HTMLFormElement>) => {\r\n ev.preventDefault();\r\n if (\r\n chatController.state.current.message ||\r\n chatController.attachments.size() > 0\r\n ) {\r\n setIsLoading(true);\r\n submit();\r\n }\r\n const textarea = document.getElementById(\r\n `GPTMessage${chatController.id}`,\r\n ) as HTMLTextAreaElement;\r\n textarea.focus();\r\n },\r\n [submit],\r\n );\r\n\r\n const onKeyDown = useCallback((ev: KeyboardEvent) => {\r\n if ((ev.target as HTMLTextAreaElement).readOnly) return;\r\n\r\n if (ev.code === 'Enter' && !ev.shiftKey) {\r\n ev.preventDefault();\r\n (ev.target as HTMLElement)\r\n .closest('form')\r\n ?.querySelector<HTMLButtonElement>('button[type=\"submit\"]')\r\n ?.click();\r\n }\r\n }, []);\r\n\r\n const { progress, handleFileUpload } = useHandleFileUpload({\r\n onContent(content) {\r\n (\r\n document.getElementById(\r\n `GPTMessage${chatController.id}`,\r\n ) as HTMLTextAreaElement\r\n ).value = content.join('\\n\\n');\r\n },\r\n });\r\n\r\n const actualIsLoading = isLoading || progress !== 100 || outIsLoading;\r\n\r\n const [dragging, setDragging] = useState(false);\r\n\r\n const handleDragLeave = (ev: React.DragEvent<HTMLElement>) => {\r\n ev.preventDefault();\r\n setDragging(false);\r\n };\r\n\r\n const handleDrop = (ev: React.DragEvent<HTMLFormElement>) => {\r\n ev.preventDefault();\r\n setDragging(false);\r\n const fileElement = document.getElementById(\r\n `gptUploadFile__${chatController.id}`,\r\n ) as HTMLInputElement;\r\n fileElement.files = ev.dataTransfer.files;\r\n const event = new Event('change', { bubbles: true });\r\n fileElement.dispatchEvent(event);\r\n };\r\n\r\n const handleDragOver = (ev: React.DragEvent<HTMLElement>) => {\r\n ev.preventDefault();\r\n };\r\n\r\n const handleDragEnter = (ev: React.DragEvent<HTMLElement>) => {\r\n ev.preventDefault();\r\n setDragging(true);\r\n };\r\n\r\n return (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', width: '100%' }}>\r\n <Box\r\n sx={{\r\n flexWrap: 'wrap',\r\n display: 'flex',\r\n maxHeight: '280px',\r\n overflowY: 'auto',\r\n paddingTop: '6px',\r\n paddingBottom: '6px',\r\n }}\r\n >\r\n {chatController.attachments.getComponents()}\r\n </Box>\r\n <form\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onSubmit={handleSubmit}\r\n className=\"gpt__form\"\r\n action=\"\"\r\n >\r\n {dragging ? (\r\n <Box\r\n sx={{\r\n height: '150px',\r\n border: '3px dashed #aaa',\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n {getLabel('msgAiDragAndDrop').text}\r\n </Box>\r\n ) : (\r\n <Textarea\r\n onKeyDown={onKeyDown}\r\n id={`GPTMessage${chatController.id}`}\r\n readOnly={actualIsLoading}\r\n value={chatController.state.current.message as string}\r\n onChange={(ev) => {\r\n chatController.state.current.message = ev.target.value;\r\n if (\r\n !chatController.state.current.message &&\r\n chatController.attachments.size() < 1\r\n )\r\n chatController.currentHistoryIndex = -1;\r\n }}\r\n />\r\n )}\r\n\r\n <Box className=\"gpt__buttonsContainer\">\r\n <Box sx={{ display: 'none' }}>\r\n <input\r\n type=\"file\"\r\n className=\"gptUploadFile\"\r\n multiple\r\n id={`gptUploadFile__${chatController.id}`}\r\n onChange={(ev) => {\r\n if (1 == noNaN('a'))\r\n handleFileUpload(ev).catch((e) => {\r\n if (e instanceof WrongFormatError) {\r\n setIsLoading(false);\r\n chatController.messages.add(\r\n new ChatMessage(\r\n getLabel('msgAiFileExtensionError').text,\r\n 'error',\r\n ),\r\n );\r\n } else {\r\n throw e;\r\n }\r\n });\r\n else {\r\n handleFileUploadAsMessage(ev.target, chatController);\r\n }\r\n\r\n ev.target.value = '';\r\n }}\r\n />\r\n </Box>\r\n <IconButton\r\n variant=\"icon-outline\"\r\n onClick={() =>\r\n !chatController.audioRecorder.state.recording\r\n ? chatController.audioRecorder.start()\r\n : chatController.audioRecorder.stop()\r\n }\r\n disabled={\r\n actualIsLoading &&\r\n !chatController.audioRecorder.state.recording\r\n }\r\n sx={{\r\n color: chatController.audioRecorder.state.recording\r\n ? 'red'\r\n : undefined,\r\n }}\r\n icon={\r\n chatController.audioRecorder.state.recording\r\n ? 'Stop'\r\n : 'Microphone'\r\n }\r\n id=\"transcribeAudio\"\r\n size=\"Lg\"\r\n title={getLabel('lblAiRecordAudio').text}\r\n />\r\n <IconButton\r\n title={getLabel('btnUploadFile').text}\r\n icon=\"File\"\r\n variant=\"icon-outline\"\r\n disabled={actualIsLoading}\r\n onClick={() => {\r\n (\r\n document.getElementById(\r\n `gptUploadFile__${chatController.id}`,\r\n ) as HTMLElement\r\n ).click();\r\n }}\r\n size=\"Lg\"\r\n />\r\n <SimpleButton\r\n title={getLabel('btnAiPrevious').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={chatController.history.previous}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiPrevious').text}\r\n </SimpleButton>\r\n <SimpleButton\r\n title={getLabel('btnAiNext').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={chatController.history.next}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiNext').text}\r\n </SimpleButton>\r\n {!hideDeleteButton && (\r\n <>\r\n <SimpleButton\r\n title={getLabel('btnAiDelete').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={() => {\r\n chatController.state.current.message = '';\r\n chatController.attachments.dropAll();\r\n chatController.currentHistoryIndex = -1;\r\n }}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiDelete').text}\r\n </SimpleButton>\r\n <SimpleButton\r\n title={getLabel('btnAiDeleteMessages').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={() => chatController.messages.clear()}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiDeleteMessages').text}\r\n </SimpleButton>\r\n </>\r\n )}\r\n <SimpleButton\r\n title={getLabel('btnAiSend').title}\r\n isLoading={actualIsLoading}\r\n type=\"submit\"\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiSend').text}\r\n </SimpleButton>\r\n </Box>\r\n </form>\r\n </Box>\r\n );\r\n },\r\n );\r\n\r\n NewTextarea.displayName = '';\r\n\r\n return NewTextarea;\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { getVariant } from '@apia/theme';\r\nimport { Box } from '@apia/theme';\r\nimport { AutoscrollContainer } from './AutoscrollContainer';\r\nimport { makeTextarea } from './Textarea';\r\nimport { ChatMessage } from './messages/ChatMessage';\r\nimport { AIMessageAttachments } from './messages/aiMessage/AIMessageAttachments';\r\nimport { makeObservable, observable } from 'mobx';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { AudioRecorder } from '@apia/util';\r\nimport { AIMessageRole } from './messages/aiMessage/types';\r\nimport { AIFileContent } from './messages/aiMessage/AIFileContent';\r\n\r\nexport type TMessageType =\r\n | 'user'\r\n | 'system'\r\n | 'warning'\r\n | 'error'\r\n | 'information'\r\n | 'response'\r\n | 'multipleChoice'\r\n | 'customMessage';\r\n\r\ntype ChatControllerState = {\r\n current: ChatMessage;\r\n messages: ChatMessage[];\r\n};\r\n\r\nexport class ChatController {\r\n state: ChatControllerState = {\r\n current: new ChatMessage(),\r\n messages: [],\r\n };\r\n\r\n constructor(\r\n public id: string,\r\n welcomeMessage?: string,\r\n ) {\r\n if (welcomeMessage) {\r\n this.state.messages.splice(\r\n 0,\r\n 0,\r\n new ChatMessage(welcomeMessage, 'system'),\r\n );\r\n }\r\n\r\n makeObservable(this, { state: observable });\r\n }\r\n\r\n components = {\r\n MessageHistory: observer(() => {\r\n return (\r\n <Box\r\n {...getVariant('layout.common.components.chat')}\r\n className=\"history\"\r\n >\r\n <AutoscrollContainer>\r\n {this.state.messages.map((current) => (\r\n <current.Component key={current.id} />\r\n ))}\r\n </AutoscrollContainer>\r\n </Box>\r\n );\r\n }),\r\n Textarea: makeTextarea(this),\r\n };\r\n\r\n #promptsHistory: ChatMessage[] = [];\r\n currentHistoryIndex = -1;\r\n\r\n #internalAudioRecorder = new AudioRecorder();\r\n\r\n audioRecorder = {\r\n start: () =>\r\n this.#internalAudioRecorder.start().then(async (blob: Blob) => {\r\n const m: AIMessageAttachments = new AIMessageAttachments(\r\n AIMessageRole.USER,\r\n new AIFileContent(\r\n await AIFileContent.blobToBase64(blob),\r\n `userRecord_${this.audioRecorder.record++}.wav`,\r\n ),\r\n () => this.attachments.drop(m),\r\n );\r\n this.attachments.add(m);\r\n }),\r\n stop: async () => {\r\n this.#internalAudioRecorder.stop();\r\n },\r\n record: 0,\r\n state: this.#internalAudioRecorder.state,\r\n };\r\n\r\n history = {\r\n add: (message: ChatMessage) => {\r\n this.currentHistoryIndex = -1;\r\n\r\n if (message === this.#promptsHistory[this.#promptsHistory.length]) {\r\n return;\r\n }\r\n\r\n this.#promptsHistory = [\r\n message,\r\n ...this.#promptsHistory.slice(\r\n Math.max(0, this.#promptsHistory.length - 10),\r\n ),\r\n ];\r\n },\r\n next: () => {\r\n let message = new ChatMessage();\r\n if (this.#promptsHistory[this.currentHistoryIndex - 1])\r\n message = this.#promptsHistory[--this.currentHistoryIndex].copy();\r\n else {\r\n this.currentHistoryIndex = -1;\r\n }\r\n this.history.updateState(message);\r\n },\r\n previous: () => {\r\n if (this.#promptsHistory[this.currentHistoryIndex + 1]) {\r\n this.history.updateState(\r\n this.#promptsHistory[++this.currentHistoryIndex].copy(),\r\n );\r\n }\r\n },\r\n updateState: (message?: ChatMessage) => {\r\n if (message) this.state.current = message;\r\n else this.state.current = new ChatMessage();\r\n },\r\n size: () => this.state.messages.length,\r\n };\r\n\r\n messages = {\r\n add: (message: ChatMessage, idx?: number) => {\r\n if (idx !== undefined && idx !== null) {\r\n this.state.messages.splice(idx, 0, message);\r\n } else {\r\n this.state.messages.push(message);\r\n }\r\n },\r\n clear: () => {\r\n this.state.messages = [];\r\n },\r\n };\r\n\r\n attachments = {\r\n add: (...aiMessage: AIMessageAttachments[]) => {\r\n this.state.current.attachments.push(...aiMessage);\r\n },\r\n dropAll: () => void (this.state.current.attachments = []),\r\n drop: (el: AIMessageAttachments) => {\r\n this.state.current.attachments = this.state.current.attachments.filter(\r\n (c) => c !== el,\r\n );\r\n if (!this.state.current.message && this.attachments.size() < 1)\r\n this.currentHistoryIndex = -1;\r\n },\r\n getComponents: () =>\r\n this.state.current.attachments.map((x) => (\r\n <x.Component closeButton canAddDescription key={x.id} />\r\n )),\r\n get: () => this.state.current.attachments,\r\n size: () => this.state.current.attachments.length,\r\n };\r\n}\r\n","import { ApiaUtil, SimpleButton } from '@apia/components';\r\nimport { ChatMessage } from './ChatMessage';\r\nimport { Box, Paragraph } from '@apia/theme';\r\nimport { ReactElement } from 'react';\r\n\r\nexport type TMultipleChoiceMessageOption<OptionProps> = {\r\n label: string;\r\n url: string;\r\n additionalProps?: OptionProps;\r\n};\r\n\r\nexport class MultipleChoiceMessage<OptionProps> extends ChatMessage {\r\n constructor(\r\n question: string,\r\n options: TMultipleChoiceMessageOption<OptionProps>[],\r\n Renderer?: (props: {\r\n item: TMultipleChoiceMessageOption<OptionProps>;\r\n }) => ReactElement,\r\n ) {\r\n super(\r\n Renderer ? (\r\n <Box className=\"multipleChoiceMessage customRenderer\">\r\n <Paragraph>{question}</Paragraph>\r\n {options.map((item) => (\r\n <Renderer item={item} key={item.url} />\r\n ))}\r\n </Box>\r\n ) : (\r\n <Box className=\"multipleChoiceMessage\">\r\n <Paragraph>{question}</Paragraph>\r\n <Box as=\"ul\">\r\n {options.map((current) => (\r\n <li key={current.label}>\r\n <SimpleButton\r\n className=\"multipleChoice__option\"\r\n onClick={() => {\r\n ApiaUtil.instance.tabs.openTab(current.label, current.url);\r\n }}\r\n >\r\n {current.label}\r\n </SimpleButton>\r\n </li>\r\n ))}\r\n </Box>\r\n </Box>\r\n ),\r\n 'multipleChoice',\r\n );\r\n }\r\n}\r\n","import { EventEmitter } from '@apia/util';\r\n\r\nexport class ResponseStream extends EventEmitter<{ part: string }> {\r\n private buffer: string = '';\r\n private isRunning = false;\r\n private locked = false;\r\n private maxCompletionTime = 2; // s\r\n private minPartSize = 2;\r\n private partSize = 2;\r\n private timing = 5; // ms\r\n private waiting: string[] = [];\r\n\r\n public close() {}\r\n\r\n private calculatePartSize() {\r\n const totalSize =\r\n this.buffer.length +\r\n this.waiting.reduce<number>((a, b) => a + b.length, 0);\r\n\r\n this.partSize = Math.max(\r\n this.minPartSize,\r\n (totalSize * this.timing) / (this.maxCompletionTime * 1000),\r\n );\r\n }\r\n\r\n emit<K extends 'part'>(_: K, data: { part: string }[K]): void {\r\n if (this.locked) {\r\n this.waiting.push(data);\r\n } else {\r\n this.buffer += data;\r\n }\r\n this.calculatePartSize();\r\n this.run();\r\n }\r\n\r\n run() {\r\n if (!this.isRunning) {\r\n this.isRunning = true;\r\n const interval = setInterval(() => {\r\n this.locked = true;\r\n\r\n const choosedSize = Math.min(this.buffer.length, this.partSize);\r\n\r\n const part = this.buffer.slice(0, choosedSize);\r\n this.buffer = this.buffer.slice(choosedSize);\r\n\r\n while (this.waiting.length > 0) {\r\n const part = this.waiting.shift();\r\n if (part) {\r\n this.buffer += part;\r\n }\r\n }\r\n this.locked = false;\r\n if (part) {\r\n super.emit('part', part);\r\n } else {\r\n this.isRunning = false;\r\n clearInterval(interval);\r\n }\r\n }, this.timing);\r\n }\r\n }\r\n}\r\n","import axios from 'axios';\r\nimport { AudioRecorder } from '@apia/util';\r\nimport { ApiaApi, makeApiaUrl, parseSuccessfulResponse } from '@apia/api';\r\nimport { ResponseStream } from '@apia/ai';\r\nimport { action, makeObservable, observable } from 'mobx';\r\n\r\ntype RoutinesGenerationState = {\r\n isLoading: boolean;\r\n progress: number;\r\n};\r\n\r\ntype TPollProgress = {\r\n message: string;\r\n progress: number;\r\n debug: string;\r\n streamPart?: string;\r\n};\r\n\r\ntype TPollRoutineResult = {\r\n status: string;\r\n payload: unknown | TPollProgress;\r\n};\r\n\r\nexport type TGenerateFromImage = {\r\n base64: string;\r\n description: string;\r\n};\r\n\r\nexport type TRoutineCompletion = Partial<{\r\n images: TGenerateFromImage[];\r\n parameters: Record<string, string>;\r\n stream: ResponseStream;\r\n}> & {\r\n routineName: string;\r\n};\r\n\r\nfunction isPollProgress(\r\n payload: unknown | TPollProgress,\r\n): payload is TPollProgress {\r\n return (payload as TPollProgress)?.progress !== undefined;\r\n}\r\n\r\nexport class RoutinesGeneration {\r\n public audioRecorder = new AudioRecorder();\r\n private routineId: string = '';\r\n public state: RoutinesGenerationState = {\r\n isLoading: false,\r\n progress: 0,\r\n };\r\n\r\n public constructor() {\r\n makeObservable(this, {\r\n completion: action,\r\n state: observable,\r\n stop: action,\r\n transcribeAudio: action,\r\n });\r\n }\r\n\r\n private checkCanGenerate() {\r\n if (this.state.isLoading) {\r\n throw new Error('Cannot queue two simultaneous generations');\r\n }\r\n\r\n this.state.isLoading = true;\r\n }\r\n\r\n private async pollRoutine<T>(stream?: ResponseStream) {\r\n while (this.state.isLoading) {\r\n const pollResult = await this.poll(this.routineId);\r\n if (isPollProgress(pollResult.payload)) {\r\n try {\r\n const res = JSON.parse(pollResult.payload.debug) as string[];\r\n if (res.length > 0) {\r\n res.forEach((c) => {\r\n console.log(JSON.parse(c));\r\n });\r\n }\r\n\r\n if (pollResult.payload.streamPart && stream) {\r\n stream.emit('part', pollResult.payload.streamPart);\r\n }\r\n this.state.progress = pollResult.payload.progress;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n } else if (pollResult.status === 'FINISHED') {\r\n this.resetLoading();\r\n return pollResult.payload as T;\r\n } else {\r\n throw new Error('Wrong poll response');\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private async executeRoutine<T>(\r\n routineName: string,\r\n prompts: Record<string, string>,\r\n images: TGenerateFromImage[],\r\n stream?: ResponseStream,\r\n ): Promise<T | null> {\r\n this.checkCanGenerate();\r\n\r\n try {\r\n const routineStartResult = await ApiaApi.post<{\r\n orchestrator: { routineId: string };\r\n }>(\r\n makeApiaUrl({\r\n action: 'routineStart',\r\n routine: routineName,\r\n }),\r\n {\r\n postData: {\r\n images: JSON.stringify(images),\r\n ...prompts,\r\n },\r\n stringifyOptions: {\r\n arrayFormat: 'repeat',\r\n },\r\n postDataTreatement: 'stringify',\r\n },\r\n );\r\n\r\n if (routineStartResult?.data?.orchestrator?.routineId !== undefined) {\r\n this.routineId = routineStartResult?.data?.orchestrator?.routineId;\r\n\r\n return this.pollRoutine<T>(stream);\r\n } else {\r\n throw new Error('Cannot get routine id');\r\n }\r\n } catch (e) {\r\n this.resetLoading();\r\n throw e;\r\n }\r\n }\r\n\r\n private async poll(routineId: string): Promise<TPollRoutineResult> {\r\n const result = await ApiaApi.post<{ orchestrator: string }>(\r\n makeApiaUrl({\r\n action: 'routinePoll',\r\n routineId,\r\n }),\r\n );\r\n\r\n if (result?.data?.orchestrator) {\r\n return JSON.parse(result.data.orchestrator) as TPollRoutineResult;\r\n } else {\r\n throw new Error('Poll failed');\r\n }\r\n }\r\n\r\n private resetLoading() {\r\n this.state.isLoading = false;\r\n this.state.progress = 0;\r\n }\r\n\r\n public async completion<T>(params: TRoutineCompletion) {\r\n return this.executeRoutine<T>(\r\n params.routineName,\r\n params.parameters ?? {},\r\n params.images ?? [],\r\n params.stream,\r\n );\r\n }\r\n\r\n public stop() {\r\n this.resetLoading();\r\n ApiaApi.get<{\r\n orchestrator: { routineId: string };\r\n }>(\r\n makeApiaUrl({\r\n action: 'routineStop',\r\n routineId: this.routineId,\r\n }),\r\n );\r\n }\r\n\r\n public async transcribeAudio(audio: Blob) {\r\n const arrayBuffer = await audio.arrayBuffer();\r\n\r\n const url = makeApiaUrl({\r\n action: 'routineStart',\r\n routine: 'transcription/Transcribe',\r\n });\r\n\r\n const response = await axios.post(url, arrayBuffer, {\r\n headers: {\r\n 'Content-Type': 'application/octet-stream',\r\n },\r\n });\r\n\r\n if (response.data) {\r\n const result = await parseSuccessfulResponse<{\r\n orchestrator: { routineId: string };\r\n }>(response, url);\r\n\r\n this.state.isLoading = true;\r\n if (result?.orchestrator?.routineId) {\r\n this.routineId = result?.orchestrator?.routineId;\r\n return await this.pollRoutine<{\r\n transcription: string;\r\n }>();\r\n }\r\n }\r\n\r\n throw new Error('Something went wrong while transcribing the audio');\r\n }\r\n}\r\n"],"names":["progress","__publicField","FileType","AIMessageRole","blob","f","part"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/chat/AutoscrollContainer.tsx","../src/files/ocr/getImageOcrMaker.ts","../src/files/pdf/getPdfReader.ts","../src/components/chat/files/useHandleFileUpload.ts","../src/components/chat/messages/ChatMessage.tsx","../src/components/chat/messages/aiMessage/AIContent.tsx","../src/components/chat/messages/aiMessage/types.ts","../src/components/chat/messages/aiMessage/AIFileContent.tsx","../src/components/chat/messages/aiMessage/AIMessageAttachments.tsx","../src/components/chat/files/handleFileUploadAsMessage.ts","../src/components/chat/Textarea.tsx","../src/components/chat/ChatController.tsx","../src/components/chat/messages/MultipleChoiceMessage.tsx","../src/stream/ResponseStream.ts","../src/routines/RoutinesGeneration.ts","../src/components/documents/ImageBinaryField/getImage.ts","../src/components/documents/UploadModal/ImageIcon.tsx","../src/components/documents/ImageBinaryField/getImageSrcString.ts","../src/components/documents/UploadModal/getImagesWithDescription.tsx"],"sourcesContent":["import { getVariant } from '@apia/theme';\r\nimport { ReactNode, useCallback, useRef } from 'react';\r\nimport { Box } from '@apia/theme';\r\n\r\nexport const AutoscrollContainer = ({ children }: { children: ReactNode }) => {\r\n const observer = useRef<MutationObserver | null>(null);\r\n const unsuscribe = useRef<(() => void) | null>(null);\r\n const isFullScrolled = useRef(false);\r\n const hasInited = useRef(false);\r\n\r\n const ref = useCallback((el: HTMLElement) => {\r\n if (!el) return;\r\n\r\n if (!hasInited.current) {\r\n hasInited.current = true;\r\n el.scrollTo({\r\n top: el.getBoundingClientRect().height,\r\n behavior: 'auto',\r\n });\r\n isFullScrolled.current = true;\r\n }\r\n\r\n observer.current?.disconnect();\r\n unsuscribe.current?.();\r\n\r\n observer.current = new MutationObserver(([mutation]) => {\r\n if (\r\n mutation &&\r\n mutation.target instanceof HTMLElement &&\r\n mutation.target === el\r\n ) {\r\n if (\r\n isFullScrolled.current &&\r\n mutation.target.scrollTop !==\r\n mutation.target.scrollHeight - mutation.target.offsetHeight\r\n ) {\r\n // eslint-disable-next-line no-param-reassign\r\n mutation.target.scrollTo({\r\n top: mutation.target.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n }\r\n });\r\n observer.current.observe(el, { childList: true, subtree: true });\r\n\r\n const handleScroll = (ev: Event) => {\r\n if (ev.target === el && el instanceof HTMLElement) {\r\n setTimeout(() => {\r\n isFullScrolled.current =\r\n Math.abs(el.scrollTop - (el.scrollHeight - el.offsetHeight)) < 150;\r\n }, 100);\r\n }\r\n };\r\n el.addEventListener('scroll', handleScroll);\r\n unsuscribe.current = () => {\r\n el.removeEventListener('scroll', handleScroll);\r\n };\r\n }, []);\r\n\r\n return (\r\n <Box\r\n {...getVariant('layout.common.components.autoscrollContainer')}\r\n className=\"autoscrollContainer\"\r\n ref={ref}\r\n >\r\n {children}\r\n </Box>\r\n );\r\n};\r\n","import { FileProcessor } from '../FileProcessor';\r\n\r\nexport function isImageFile(file: File) {\r\n const IMAGE_EXTENSIONS = [\r\n 'jpg',\r\n 'jpeg',\r\n 'png',\r\n 'gif',\r\n 'bmp',\r\n 'webp',\r\n 'tiff',\r\n 'svg',\r\n 'jfif',\r\n ];\r\n\r\n return IMAGE_EXTENSIONS.includes(file.name.split('.').pop() as string);\r\n}\r\n\r\nexport default function getImageOcrMaker(lang: 'eng' | 'spa') {\r\n return new (class ImageOcrMaker implements FileProcessor {\r\n async processFile(\r\n file: File,\r\n onProgress?: (progress: number) => unknown,\r\n ): Promise<string[]> {\r\n const tesseract = await import('tesseract.js');\r\n\r\n const worker = await tesseract.createWorker(lang, 1, {\r\n logger(arg) {\r\n onProgress?.(arg.progress * 100);\r\n },\r\n });\r\n\r\n const result = (await worker.recognize(file)).data.text;\r\n return [result];\r\n }\r\n\r\n willProcessFile(file: File) {\r\n return isImageFile(file);\r\n }\r\n })();\r\n}\r\n","import { FileProcessor } from '../FileProcessor';\r\n\r\nexport function isPdfFile(file: File) {\r\n const IMAGE_EXTENSIONS = ['pdf'];\r\n\r\n return IMAGE_EXTENSIONS.includes(file.name.split('.').pop() as string);\r\n}\r\n\r\nexport default function getPdfReader() {\r\n return new (class PdfReader implements FileProcessor {\r\n async processFile(\r\n file: File,\r\n onProgress?: (progress: number) => void,\r\n ): Promise<string[]> {\r\n onProgress?.(0);\r\n const { getDocument, GlobalWorkerOptions } = await import('pdfjs-dist');\r\n\r\n async function getPdfTextFromArrayBuffer(\r\n buffer: ArrayBuffer,\r\n ): Promise<string[]> {\r\n GlobalWorkerOptions.workerSrc = '../includes/pdf.worker.min.js';\r\n\r\n const pdf = await getDocument({ data: buffer }).promise;\r\n\r\n const pages: string[] = [];\r\n\r\n for (let i = 1; i <= pdf.numPages; i++) {\r\n const page = await pdf.getPage(i);\r\n const textContent = await page.getTextContent();\r\n\r\n // Concatenar texto de cada página\r\n pages.push(\r\n textContent.items\r\n .map((item) => (item as { str: string }).str)\r\n .join(' '),\r\n );\r\n }\r\n\r\n return pages;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = async function (event: ProgressEvent<FileReader>) {\r\n if (!event.target?.result) {\r\n alert('Error al leer el archivo.');\r\n return;\r\n }\r\n\r\n const buffer: ArrayBuffer = event.target.result as ArrayBuffer;\r\n const text = await getPdfTextFromArrayBuffer(buffer);\r\n\r\n onProgress?.(100);\r\n resolve(text);\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n });\r\n }\r\n\r\n willProcessFile(file: File) {\r\n return isPdfFile(file);\r\n }\r\n })();\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { ChangeEvent, useCallback, useState } from 'react';\r\nimport getImageOcrMaker, {\r\n isImageFile,\r\n} from '../../../files/ocr/getImageOcrMaker';\r\nimport getPdfReader, { isPdfFile } from '../../../files/pdf/getPdfReader';\r\n\r\nexport class WrongFormatError extends Error {\r\n constructor(fileName: string) {\r\n super(`File format not supported: ${fileName}`);\r\n }\r\n}\r\n\r\nexport default function useHandleFileUpload({\r\n onContent,\r\n}: {\r\n onContent: (content: string[]) => unknown;\r\n}) {\r\n const [progress, setProgress] = useState(100);\r\n\r\n const handleFileUpload = useCallback(\r\n async (ev: ChangeEvent<HTMLInputElement>) => {\r\n setProgress(0);\r\n const imageProcessor = getImageOcrMaker('spa');\r\n const pdfProcessor = getPdfReader();\r\n\r\n await (async () => {\r\n const obtainedText: string[] = [];\r\n const files = ev.target.files;\r\n const filesLength = ev.target.files?.length ?? 0;\r\n if (files) {\r\n for (let i = 0; i < filesLength; i++) {\r\n const file = files[i];\r\n\r\n if (!isImageFile(file) && !isPdfFile(file)) {\r\n setProgress(100);\r\n throw new WrongFormatError(file.name);\r\n }\r\n\r\n const handleProgress = (progress: number) => {\r\n setProgress(\r\n (i / filesLength) * 100 +\r\n (1 / filesLength) * 100 * (progress / 100),\r\n );\r\n };\r\n\r\n let result = '';\r\n if (imageProcessor.willProcessFile(file)) {\r\n try {\r\n result = (\r\n await imageProcessor.processFile(file, handleProgress)\r\n )[0];\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n } else if (pdfProcessor.willProcessFile(file)) {\r\n result = (\r\n await pdfProcessor.processFile(file, handleProgress)\r\n ).join('\\n\\n');\r\n try {\r\n //\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n }\r\n\r\n if (result) {\r\n obtainedText.push(result);\r\n }\r\n\r\n setProgress(((i + 1) / filesLength) * 100);\r\n }\r\n }\r\n onContent(obtainedText);\r\n })();\r\n\r\n ev.target.value = '';\r\n },\r\n [onContent],\r\n );\r\n\r\n return { progress, handleFileUpload };\r\n}\r\n","import { ReactNode } from 'react';\r\nimport { TMessageType } from '../ChatController';\r\nimport { AIMessageAttachments } from './aiMessage/AIMessageAttachments';\r\nimport { Box } from '@apia/theme';\r\nimport { makeObservable, observable } from 'mobx';\r\n\r\nlet maxId = 0;\r\n\r\nexport class ChatMessage {\r\n id: number;\r\n\r\n parseMessage(message: string) {\r\n let result = message;\r\n\r\n result = result.replaceAll('[strong]', '<strong>');\r\n result = result.replaceAll('[/strong]', '</strong>');\r\n\r\n return result;\r\n }\r\n\r\n constructor(\r\n public message: ReactNode = '',\r\n public messageType: TMessageType = 'user',\r\n public attachments: AIMessageAttachments[] = [],\r\n ) {\r\n this.id = maxId++;\r\n if (messageType === 'response') this.messageType = 'system';\r\n if (typeof message === 'string') this.message = this.parseMessage(message);\r\n\r\n makeObservable(this, {\r\n attachments: observable,\r\n message: observable,\r\n messageType: observable,\r\n });\r\n }\r\n\r\n copy = () =>\r\n new ChatMessage(this.message, this.messageType, this.attachments);\r\n\r\n Component = () => {\r\n return (\r\n <Box\r\n as=\"pre\"\r\n className={`history__message ${this.messageType}`}\r\n key={this.id}\r\n >\r\n <Box\r\n className=\"text_wrapper\"\r\n {...(typeof this.message === 'string'\r\n ? { dangerouslySetInnerHTML: { __html: this.message } }\r\n : { children: this.message })}\r\n />\r\n <Box className=\"additionalContent_wrapper\">\r\n {this.attachments.map((x) => (\r\n <x.Component key={x.id} />\r\n ))}\r\n </Box>\r\n </Box>\r\n );\r\n };\r\n}\r\n","import { Box } from '@apia/theme';\r\nimport { Reactive } from './types';\r\nimport { ReactNode } from 'react';\r\nimport { CollectorField } from '@apia/validations';\r\nimport { uniqueId } from '@apia/notifications';\r\n\r\nexport class AIContent extends CollectorField implements Reactive {\r\n type = 'aiContent';\r\n content: ReactNode;\r\n\r\n constructor(content?: ReactNode) {\r\n super(uniqueId(), '');\r\n this.content = content;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n Component = () => {\r\n return (\r\n <Box variant={'layout.common.components.aiMessage.textBox'}>\r\n <Box variant={'layout.common.components.aiMessage.textSnippet'}>\r\n {this.content}\r\n </Box>\r\n </Box>\r\n );\r\n };\r\n}\r\n","import { FC } from 'react';\r\n\r\n// CONSTANTS\r\nexport const AIFileContentAllowedExtensions = {\r\n svg: 'svg',\r\n png: 'png',\r\n jpg: 'jpg',\r\n jpeg: 'jpeg',\r\n txt: 'txt',\r\n doc: 'doc',\r\n pdf: 'pdf',\r\n docx: 'docx',\r\n csv: 'csv',\r\n xlsx: 'xlsx',\r\n xls: 'xls',\r\n mp3: 'mp3',\r\n wav: 'wav',\r\n} as const;\r\n\r\n// TYPES\r\nexport type AIFileContentAllowedExtension =\r\n keyof typeof AIFileContentAllowedExtensions;\r\n\r\nexport type TAttachmentErrorCallback = 'fileExtension' | 'blobGeneration';\r\n\r\n//ENUMS\r\nexport enum FileType {\r\n DOCUMENT = 'DOCUMENT',\r\n IMAGE = 'IMAGE',\r\n AUDIO = 'AUDIO',\r\n SHEET = 'SHEET',\r\n}\r\n\r\nexport enum AIMessageRole {\r\n USER = 'USER',\r\n SYSTEM = 'SYSTEM',\r\n}\r\n\r\n// INTERFACES\r\nexport interface Reactive {\r\n Component: FC<any>;\r\n}\r\n","import { Box } from '@apia/theme';\r\nimport { AIContent } from './AIContent';\r\nimport {\r\n AIFileContentAllowedExtension,\r\n AIFileContentAllowedExtensions,\r\n FileType,\r\n Reactive,\r\n TAttachmentErrorCallback,\r\n} from './types';\r\nimport { FileIcon } from '@apia/icons';\r\n\r\nexport class AIFileContent extends AIContent implements Reactive {\r\n type: FileType;\r\n fileUrl: string;\r\n fileName: string;\r\n extension: AIFileContentAllowedExtension;\r\n private __file: File | undefined;\r\n private __error?: Partial<Record<TAttachmentErrorCallback, () => void>>;\r\n private overrideSize: { width: number; height: number } | undefined;\r\n\r\n constructor(\r\n fileUrl: string,\r\n fileName: string,\r\n f?: File,\r\n error?: Partial<Record<TAttachmentErrorCallback, () => void>>,\r\n ) {\r\n const extension = AIFileContent.getExtensionFromFileName(fileName);\r\n super();\r\n this.__error = error;\r\n if (!AIFileContent.isValidExtension(extension))\r\n this.__throwError(\r\n new Error(AIFileContent.__getExtensionErrorMessage(extension)),\r\n this.__error?.fileExtension,\r\n );\r\n this.fileUrl = fileUrl;\r\n this.extension = extension;\r\n this.type = this.inferExtension(this.extension) as FileType;\r\n this.fileName = fileName;\r\n this.__file = f;\r\n this.content = this.inferContent();\r\n }\r\n\r\n // PUBLIC METHODS\r\n\r\n public setOverrideSize(overrideSize: { width: number; height: number }) {\r\n this.overrideSize = overrideSize;\r\n return this;\r\n }\r\n\r\n public get file() {\r\n if (!this.__file) throw new Error('File is undefined');\r\n return this.__file;\r\n }\r\n\r\n public inferContent = () => {\r\n return `You must collect information contained in this ${this.type} as help to build your tool choice.`;\r\n };\r\n\r\n public inferExtension = (extension: AIFileContentAllowedExtension) => {\r\n switch (extension) {\r\n case AIFileContentAllowedExtensions.jpg:\r\n case AIFileContentAllowedExtensions.jpeg:\r\n case AIFileContentAllowedExtensions.png:\r\n case AIFileContentAllowedExtensions.svg:\r\n return FileType.IMAGE;\r\n case AIFileContentAllowedExtensions.txt:\r\n case AIFileContentAllowedExtensions.doc:\r\n case AIFileContentAllowedExtensions.pdf:\r\n case AIFileContentAllowedExtensions.docx:\r\n return FileType.DOCUMENT;\r\n case AIFileContentAllowedExtensions.csv:\r\n case AIFileContentAllowedExtensions.xlsx:\r\n case AIFileContentAllowedExtensions.xls:\r\n return FileType.SHEET;\r\n case AIFileContentAllowedExtensions.mp3:\r\n case AIFileContentAllowedExtensions.wav:\r\n return FileType.AUDIO;\r\n default:\r\n this.__throwError(\r\n new Error(AIFileContent.__getExtensionErrorMessage(extension)),\r\n this.__error?.fileExtension,\r\n );\r\n }\r\n };\r\n\r\n // STATIC METHODS\r\n\r\n static isValidExtension = (\r\n extension: string,\r\n ): extension is AIFileContentAllowedExtension => {\r\n return (\r\n Object.values(\r\n AIFileContentAllowedExtensions,\r\n ) as AIFileContentAllowedExtension[]\r\n ).includes(extension as AIFileContentAllowedExtension);\r\n };\r\n\r\n static blobToBase64 = async (blob: Blob) => {\r\n return await ((blob: Blob): Promise<string> =>\r\n new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onloadend = () => {\r\n const base64String = reader.result as string;\r\n resolve(base64String);\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(blob);\r\n }))(blob);\r\n };\r\n\r\n static fromFile = async (\r\n f: File,\r\n error?: Partial<Record<TAttachmentErrorCallback, () => void>>,\r\n ): Promise<AIFileContent> => {\r\n const fileUrl = await ((f: File) =>\r\n new Promise<string>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.readAsDataURL(f);\r\n reader.onload = () => resolve(reader.result as string);\r\n reader.onerror = () => reject();\r\n }))(f);\r\n return new AIFileContent(fileUrl, f.name, f, error);\r\n };\r\n\r\n static getExtensionFromFileName(fileName: string) {\r\n return fileName.split('.', 2).pop() as AIFileContentAllowedExtension;\r\n }\r\n\r\n // PRIVATE METHODS\r\n\r\n private static __getExtensionErrorMessage(extension: string) {\r\n return `extension \"${extension}\" is not included into valid types:\\n${Object.keys(AIFileContentAllowedExtensions)}`;\r\n }\r\n\r\n private __throwError(e: Error, callback?: () => void) {\r\n callback && callback();\r\n throw e;\r\n }\r\n\r\n // COMPONENT METHODS\r\n\r\n Component = () => (\r\n <Box\r\n sx={{\r\n ...(this.overrideSize\r\n ? {\r\n ...this.overrideSize,\r\n img: {\r\n width: `${this.overrideSize.width - 20}px`,\r\n height: `${this.overrideSize.height - 61}px`,\r\n },\r\n }\r\n : {}),\r\n }}\r\n variant={'layout.common.components.aiMessage.fileBox'}\r\n >\r\n {FileType.IMAGE === this.type ? (\r\n <img src={URL.createObjectURL(this.file)} alt={this.fileName}></img>\r\n ) : (\r\n <FileIcon iconSize=\"lg\" docName={this.fileName} />\r\n )}\r\n <Box\r\n as={'p'}\r\n variant={'layout.common.components.aiMessage.fileName'}\r\n title={this.fileName}\r\n >\r\n {this.fileName}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n","import { AIMessageRole, Reactive } from './types';\r\nimport { AIContent } from './AIContent';\r\nimport { IconButton } from '@apia/components';\r\nimport { Box, getVariant } from '@apia/theme';\r\nimport { uniqueId } from '@apia/notifications';\r\nimport { getLabel } from '@apia/util';\r\nimport { Collector } from '@apia/validations';\r\nimport { AIFileContent } from './AIFileContent';\r\n\r\nexport class AIMessageAttachments implements Reactive {\r\n role: AIMessageRole;\r\n content: AIContent;\r\n id = uniqueId();\r\n customDescription = false;\r\n\r\n constructor(\r\n role: AIMessageRole,\r\n content: AIContent,\r\n private close?: () => void,\r\n ) {\r\n this.role = role;\r\n this.content = content;\r\n }\r\n\r\n addDescription = async () => {\r\n const collector = new Collector();\r\n const collected = await collector\r\n .add(\r\n this.content instanceof AIFileContent\r\n ? this.content.setOverrideSize({ height: 320, width: 330 })\r\n : this.content,\r\n )\r\n .add(\r\n new collector.fields.textarea(\r\n 'addCommentTextArea',\r\n getLabel('lblAiAddImageCo').text,\r\n {\r\n initialValue:\r\n this.content instanceof AIFileContent &&\r\n this.content.content !== this.content.inferContent()\r\n ? (this.content.content as string)\r\n : '',\r\n },\r\n ),\r\n )\r\n .show<{ addCommentTextArea: string }>({\r\n title: getLabel('btnAddComment').text,\r\n })\r\n .catch((e) => {\r\n throw e;\r\n });\r\n if (collected?.addCommentTextArea) {\r\n this.content.content = collected.addCommentTextArea;\r\n this.customDescription = true;\r\n } else {\r\n if (this.content instanceof AIFileContent)\r\n this.content.content = this.content.inferContent();\r\n this.customDescription = false;\r\n }\r\n };\r\n\r\n Component = (props: {\r\n closeButton?: boolean;\r\n canAddDescription?: boolean;\r\n }) => (\r\n <Box {...getVariant('layout.common.components.aiMessage')}>\r\n {props.closeButton ? (\r\n <IconButton\r\n className=\"closeButton\"\r\n size=\"Md\"\r\n icon=\"Close\"\r\n onClick={this.close}\r\n title={getLabel('lblDeleteItem').title}\r\n ></IconButton>\r\n ) : (\r\n <></>\r\n )}\r\n {props?.canAddDescription ? (\r\n <IconButton\r\n className=\"descriptionButton\"\r\n size=\"Md\"\r\n icon=\"Magic\"\r\n onClick={this.addDescription}\r\n ></IconButton>\r\n ) : (\r\n <></>\r\n )}\r\n <this.content.Component />\r\n </Box>\r\n );\r\n}\r\n","import { getLabel } from '@apia/util';\r\nimport { ChatController } from '../ChatController';\r\nimport { ChatMessage } from '../messages/ChatMessage';\r\nimport { AIFileContent } from '../messages/aiMessage/AIFileContent';\r\nimport { AIMessageAttachments } from '../messages/aiMessage/AIMessageAttachments';\r\nimport {\r\n AIFileContentAllowedExtensions,\r\n AIMessageRole,\r\n} from '../messages/aiMessage/types';\r\n\r\nexport const handleFileUploadAsMessage = async (\r\n fileInputElement: HTMLInputElement,\r\n chatController: ChatController,\r\n) => {\r\n if (fileInputElement.files) {\r\n [...fileInputElement.files].forEach(async (f) => {\r\n const m: AIMessageAttachments = new AIMessageAttachments(\r\n AIMessageRole.USER,\r\n await AIFileContent.fromFile(f, {\r\n fileExtension: () =>\r\n chatController.messages.add(\r\n new ChatMessage(\r\n getLabel('msgAiIncorrectFileExtensionError', {\r\n text: {\r\n TOK1: `[${Object.keys(AIFileContentAllowedExtensions).join(', ')}]`,\r\n },\r\n }).text,\r\n 'error',\r\n ),\r\n ),\r\n }),\r\n () => chatController.attachments.drop(m),\r\n );\r\n chatController.attachments.add(m);\r\n });\r\n }\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { FormEvent, KeyboardEvent, useCallback, useState } from 'react';\r\nimport { ChatController } from './ChatController';\r\nimport { IconButton, SimpleButton } from '@apia/components';\r\nimport { Box, Textarea } from '@apia/theme';\r\nimport useHandleFileUpload, {\r\n WrongFormatError,\r\n} from './files/useHandleFileUpload';\r\nimport { getLabel, noNaN } from '@apia/util';\r\nimport { ChatMessage } from './messages/ChatMessage';\r\nimport { handleFileUploadAsMessage } from './files/handleFileUploadAsMessage';\r\nimport { observer } from 'mobx-react-lite';\r\n\r\nexport const makeTextarea = (chatController: ChatController) => {\r\n const NewTextarea = observer(\r\n ({\r\n hideDeleteButton,\r\n isLoading: outIsLoading,\r\n onSubmit,\r\n preventAppendUserMessages,\r\n }: {\r\n hideDeleteButton?: boolean;\r\n isLoading?: boolean;\r\n onSubmit: (chatMessage: ChatMessage) => Promise<void>;\r\n preventAppendUserMessages?: boolean;\r\n }) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const submit = useCallback(() => {\r\n if (preventAppendUserMessages !== true)\r\n chatController.messages.add(chatController.state.current);\r\n\r\n chatController.history.add(chatController.state.current);\r\n\r\n onSubmit(chatController.state.current).finally(() => {\r\n setIsLoading(false);\r\n\r\n chatController.state.current = new ChatMessage();\r\n });\r\n }, [onSubmit, preventAppendUserMessages]);\r\n\r\n const handleSubmit = useCallback(\r\n (ev: FormEvent<HTMLFormElement>) => {\r\n ev.preventDefault();\r\n if (\r\n chatController.state.current.message ||\r\n chatController.attachments.size() > 0\r\n ) {\r\n setIsLoading(true);\r\n submit();\r\n }\r\n const textarea = document.getElementById(\r\n `GPTMessage${chatController.id}`,\r\n ) as HTMLTextAreaElement;\r\n textarea.focus();\r\n },\r\n [submit],\r\n );\r\n\r\n const onKeyDown = useCallback((ev: KeyboardEvent) => {\r\n if ((ev.target as HTMLTextAreaElement).readOnly) return;\r\n\r\n if (ev.code === 'Enter' && !ev.shiftKey) {\r\n ev.preventDefault();\r\n (ev.target as HTMLElement)\r\n .closest('form')\r\n ?.querySelector<HTMLButtonElement>('button[type=\"submit\"]')\r\n ?.click();\r\n }\r\n }, []);\r\n\r\n const { progress, handleFileUpload } = useHandleFileUpload({\r\n onContent(content) {\r\n (\r\n document.getElementById(\r\n `GPTMessage${chatController.id}`,\r\n ) as HTMLTextAreaElement\r\n ).value = content.join('\\n\\n');\r\n },\r\n });\r\n\r\n const actualIsLoading = isLoading || progress !== 100 || outIsLoading;\r\n\r\n const [dragging, setDragging] = useState(false);\r\n\r\n const handleDragLeave = (ev: React.DragEvent<HTMLElement>) => {\r\n ev.preventDefault();\r\n setDragging(false);\r\n };\r\n\r\n const handleDrop = (ev: React.DragEvent<HTMLFormElement>) => {\r\n ev.preventDefault();\r\n setDragging(false);\r\n const fileElement = document.getElementById(\r\n `gptUploadFile__${chatController.id}`,\r\n ) as HTMLInputElement;\r\n fileElement.files = ev.dataTransfer.files;\r\n const event = new Event('change', { bubbles: true });\r\n fileElement.dispatchEvent(event);\r\n };\r\n\r\n const handleDragOver = (ev: React.DragEvent<HTMLElement>) => {\r\n ev.preventDefault();\r\n };\r\n\r\n const handleDragEnter = (ev: React.DragEvent<HTMLElement>) => {\r\n ev.preventDefault();\r\n setDragging(true);\r\n };\r\n\r\n return (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', width: '100%' }}>\r\n <Box\r\n sx={{\r\n flexWrap: 'wrap',\r\n display: 'flex',\r\n maxHeight: '280px',\r\n overflowY: 'auto',\r\n paddingTop: '6px',\r\n paddingBottom: '6px',\r\n }}\r\n >\r\n {chatController.attachments.getComponents()}\r\n </Box>\r\n <form\r\n onDrop={handleDrop}\r\n onDragOver={handleDragOver}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onSubmit={handleSubmit}\r\n className=\"gpt__form\"\r\n action=\"\"\r\n >\r\n {dragging ? (\r\n <Box\r\n sx={{\r\n height: '150px',\r\n border: '3px dashed #aaa',\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n }}\r\n >\r\n {getLabel('msgAiDragAndDrop').text}\r\n </Box>\r\n ) : (\r\n <Textarea\r\n onKeyDown={onKeyDown}\r\n id={`GPTMessage${chatController.id}`}\r\n readOnly={actualIsLoading}\r\n value={chatController.state.current.message as string}\r\n onChange={(ev) => {\r\n chatController.state.current.message = ev.target.value;\r\n if (\r\n !chatController.state.current.message &&\r\n chatController.attachments.size() < 1\r\n )\r\n chatController.currentHistoryIndex = -1;\r\n }}\r\n />\r\n )}\r\n\r\n <Box className=\"gpt__buttonsContainer\">\r\n <Box sx={{ display: 'none' }}>\r\n <input\r\n type=\"file\"\r\n className=\"gptUploadFile\"\r\n multiple\r\n id={`gptUploadFile__${chatController.id}`}\r\n onChange={(ev) => {\r\n if (1 == noNaN('a'))\r\n handleFileUpload(ev).catch((e) => {\r\n if (e instanceof WrongFormatError) {\r\n setIsLoading(false);\r\n chatController.messages.add(\r\n new ChatMessage(\r\n getLabel('msgAiFileExtensionError').text,\r\n 'error',\r\n ),\r\n );\r\n } else {\r\n throw e;\r\n }\r\n });\r\n else {\r\n handleFileUploadAsMessage(ev.target, chatController);\r\n }\r\n\r\n ev.target.value = '';\r\n }}\r\n />\r\n </Box>\r\n <IconButton\r\n variant=\"icon-outline\"\r\n onClick={() =>\r\n !chatController.audioRecorder.state.recording\r\n ? chatController.audioRecorder.start()\r\n : chatController.audioRecorder.stop()\r\n }\r\n disabled={\r\n actualIsLoading &&\r\n !chatController.audioRecorder.state.recording\r\n }\r\n sx={{\r\n color: chatController.audioRecorder.state.recording\r\n ? 'red'\r\n : undefined,\r\n }}\r\n icon={\r\n chatController.audioRecorder.state.recording\r\n ? 'Stop'\r\n : 'Microphone'\r\n }\r\n id=\"transcribeAudio\"\r\n size=\"Lg\"\r\n title={getLabel('lblAiRecordAudio').text}\r\n />\r\n <IconButton\r\n title={getLabel('btnUploadFile').text}\r\n icon=\"File\"\r\n variant=\"icon-outline\"\r\n disabled={actualIsLoading}\r\n onClick={() => {\r\n (\r\n document.getElementById(\r\n `gptUploadFile__${chatController.id}`,\r\n ) as HTMLElement\r\n ).click();\r\n }}\r\n size=\"Lg\"\r\n />\r\n <SimpleButton\r\n title={getLabel('btnAiPrevious').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={chatController.history.previous}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiPrevious').text}\r\n </SimpleButton>\r\n <SimpleButton\r\n title={getLabel('btnAiNext').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={chatController.history.next}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiNext').text}\r\n </SimpleButton>\r\n {!hideDeleteButton && (\r\n <>\r\n <SimpleButton\r\n title={getLabel('btnAiDelete').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={() => {\r\n chatController.state.current.message = '';\r\n chatController.attachments.dropAll();\r\n chatController.currentHistoryIndex = -1;\r\n }}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiDelete').text}\r\n </SimpleButton>\r\n <SimpleButton\r\n title={getLabel('btnAiDeleteMessages').title}\r\n variant=\"outline\"\r\n type=\"button\"\r\n onClick={() => chatController.messages.clear()}\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiDeleteMessages').text}\r\n </SimpleButton>\r\n </>\r\n )}\r\n <SimpleButton\r\n title={getLabel('btnAiSend').title}\r\n isLoading={actualIsLoading}\r\n type=\"submit\"\r\n size=\"sm\"\r\n >\r\n {getLabel('btnAiSend').text}\r\n </SimpleButton>\r\n </Box>\r\n </form>\r\n </Box>\r\n );\r\n },\r\n );\r\n\r\n NewTextarea.displayName = '';\r\n\r\n return NewTextarea;\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { getVariant } from '@apia/theme';\r\nimport { Box } from '@apia/theme';\r\nimport { AutoscrollContainer } from './AutoscrollContainer';\r\nimport { makeTextarea } from './Textarea';\r\nimport { ChatMessage } from './messages/ChatMessage';\r\nimport { AIMessageAttachments } from './messages/aiMessage/AIMessageAttachments';\r\nimport { makeObservable, observable } from 'mobx';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { AudioRecorder } from '@apia/util';\r\nimport { AIMessageRole } from './messages/aiMessage/types';\r\nimport { AIFileContent } from './messages/aiMessage/AIFileContent';\r\n\r\nexport type TMessageType =\r\n | 'user'\r\n | 'system'\r\n | 'warning'\r\n | 'error'\r\n | 'information'\r\n | 'response'\r\n | 'multipleChoice'\r\n | 'customMessage';\r\n\r\ntype ChatControllerState = {\r\n current: ChatMessage;\r\n messages: ChatMessage[];\r\n};\r\n\r\nexport class ChatController {\r\n state: ChatControllerState = {\r\n current: new ChatMessage(),\r\n messages: [],\r\n };\r\n\r\n constructor(\r\n public id: string,\r\n welcomeMessage?: string,\r\n ) {\r\n if (welcomeMessage) {\r\n this.state.messages.splice(\r\n 0,\r\n 0,\r\n new ChatMessage(welcomeMessage, 'system'),\r\n );\r\n }\r\n\r\n makeObservable(this, { state: observable });\r\n }\r\n\r\n components = {\r\n MessageHistory: observer(() => {\r\n return (\r\n <Box\r\n {...getVariant('layout.common.components.chat')}\r\n className=\"history\"\r\n >\r\n <AutoscrollContainer>\r\n {this.state.messages.map((current) => (\r\n <current.Component key={current.id} />\r\n ))}\r\n </AutoscrollContainer>\r\n </Box>\r\n );\r\n }),\r\n Textarea: makeTextarea(this),\r\n };\r\n\r\n #promptsHistory: ChatMessage[] = [];\r\n currentHistoryIndex = -1;\r\n\r\n #internalAudioRecorder = new AudioRecorder();\r\n\r\n audioRecorder = {\r\n start: () =>\r\n this.#internalAudioRecorder.start().then(async (blob: Blob) => {\r\n const m: AIMessageAttachments = new AIMessageAttachments(\r\n AIMessageRole.USER,\r\n new AIFileContent(\r\n await AIFileContent.blobToBase64(blob),\r\n `userRecord_${this.audioRecorder.record++}.wav`,\r\n ),\r\n () => this.attachments.drop(m),\r\n );\r\n this.attachments.add(m);\r\n }),\r\n stop: async () => {\r\n this.#internalAudioRecorder.stop();\r\n },\r\n record: 0,\r\n state: this.#internalAudioRecorder.state,\r\n };\r\n\r\n history = {\r\n add: (message: ChatMessage) => {\r\n this.currentHistoryIndex = -1;\r\n\r\n if (message === this.#promptsHistory[this.#promptsHistory.length]) {\r\n return;\r\n }\r\n\r\n this.#promptsHistory = [\r\n message,\r\n ...this.#promptsHistory.slice(\r\n Math.max(0, this.#promptsHistory.length - 10),\r\n ),\r\n ];\r\n },\r\n next: () => {\r\n let message = new ChatMessage();\r\n if (this.#promptsHistory[this.currentHistoryIndex - 1])\r\n message = this.#promptsHistory[--this.currentHistoryIndex].copy();\r\n else {\r\n this.currentHistoryIndex = -1;\r\n }\r\n this.history.updateState(message);\r\n },\r\n previous: () => {\r\n if (this.#promptsHistory[this.currentHistoryIndex + 1]) {\r\n this.history.updateState(\r\n this.#promptsHistory[++this.currentHistoryIndex].copy(),\r\n );\r\n }\r\n },\r\n updateState: (message?: ChatMessage) => {\r\n if (message) this.state.current = message;\r\n else this.state.current = new ChatMessage();\r\n },\r\n size: () => this.state.messages.length,\r\n };\r\n\r\n messages = {\r\n add: (message: ChatMessage, idx?: number) => {\r\n if (idx !== undefined && idx !== null) {\r\n this.state.messages.splice(idx, 0, message);\r\n } else {\r\n this.state.messages.push(message);\r\n }\r\n },\r\n clear: () => {\r\n this.state.messages = [];\r\n },\r\n };\r\n\r\n attachments = {\r\n add: (...aiMessage: AIMessageAttachments[]) => {\r\n this.state.current.attachments.push(...aiMessage);\r\n },\r\n dropAll: () => void (this.state.current.attachments = []),\r\n drop: (el: AIMessageAttachments) => {\r\n this.state.current.attachments = this.state.current.attachments.filter(\r\n (c) => c !== el,\r\n );\r\n if (!this.state.current.message && this.attachments.size() < 1)\r\n this.currentHistoryIndex = -1;\r\n },\r\n getComponents: () =>\r\n this.state.current.attachments.map((x) => (\r\n <x.Component closeButton canAddDescription key={x.id} />\r\n )),\r\n get: () => this.state.current.attachments,\r\n size: () => this.state.current.attachments.length,\r\n };\r\n}\r\n","import { ApiaUtil, SimpleButton } from '@apia/components';\r\nimport { ChatMessage } from './ChatMessage';\r\nimport { Box, Paragraph } from '@apia/theme';\r\nimport { ReactElement } from 'react';\r\n\r\nexport type TMultipleChoiceMessageOption<OptionProps> = {\r\n label: string;\r\n url: string;\r\n additionalProps?: OptionProps;\r\n};\r\n\r\nexport class MultipleChoiceMessage<OptionProps> extends ChatMessage {\r\n constructor(\r\n question: string,\r\n options: TMultipleChoiceMessageOption<OptionProps>[],\r\n Renderer?: (props: {\r\n item: TMultipleChoiceMessageOption<OptionProps>;\r\n }) => ReactElement,\r\n ) {\r\n super(\r\n Renderer ? (\r\n <Box className=\"multipleChoiceMessage customRenderer\">\r\n <Paragraph>{question}</Paragraph>\r\n {options.map((item) => (\r\n <Renderer item={item} key={item.url} />\r\n ))}\r\n </Box>\r\n ) : (\r\n <Box className=\"multipleChoiceMessage\">\r\n <Paragraph>{question}</Paragraph>\r\n <Box as=\"ul\">\r\n {options.map((current) => (\r\n <li key={current.label}>\r\n <SimpleButton\r\n className=\"multipleChoice__option\"\r\n onClick={() => {\r\n ApiaUtil.instance.tabs.openTab(current.label, current.url);\r\n }}\r\n >\r\n {current.label}\r\n </SimpleButton>\r\n </li>\r\n ))}\r\n </Box>\r\n </Box>\r\n ),\r\n 'multipleChoice',\r\n );\r\n }\r\n}\r\n","import { EventEmitter } from '@apia/util';\r\n\r\nexport class ResponseStream extends EventEmitter<{ part: string }> {\r\n private buffer: string = '';\r\n private isRunning = false;\r\n private locked = false;\r\n private maxCompletionTime = 2; // s\r\n private minPartSize = 2;\r\n private partSize = 2;\r\n private timing = 5; // ms\r\n private waiting: string[] = [];\r\n\r\n public close() {}\r\n\r\n private calculatePartSize() {\r\n const totalSize =\r\n this.buffer.length +\r\n this.waiting.reduce<number>((a, b) => a + b.length, 0);\r\n\r\n this.partSize = Math.max(\r\n this.minPartSize,\r\n (totalSize * this.timing) / (this.maxCompletionTime * 1000),\r\n );\r\n }\r\n\r\n emit<K extends 'part'>(_: K, data: { part: string }[K]): void {\r\n if (this.locked) {\r\n this.waiting.push(data);\r\n } else {\r\n this.buffer += data;\r\n }\r\n this.calculatePartSize();\r\n this.run();\r\n }\r\n\r\n run() {\r\n if (!this.isRunning) {\r\n this.isRunning = true;\r\n const interval = setInterval(() => {\r\n this.locked = true;\r\n\r\n const choosedSize = Math.min(this.buffer.length, this.partSize);\r\n\r\n const part = this.buffer.slice(0, choosedSize);\r\n this.buffer = this.buffer.slice(choosedSize);\r\n\r\n while (this.waiting.length > 0) {\r\n const part = this.waiting.shift();\r\n if (part) {\r\n this.buffer += part;\r\n }\r\n }\r\n this.locked = false;\r\n if (part) {\r\n super.emit('part', part);\r\n } else {\r\n this.isRunning = false;\r\n clearInterval(interval);\r\n }\r\n }, this.timing);\r\n }\r\n }\r\n}\r\n","import axios from 'axios';\r\nimport { AudioRecorder } from '@apia/util';\r\nimport { ApiaApi, makeApiaUrl, parseSuccessfulResponse } from '@apia/api';\r\nimport { ResponseStream } from '@apia/ai';\r\nimport { action, makeObservable, observable } from 'mobx';\r\n\r\ntype RoutinesGenerationState = {\r\n isLoading: boolean;\r\n progress: number;\r\n};\r\n\r\ntype TPollProgress = {\r\n message: string;\r\n progress: number;\r\n debug: string;\r\n streamPart?: string;\r\n};\r\n\r\ntype TPollRoutineResult = {\r\n status: string;\r\n payload: unknown | TPollProgress;\r\n};\r\n\r\nexport type TGenerateFromImage = {\r\n base64: string;\r\n description: string;\r\n};\r\n\r\nexport type TRoutineCompletion = Partial<{\r\n images: TGenerateFromImage[];\r\n parameters: Record<string, string>;\r\n stream: ResponseStream;\r\n}> & {\r\n routineName: string;\r\n};\r\n\r\nfunction isPollProgress(\r\n payload: unknown | TPollProgress,\r\n): payload is TPollProgress {\r\n return (payload as TPollProgress)?.progress !== undefined;\r\n}\r\n\r\nexport class RoutinesGeneration {\r\n public audioRecorder = new AudioRecorder();\r\n private routineId: string = '';\r\n public state: RoutinesGenerationState = {\r\n isLoading: false,\r\n progress: 0,\r\n };\r\n\r\n public constructor() {\r\n makeObservable(this, {\r\n completion: action,\r\n state: observable,\r\n stop: action,\r\n transcribeAudio: action,\r\n });\r\n }\r\n\r\n private checkCanGenerate() {\r\n if (this.state.isLoading) {\r\n throw new Error('Cannot queue two simultaneous generations');\r\n }\r\n\r\n this.state.isLoading = true;\r\n }\r\n\r\n private async pollRoutine<T>(stream?: ResponseStream) {\r\n while (this.state.isLoading) {\r\n const pollResult = await this.poll(this.routineId);\r\n if (isPollProgress(pollResult.payload)) {\r\n try {\r\n const res = JSON.parse(pollResult.payload.debug) as string[];\r\n if (res.length > 0) {\r\n res.forEach((c) => {\r\n console.log(JSON.parse(c));\r\n });\r\n }\r\n\r\n if (pollResult.payload.streamPart && stream) {\r\n stream.emit('part', pollResult.payload.streamPart);\r\n }\r\n this.state.progress = pollResult.payload.progress;\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n } else if (pollResult.status === 'FINISHED') {\r\n this.resetLoading();\r\n return pollResult.payload as T;\r\n } else {\r\n throw new Error('Wrong poll response');\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private async executeRoutine<T>(\r\n routineName: string,\r\n prompts: Record<string, string>,\r\n images: TGenerateFromImage[],\r\n stream?: ResponseStream,\r\n ): Promise<T | null> {\r\n this.checkCanGenerate();\r\n\r\n try {\r\n const routineStartResult = await ApiaApi.post<{\r\n orchestrator: { routineId: string };\r\n }>(\r\n makeApiaUrl({\r\n action: 'routineStart',\r\n routine: routineName,\r\n }),\r\n {\r\n postData: {\r\n images: JSON.stringify(images),\r\n ...prompts,\r\n },\r\n stringifyOptions: {\r\n arrayFormat: 'repeat',\r\n },\r\n postDataTreatement: 'stringify',\r\n },\r\n );\r\n\r\n if (routineStartResult?.data?.orchestrator?.routineId !== undefined) {\r\n this.routineId = routineStartResult?.data?.orchestrator?.routineId;\r\n\r\n return this.pollRoutine<T>(stream);\r\n } else {\r\n throw new Error('Cannot get routine id');\r\n }\r\n } catch (e) {\r\n this.resetLoading();\r\n throw e;\r\n }\r\n }\r\n\r\n private async poll(routineId: string): Promise<TPollRoutineResult> {\r\n const result = await ApiaApi.post<{ orchestrator: string }>(\r\n makeApiaUrl({\r\n action: 'routinePoll',\r\n routineId,\r\n }),\r\n );\r\n\r\n if (result?.data?.orchestrator) {\r\n return JSON.parse(result.data.orchestrator) as TPollRoutineResult;\r\n } else {\r\n throw new Error('Poll failed');\r\n }\r\n }\r\n\r\n private resetLoading() {\r\n this.state.isLoading = false;\r\n this.state.progress = 0;\r\n }\r\n\r\n public async completion<T>(params: TRoutineCompletion) {\r\n return this.executeRoutine<T>(\r\n params.routineName,\r\n params.parameters ?? {},\r\n params.images ?? [],\r\n params.stream,\r\n );\r\n }\r\n\r\n public stop() {\r\n this.resetLoading();\r\n ApiaApi.get<{\r\n orchestrator: { routineId: string };\r\n }>(\r\n makeApiaUrl({\r\n action: 'routineStop',\r\n routineId: this.routineId,\r\n }),\r\n );\r\n }\r\n\r\n public async transcribeAudio(audio: Blob) {\r\n const arrayBuffer = await audio.arrayBuffer();\r\n\r\n const url = makeApiaUrl({\r\n action: 'routineStart',\r\n routine: 'transcription/Transcribe',\r\n });\r\n\r\n const response = await axios.post(url, arrayBuffer, {\r\n headers: {\r\n 'Content-Type': 'application/octet-stream',\r\n },\r\n });\r\n\r\n if (response.data) {\r\n const result = await parseSuccessfulResponse<{\r\n orchestrator: { routineId: string };\r\n }>(response, url);\r\n\r\n this.state.isLoading = true;\r\n if (result?.orchestrator?.routineId) {\r\n this.routineId = result?.orchestrator?.routineId;\r\n return await this.pollRoutine<{\r\n transcription: string;\r\n }>();\r\n }\r\n }\r\n\r\n throw new Error('Something went wrong while transcribing the audio');\r\n }\r\n}\r\n","import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport { uniqueId } from 'lodash-es';\r\n\r\nexport type RetrievedImage = {\r\n base64: string;\r\n path: string;\r\n};\r\n\r\nexport type GetImageSize = '256x256' | '512x512' | '1024x1024';\r\n\r\nexport async function getImageFromGpt({\r\n prompt,\r\n ...props\r\n}: {\r\n prompt: string;\r\n size?: GetImageSize;\r\n model: string;\r\n}): Promise<RetrievedImage | null> {\r\n const res = await ApiaApi.post<{ image: string }>(\r\n makeApiaUrl({\r\n action: 'generateImage',\r\n ...props,\r\n }),\r\n {\r\n postData: {\r\n prompt,\r\n },\r\n postDataTreatement: 'stringify',\r\n },\r\n );\r\n\r\n if (res?.data)\r\n return {\r\n base64: res.data.image as any as string,\r\n path: `${uniqueId()}.png`,\r\n };\r\n\r\n return null;\r\n}\r\n\r\nexport async function getImageFromDisk(\r\n inputProps?: Partial<{\r\n accept: string;\r\n }>,\r\n): Promise<RetrievedImage | null> {\r\n return (\r\n (await getImagesFromDisk({ ...inputProps, multiple: 'false' }))![0] ?? null\r\n );\r\n}\r\n\r\nexport function getImagesFromDisk(\r\n inputProps?: Partial<{\r\n accept: string;\r\n multiple: string;\r\n }>,\r\n): Promise<RetrievedImage[]> {\r\n return new Promise<RetrievedImage[]>((resolve) => {\r\n const input = document.createElement('input');\r\n input.accept = 'image/*';\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n Object.assign(input, inputProps);\r\n\r\n document.body.append(input);\r\n\r\n input.addEventListener('change', (event) => {\r\n const target = event?.target as HTMLInputElement;\r\n if (!target?.files) return;\r\n\r\n const retrievedImages: (RetrievedImage | null)[] = [];\r\n const sources = [...(target.files ?? [])];\r\n\r\n const checkResolve = () => {\r\n if (sources.length === retrievedImages.length) {\r\n resolve(retrievedImages.filter((c): c is RetrievedImage => !!c));\r\n }\r\n };\r\n\r\n sources.forEach((file) => {\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = function (e) {\r\n const binary = (e.target?.result as string)?.split(',')[1];\r\n input.remove();\r\n retrievedImages.push({\r\n base64: binary,\r\n path: file.name,\r\n });\r\n\r\n checkResolve();\r\n };\r\n reader.readAsDataURL(file);\r\n } else {\r\n retrievedImages.push(null);\r\n }\r\n\r\n checkResolve();\r\n });\r\n });\r\n input.click();\r\n });\r\n}\r\n","import { IconButton } from '@apia/components';\r\nimport { Box } from '@apia/theme';\r\n\r\nexport const ImageIcon = ({\r\n deletable,\r\n onClick,\r\n onRemove,\r\n src,\r\n}: {\r\n deletable: boolean;\r\n onClick: () => unknown;\r\n onRemove: () => unknown;\r\n src: string;\r\n}) => {\r\n return (\r\n <Box className=\"image_preview\">\r\n {deletable && (\r\n <IconButton icon=\"Close\" size=\"Xs\" iconSize=\"Xs\" onClick={onRemove} />\r\n )}\r\n <img src={src} onClick={onClick} />\r\n </Box>\r\n );\r\n};\r\n","export function getSrcFromBase64(base64: string) {\r\n return `data:image/jpg;base64,${base64}`;\r\n}\r\n","import {\r\n ApiaUtil,\r\n IconButton,\r\n SortableList,\r\n SortableListItem,\r\n} from '@apia/components';\r\nimport { Box, getVariant, Textarea } from '@apia/theme';\r\nimport { makeAutoObservable, toJS } from 'mobx';\r\nimport { observer } from 'mobx-react-lite';\r\nimport { uniqueId } from '@apia/notifications';\r\nimport { ImageIcon } from './ImageIcon';\r\nimport { getSrcFromBase64 } from '../ImageBinaryField/getImageSrcString';\r\nimport { getImagesFromDisk } from '../ImageBinaryField/getImage';\r\n\r\nexport type TGenerateFromImage = {\r\n base64: string;\r\n description: string;\r\n};\r\n\r\ntype TStoredImage = TGenerateFromImage & { id: string };\r\n\r\nclass ImagesStore {\r\n images: Map<string, TStoredImage> = new Map();\r\n selectedId = '';\r\n\r\n constructor(\r\n images: TGenerateFromImage[],\r\n public multiple: boolean,\r\n ) {\r\n this.images = new Map(\r\n images.map((c) => {\r\n const id = uniqueId();\r\n return [id, { ...c, id }];\r\n }),\r\n );\r\n this.selectedId = this.images.values().next().value.id;\r\n makeAutoObservable(this);\r\n }\r\n}\r\n\r\nconst GetImagesDescription = observer(({ store }: { store: ImagesStore }) => {\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n\r\n return (\r\n <Box\r\n className=\"images_description_generator\"\r\n {...getVariant('layout.design.projectAnalysis.imagesLoader')}\r\n >\r\n <Box className=\"images_sort_wrapper\">\r\n <SortableList\r\n onSortChange={(ev) => {\r\n store.images = new Map(\r\n ev.map((c) => [\r\n c.props.id,\r\n c.props.additionalProps as TStoredImage,\r\n ]),\r\n );\r\n }}\r\n >\r\n {[...store.images].map(([k, c]) => (\r\n <SortableListItem additionalProps={c} id={c.id} key={c.id}>\r\n <ImageIcon\r\n deletable={store.multiple}\r\n onClick={() => {\r\n store.selectedId = c.id;\r\n }}\r\n onRemove={() => {\r\n store.images.delete(k);\r\n }}\r\n src={getSrcFromBase64(c.base64 ?? '')}\r\n />\r\n </SortableListItem>\r\n ))}\r\n </SortableList>\r\n </Box>\r\n <Box className=\"image_editor\">\r\n <Box className=\"image_preview\">\r\n {store.images.get(store.selectedId) && (\r\n <img\r\n src={getSrcFromBase64(\r\n store.images.get(store.selectedId)!.base64 ?? '',\r\n )}\r\n />\r\n )}\r\n </Box>\r\n <Box className=\"image_description\">\r\n <Textarea\r\n autoFocus\r\n disabled={!store.images.get(store.selectedId)}\r\n onChange={(ev) => {\r\n const image = store.images.get(store.selectedId);\r\n if (image) image.description = ev.target.value;\r\n }}\r\n value={store.images.get(store.selectedId)?.description}\r\n />\r\n {store.multiple && (\r\n <IconButton\r\n icon=\"Attach\"\r\n onClick={() => {\r\n getImagesFromDisk({ multiple: 'true' }).then((res) => {\r\n res.forEach((c) => {\r\n const id = uniqueId();\r\n store.images.set(id, {\r\n base64: c.base64,\r\n description: '',\r\n id,\r\n });\r\n });\r\n });\r\n }}\r\n size=\"Md\"\r\n iconSize=\"Sm\"\r\n variant=\"icon-only\"\r\n />\r\n )}\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n\r\nexport function getImagesWithDescription({\r\n multiple,\r\n}: {\r\n multiple?: boolean;\r\n}): Promise<TGenerateFromImage[]> {\r\n return new Promise((resolve) => {\r\n getImagesFromDisk({ multiple: multiple ? 'true' : undefined }).then(\r\n (images) => {\r\n const store = new ImagesStore(\r\n images.map((c) => ({\r\n base64: c.base64,\r\n description: '',\r\n })),\r\n multiple || false,\r\n );\r\n\r\n ApiaUtil.instance.modals.open({\r\n children: <GetImagesDescription store={store} />,\r\n initialFocusGetter(modalInnerRef) {\r\n return modalInnerRef.querySelector<HTMLElement>('textarea');\r\n },\r\n onConfirm: () => {\r\n resolve([...toJS(store.images).values()]);\r\n },\r\n onCancel() {\r\n resolve([]);\r\n },\r\n size: 'xxxl-fixed',\r\n noHeader: true,\r\n });\r\n },\r\n );\r\n });\r\n}\r\n"],"names":["progress","__publicField","FileType","AIMessageRole","blob","f","part"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apia/ai",
3
- "version": "4.0.7",
3
+ "version": "4.0.8",
4
4
  "sideEffects": false,
5
5
  "author": "Alexis Leite <alexisleite@live.com>",
6
6
  "main": "dist/index.js",
@@ -13,10 +13,10 @@
13
13
  "libWatch": "rollup --watch --config ../../config/rollup.common.mjs --environment MODE:development,ENTRY:index.ts,WATCH:true"
14
14
  },
15
15
  "dependencies": {
16
- "@apia/api": "^4.0.7",
17
- "@apia/components": "^4.0.7",
18
- "@apia/theme": "^4.0.7",
19
- "@apia/util": "^4.0.7",
16
+ "@apia/api": "^4.0.8",
17
+ "@apia/components": "^4.0.8",
18
+ "@apia/theme": "^4.0.8",
19
+ "@apia/util": "^4.0.8",
20
20
  "mobx": "^6.13.1",
21
21
  "mobx-react-lite": "^4.0.7"
22
22
  },
@@ -37,5 +37,5 @@
37
37
  "access": "public",
38
38
  "registry": "https://registry.npmjs.org/"
39
39
  },
40
- "gitHead": "30961d8aff658498a41befa350cd91a4bb647177"
40
+ "gitHead": "0d74b0e9511fd294037142422ef2425f0fa057b9"
41
41
  }