@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.
- package/dist/LLMService.constants.d.ts +5963 -3323
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.js +2 -3
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAISpeechToText.service.js.map +1 -1
- package/dist/providers/LLMAPI/LLMAPI.constants.d.ts +9923 -6337
- package/dist/providers/LLMAPI/LLMAPI.constants.js +334 -0
- package/dist/providers/LLMAPI/LLMAPI.constants.js.map +1 -1
- package/dist/providers/LLMAPI/LLMAPI.typedefs.d.ts +41 -1
- package/dist/providers/LLMAPI/LLMAPI.typedefs.js +51 -0
- package/dist/providers/LLMAPI/LLMAPI.typedefs.js.map +1 -1
- package/dist/providers/LLMAPI/LLMAPI.voices.d.ts +32 -0
- package/dist/providers/LLMAPI/LLMAPI.voices.js +41 -1
- package/dist/providers/LLMAPI/LLMAPI.voices.js.map +1 -1
- package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.d.ts +11 -4
- package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js +15 -63
- package/dist/providers/LLMAPI/services/LLMAPISpeechToText.service.js.map +1 -1
- package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.d.ts +14 -4
- package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.js +16 -53
- package/dist/providers/LLMAPI/services/LLMAPITextToSpeech.service.js.map +1 -1
- package/dist/providers/OpenAI/services/OpenAISpeechToText.service.d.ts +11 -4
- package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js +24 -71
- package/dist/providers/OpenAI/services/OpenAISpeechToText.service.js.map +1 -1
- package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.d.ts +7 -4
- package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.js +15 -61
- package/dist/providers/OpenAI/services/OpenAITextToSpeech.service.js.map +1 -1
- package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.d.ts +22 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js +79 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleSpeechToText.service.js.map +1 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.d.ts +22 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.js +67 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleTextToSpeech.service.js.map +1 -0
- 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
|
|
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
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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,+
|
|
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
|
|
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 {
|
|
6
|
-
export declare class OpenAISpeechToTextService<Reporter extends LLMReporterInterface<any> | undefined> extends
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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":"
|
|
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
|
|
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 {
|
|
6
|
-
export declare class OpenAITextToSpeechService<Reporter extends LLMReporterInterface<any> | undefined> extends
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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":";;;AAAA,mCAAgC;AAChC,+
|
|
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"}
|