@purpleschool/gptbot 0.7.9 → 0.7.11

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.
@@ -6,6 +6,7 @@ export const FILE_ROUTES = {
6
6
  UPLOAD: 'upload',
7
7
  UPLOAD_FILE: 'upload-file',
8
8
  UPLOAD_IMAGE: 'upload-image',
9
+ CALCULATE_TEXT_FILE_COST: (uuid: string) => `cost/text/${uuid}`,
9
10
  CRON: {
10
11
  DELETE_UNUSED: 'cron/delete-unused',
11
12
  },
package/api/routes.ts CHANGED
@@ -146,6 +146,8 @@ export const REST_API = {
146
146
  FILES: {
147
147
  UPLOAD_FILE: `${ROOT}/${CONTROLLERS.FILE_CONTROLLER}/${CONTROLLERS.FILE_ROUTES.UPLOAD_FILE}`,
148
148
  UPLOAD_IMAGE: `${ROOT}/${CONTROLLERS.FILE_CONTROLLER}/${CONTROLLERS.FILE_ROUTES.UPLOAD_IMAGE}`,
149
+ CALCULATE_TEXT_FILE_COST: (uuid: string) =>
150
+ `${ROOT}/${CONTROLLERS.FILE_CONTROLLER}/${CONTROLLERS.FILE_ROUTES.CALCULATE_TEXT_FILE_COST(uuid)}`,
149
151
  },
150
152
  BLOG_ARTICLES: {
151
153
  CREATE: `${ROOT}/${CONTROLLERS.BLOG_CONTROLLER(POST_TYPE.ARTICLE)}`,
@@ -8,6 +8,7 @@ exports.FILE_ROUTES = {
8
8
  UPLOAD: 'upload',
9
9
  UPLOAD_FILE: 'upload-file',
10
10
  UPLOAD_IMAGE: 'upload-image',
11
+ CALCULATE_TEXT_FILE_COST: (uuid) => `cost/text/${uuid}`,
11
12
  CRON: {
12
13
  DELETE_UNUSED: 'cron/delete-unused',
13
14
  },
@@ -154,6 +154,7 @@ exports.REST_API = {
154
154
  FILES: {
155
155
  UPLOAD_FILE: `${exports.ROOT}/${CONTROLLERS.FILE_CONTROLLER}/${CONTROLLERS.FILE_ROUTES.UPLOAD_FILE}`,
156
156
  UPLOAD_IMAGE: `${exports.ROOT}/${CONTROLLERS.FILE_CONTROLLER}/${CONTROLLERS.FILE_ROUTES.UPLOAD_IMAGE}`,
157
+ CALCULATE_TEXT_FILE_COST: (uuid) => `${exports.ROOT}/${CONTROLLERS.FILE_CONTROLLER}/${CONTROLLERS.FILE_ROUTES.CALCULATE_TEXT_FILE_COST(uuid)}`,
157
158
  },
158
159
  BLOG_ARTICLES: {
159
160
  CREATE: `${exports.ROOT}/${CONTROLLERS.BLOG_CONTROLLER(constants_1.POST_TYPE.ARTICLE)}`,
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CalculateFileCostCommand = void 0;
4
+ const models_1 = require("../../models");
5
+ const zod_1 = require("zod");
6
+ var CalculateFileCostCommand;
7
+ (function (CalculateFileCostCommand) {
8
+ CalculateFileCostCommand.RequestParamSchema = models_1.FileSchema.pick({
9
+ uuid: true,
10
+ });
11
+ CalculateFileCostCommand.RequestSchema = zod_1.z.object({
12
+ model: zod_1.z.string(),
13
+ });
14
+ CalculateFileCostCommand.ResponseSchema = zod_1.z.object({
15
+ data: models_1.FileSchema,
16
+ });
17
+ })(CalculateFileCostCommand || (exports.CalculateFileCostCommand = CalculateFileCostCommand = {}));
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./delete-user-file.command"), exports);
18
18
  __exportStar(require("./upload.command"), exports);
19
+ __exportStar(require("./calculate-file-cost.command"), exports);
@@ -5,6 +5,9 @@ const models_1 = require("../../models");
5
5
  const zod_1 = require("zod");
6
6
  var UploadFileCommand;
7
7
  (function (UploadFileCommand) {
8
+ UploadFileCommand.RequestSchema = zod_1.z.object({
9
+ model: zod_1.z.string().optional(),
10
+ });
8
11
  UploadFileCommand.ResponseSchema = zod_1.z.object({
9
12
  data: models_1.FileSchema,
10
13
  });
@@ -5,6 +5,7 @@ var AI_MODEL_FEATURE;
5
5
  (function (AI_MODEL_FEATURE) {
6
6
  AI_MODEL_FEATURE["IMAGE_ATTACHMENT"] = "image_attachment";
7
7
  AI_MODEL_FEATURE["AUDIO_ATTACHMENT"] = "audio_attachment";
8
+ AI_MODEL_FEATURE["TEXT_ATTACHMENT"] = "text_attachment";
8
9
  AI_MODEL_FEATURE["WEB_SEARCH"] = "web_search";
9
10
  AI_MODEL_FEATURE["IMAGE_EDITING"] = "image_editing";
10
11
  })(AI_MODEL_FEATURE || (exports.AI_MODEL_FEATURE = AI_MODEL_FEATURE = {}));
@@ -1248,9 +1248,9 @@ exports.ERRORS = {
1248
1248
  message: 'Произошла ошибка при удалении сообщения',
1249
1249
  httpCode: 500,
1250
1250
  },
1251
- CHAT_IMAGE_ATTACHMENT_FEATURE_MISSING: {
1251
+ CHAT_FILE_ATTACHMENT_FEATURE_MISSING: {
1252
1252
  code: 'A275',
1253
- message: 'Функция вложения изображений не указана в запросе',
1253
+ message: 'Функции вложения файлов не указаны в запросе',
1254
1254
  httpCode: 400,
1255
1255
  },
1256
1256
  CHAT_IMAGE_ATTACHMENT_AND_WEB_SEARCH_CONFLICT: {
@@ -1562,4 +1562,19 @@ exports.ERRORS = {
1562
1562
  message: 'Выбрана Неверная продолжительность видео',
1563
1563
  httpCode: 400,
1564
1564
  },
1565
+ FILE_UPLOAD_NO_MODEL: {
1566
+ code: 'A334',
1567
+ message: 'В запросе нет модели для обработки текстового файла',
1568
+ httpCode: 400,
1569
+ },
1570
+ FILE_VECTOR_CHUNKS_CREATE_ERROR: {
1571
+ code: 'A335',
1572
+ message: 'Ошибка при сохранении векторных чанков файлов',
1573
+ httpCode: 500,
1574
+ },
1575
+ FILE_VECTOR_SEARCH_ERROR: {
1576
+ code: 'A336',
1577
+ message: 'Ошибка при поиске по векторному хранилищу',
1578
+ httpCode: 500,
1579
+ },
1565
1580
  };
@@ -5,5 +5,6 @@ var FILE_TYPE;
5
5
  (function (FILE_TYPE) {
6
6
  FILE_TYPE["IMAGE"] = "image";
7
7
  FILE_TYPE["AUDIO"] = "audio";
8
+ FILE_TYPE["TEXT"] = "text";
8
9
  FILE_TYPE["OTHER"] = "other";
9
10
  })(FILE_TYPE || (exports.FILE_TYPE = FILE_TYPE = {}));
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DELETE_UNUSED_FILES_AFTER_HOURS = exports.SUPPORTED_FILES = exports.MAX_AUDIO_UPLOAD_SIZE = exports.MAX_IMAGE_UPLOAD_SIZE = void 0;
3
+ exports.DELETE_UNUSED_FILES_AFTER_HOURS = exports.SUPPORTED_FILES = exports.MAX_TEXT_UPLOAD_SIZE = exports.MAX_AUDIO_UPLOAD_SIZE = exports.MAX_IMAGE_UPLOAD_SIZE = void 0;
4
4
  const enums_1 = require("./enums");
5
5
  exports.MAX_IMAGE_UPLOAD_SIZE = 5 * 1024 * 1024; // 5 MB
6
6
  exports.MAX_AUDIO_UPLOAD_SIZE = 500 * 1024 * 1024; // 500 MB
7
+ exports.MAX_TEXT_UPLOAD_SIZE = 10 * 1024 * 1024; // 10 MB
7
8
  exports.SUPPORTED_FILES = new Map([
8
9
  ['image/jpeg', { type: enums_1.FILE_TYPE.IMAGE, size: exports.MAX_IMAGE_UPLOAD_SIZE }],
9
10
  ['image/png', { type: enums_1.FILE_TYPE.IMAGE, size: exports.MAX_IMAGE_UPLOAD_SIZE }],
@@ -13,5 +14,34 @@ exports.SUPPORTED_FILES = new Map([
13
14
  ['audio/wave', { type: enums_1.FILE_TYPE.AUDIO, size: exports.MAX_AUDIO_UPLOAD_SIZE }],
14
15
  ['audio/wav', { type: enums_1.FILE_TYPE.AUDIO, size: exports.MAX_AUDIO_UPLOAD_SIZE }],
15
16
  ['audio/x-wav', { type: enums_1.FILE_TYPE.AUDIO, size: exports.MAX_AUDIO_UPLOAD_SIZE }],
17
+ ['text/plain', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
18
+ ['text/markdown', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
19
+ ['text/csv', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
20
+ ['text/tab-separated-values', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
21
+ ['application/json', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
22
+ ['application/xml', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
23
+ ['text/xml', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
24
+ ['application/x-yaml', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
25
+ ['text/yaml', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
26
+ ['application/javascript', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
27
+ ['application/typescript', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
28
+ ['text/javascript', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
29
+ ['text/typescript', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
30
+ ['text/html', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
31
+ ['text/css', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
32
+ ['application/x-sh', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
33
+ ['text/x-python', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
34
+ ['text/x-c', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
35
+ ['text/x-c++', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
36
+ ['text/x-java-source', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
37
+ ['text/x-shellscript', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
38
+ ['text/x-php', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
39
+ ['text/x-ruby', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
40
+ ['text/x-go', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
41
+ ['text/x-scss', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
42
+ ['text/x-yaml', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
43
+ ['text/x-ini', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
44
+ ['text/x-properties', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
45
+ ['text/x-config', { type: enums_1.FILE_TYPE.TEXT, size: exports.MAX_TEXT_UPLOAD_SIZE }],
16
46
  ]);
17
47
  exports.DELETE_UNUSED_FILES_AFTER_HOURS = 12;
@@ -13,6 +13,7 @@ exports.FileSchema = zod_1.z.object({
13
13
  type: zod_1.z.nativeEnum(constants_1.FILE_TYPE),
14
14
  duration: zod_1.z.number().nullable(),
15
15
  attachmentCost: zod_1.z.number(),
16
+ contentLength: zod_1.z.number().nullable(),
16
17
  createdAt: zod_1.z.date(),
17
18
  updatedAt: zod_1.z.date(),
18
19
  });
@@ -0,0 +1,22 @@
1
+ import { FileSchema } from '../../models';
2
+ import { z } from 'zod';
3
+
4
+ export namespace CalculateFileCostCommand {
5
+ export const RequestParamSchema = FileSchema.pick({
6
+ uuid: true,
7
+ });
8
+
9
+ export type RequestParam = z.infer<typeof RequestParamSchema>;
10
+
11
+ export const RequestSchema = z.object({
12
+ model: z.string(),
13
+ });
14
+
15
+ export type Request = z.infer<typeof RequestSchema>;
16
+
17
+ export const ResponseSchema = z.object({
18
+ data: FileSchema,
19
+ });
20
+
21
+ export type Response = z.infer<typeof ResponseSchema>;
22
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './delete-user-file.command';
2
2
  export * from './upload.command';
3
+ export * from './calculate-file-cost.command';
@@ -2,6 +2,12 @@ import { FileSchema } from '../../models';
2
2
  import { z } from 'zod';
3
3
 
4
4
  export namespace UploadFileCommand {
5
+ export const RequestSchema = z.object({
6
+ model: z.string().optional(),
7
+ });
8
+
9
+ export type Request = z.infer<typeof RequestSchema>;
10
+
5
11
  export const ResponseSchema = z.object({
6
12
  data: FileSchema,
7
13
  });
@@ -1,6 +1,7 @@
1
1
  export enum AI_MODEL_FEATURE {
2
2
  IMAGE_ATTACHMENT = 'image_attachment',
3
3
  AUDIO_ATTACHMENT = 'audio_attachment',
4
+ TEXT_ATTACHMENT = 'text_attachment',
4
5
  WEB_SEARCH = 'web_search',
5
6
  IMAGE_EDITING = 'image_editing',
6
7
  }
@@ -1254,9 +1254,9 @@ export const ERRORS = {
1254
1254
  message: 'Произошла ошибка при удалении сообщения',
1255
1255
  httpCode: 500,
1256
1256
  },
1257
- CHAT_IMAGE_ATTACHMENT_FEATURE_MISSING: {
1257
+ CHAT_FILE_ATTACHMENT_FEATURE_MISSING: {
1258
1258
  code: 'A275',
1259
- message: 'Функция вложения изображений не указана в запросе',
1259
+ message: 'Функции вложения файлов не указаны в запросе',
1260
1260
  httpCode: 400,
1261
1261
  },
1262
1262
  CHAT_IMAGE_ATTACHMENT_AND_WEB_SEARCH_CONFLICT: {
@@ -1569,4 +1569,19 @@ export const ERRORS = {
1569
1569
  message: 'Выбрана Неверная продолжительность видео',
1570
1570
  httpCode: 400,
1571
1571
  },
1572
+ FILE_UPLOAD_NO_MODEL: {
1573
+ code: 'A334',
1574
+ message: 'В запросе нет модели для обработки текстового файла',
1575
+ httpCode: 400,
1576
+ },
1577
+ FILE_VECTOR_CHUNKS_CREATE_ERROR: {
1578
+ code: 'A335',
1579
+ message: 'Ошибка при сохранении векторных чанков файлов',
1580
+ httpCode: 500,
1581
+ },
1582
+ FILE_VECTOR_SEARCH_ERROR: {
1583
+ code: 'A336',
1584
+ message: 'Ошибка при поиске по векторному хранилищу',
1585
+ httpCode: 500,
1586
+ },
1572
1587
  };
@@ -1,5 +1,6 @@
1
1
  export enum FILE_TYPE {
2
2
  IMAGE = 'image',
3
3
  AUDIO = 'audio',
4
+ TEXT = 'text',
4
5
  OTHER = 'other',
5
6
  }
@@ -2,6 +2,7 @@ import { FILE_TYPE } from './enums';
2
2
 
3
3
  export const MAX_IMAGE_UPLOAD_SIZE = 5 * 1024 * 1024; // 5 MB
4
4
  export const MAX_AUDIO_UPLOAD_SIZE = 500 * 1024 * 1024; // 500 MB
5
+ export const MAX_TEXT_UPLOAD_SIZE = 10 * 1024 * 1024; // 10 MB
5
6
 
6
7
  export const SUPPORTED_FILES = new Map<
7
8
  string,
@@ -18,6 +19,35 @@ export const SUPPORTED_FILES = new Map<
18
19
  ['audio/wave', { type: FILE_TYPE.AUDIO, size: MAX_AUDIO_UPLOAD_SIZE }],
19
20
  ['audio/wav', { type: FILE_TYPE.AUDIO, size: MAX_AUDIO_UPLOAD_SIZE }],
20
21
  ['audio/x-wav', { type: FILE_TYPE.AUDIO, size: MAX_AUDIO_UPLOAD_SIZE }],
22
+ ['text/plain', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
23
+ ['text/markdown', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
24
+ ['text/csv', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
25
+ ['text/tab-separated-values', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
26
+ ['application/json', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
27
+ ['application/xml', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
28
+ ['text/xml', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
29
+ ['application/x-yaml', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
30
+ ['text/yaml', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
31
+ ['application/javascript', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
32
+ ['application/typescript', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
33
+ ['text/javascript', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
34
+ ['text/typescript', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
35
+ ['text/html', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
36
+ ['text/css', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
37
+ ['application/x-sh', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
38
+ ['text/x-python', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
39
+ ['text/x-c', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
40
+ ['text/x-c++', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
41
+ ['text/x-java-source', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
42
+ ['text/x-shellscript', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
43
+ ['text/x-php', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
44
+ ['text/x-ruby', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
45
+ ['text/x-go', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
46
+ ['text/x-scss', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
47
+ ['text/x-yaml', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
48
+ ['text/x-ini', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
49
+ ['text/x-properties', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
50
+ ['text/x-config', { type: FILE_TYPE.TEXT, size: MAX_TEXT_UPLOAD_SIZE }],
21
51
  ]);
22
52
 
23
53
  export const DELETE_UNUSED_FILES_AFTER_HOURS = 12;
@@ -11,6 +11,7 @@ export const FileSchema = z.object({
11
11
  type: z.nativeEnum(FILE_TYPE),
12
12
  duration: z.number().nullable(),
13
13
  attachmentCost: z.number(),
14
+ contentLength: z.number().nullable(),
14
15
  createdAt: z.date(),
15
16
  updatedAt: z.date(),
16
17
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purpleschool/gptbot",
3
- "version": "0.7.9",
3
+ "version": "0.7.11",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",