@apia/ai 4.0.7 → 4.0.9

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,18 @@ 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
+ __publicField$6(this, "Component", () => {
259
261
  return /* @__PURE__ */ jsx(Box, { variant: "layout.common.components.aiMessage.textBox", children: /* @__PURE__ */ jsx(Box, { variant: "layout.common.components.aiMessage.textSnippet", children: this.content }) });
260
262
  });
261
263
  this.content = content;
@@ -290,26 +292,27 @@ var AIMessageRole = /* @__PURE__ */ ((AIMessageRole2) => {
290
292
  return AIMessageRole2;
291
293
  })(AIMessageRole || {});
292
294
 
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);
295
+ var __defProp$5 = Object.defineProperty;
296
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
297
+ var __publicField$5 = (obj, key, value) => {
298
+ __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
297
299
  return value;
298
300
  };
299
301
  const _AIFileContent = class _AIFileContent extends AIContent {
300
302
  constructor(fileUrl, fileName, f, error) {
301
303
  const extension = _AIFileContent.getExtensionFromFileName(fileName);
302
304
  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", () => {
305
+ __publicField$5(this, "type");
306
+ __publicField$5(this, "fileUrl");
307
+ __publicField$5(this, "fileName");
308
+ __publicField$5(this, "extension");
309
+ __publicField$5(this, "__file");
310
+ __publicField$5(this, "__error");
311
+ __publicField$5(this, "overrideSize");
312
+ __publicField$5(this, "inferContent", () => {
310
313
  return `You must collect information contained in this ${this.type} as help to build your tool choice.`;
311
314
  });
312
- __publicField$4(this, "inferExtension", (extension) => {
315
+ __publicField$5(this, "inferExtension", (extension) => {
313
316
  switch (extension) {
314
317
  case AIFileContentAllowedExtensions.jpg:
315
318
  case AIFileContentAllowedExtensions.jpeg:
@@ -336,18 +339,33 @@ const _AIFileContent = class _AIFileContent extends AIContent {
336
339
  }
337
340
  });
338
341
  // 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
- ] }));
342
+ __publicField$5(this, "Component", () => /* @__PURE__ */ jsxs(
343
+ Box,
344
+ {
345
+ sx: {
346
+ ...this.overrideSize ? {
347
+ ...this.overrideSize,
348
+ img: {
349
+ width: `${this.overrideSize.width - 20}px`,
350
+ height: `${this.overrideSize.height - 61}px`
351
+ }
352
+ } : {}
353
+ },
354
+ variant: "layout.common.components.aiMessage.fileBox",
355
+ children: [
356
+ FileType.IMAGE === this.type ? /* @__PURE__ */ jsx("img", { src: URL.createObjectURL(this.file), alt: this.fileName }) : /* @__PURE__ */ jsx(FileIcon, { iconSize: "lg", docName: this.fileName }),
357
+ /* @__PURE__ */ jsx(
358
+ Box,
359
+ {
360
+ as: "p",
361
+ variant: "layout.common.components.aiMessage.fileName",
362
+ title: this.fileName,
363
+ children: this.fileName
364
+ }
365
+ )
366
+ ]
367
+ }
368
+ ));
351
369
  this.__error = error;
352
370
  if (!_AIFileContent.isValidExtension(extension))
353
371
  this.__throwError(
@@ -362,6 +380,10 @@ const _AIFileContent = class _AIFileContent extends AIContent {
362
380
  this.content = this.inferContent();
363
381
  }
364
382
  // PUBLIC METHODS
383
+ setOverrideSize(overrideSize) {
384
+ this.overrideSize = overrideSize;
385
+ return this;
386
+ }
365
387
  get file() {
366
388
  if (!this.__file)
367
389
  throw new Error("File is undefined");
@@ -381,12 +403,12 @@ ${Object.keys(AIFileContentAllowedExtensions)}`;
381
403
  }
382
404
  };
383
405
  // STATIC METHODS
384
- __publicField$4(_AIFileContent, "isValidExtension", (extension) => {
406
+ __publicField$5(_AIFileContent, "isValidExtension", (extension) => {
385
407
  return Object.values(
386
408
  AIFileContentAllowedExtensions
387
409
  ).includes(extension);
388
410
  });
389
- __publicField$4(_AIFileContent, "blobToBase64", async (blob) => {
411
+ __publicField$5(_AIFileContent, "blobToBase64", async (blob) => {
390
412
  return await ((blob2) => new Promise((resolve, reject) => {
391
413
  const reader = new FileReader();
392
414
  reader.onloadend = () => {
@@ -397,7 +419,7 @@ __publicField$4(_AIFileContent, "blobToBase64", async (blob) => {
397
419
  reader.readAsDataURL(blob2);
398
420
  }))(blob);
399
421
  });
400
- __publicField$4(_AIFileContent, "fromFile", async (f, error) => {
422
+ __publicField$5(_AIFileContent, "fromFile", async (f, error) => {
401
423
  const fileUrl = await ((f2) => new Promise((resolve, reject) => {
402
424
  const reader = new FileReader();
403
425
  reader.readAsDataURL(f2);
@@ -408,31 +430,44 @@ __publicField$4(_AIFileContent, "fromFile", async (f, error) => {
408
430
  });
409
431
  let AIFileContent = _AIFileContent;
410
432
 
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);
433
+ var __defProp$4 = Object.defineProperty;
434
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
435
+ var __publicField$4 = (obj, key, value) => {
436
+ __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
415
437
  return value;
416
438
  };
417
439
  class AIMessageAttachments {
418
440
  constructor(role, content, close) {
419
441
  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 () => {
442
+ __publicField$4(this, "role");
443
+ __publicField$4(this, "content");
444
+ __publicField$4(this, "id", uniqueId());
445
+ __publicField$4(this, "customDescription", false);
446
+ __publicField$4(this, "addDescription", async () => {
424
447
  const collector = new Collector();
425
- const collected = await collector.add(
448
+ const collected = await collector.add(this.content).add(
426
449
  new collector.fields.textarea(
427
450
  "addCommentTextArea",
428
- "TODO The description will help the assistant to understand the file content"
451
+ getLabel("lblAiAddImageCo").text.replace(".", ""),
452
+ {
453
+ initialValue: this.content instanceof AIFileContent && this.content.content !== this.content.inferContent() ? this.content.content : ""
454
+ }
429
455
  )
430
- ).show({ title: "TODO Add image Comment" }).catch((e) => {
456
+ ).show({
457
+ title: getLabel("btnAddComment").text
458
+ }).catch((e) => {
431
459
  throw e;
432
460
  });
433
- collected?.addCommentTextArea && (this.content.content = collected.addCommentTextArea);
461
+ if (collected?.addCommentTextArea) {
462
+ this.content.content = collected.addCommentTextArea;
463
+ this.customDescription = true;
464
+ } else {
465
+ if (this.content instanceof AIFileContent)
466
+ this.content.content = this.content.inferContent();
467
+ this.customDescription = false;
468
+ }
434
469
  });
435
- __publicField$3(this, "Component", (props) => /* @__PURE__ */ jsxs(Box, { ...getVariant("layout.common.components.aiMessage"), children: [
470
+ __publicField$4(this, "Component", (props) => /* @__PURE__ */ jsxs(Box, { ...getVariant("layout.common.components.aiMessage"), children: [
436
471
  props.closeButton ? /* @__PURE__ */ jsx(
437
472
  IconButton,
438
473
  {
@@ -737,10 +772,10 @@ const makeTextarea = (chatController) => {
737
772
  return NewTextarea;
738
773
  };
739
774
 
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);
775
+ var __defProp$3 = Object.defineProperty;
776
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
777
+ var __publicField$3 = (obj, key, value) => {
778
+ __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
744
779
  return value;
745
780
  };
746
781
  var __accessCheck = (obj, member, msg) => {
@@ -765,11 +800,11 @@ var _promptsHistory, _internalAudioRecorder;
765
800
  class ChatController {
766
801
  constructor(id, welcomeMessage) {
767
802
  this.id = id;
768
- __publicField$2(this, "state", {
803
+ __publicField$3(this, "state", {
769
804
  current: new ChatMessage(),
770
805
  messages: []
771
806
  });
772
- __publicField$2(this, "components", {
807
+ __publicField$3(this, "components", {
773
808
  MessageHistory: observer(() => {
774
809
  return /* @__PURE__ */ jsx(
775
810
  Box,
@@ -783,9 +818,9 @@ class ChatController {
783
818
  Textarea: makeTextarea(this)
784
819
  });
785
820
  __privateAdd(this, _promptsHistory, []);
786
- __publicField$2(this, "currentHistoryIndex", -1);
821
+ __publicField$3(this, "currentHistoryIndex", -1);
787
822
  __privateAdd(this, _internalAudioRecorder, new AudioRecorder());
788
- __publicField$2(this, "audioRecorder", {
823
+ __publicField$3(this, "audioRecorder", {
789
824
  start: () => __privateGet(this, _internalAudioRecorder).start().then(async (blob) => {
790
825
  const m = new AIMessageAttachments(
791
826
  AIMessageRole.USER,
@@ -803,7 +838,7 @@ class ChatController {
803
838
  record: 0,
804
839
  state: __privateGet(this, _internalAudioRecorder).state
805
840
  });
806
- __publicField$2(this, "history", {
841
+ __publicField$3(this, "history", {
807
842
  add: (message) => {
808
843
  this.currentHistoryIndex = -1;
809
844
  if (message === __privateGet(this, _promptsHistory)[__privateGet(this, _promptsHistory).length]) {
@@ -840,7 +875,7 @@ class ChatController {
840
875
  },
841
876
  size: () => this.state.messages.length
842
877
  });
843
- __publicField$2(this, "messages", {
878
+ __publicField$3(this, "messages", {
844
879
  add: (message, idx) => {
845
880
  if (idx !== void 0 && idx !== null) {
846
881
  this.state.messages.splice(idx, 0, message);
@@ -852,7 +887,7 @@ class ChatController {
852
887
  this.state.messages = [];
853
888
  }
854
889
  });
855
- __publicField$2(this, "attachments", {
890
+ __publicField$3(this, "attachments", {
856
891
  add: (...aiMessage) => {
857
892
  this.state.current.attachments.push(...aiMessage);
858
893
  },
@@ -905,25 +940,25 @@ class MultipleChoiceMessage extends ChatMessage {
905
940
  }
906
941
  }
907
942
 
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);
943
+ var __defProp$2 = Object.defineProperty;
944
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
945
+ var __publicField$2 = (obj, key, value) => {
946
+ __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
912
947
  return value;
913
948
  };
914
949
  class ResponseStream extends EventEmitter {
915
950
  constructor() {
916
951
  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);
952
+ __publicField$2(this, "buffer", "");
953
+ __publicField$2(this, "isRunning", false);
954
+ __publicField$2(this, "locked", false);
955
+ __publicField$2(this, "maxCompletionTime", 2);
921
956
  // s
922
- __publicField$1(this, "minPartSize", 2);
923
- __publicField$1(this, "partSize", 2);
924
- __publicField$1(this, "timing", 5);
957
+ __publicField$2(this, "minPartSize", 2);
958
+ __publicField$2(this, "partSize", 2);
959
+ __publicField$2(this, "timing", 5);
925
960
  // ms
926
- __publicField$1(this, "waiting", []);
961
+ __publicField$2(this, "waiting", []);
927
962
  }
928
963
  close() {
929
964
  }
@@ -969,10 +1004,10 @@ class ResponseStream extends EventEmitter {
969
1004
  }
970
1005
  }
971
1006
 
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);
1007
+ var __defProp$1 = Object.defineProperty;
1008
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1009
+ var __publicField$1 = (obj, key, value) => {
1010
+ __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
976
1011
  return value;
977
1012
  };
978
1013
  function isPollProgress(payload) {
@@ -980,9 +1015,9 @@ function isPollProgress(payload) {
980
1015
  }
981
1016
  class RoutinesGeneration {
982
1017
  constructor() {
983
- __publicField(this, "audioRecorder", new AudioRecorder());
984
- __publicField(this, "routineId", "");
985
- __publicField(this, "state", {
1018
+ __publicField$1(this, "audioRecorder", new AudioRecorder());
1019
+ __publicField$1(this, "routineId", "");
1020
+ __publicField$1(this, "state", {
986
1021
  isLoading: false,
987
1022
  progress: 0
988
1023
  });
@@ -1113,5 +1148,202 @@ class RoutinesGeneration {
1113
1148
  }
1114
1149
  }
1115
1150
 
1116
- export { AIMessageAttachments, AutoscrollContainer, ChatController, ChatMessage, MultipleChoiceMessage, ResponseStream, RoutinesGeneration };
1151
+ async function getImageFromDisk(inputProps) {
1152
+ return (await getImagesFromDisk({ ...inputProps, multiple: "false" }))[0] ?? null;
1153
+ }
1154
+ function getImagesFromDisk(inputProps) {
1155
+ return new Promise((resolve) => {
1156
+ const input = document.createElement("input");
1157
+ input.accept = "image/*";
1158
+ input.type = "file";
1159
+ input.style.display = "none";
1160
+ Object.assign(input, inputProps);
1161
+ document.body.append(input);
1162
+ input.addEventListener("change", (event) => {
1163
+ const target = event?.target;
1164
+ if (!target?.files)
1165
+ return;
1166
+ const retrievedImages = [];
1167
+ const sources = [...target.files ?? []];
1168
+ const checkResolve = () => {
1169
+ if (sources.length === retrievedImages.length) {
1170
+ resolve(retrievedImages.filter((c) => !!c));
1171
+ }
1172
+ };
1173
+ sources.forEach((file) => {
1174
+ if (file) {
1175
+ const reader = new FileReader();
1176
+ reader.onload = function(e) {
1177
+ const binary = e.target?.result?.split(",")[1];
1178
+ input.remove();
1179
+ retrievedImages.push({
1180
+ base64: binary,
1181
+ path: file.name
1182
+ });
1183
+ checkResolve();
1184
+ };
1185
+ reader.readAsDataURL(file);
1186
+ } else {
1187
+ retrievedImages.push(null);
1188
+ }
1189
+ checkResolve();
1190
+ });
1191
+ });
1192
+ input.click();
1193
+ });
1194
+ }
1195
+
1196
+ const ImageIcon = ({
1197
+ deletable,
1198
+ onClick,
1199
+ onRemove,
1200
+ src
1201
+ }) => {
1202
+ return /* @__PURE__ */ jsxs(Box, { className: "image_preview", children: [
1203
+ deletable && /* @__PURE__ */ jsx(IconButton, { icon: "Close", size: "Xs", iconSize: "Xs", onClick: onRemove }),
1204
+ /* @__PURE__ */ jsx("img", { src, onClick })
1205
+ ] });
1206
+ };
1207
+
1208
+ function getSrcFromBase64(base64) {
1209
+ return `data:image/jpg;base64,${base64}`;
1210
+ }
1211
+
1212
+ var __defProp = Object.defineProperty;
1213
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1214
+ var __publicField = (obj, key, value) => {
1215
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1216
+ return value;
1217
+ };
1218
+ class ImagesStore {
1219
+ constructor(images, multiple) {
1220
+ this.multiple = multiple;
1221
+ __publicField(this, "images", /* @__PURE__ */ new Map());
1222
+ __publicField(this, "selectedId", "");
1223
+ this.images = new Map(
1224
+ images.map((c) => {
1225
+ const id = uniqueId();
1226
+ return [id, { ...c, id }];
1227
+ })
1228
+ );
1229
+ this.selectedId = this.images.values().next().value.id;
1230
+ makeAutoObservable(this);
1231
+ }
1232
+ }
1233
+ const GetImagesDescription = observer(({ store }) => {
1234
+ return /* @__PURE__ */ jsxs(
1235
+ Box,
1236
+ {
1237
+ className: "images_description_generator",
1238
+ ...getVariant("layout.design.projectAnalysis.imagesLoader"),
1239
+ children: [
1240
+ /* @__PURE__ */ jsx(Box, { className: "images_sort_wrapper", children: /* @__PURE__ */ jsx(
1241
+ SortableList,
1242
+ {
1243
+ onSortChange: (ev) => {
1244
+ store.images = new Map(
1245
+ ev.map((c) => [
1246
+ c.props.id,
1247
+ c.props.additionalProps
1248
+ ])
1249
+ );
1250
+ },
1251
+ children: [...store.images].map(([k, c]) => /* @__PURE__ */ jsx(SortableListItem, { additionalProps: c, id: c.id, children: /* @__PURE__ */ jsx(
1252
+ ImageIcon,
1253
+ {
1254
+ deletable: store.multiple,
1255
+ onClick: () => {
1256
+ store.selectedId = c.id;
1257
+ },
1258
+ onRemove: () => {
1259
+ store.images.delete(k);
1260
+ },
1261
+ src: getSrcFromBase64(c.base64 ?? "")
1262
+ }
1263
+ ) }, c.id))
1264
+ }
1265
+ ) }),
1266
+ /* @__PURE__ */ jsxs(Box, { className: "image_editor", children: [
1267
+ /* @__PURE__ */ jsx(Box, { className: "image_preview", children: store.images.get(store.selectedId) && /* @__PURE__ */ jsx(
1268
+ "img",
1269
+ {
1270
+ src: getSrcFromBase64(
1271
+ store.images.get(store.selectedId).base64 ?? ""
1272
+ )
1273
+ }
1274
+ ) }),
1275
+ /* @__PURE__ */ jsxs(Box, { className: "image_description", children: [
1276
+ /* @__PURE__ */ jsx(
1277
+ Textarea,
1278
+ {
1279
+ autoFocus: true,
1280
+ disabled: !store.images.get(store.selectedId),
1281
+ onChange: (ev) => {
1282
+ const image = store.images.get(store.selectedId);
1283
+ if (image)
1284
+ image.description = ev.target.value;
1285
+ },
1286
+ value: store.images.get(store.selectedId)?.description
1287
+ }
1288
+ ),
1289
+ store.multiple && /* @__PURE__ */ jsx(
1290
+ IconButton,
1291
+ {
1292
+ icon: "Attach",
1293
+ onClick: () => {
1294
+ getImagesFromDisk({ multiple: "true" }).then((res) => {
1295
+ res.forEach((c) => {
1296
+ const id = uniqueId();
1297
+ store.images.set(id, {
1298
+ base64: c.base64,
1299
+ description: "",
1300
+ id
1301
+ });
1302
+ });
1303
+ });
1304
+ },
1305
+ size: "Md",
1306
+ iconSize: "Sm",
1307
+ variant: "icon-only"
1308
+ }
1309
+ )
1310
+ ] })
1311
+ ] })
1312
+ ]
1313
+ }
1314
+ );
1315
+ });
1316
+ function getImagesWithDescription({
1317
+ multiple
1318
+ }) {
1319
+ return new Promise((resolve) => {
1320
+ getImagesFromDisk({ multiple: multiple ? "true" : void 0 }).then(
1321
+ (images) => {
1322
+ const store = new ImagesStore(
1323
+ images.map((c) => ({
1324
+ base64: c.base64,
1325
+ description: ""
1326
+ })),
1327
+ multiple || false
1328
+ );
1329
+ ApiaUtil.instance.modals.open({
1330
+ children: /* @__PURE__ */ jsx(GetImagesDescription, { store }),
1331
+ initialFocusGetter(modalInnerRef) {
1332
+ return modalInnerRef.querySelector("textarea");
1333
+ },
1334
+ onConfirm: () => {
1335
+ resolve([...toJS(store.images).values()]);
1336
+ },
1337
+ onCancel() {
1338
+ resolve([]);
1339
+ },
1340
+ size: "xxxl-fixed",
1341
+ noHeader: true
1342
+ });
1343
+ }
1344
+ );
1345
+ });
1346
+ }
1347
+
1348
+ export { AIMessageAttachments, AutoscrollContainer, ChatController, ChatMessage, MultipleChoiceMessage, ResponseStream, RoutinesGeneration, getImageFromDisk, getImagesFromDisk, getImagesWithDescription };
1117
1349
  //# 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 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(this.content)\r\n .add(\r\n new collector.fields.textarea(\r\n 'addCommentTextArea',\r\n getLabel('lblAiAddImageCo').text.replace('.', ''),\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.9",
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.9",
17
+ "@apia/components": "^4.0.9",
18
+ "@apia/theme": "^4.0.9",
19
+ "@apia/util": "^4.0.9",
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": "d34af51b97c6057830b5640087053d3d261a9e95"
41
41
  }