@mate-academy/llm-gateway 7.3.0 → 7.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/LLMService.constants.d.ts +5963 -3323
  2. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.js +2 -3
  3. package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.js.map +1 -1
  4. package/dist/providers/LLMAPI/LLMAPI.constants.d.ts +9923 -6337
  5. package/dist/providers/LLMAPI/LLMAPI.constants.js +334 -0
  6. package/dist/providers/LLMAPI/LLMAPI.constants.js.map +1 -1
  7. package/dist/providers/LLMAPI/LLMAPI.typedefs.d.ts +41 -1
  8. package/dist/providers/LLMAPI/LLMAPI.typedefs.js +51 -0
  9. package/dist/providers/LLMAPI/LLMAPI.typedefs.js.map +1 -1
  10. package/dist/providers/LLMAPI/LLMAPI.voices.d.ts +32 -0
  11. package/dist/providers/LLMAPI/LLMAPI.voices.js +41 -1
  12. package/dist/providers/LLMAPI/LLMAPI.voices.js.map +1 -1
  13. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.d.ts +11 -4
  14. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js +15 -63
  15. package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js.map +1 -1
  16. package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.d.ts +14 -4
  17. package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.js +16 -53
  18. package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.js.map +1 -1
  19. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.d.ts +11 -4
  20. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js +24 -71
  21. package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js.map +1 -1
  22. package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.d.ts +7 -4
  23. package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.js +15 -61
  24. package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.js.map +1 -1
  25. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.d.ts +22 -0
  26. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js +79 -0
  27. package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js.map +1 -0
  28. package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.d.ts +22 -0
  29. package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.js +67 -0
  30. package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.js.map +1 -0
  31. package/package.json +1 -1
@@ -3,11 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LLMAPITextToSpeechService = void 0;
4
4
  const openai_1 = require("openai");
5
5
  const LLMService_typedefs_1 = require("../../../LLMService.typedefs");
6
- const serializeError_1 = require("../../../utilities/serializeError");
7
- const services_1 = require("../../../services");
6
+ const OpenAICompatibleTextToSpeech_service_1 = require("../../../providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service");
8
7
  const LLMAPI_typedefs_1 = require("../../../providers/LLMAPI/LLMAPI.typedefs");
9
8
  const LLMAPI_constants_1 = require("../../../providers/LLMAPI/LLMAPI.constants");
10
- class LLMAPITextToSpeechService extends services_1.LLMTextToSpeechService {
9
+ class LLMAPITextToSpeechService extends OpenAICompatibleTextToSpeech_service_1.OpenAICompatibleTextToSpeechService {
11
10
  constructor(logger, reporter, options) {
12
11
  super(LLMService_typedefs_1.LLMProviders.LLMAPI, logger, reporter, options);
13
12
  }
@@ -17,56 +16,20 @@ class LLMAPITextToSpeechService extends services_1.LLMTextToSpeechService {
17
16
  baseURL: LLMAPI_typedefs_1.LLMAPI_BASE_URL,
18
17
  }));
19
18
  }
20
- async createSpeech(options) {
21
- const { text, model, instructions, speechOptions, abortSignal, reporterContext, } = options;
22
- const writeMetrics = this.reporter?.initWriter(reporterContext);
23
- try {
24
- abortSignal?.throwIfAborted();
25
- const defaultVoice = LLMAPI_constants_1.LLMAPI_TTS_DEFAULT_VOICES[model.name] ?? 'alloy';
26
- const audioResponse = await this.instance.audio.speech.create({
27
- model: model.name,
28
- input: text,
29
- instructions,
30
- voice: speechOptions?.voice ?? defaultVoice,
31
- response_format: speechOptions?.response_format,
32
- speed: speechOptions?.speed,
33
- }, {
34
- signal: abortSignal,
35
- headers: { Accept: '*/*' },
36
- });
37
- abortSignal?.throwIfAborted();
38
- const audioArrayBuffer = await audioResponse.arrayBuffer();
39
- const audioBuffer = Buffer.from(audioArrayBuffer);
40
- abortSignal?.throwIfAborted();
41
- await this.writeSuccessMetrics({
42
- method: this.getMethodName(this.createSpeech),
43
- model,
44
- usage: {
45
- inputTextTokens: text.length,
46
- outputAudioTokens: 0,
47
- },
48
- writeMetrics,
49
- });
50
- return {
51
- audio: audioBuffer,
52
- mimeType: audioResponse.headers.get('Content-Type'),
53
- };
54
- }
55
- catch (error) {
56
- await this.writeErrorMetrics({
57
- method: this.getMethodName(this.createSpeech),
58
- model,
59
- isAborted: abortSignal?.aborted,
60
- writeMetrics,
61
- });
62
- this.logger
63
- ?.child(this.getMethodName(this.createSpeech))
64
- .error('Error creating speech', {
65
- error: (0, serializeError_1.serializeError)(error),
66
- options,
67
- });
68
- return { error };
69
- }
19
+ getDefaultVoice(modelName) {
20
+ return LLMAPI_constants_1.LLMAPI_TTS_DEFAULT_VOICES[modelName] ?? 'alloy';
21
+ }
22
+ getRequestOptions(abortSignal) {
23
+ return {
24
+ signal: abortSignal,
25
+ headers: { Accept: '*/*' },
26
+ };
27
+ }
28
+ extractUsage(_audioBuffer, text) {
29
+ return {
30
+ inputTextTokens: text.length,
31
+ outputAudioTokens: 0,
32
+ };
70
33
  }
71
34
  }
72
35
  exports.LLMAPITextToSpeechService = LLMAPITextToSpeechService;
@@ -1 +1 @@
1
- {"version":3,"file":"LLMAPITextToSpeech.service.js","sourceRoot":"","sources":["../../../../src/providers/LLMAPI/services/LLMAPITextToSpeech.service.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,+DAK+B;AAG/B,+DAA4D;AAC5D,yCAAoD;AACpD,wEAAqE;AACrE,0EAAgF;AAEhF,MAAa,yBAEX,SAAQ,iCAAqD;IAC7D,YACE,MAAsC,EACtC,QAAkB,EAClB,OAAiD;QAEjD,KAAK,CAAC,kCAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAC7B,GAAG,EAAE,CAAC,IAAI,eAAM,CAAC;YACf,GAAG,IAAI,CAAC,OAAO;YACf,OAAO,EAAE,iCAAe;SACzB,CAAsB,CACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,OAA+D;QAE/D,MAAM,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,GAChB,GAAG,OAAO,CAAC;QAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,WAAW,EAAE,cAAc,EAAE,CAAC;YAE9B,MAAM,YAAY,GAAG,4CAAyB,CAC5C,KAAK,CAAC,IAA8C,CACrD,IAAI,OAAO,CAAC;YAEb,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC5D,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,KAAK,EAAE,IAAI;gBACX,YAAY;gBACZ,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,YAAY;gBAC3C,eAAe,EAAE,aAAa,EAAE,eAAsB;gBACtD,KAAK,EAAE,aAAa,EAAE,KAAK;aAC5B,EAAE;gBACD,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;aAC3B,CAAC,CAAC;YAEH,WAAW,EAAE,cAAc,EAAE,CAAC;YAE9B,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAElD,WAAW,EAAE,cAAc,EAAE,CAAC;YAE9B,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC7B,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC7C,KAAK;gBACL,KAAK,EAAE;oBACL,eAAe,EAAE,IAAI,CAAC,MAAM;oBAC5B,iBAAiB,EAAE,CAAC;iBACrB;gBACD,YAAY;aACb,CAAC,CAAC;YAEH,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;aACpD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,iBAAiB,CAAC;gBAC3B,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC7C,KAAK;gBACL,SAAS,EAAE,WAAW,EAAE,OAAO;gBAC/B,YAAY;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM;gBACT,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBAC7C,KAAK,CAAC,uBAAuB,EAAE;gBAC9B,KAAK,EAAE,IAAA,+BAAc,EAAC,KAAK,CAAC;gBAC5B,OAAO;aACR,CAAC,CAAC;YAEL,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AA5FD,8DA4FC"}
1
+ {"version":3,"file":"LLMAPITextToSpeech.service.js","sourceRoot":"","sources":["../../../../src/providers/LLMAPI/services/LLMAPITextToSpeech.service.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,+DAG+B;AAG/B,4HAE2E;AAC3E,wEAAqE;AACrE,0EAAgF;AAEhF,MAAa,yBAEX,SAAQ,0EAAkE;IAC1E,YACE,MAAsC,EACtC,QAAkB,EAClB,OAAiD;QAEjD,KAAK,CAAC,kCAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAC7B,GAAG,EAAE,CAAC,IAAI,eAAM,CAAC;YACf,GAAG,IAAI,CAAC,OAAO;YACf,OAAO,EAAE,iCAAe;SACzB,CAAsB,CACxB,CAAC;IACJ,CAAC;IAES,eAAe,CAAC,SAAiB;QACzC,OAAO,4CAAyB,CAC9B,SAAmD,CACpD,IAAI,OAAO,CAAC;IACf,CAAC;IAES,iBAAiB,CAAC,WAAyB;QACnD,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;SAC3B,CAAC;IACJ,CAAC;IAES,YAAY,CACpB,YAAoB,EACpB,IAAY;QAEZ,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,MAAM;YAC5B,iBAAiB,EAAE,CAAC;SACrB,CAAC;IACJ,CAAC;CACF;AA1CD,8DA0CC"}
@@ -1,10 +1,17 @@
1
+ import { type ReadStream } from 'fs';
1
2
  import { OpenAI } from 'openai';
2
- import { LLMProviders, type LLMInstanceOptions, type LLMTranscribeOptions, type LLMTranscribeResult } from '../../../LLMService.typedefs';
3
+ import type { TranscriptionCreateParamsNonStreaming } from 'openai/resources/audio/transcriptions';
4
+ import { LLMProviders, type LLMInstanceOptions, type LLMTranscribeOptions } from '../../../LLMService.typedefs';
3
5
  import { type LLMLoggerInterface } from '../../../utilities/logger';
4
6
  import { type LLMReporterInterface } from '../../../utilities/reporter';
5
- import { LLMSpeechToTextService } from '../../../services';
6
- export declare class OpenAISpeechToTextService<Reporter extends LLMReporterInterface<any> | undefined> extends LLMSpeechToTextService<LLMProviders.OpenAI, Reporter> {
7
+ import { OpenAICompatibleSpeechToTextService } from '../../../providers/OpenAICompatible/OpenAICompatibleSpeechToText.service';
8
+ export declare class OpenAISpeechToTextService<Reporter extends LLMReporterInterface<any> | undefined> extends OpenAICompatibleSpeechToTextService<LLMProviders.OpenAI, Reporter> {
7
9
  constructor(logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[LLMProviders.OpenAI]);
8
10
  get instance(): OpenAI;
9
- transcribe(options: LLMTranscribeOptions<typeof this.provider, Reporter>): Promise<LLMTranscribeResult>;
11
+ protected buildTranscriptionParams(options: LLMTranscribeOptions<LLMProviders.OpenAI, Reporter>, audioFileStream: ReadStream): TranscriptionCreateParamsNonStreaming<'json'>;
12
+ protected extractUsage(response: OpenAI.Audio.Transcription): {
13
+ inputTextTokens: number;
14
+ inputAudioTokens: number;
15
+ outputTextTokens: number;
16
+ };
10
17
  }
@@ -1,86 +1,39 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.OpenAISpeechToTextService = void 0;
7
- const fs_1 = require("fs");
8
4
  const openai_1 = require("openai");
9
5
  const LLMService_typedefs_1 = require("../../../LLMService.typedefs");
10
- const serializeError_1 = require("../../../utilities/serializeError");
11
- const services_1 = require("../../../services");
6
+ const OpenAICompatibleSpeechToText_service_1 = require("../../../providers/OpenAICompatible/OpenAICompatibleSpeechToText.service");
12
7
  const OpenAI_entity_1 = require("../../../providers/OpenAI/OpenAI.entity");
13
- const mime_types_1 = __importDefault(require("mime-types"));
14
- class OpenAISpeechToTextService extends services_1.LLMSpeechToTextService {
8
+ class OpenAISpeechToTextService extends OpenAICompatibleSpeechToText_service_1.OpenAICompatibleSpeechToTextService {
15
9
  constructor(logger, reporter, options) {
16
10
  super(LLMService_typedefs_1.LLMProviders.OpenAI, logger, reporter, options);
17
11
  }
18
12
  get instance() {
19
13
  return this.getOrCreateInstance(() => new openai_1.OpenAI(this.options));
20
14
  }
21
- async transcribe(options) {
22
- const { model, pathToAudio, mimeType, instructions, language, abortSignal, reporterContext, } = options;
23
- const writeMetrics = this.reporter?.initWriter(reporterContext);
24
- try {
25
- abortSignal?.throwIfAborted();
26
- const { maxFileSize, supportedMimeTypes, } = OpenAI_entity_1.OpenAIEntity.transcribeLimits;
27
- const fileSize = (0, fs_1.statSync)(pathToAudio).size;
28
- if (fileSize > maxFileSize) {
29
- throw new Error(`File size exceeds the limit of ${maxFileSize} bytes`);
30
- }
31
- const resolvedMimeType = mimeType ?? mime_types_1.default.lookup(pathToAudio);
32
- if (!resolvedMimeType || !supportedMimeTypes.includes(resolvedMimeType)) {
33
- throw new Error(`Unsupported audio file type: ${resolvedMimeType}. Supported types are: ${supportedMimeTypes.join(', ')}`);
34
- }
35
- const audioFileStream = (0, fs_1.createReadStream)(pathToAudio, { signal: abortSignal });
36
- abortSignal?.throwIfAborted();
37
- const response = await this.instance.audio.transcriptions.create({
38
- model: model.name,
39
- file: audioFileStream,
40
- response_format: 'json',
41
- temperature: model.config?.temperature,
42
- prompt: instructions || OpenAI_entity_1.OpenAIEntity.transcribeInstructions,
43
- language,
44
- }, {
45
- signal: abortSignal,
46
- });
47
- abortSignal?.throwIfAborted();
48
- const inputTextTokens = response.usage && 'input_token_details' in response.usage
49
- ? response.usage.input_token_details?.text_tokens ?? 0
50
- : 0;
51
- const inputAudioTokens = response.usage && 'input_token_details' in response.usage
52
- ? response.usage.input_token_details?.audio_tokens ?? 0
53
- : 0;
54
- const outputTextTokens = response.usage && 'output_tokens' in response.usage
55
- ? response.usage.output_tokens
56
- : 0;
57
- await this.writeSuccessMetrics({
58
- method: this.getMethodName(this.transcribe),
59
- model,
60
- usage: {
61
- inputTextTokens,
62
- inputAudioTokens,
63
- outputTextTokens,
64
- },
65
- writeMetrics,
66
- });
67
- return { text: response.text };
68
- }
69
- catch (error) {
70
- await this.writeErrorMetrics({
71
- method: this.getMethodName(this.transcribe),
72
- model,
73
- isAborted: abortSignal?.aborted,
74
- writeMetrics,
75
- });
76
- this.logger
77
- ?.child(this.getMethodName(this.transcribe))
78
- .error('Error transcribing audio', {
79
- error: (0, serializeError_1.serializeError)(error),
80
- options,
81
- });
82
- return { error };
83
- }
15
+ buildTranscriptionParams(options, audioFileStream) {
16
+ return {
17
+ ...super.buildTranscriptionParams(options, audioFileStream),
18
+ temperature: options.model.config?.temperature,
19
+ prompt: options.instructions || OpenAI_entity_1.OpenAIEntity.transcribeInstructions,
20
+ };
21
+ }
22
+ extractUsage(response) {
23
+ const inputTextTokens = response.usage && 'input_token_details' in response.usage
24
+ ? response.usage.input_token_details?.text_tokens ?? 0
25
+ : 0;
26
+ const inputAudioTokens = response.usage && 'input_token_details' in response.usage
27
+ ? response.usage.input_token_details?.audio_tokens ?? 0
28
+ : 0;
29
+ const outputTextTokens = response.usage && 'output_tokens' in response.usage
30
+ ? response.usage.output_tokens
31
+ : 0;
32
+ return {
33
+ inputTextTokens,
34
+ inputAudioTokens,
35
+ outputTextTokens,
36
+ };
84
37
  }
85
38
  }
86
39
  exports.OpenAISpeechToTextService = OpenAISpeechToTextService;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAISpeechToText.service.js","sourceRoot":"","sources":["../../../../src/providers/OpenAI/services/OpenAISpeechToText.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenAISpeechToText.service.js","sourceRoot":"","sources":["../../../../src/providers/OpenAI/services/OpenAISpeechToText.service.ts"],"names":[],"mappings":";;;AACA,mCAAgC;AAEhC,+DAI+B;AAG/B,4HAE2E;AAC3E,oEAAgE;AAEhE,MAAa,yBAEX,SAAQ,0EAAkE;IAC1E,YACE,MAAsC,EACtC,QAAkB,EAClB,OAAiD;QAEjD,KAAK,CAAC,kCAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAES,wBAAwB,CAChC,OAA4D,EAC5D,eAA2B;QAE3B,OAAO;YACL,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,EAAE,eAAe,CAAC;YAC3D,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW;YAC9C,MAAM,EAAE,OAAO,CAAC,YAAY,IAAI,4BAAY,CAAC,sBAAsB;SACpE,CAAC;IACJ,CAAC;IAES,YAAY,CACpB,QAAoC;QAEpC,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,IAAI,qBAAqB,IAAI,QAAQ,CAAC,KAAK;YAC/E,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE,WAAW,IAAI,CAAC;YACtD,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,IAAI,qBAAqB,IAAI,QAAQ,CAAC,KAAK;YAChF,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE,YAAY,IAAI,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,IAAI,eAAe,IAAI,QAAQ,CAAC,KAAK;YAC1E,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;YAC9B,CAAC,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,eAAe;YACf,gBAAgB;YAChB,gBAAgB;SACjB,CAAC;IACJ,CAAC;CACF;AA7CD,8DA6CC"}
@@ -1,10 +1,13 @@
1
1
  import { OpenAI } from 'openai';
2
- import { LLMProviders, type LLMCreateSpeechOptions, type LLMCreateSpeechResult, type LLMInstanceOptions } from '../../../LLMService.typedefs';
2
+ import { LLMProviders, type LLMInstanceOptions, type LLMModel } from '../../../LLMService.typedefs';
3
3
  import { type LLMLoggerInterface } from '../../../utilities/logger';
4
4
  import { type LLMReporterInterface } from '../../../utilities/reporter';
5
- import { LLMTextToSpeechService } from '../../../services';
6
- export declare class OpenAITextToSpeechService<Reporter extends LLMReporterInterface<any> | undefined> extends LLMTextToSpeechService<LLMProviders.OpenAI, Reporter> {
5
+ import { OpenAICompatibleTextToSpeechService } from '../../../providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service';
6
+ export declare class OpenAITextToSpeechService<Reporter extends LLMReporterInterface<any> | undefined> extends OpenAICompatibleTextToSpeechService<LLMProviders.OpenAI, Reporter> {
7
7
  constructor(logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[LLMProviders.OpenAI]);
8
8
  get instance(): OpenAI;
9
- createSpeech(options: LLMCreateSpeechOptions<typeof this.provider, Reporter>): Promise<LLMCreateSpeechResult>;
9
+ protected extractUsage(audioBuffer: Buffer, text: string, model: LLMModel<LLMProviders.OpenAI>): Promise<{
10
+ inputTextTokens: number;
11
+ outputAudioTokens: number;
12
+ }>;
10
13
  }
@@ -3,75 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OpenAITextToSpeechService = void 0;
4
4
  const openai_1 = require("openai");
5
5
  const LLMService_typedefs_1 = require("../../../LLMService.typedefs");
6
- const serializeError_1 = require("../../../utilities/serializeError");
7
- const services_1 = require("../../../services");
6
+ const OpenAICompatibleTextToSpeech_service_1 = require("../../../providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service");
8
7
  const OpenAI_entity_1 = require("../../../providers/OpenAI/OpenAI.entity");
9
8
  const OpenAI_typedefs_1 = require("../../../providers/OpenAI/OpenAI.typedefs");
10
- class OpenAITextToSpeechService extends services_1.LLMTextToSpeechService {
9
+ class OpenAITextToSpeechService extends OpenAICompatibleTextToSpeech_service_1.OpenAICompatibleTextToSpeechService {
11
10
  constructor(logger, reporter, options) {
12
11
  super(LLMService_typedefs_1.LLMProviders.OpenAI, logger, reporter, options);
13
12
  }
14
13
  get instance() {
15
14
  return this.getOrCreateInstance(() => new openai_1.OpenAI(this.options));
16
15
  }
17
- async createSpeech(options) {
18
- const { text, model, instructions, speechOptions, abortSignal, reporterContext, } = options;
19
- const writeMetrics = this.reporter?.initWriter(reporterContext);
20
- try {
21
- abortSignal?.throwIfAborted();
22
- const audioResponse = await this.instance.audio.speech.create({
23
- model: model.name,
24
- input: text,
25
- instructions,
26
- voice: speechOptions?.voice || 'alloy',
27
- response_format: speechOptions?.response_format,
28
- speed: speechOptions?.speed,
29
- }, {
30
- signal: abortSignal,
31
- });
32
- abortSignal?.throwIfAborted();
33
- const audioArrayBuffer = await audioResponse.arrayBuffer();
34
- const audioBuffer = Buffer.from(audioArrayBuffer);
35
- abortSignal?.throwIfAborted();
36
- const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
37
- const inputTextTokens = text.length;
38
- // GPT-4o-mini-TTS bills audio output by tokens
39
- // TTS-1 doesn't bill for audio output separately (included in input character cost)
40
- const outputAudioTokens = model.name === OpenAI_typedefs_1.OpenAIModelNames.TTS_1
41
- ? 0
42
- : await countTokensFn([{
43
- type: LLMService_typedefs_1.LLMMessageContentType.AUDIO_FILE,
44
- buffer: audioBuffer,
45
- }]);
46
- await this.writeSuccessMetrics({
47
- method: this.getMethodName(this.createSpeech),
48
- model,
49
- usage: {
50
- inputTextTokens,
51
- outputAudioTokens,
52
- },
53
- writeMetrics,
54
- });
55
- return {
56
- audio: audioBuffer,
57
- mimeType: audioResponse.headers.get('Content-Type'),
58
- };
59
- }
60
- catch (error) {
61
- await this.writeErrorMetrics({
62
- method: this.getMethodName(this.createSpeech),
63
- model,
64
- isAborted: abortSignal?.aborted,
65
- writeMetrics,
66
- });
67
- this.logger
68
- ?.child(this.getMethodName(this.createSpeech))
69
- .error('Error creating speech', {
70
- error: (0, serializeError_1.serializeError)(error),
71
- options,
72
- });
73
- return { error };
74
- }
16
+ async extractUsage(audioBuffer, text, model) {
17
+ const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
18
+ const inputTextTokens = text.length;
19
+ const outputAudioTokens = model.name === OpenAI_typedefs_1.OpenAIModelNames.TTS_1
20
+ ? 0
21
+ : await countTokensFn([{
22
+ type: LLMService_typedefs_1.LLMMessageContentType.AUDIO_FILE,
23
+ buffer: audioBuffer,
24
+ }]);
25
+ return {
26
+ inputTextTokens,
27
+ outputAudioTokens,
28
+ };
75
29
  }
76
30
  }
77
31
  exports.OpenAITextToSpeechService = OpenAITextToSpeechService;
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAITextToSpeech.service.js","sourceRoot":"","sources":["../../../../src/providers/OpenAI/services/OpenAITextToSpeech.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OpenAITextToSpeech.service.js","sourceRoot":"","sources":["../../../../src/providers/OpenAI/services/OpenAITextToSpeech.service.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,+DAK+B;AAG/B,4HAE2E;AAC3E,oEAAgE;AAChE,wEAAsE;AAEtE,MAAa,yBAEX,SAAQ,0EAAkE;IAC1E,YACE,MAAsC,EACtC,QAAkB,EAClB,OAAiD;QAEjD,KAAK,CAAC,kCAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAES,KAAK,CAAC,YAAY,CAC1B,WAAmB,EACnB,IAAY,EACZ,KAAoC;QAEpC,MAAM,aAAa,GAAG,4BAAY,CAAC,gBAAgB,EAAE,CAAC;QAEtD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;QAEpC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,KAAK,kCAAgB,CAAC,KAAK;YAC7D,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC;oBACrB,IAAI,EAAE,2CAAqB,CAAC,UAAU;oBACtC,MAAM,EAAE,WAAkC;iBAC3C,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,eAAe;YACf,iBAAiB;SAClB,CAAC;IACJ,CAAC;CACF;AApCD,8DAoCC"}
@@ -0,0 +1,22 @@
1
+ import { type ReadStream } from 'fs';
2
+ import { OpenAI } from 'openai';
3
+ import type { TranscriptionCreateParamsNonStreaming } from 'openai/resources/audio/transcriptions';
4
+ import { type LLMProviders, type LLMFileLimits, type LLMInstanceOptions, type LLMTranscribeOptions, type LLMTranscribeResult } from '../../LLMService.typedefs';
5
+ import { type LLMLoggerInterface } from '../../utilities/logger';
6
+ import { type LLMReporterInterface } from '../../utilities/reporter';
7
+ import { LLMSpeechToTextService } from '../../services';
8
+ type OpenAICompatibleSTTProvider = LLMProviders.OpenAI | LLMProviders.LLMAPI;
9
+ interface TranscriptionUsage {
10
+ inputTextTokens: number;
11
+ inputAudioTokens: number;
12
+ outputTextTokens: number;
13
+ }
14
+ export declare abstract class OpenAICompatibleSpeechToTextService<Provider extends OpenAICompatibleSTTProvider, Reporter extends LLMReporterInterface<any> | undefined> extends LLMSpeechToTextService<Provider, Reporter> {
15
+ constructor(provider: Provider, logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[Provider]);
16
+ get instance(): OpenAI;
17
+ protected get transcribeLimits(): LLMFileLimits;
18
+ protected buildTranscriptionParams(options: LLMTranscribeOptions<Provider, Reporter>, audioFileStream: ReadStream): TranscriptionCreateParamsNonStreaming<'json'>;
19
+ protected abstract extractUsage(response: OpenAI.Audio.Transcription, fileSize: number): TranscriptionUsage;
20
+ transcribe(options: LLMTranscribeOptions<typeof this.provider, Reporter>): Promise<LLMTranscribeResult>;
21
+ }
22
+ export {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAICompatibleSpeechToTextService = void 0;
7
+ const fs_1 = require("fs");
8
+ const openai_1 = require("openai");
9
+ const serializeError_1 = require("../../utilities/serializeError");
10
+ const services_1 = require("../../services");
11
+ const OpenAI_entity_1 = require("../../providers/OpenAI/OpenAI.entity");
12
+ const mime_types_1 = __importDefault(require("mime-types"));
13
+ class OpenAICompatibleSpeechToTextService extends services_1.LLMSpeechToTextService {
14
+ constructor(provider, logger, reporter, options) {
15
+ super(provider, logger, reporter, options);
16
+ }
17
+ get instance() {
18
+ return this.getOrCreateInstance(() => new openai_1.OpenAI(this.options));
19
+ }
20
+ get transcribeLimits() {
21
+ return OpenAI_entity_1.OpenAIEntity.transcribeLimits;
22
+ }
23
+ buildTranscriptionParams(options, audioFileStream) {
24
+ return {
25
+ model: options.model.name,
26
+ file: audioFileStream,
27
+ response_format: 'json',
28
+ prompt: options.instructions,
29
+ };
30
+ }
31
+ async transcribe(options) {
32
+ const { model, pathToAudio, mimeType, abortSignal, reporterContext, } = options;
33
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
34
+ try {
35
+ abortSignal?.throwIfAborted();
36
+ const { maxFileSize, supportedMimeTypes, } = this.transcribeLimits;
37
+ const fileSize = (0, fs_1.statSync)(pathToAudio).size;
38
+ if (fileSize > maxFileSize) {
39
+ throw new Error(`File size exceeds the limit of ${maxFileSize} bytes`);
40
+ }
41
+ const resolvedMimeType = mimeType ?? mime_types_1.default.lookup(pathToAudio);
42
+ if (!resolvedMimeType || !supportedMimeTypes.includes(resolvedMimeType)) {
43
+ throw new Error(`Unsupported audio file type: ${resolvedMimeType}. Supported types are: ${supportedMimeTypes.join(', ')}`);
44
+ }
45
+ const audioFileStream = (0, fs_1.createReadStream)(pathToAudio, { signal: abortSignal });
46
+ abortSignal?.throwIfAborted();
47
+ const params = this.buildTranscriptionParams(options, audioFileStream);
48
+ const response = await this.instance.audio.transcriptions.create(params, {
49
+ signal: abortSignal,
50
+ });
51
+ abortSignal?.throwIfAborted();
52
+ const usage = this.extractUsage(response, fileSize);
53
+ await this.writeSuccessMetrics({
54
+ method: this.getMethodName(this.transcribe),
55
+ model,
56
+ usage,
57
+ writeMetrics,
58
+ });
59
+ return { text: response.text };
60
+ }
61
+ catch (error) {
62
+ await this.writeErrorMetrics({
63
+ method: this.getMethodName(this.transcribe),
64
+ model,
65
+ isAborted: abortSignal?.aborted,
66
+ writeMetrics,
67
+ });
68
+ this.logger
69
+ ?.child(this.getMethodName(this.transcribe))
70
+ .error('Error transcribing audio', {
71
+ error: (0, serializeError_1.serializeError)(error),
72
+ options,
73
+ });
74
+ return { error };
75
+ }
76
+ }
77
+ }
78
+ exports.OpenAICompatibleSpeechToTextService = OpenAICompatibleSpeechToTextService;
79
+ //# sourceMappingURL=OpenAICompatibleSpeechToText.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAICompatibleSpeechToText.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { OpenAI } from 'openai';
2
+ import { type LLMProviders, type LLMCreateSpeechOptions, type LLMCreateSpeechResult, type LLMInstanceOptions, type LLMModel } from '../../LLMService.typedefs';
3
+ import { type LLMLoggerInterface } from '../../utilities/logger';
4
+ import { type LLMReporterInterface } from '../../utilities/reporter';
5
+ import { LLMTextToSpeechService } from '../../services';
6
+ type OpenAICompatibleTTSProvider = LLMProviders.OpenAI | LLMProviders.LLMAPI;
7
+ interface SpeechUsage {
8
+ inputTextTokens: number;
9
+ outputAudioTokens: number;
10
+ }
11
+ export declare abstract class OpenAICompatibleTextToSpeechService<Provider extends OpenAICompatibleTTSProvider, Reporter extends LLMReporterInterface<any> | undefined> extends LLMTextToSpeechService<Provider, Reporter> {
12
+ constructor(provider: Provider, logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[Provider]);
13
+ get instance(): OpenAI;
14
+ protected getDefaultVoice(_modelName: string): string;
15
+ protected getRequestOptions(abortSignal?: AbortSignal): {
16
+ signal?: AbortSignal;
17
+ headers?: Record<string, string>;
18
+ };
19
+ protected abstract extractUsage(audioBuffer: Buffer, text: string, model: LLMModel<Provider>): Promise<SpeechUsage> | SpeechUsage;
20
+ createSpeech(options: LLMCreateSpeechOptions<typeof this.provider, Reporter>): Promise<LLMCreateSpeechResult>;
21
+ }
22
+ export {};
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAICompatibleTextToSpeechService = void 0;
4
+ const openai_1 = require("openai");
5
+ const serializeError_1 = require("../../utilities/serializeError");
6
+ const services_1 = require("../../services");
7
+ class OpenAICompatibleTextToSpeechService extends services_1.LLMTextToSpeechService {
8
+ constructor(provider, logger, reporter, options) {
9
+ super(provider, logger, reporter, options);
10
+ }
11
+ get instance() {
12
+ return this.getOrCreateInstance(() => new openai_1.OpenAI(this.options));
13
+ }
14
+ getDefaultVoice(_modelName) {
15
+ return 'alloy';
16
+ }
17
+ getRequestOptions(abortSignal) {
18
+ return { signal: abortSignal };
19
+ }
20
+ async createSpeech(options) {
21
+ const { text, model, instructions, speechOptions, abortSignal, reporterContext, } = options;
22
+ const writeMetrics = this.reporter?.initWriter(reporterContext);
23
+ try {
24
+ abortSignal?.throwIfAborted();
25
+ const audioResponse = await this.instance.audio.speech.create({
26
+ model: model.name,
27
+ input: text,
28
+ instructions,
29
+ voice: speechOptions?.voice ?? this.getDefaultVoice(model.name),
30
+ response_format: speechOptions?.response_format,
31
+ speed: speechOptions?.speed,
32
+ }, this.getRequestOptions(abortSignal));
33
+ abortSignal?.throwIfAborted();
34
+ const audioArrayBuffer = await audioResponse.arrayBuffer();
35
+ const audioBuffer = Buffer.from(audioArrayBuffer);
36
+ abortSignal?.throwIfAborted();
37
+ const usage = await this.extractUsage(audioBuffer, text, model);
38
+ await this.writeSuccessMetrics({
39
+ method: this.getMethodName(this.createSpeech),
40
+ model,
41
+ usage,
42
+ writeMetrics,
43
+ });
44
+ return {
45
+ audio: audioBuffer,
46
+ mimeType: audioResponse.headers.get('Content-Type'),
47
+ };
48
+ }
49
+ catch (error) {
50
+ await this.writeErrorMetrics({
51
+ method: this.getMethodName(this.createSpeech),
52
+ model,
53
+ isAborted: abortSignal?.aborted,
54
+ writeMetrics,
55
+ });
56
+ this.logger
57
+ ?.child(this.getMethodName(this.createSpeech))
58
+ .error('Error creating speech', {
59
+ error: (0, serializeError_1.serializeError)(error),
60
+ options,
61
+ });
62
+ return { error };
63
+ }
64
+ }
65
+ }
66
+ exports.OpenAICompatibleTextToSpeechService = OpenAICompatibleTextToSpeechService;
67
+ //# sourceMappingURL=OpenAICompatibleTextToSpeech.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAICompatibleTextToSpeech.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAUhC,+DAA4D;AAC5D,yCAAoD;AASpD,MAAsB,mCAGpB,SAAQ,iCAA0C;IAClD,YACE,QAAkB,EAClB,MAAsC,EACtC,QAAkB,EAClB,OAAsC;QAEtC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,mBAAmB,CAC7B,GAAG,EAAE,CAAC,IAAI,eAAM,CAAC,IAAI,CAAC,OAAO,CAAsB,CACpD,CAAC;IACJ,CAAC;IAES,eAAe,CAAC,UAAkB;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAES,iBAAiB,CAAC,WAAyB;QACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAQD,KAAK,CAAC,YAAY,CAChB,OAA+D;QAE/D,MAAM,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,GAChB,GAAG,OAAO,CAAC;QAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,WAAW,EAAE,cAAc,EAAE,CAAC;YAE9B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC5D,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,KAAK,EAAE,IAAI;gBACX,YAAY;gBACZ,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC/D,eAAe,EAAE,aAAa,EAAE,eAAsB;gBACtD,KAAK,EAAE,aAAa,EAAE,KAAK;aAC5B,EAAE,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;YAExC,WAAW,EAAE,cAAc,EAAE,CAAC;YAE9B,MAAM,gBAAgB,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAElD,WAAW,EAAE,cAAc,EAAE,CAAC;YAE9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAEhE,MAAM,IAAI,CAAC,mBAAmB,CAAC;gBAC7B,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC7C,KAAK;gBACL,KAAK;gBACL,YAAY;aACb,CAAC,CAAC;YAEH,OAAO;gBACL,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;aACpD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,iBAAiB,CAAC;gBAC3B,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC7C,KAAK;gBACL,SAAS,EAAE,WAAW,EAAE,OAAO;gBAC/B,YAAY;aACb,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM;gBACT,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBAC7C,KAAK,CAAC,uBAAuB,EAAE;gBAC9B,KAAK,EAAE,IAAA,+BAAc,EAAC,KAAK,CAAC;gBAC5B,OAAO;aACR,CAAC,CAAC;YAEL,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAjGD,kFAiGC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mate-academy/llm-gateway",
3
- "version": "7.3.0",
3
+ "version": "7.3.1",
4
4
  "description": "A gateway package for LLM services.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",