@dataclouder/nest-vertex 0.0.56 → 0.0.57
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/comfyui/controllers/comfy-sdk.controller.js +12 -2
- package/comfyui/services/comfy-connection.service.js +4 -5
- package/comfyui/services/comfy-sdk.service.js +1 -1
- package/controllers/stt/groq-stt.controller.js +1 -1
- package/controllers/stt/local-stt.controller.d.ts +8 -0
- package/controllers/stt/local-stt.controller.js +62 -0
- package/controllers/tts/vertex-tts-adapter.controller.js +1 -1
- package/models/key-balancer.models.d.ts +2 -0
- package/nest-vertex.module.js +5 -6
- package/package.json +1 -1
- package/services/vertex-image.service.js +20 -16
- package/services/whisper/groq.service.js +1 -0
- package/services/whisper/local-stt.service.d.ts +7 -0
- package/services/whisper/local-stt.service.js +127 -0
- package/drizzle/drizzle.module.d.ts +0 -2
- package/drizzle/drizzle.module.js +0 -35
- package/drizzle/drizzle.service.d.ts +0 -10
- package/drizzle/drizzle.service.js +0 -68
- package/drizzle/dto/create-key-balancer.dto.d.ts +0 -9
- package/drizzle/dto/create-key-balancer.dto.js +0 -54
- package/drizzle/dto/create-key-usage.dto.d.ts +0 -6
- package/drizzle/dto/create-key-usage.dto.js +0 -11
- package/drizzle/dto/create-user-request.dto.d.ts +0 -7
- package/drizzle/dto/create-user-request.dto.js +0 -47
- package/drizzle/dto/update-key-balancer.dto.d.ts +0 -5
- package/drizzle/dto/update-key-balancer.dto.js +0 -9
- package/drizzle/dto/update-user-request.dto.d.ts +0 -5
- package/drizzle/dto/update-user-request.dto.js +0 -9
- package/drizzle/key-balancer.controller.d.ts +0 -13
- package/drizzle/key-balancer.controller.js +0 -103
- package/drizzle/key-balancer.model.d.ts +0 -10
- package/drizzle/key-balancer.model.js +0 -3
- package/drizzle/key-balancer.service.d.ts +0 -11
- package/drizzle/key-balancer.service.js +0 -50
- package/drizzle/key-usage.service.d.ts +0 -17
- package/drizzle/key-usage.service.js +0 -63
- package/drizzle/schema.d.ts +0 -395
- package/drizzle/schema.js +0 -33
- package/drizzle/user-requests.controller.d.ts +0 -47
- package/drizzle/user-requests.controller.js +0 -81
- package/drizzle/user-requests.service.d.ts +0 -47
- package/drizzle/user-requests.service.js +0 -47
- package/services/metric-ai.service.d.ts +0 -11
- package/services/metric-ai.service.js +0 -48
|
@@ -21,8 +21,18 @@ let ComfySDKController = class ComfySDKController {
|
|
|
21
21
|
return this.comfySDKService.testMethod();
|
|
22
22
|
}
|
|
23
23
|
async statusEndpoint() {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
try {
|
|
25
|
+
const status = await this.comfySDKService.getStatus();
|
|
26
|
+
return status;
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
const response = {
|
|
30
|
+
status: 'Server Down',
|
|
31
|
+
numAvailable: 0,
|
|
32
|
+
servers: [],
|
|
33
|
+
};
|
|
34
|
+
return response;
|
|
35
|
+
}
|
|
26
36
|
}
|
|
27
37
|
};
|
|
28
38
|
exports.ComfySDKController = ComfySDKController;
|
|
@@ -58,7 +58,6 @@ let ComfyConnectionService = ComfyConnectionService_1 = class ComfyConnectionSer
|
|
|
58
58
|
try {
|
|
59
59
|
await this.checkApiStatus();
|
|
60
60
|
this.logger.log('Successfully connected to ComfyUI server.');
|
|
61
|
-
this.connectWebSocket();
|
|
62
61
|
}
|
|
63
62
|
catch (error) {
|
|
64
63
|
this.logger.error('Failed to connect to ComfyUI server:', error.message || error);
|
|
@@ -109,7 +108,7 @@ let ComfyConnectionService = ComfyConnectionService_1 = class ComfyConnectionSer
|
|
|
109
108
|
this.logger.log('Disconnected from ComfyUI WebSocket. Attempting to reconnect...');
|
|
110
109
|
setTimeout(() => this.connectWebSocket(), 5000);
|
|
111
110
|
});
|
|
112
|
-
this.ws.on('error',
|
|
111
|
+
this.ws.on('error', error => {
|
|
113
112
|
this.logger.error('ComfyUI WebSocket error:', error);
|
|
114
113
|
});
|
|
115
114
|
}
|
|
@@ -177,7 +176,7 @@ let ComfyConnectionService = ComfyConnectionService_1 = class ComfyConnectionSer
|
|
|
177
176
|
prompt: workflow,
|
|
178
177
|
client_id: this.clientId,
|
|
179
178
|
};
|
|
180
|
-
return (0, rxjs_1.firstValueFrom)(this.httpService.post(url, payload)).then(
|
|
179
|
+
return (0, rxjs_1.firstValueFrom)(this.httpService.post(url, payload)).then(res => res.data);
|
|
181
180
|
}
|
|
182
181
|
async uploadImage(imageBuffer, filename) {
|
|
183
182
|
const url = `http://${this.comfyApiHost}/upload/image`;
|
|
@@ -198,11 +197,11 @@ let ComfyConnectionService = ComfyConnectionService_1 = class ComfyConnectionSer
|
|
|
198
197
|
reject(new Error(`Media generation timed out after ${timeoutMs / 1000} seconds for prompt ${prompt_id}.`));
|
|
199
198
|
}, timeoutMs);
|
|
200
199
|
this.pendingPrompts.set(prompt_id, {
|
|
201
|
-
resolve:
|
|
200
|
+
resolve: output => {
|
|
202
201
|
clearTimeout(timeout);
|
|
203
202
|
resolve(output);
|
|
204
203
|
},
|
|
205
|
-
reject:
|
|
204
|
+
reject: error => {
|
|
206
205
|
clearTimeout(timeout);
|
|
207
206
|
reject(error);
|
|
208
207
|
},
|
|
@@ -62,7 +62,7 @@ let ComfySDKService = ComfySDKService_1 = class ComfySDKService {
|
|
|
62
62
|
this.generatedAssetService = generatedAssetService;
|
|
63
63
|
this.httpService = httpService;
|
|
64
64
|
this.storageFactory = storageFactory;
|
|
65
|
-
this.api = new comfyui_sdk_1.ComfyApi('http://192.168.2.
|
|
65
|
+
this.api = new comfyui_sdk_1.ComfyApi(process.env.COMFYUI_API_HOST || 'http://192.168.2.2:8188').init();
|
|
66
66
|
console.log('what is in the comfy api?', this.api.apiHost);
|
|
67
67
|
}
|
|
68
68
|
init() {
|
|
@@ -55,7 +55,7 @@ __decorate([
|
|
|
55
55
|
], GroqSttController.prototype, "processAudio", null);
|
|
56
56
|
exports.GroqSttController = GroqSttController = GroqSttController_1 = __decorate([
|
|
57
57
|
(0, swagger_1.ApiTags)('Speech-to-Text'),
|
|
58
|
-
(0, common_1.Controller)('api/groq-stt'),
|
|
58
|
+
(0, common_1.Controller)('api/ai-services/groq-stt'),
|
|
59
59
|
(0, common_1.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
60
60
|
__metadata("design:paramtypes", [groq_service_1.GroqService])
|
|
61
61
|
], GroqSttController);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type MulterFile } from '@webundsoehne/nest-fastify-file-upload';
|
|
2
|
+
import { LocalSttService } from '../../services/whisper/local-stt.service';
|
|
3
|
+
export declare class LocalSttController {
|
|
4
|
+
private readonly localSttService;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(localSttService: LocalSttService);
|
|
7
|
+
processAudio(file: MulterFile): Promise<any>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var LocalSttController_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.LocalSttController = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const nest_fastify_file_upload_1 = require("@webundsoehne/nest-fastify-file-upload");
|
|
19
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
20
|
+
const nest_core_1 = require("@dataclouder/nest-core");
|
|
21
|
+
const local_stt_service_1 = require("../../services/whisper/local-stt.service");
|
|
22
|
+
let LocalSttController = LocalSttController_1 = class LocalSttController {
|
|
23
|
+
localSttService;
|
|
24
|
+
logger = new common_1.Logger(LocalSttController_1.name);
|
|
25
|
+
constructor(localSttService) {
|
|
26
|
+
this.localSttService = localSttService;
|
|
27
|
+
}
|
|
28
|
+
async processAudio(file) {
|
|
29
|
+
this.logger.log('Receive requests');
|
|
30
|
+
if (!file || !file.buffer) {
|
|
31
|
+
this.logger.error('No file buffer received.');
|
|
32
|
+
return { error: 'No file uploaded or file buffer is missing.' };
|
|
33
|
+
}
|
|
34
|
+
this.logger.log(`Received file: ${file.originalname}, mimetype: ${file.mimetype}, size: ${file.size}`);
|
|
35
|
+
try {
|
|
36
|
+
const result = await this.localSttService.transcribeAudio(file.buffer, file.originalname, file.mimetype);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.logger.error('Error during transcription process:', error);
|
|
41
|
+
return { error: 'Failed to transcribe audio.', details: error.message };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
exports.LocalSttController = LocalSttController;
|
|
46
|
+
__decorate([
|
|
47
|
+
(0, common_1.Post)('transcribe-bytes'),
|
|
48
|
+
(0, common_1.UseInterceptors)((0, nest_fastify_file_upload_1.FileInterceptor)('file')),
|
|
49
|
+
(0, swagger_1.ApiConsumes)('multipart/form-data'),
|
|
50
|
+
(0, nest_fastify_file_upload_1.ApiFileBody)('file'),
|
|
51
|
+
__param(0, (0, common_1.UploadedFile)('file')),
|
|
52
|
+
__metadata("design:type", Function),
|
|
53
|
+
__metadata("design:paramtypes", [Object]),
|
|
54
|
+
__metadata("design:returntype", Promise)
|
|
55
|
+
], LocalSttController.prototype, "processAudio", null);
|
|
56
|
+
exports.LocalSttController = LocalSttController = LocalSttController_1 = __decorate([
|
|
57
|
+
(0, swagger_1.ApiTags)('Speech-to-Text'),
|
|
58
|
+
(0, common_1.Controller)('api/ai-services/local-stt'),
|
|
59
|
+
(0, common_1.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
60
|
+
__metadata("design:paramtypes", [local_stt_service_1.LocalSttService])
|
|
61
|
+
], LocalSttController);
|
|
62
|
+
//# sourceMappingURL=local-stt.controller.js.map
|
|
@@ -105,7 +105,7 @@ __decorate([
|
|
|
105
105
|
], VertexTtsAdapterController.prototype, "listVoices", null);
|
|
106
106
|
exports.VertexTtsAdapterController = VertexTtsAdapterController = __decorate([
|
|
107
107
|
(0, swagger_1.ApiTags)('Vertex TTS Adapter'),
|
|
108
|
-
(0, common_1.Controller)('api/
|
|
108
|
+
(0, common_1.Controller)('api/ai-services/adapter/tts'),
|
|
109
109
|
(0, common_2.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
110
110
|
__metadata("design:paramtypes", [vertex_tts_service_1.VertextTtsService])
|
|
111
111
|
], VertexTtsAdapterController);
|
package/nest-vertex.module.js
CHANGED
|
@@ -36,12 +36,12 @@ const veo_video_controller_1 = require("./controllers/video/veo-video.controller
|
|
|
36
36
|
const google_genai_service_1 = require("./services/google-genai.service");
|
|
37
37
|
const groq_stt_controller_1 = require("./controllers/stt/groq-stt.controller");
|
|
38
38
|
const groq_service_1 = require("./services/whisper/groq.service");
|
|
39
|
+
const local_stt_controller_1 = require("./controllers/stt/local-stt.controller");
|
|
40
|
+
const local_stt_service_1 = require("./services/whisper/local-stt.service");
|
|
39
41
|
const comfy_sdk_service_1 = require("./comfyui/services/comfy-sdk.service");
|
|
40
42
|
const vertex_gemini_tts_controller_1 = require("./controllers/tts/vertex-gemini-tts.controller");
|
|
41
43
|
const vertex_gemini_tts_service_1 = require("./services/vertex-gemini-tts.service");
|
|
42
|
-
const drizzle_module_1 = require("./drizzle/drizzle.module");
|
|
43
44
|
const nest_auth_1 = require("@dataclouder/nest-auth");
|
|
44
|
-
const metric_ai_service_1 = require("./services/metric-ai.service");
|
|
45
45
|
const groq_llm_service_1 = require("./services/llm/groq-llm.service");
|
|
46
46
|
const groq_llm_controller_1 = require("./controllers/llm/groq-llm.controller");
|
|
47
47
|
const video_gen_adapter_controller_1 = require("./controllers/video/video-gen-adapter.controller");
|
|
@@ -56,7 +56,6 @@ exports.NestVertexModule = NestVertexModule = __decorate([
|
|
|
56
56
|
nest_mongo_1.DCMongoDBModule,
|
|
57
57
|
mongoose_1.MongooseModule.forFeature([{ name: generated_asset_entity_1.GeneratedAsset.name, schema: generated_asset_entity_1.GeneratedAssetSchema }]),
|
|
58
58
|
comfyui_module_1.ComfyUIModule,
|
|
59
|
-
drizzle_module_1.DrizzleModule,
|
|
60
59
|
nest_auth_1.NestAuthModule,
|
|
61
60
|
],
|
|
62
61
|
providers: [
|
|
@@ -74,9 +73,9 @@ exports.NestVertexModule = NestVertexModule = __decorate([
|
|
|
74
73
|
vertex_veo_genai_service_1.VertexVeoGenaiService,
|
|
75
74
|
google_genai_service_1.GoogleGenaiService,
|
|
76
75
|
groq_service_1.GroqService,
|
|
76
|
+
local_stt_service_1.LocalSttService,
|
|
77
77
|
comfy_sdk_service_1.ComfySDKService,
|
|
78
78
|
vertex_gemini_tts_service_1.VertexGeminiTtsService,
|
|
79
|
-
metric_ai_service_1.MetricAIService,
|
|
80
79
|
groq_llm_service_1.GroqLlmService,
|
|
81
80
|
],
|
|
82
81
|
exports: [
|
|
@@ -94,11 +93,10 @@ exports.NestVertexModule = NestVertexModule = __decorate([
|
|
|
94
93
|
vertex_veo_genai_service_1.VertexVeoGenaiService,
|
|
95
94
|
google_genai_service_1.GoogleGenaiService,
|
|
96
95
|
groq_service_1.GroqService,
|
|
96
|
+
local_stt_service_1.LocalSttService,
|
|
97
97
|
comfyui_module_1.ComfyUIModule,
|
|
98
98
|
comfy_sdk_service_1.ComfySDKService,
|
|
99
99
|
vertex_gemini_tts_service_1.VertexGeminiTtsService,
|
|
100
|
-
drizzle_module_1.DrizzleModule,
|
|
101
|
-
metric_ai_service_1.MetricAIService,
|
|
102
100
|
groq_llm_service_1.GroqLlmService,
|
|
103
101
|
],
|
|
104
102
|
controllers: [
|
|
@@ -112,6 +110,7 @@ exports.NestVertexModule = NestVertexModule = __decorate([
|
|
|
112
110
|
vertex_comfy_controller_1.VertexComfyController,
|
|
113
111
|
veo_video_controller_1.VertexVeoGenerationController,
|
|
114
112
|
groq_stt_controller_1.GroqSttController,
|
|
113
|
+
local_stt_controller_1.LocalSttController,
|
|
115
114
|
vertex_gemini_tts_controller_1.VertexGeminiTtsController,
|
|
116
115
|
],
|
|
117
116
|
})
|
package/package.json
CHANGED
|
@@ -38,32 +38,36 @@ let ImageVertexService = ImageVertexService_1 = class ImageVertexService {
|
|
|
38
38
|
let apiKey;
|
|
39
39
|
let keyId;
|
|
40
40
|
let availableKey = {};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
keyId = 'local';
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
this.logger.log(`Vertex Image"Getting key for model: ${model} and tier: ${tierType}`);
|
|
41
|
+
try {
|
|
42
|
+
this.logger.log(`Vertex Image - Getting key for model: ${model} and tier: ${tierType}`);
|
|
47
43
|
availableKey = await this.keyBalancerApiService.getBestKey({
|
|
48
44
|
provider: 'google',
|
|
49
45
|
service: model,
|
|
50
46
|
tierType: tierType,
|
|
51
47
|
aiType: key_balancer_models_1.ModelType.IMAGE,
|
|
52
48
|
}, null);
|
|
53
|
-
if (availableKey
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
if (availableKey?.error === 'RateLimited') {
|
|
57
|
-
this.logger.error('No available API key from key balancer.');
|
|
58
|
-
throw new Error('RateLimited');
|
|
59
|
-
}
|
|
60
|
-
if (!availableKey || availableKey?.error) {
|
|
61
|
-
this.logger.error('No available API key from key balancer.');
|
|
62
|
-
throw new Error('Not available API key');
|
|
49
|
+
if (!availableKey || availableKey.error) {
|
|
50
|
+
throw new Error('No available API key from key balancer or error received.');
|
|
63
51
|
}
|
|
52
|
+
this.logger.log(` USING Balanced key 🖼️ ${availableKey.name} ${availableKey.id}`);
|
|
64
53
|
apiKey = availableKey.key;
|
|
65
54
|
keyId = availableKey.id;
|
|
66
55
|
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
this.logger.warn(`Failed to get key from KeyBalancer: ${error.message}. Falling back to GEMINI_API_KEY.`);
|
|
58
|
+
if (this.gemini_key) {
|
|
59
|
+
apiKey = this.gemini_key;
|
|
60
|
+
keyId = 'local-gemini-key';
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.logger.error('Fallback to GEMINI_API_KEY failed as it is not set.');
|
|
64
|
+
throw new Error('No available API key from KeyBalancer and no fallback GEMINI_API_KEY set.');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!apiKey) {
|
|
68
|
+
this.logger.error('Could not obtain an API key.');
|
|
69
|
+
throw new Error('Not available API key');
|
|
70
|
+
}
|
|
67
71
|
return {
|
|
68
72
|
client: new genai_1.GoogleGenAI({ apiKey }),
|
|
69
73
|
keyId,
|
|
@@ -113,6 +113,7 @@ let GroqService = GroqService_1 = class GroqService {
|
|
|
113
113
|
tierType: key_balancer_models_1.TierType.FREE_TIER,
|
|
114
114
|
aiType: key_balancer_models_1.ModelType.AUDIO,
|
|
115
115
|
}, null);
|
|
116
|
+
console.log(`Using key: ${keyResult.name} {${keyResult?.service}}`);
|
|
116
117
|
const transcription = await this.getClientWithKey(keyResult.key).audio.transcriptions.create({
|
|
117
118
|
file: file,
|
|
118
119
|
model: 'whisper-large-v3-turbo',
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var LocalSttService_1;
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.LocalSttService = void 0;
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const openai_1 = __importStar(require("openai"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
let LocalSttService = LocalSttService_1 = class LocalSttService {
|
|
51
|
+
logger = new common_1.Logger(LocalSttService_1.name);
|
|
52
|
+
openai;
|
|
53
|
+
constructor() {
|
|
54
|
+
this.openai = new openai_1.default({
|
|
55
|
+
baseURL: 'http://192.168.2.224:8000/v1',
|
|
56
|
+
apiKey: '',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
getExtensionFromMimeType(mimeType) {
|
|
60
|
+
switch (mimeType?.toLowerCase()) {
|
|
61
|
+
case 'audio/wav':
|
|
62
|
+
case 'audio/x-wav':
|
|
63
|
+
return '.wav';
|
|
64
|
+
case 'audio/mpeg':
|
|
65
|
+
return '.mp3';
|
|
66
|
+
case 'audio/mp4':
|
|
67
|
+
case 'video/mp4':
|
|
68
|
+
return '.mp4';
|
|
69
|
+
case 'audio/flac':
|
|
70
|
+
return '.flac';
|
|
71
|
+
case 'audio/ogg':
|
|
72
|
+
return '.ogg';
|
|
73
|
+
case 'audio/opus':
|
|
74
|
+
return '.opus';
|
|
75
|
+
case 'audio/webm':
|
|
76
|
+
case 'video/webm':
|
|
77
|
+
return '.webm';
|
|
78
|
+
case 'audio/mpga':
|
|
79
|
+
return '.mpga';
|
|
80
|
+
case 'audio/m4a':
|
|
81
|
+
return '.m4a';
|
|
82
|
+
default:
|
|
83
|
+
this.logger.warn(`Unsupported or unknown mime type provided: ${mimeType}`);
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async transcribeAudio(fileBuffer, originalFileName, mimeType) {
|
|
88
|
+
this.logger.log(`Attempting to transcribe file: ${originalFileName} (${mimeType})`);
|
|
89
|
+
const extension = this.getExtensionFromMimeType(mimeType);
|
|
90
|
+
let effectiveFileName = originalFileName;
|
|
91
|
+
if (extension) {
|
|
92
|
+
const currentExt = path.extname(originalFileName).toLowerCase();
|
|
93
|
+
if (currentExt !== extension) {
|
|
94
|
+
const baseName = path.basename(originalFileName, currentExt);
|
|
95
|
+
effectiveFileName = `${baseName}${extension}`;
|
|
96
|
+
this.logger.log(`Adjusted filename to: ${effectiveFileName} based on mime type: ${mimeType}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.logger.log(`Filename ${originalFileName} already has correct extension ${extension}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
this.logger.warn(`Could not determine valid extension for mime type ${mimeType}. Using original filename: ${originalFileName}. Transcription may fail if the filename lacks a supported extension.`);
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const result = await this.openai.audio.transcriptions.create({
|
|
107
|
+
model: 'rtlingo/mobiuslabsgmbh-faster-whisper-large-v3-turbo',
|
|
108
|
+
file: await (0, openai_1.toFile)(fileBuffer, effectiveFileName, { type: mimeType }),
|
|
109
|
+
response_format: 'verbose_json',
|
|
110
|
+
timestamp_granularities: ['word'],
|
|
111
|
+
});
|
|
112
|
+
this.logger.log(`Transcription successful for file: ${effectiveFileName}`);
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
this.logger.error(`Error during transcription for file ${effectiveFileName}:`, error?.error || error);
|
|
117
|
+
const errorMessage = error?.error?.message || (error instanceof Error ? error.message : 'Unknown error during transcription');
|
|
118
|
+
throw new Error(`Failed to transcribe audio: ${errorMessage}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
exports.LocalSttService = LocalSttService;
|
|
123
|
+
exports.LocalSttService = LocalSttService = LocalSttService_1 = __decorate([
|
|
124
|
+
(0, common_1.Injectable)(),
|
|
125
|
+
__metadata("design:paramtypes", [])
|
|
126
|
+
], LocalSttService);
|
|
127
|
+
//# sourceMappingURL=local-stt.service.js.map
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.DrizzleModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const drizzle_service_1 = require("./drizzle.service");
|
|
12
|
-
const key_balancer_service_1 = require("./key-balancer.service");
|
|
13
|
-
const key_balancer_controller_1 = require("./key-balancer.controller");
|
|
14
|
-
const user_requests_service_1 = require("./user-requests.service");
|
|
15
|
-
const user_requests_controller_1 = require("./user-requests.controller");
|
|
16
|
-
const key_usage_service_1 = require("./key-usage.service");
|
|
17
|
-
let DrizzleModule = class DrizzleModule {
|
|
18
|
-
};
|
|
19
|
-
exports.DrizzleModule = DrizzleModule;
|
|
20
|
-
exports.DrizzleModule = DrizzleModule = __decorate([
|
|
21
|
-
(0, common_1.Module)({
|
|
22
|
-
controllers: [key_balancer_controller_1.KeyBalancerController, user_requests_controller_1.UserRequestsController],
|
|
23
|
-
providers: [
|
|
24
|
-
{
|
|
25
|
-
provide: drizzle_service_1.DRIZZLE_SERVICE,
|
|
26
|
-
useClass: drizzle_service_1.DrizzleService,
|
|
27
|
-
},
|
|
28
|
-
key_balancer_service_1.KeyBalancerService,
|
|
29
|
-
user_requests_service_1.UserRequestsService,
|
|
30
|
-
key_usage_service_1.KeyUsageService,
|
|
31
|
-
],
|
|
32
|
-
exports: [key_balancer_service_1.KeyBalancerService, user_requests_service_1.UserRequestsService, key_usage_service_1.KeyUsageService],
|
|
33
|
-
})
|
|
34
|
-
], DrizzleModule);
|
|
35
|
-
//# sourceMappingURL=drizzle.module.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Pool } from 'pg';
|
|
2
|
-
import * as schema from './schema';
|
|
3
|
-
export declare const DRIZZLE_SERVICE = "DRIZZLE_SERVICE";
|
|
4
|
-
export declare class DrizzleService {
|
|
5
|
-
private _drizzle;
|
|
6
|
-
constructor();
|
|
7
|
-
get db(): import("drizzle-orm/node-postgres").NodePgDatabase<typeof schema> & {
|
|
8
|
-
$client: Pool;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
-
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
-
};
|
|
44
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.DrizzleService = exports.DRIZZLE_SERVICE = void 0;
|
|
46
|
-
const common_1 = require("@nestjs/common");
|
|
47
|
-
const node_postgres_1 = require("drizzle-orm/node-postgres");
|
|
48
|
-
const pg_1 = require("pg");
|
|
49
|
-
const schema = __importStar(require("./schema"));
|
|
50
|
-
exports.DRIZZLE_SERVICE = 'DRIZZLE_SERVICE';
|
|
51
|
-
let DrizzleService = class DrizzleService {
|
|
52
|
-
_drizzle;
|
|
53
|
-
constructor() {
|
|
54
|
-
const pool = new pg_1.Pool({
|
|
55
|
-
connectionString: process.env.DATABASE_URL,
|
|
56
|
-
});
|
|
57
|
-
this._drizzle = (0, node_postgres_1.drizzle)(pool, { schema });
|
|
58
|
-
}
|
|
59
|
-
get db() {
|
|
60
|
-
return this._drizzle;
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
exports.DrizzleService = DrizzleService;
|
|
64
|
-
exports.DrizzleService = DrizzleService = __decorate([
|
|
65
|
-
(0, common_1.Injectable)(),
|
|
66
|
-
__metadata("design:paramtypes", [])
|
|
67
|
-
], DrizzleService);
|
|
68
|
-
//# sourceMappingURL=drizzle.service.js.map
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.CreateKeyBalancerDto = void 0;
|
|
13
|
-
const class_validator_1 = require("class-validator");
|
|
14
|
-
class CreateKeyBalancerDto {
|
|
15
|
-
name;
|
|
16
|
-
email;
|
|
17
|
-
disabled;
|
|
18
|
-
description;
|
|
19
|
-
key;
|
|
20
|
-
type;
|
|
21
|
-
provider;
|
|
22
|
-
}
|
|
23
|
-
exports.CreateKeyBalancerDto = CreateKeyBalancerDto;
|
|
24
|
-
__decorate([
|
|
25
|
-
(0, class_validator_1.IsString)(),
|
|
26
|
-
__metadata("design:type", String)
|
|
27
|
-
], CreateKeyBalancerDto.prototype, "name", void 0);
|
|
28
|
-
__decorate([
|
|
29
|
-
(0, class_validator_1.IsEmail)(),
|
|
30
|
-
__metadata("design:type", String)
|
|
31
|
-
], CreateKeyBalancerDto.prototype, "email", void 0);
|
|
32
|
-
__decorate([
|
|
33
|
-
(0, class_validator_1.IsBoolean)(),
|
|
34
|
-
(0, class_validator_1.IsOptional)(),
|
|
35
|
-
__metadata("design:type", Boolean)
|
|
36
|
-
], CreateKeyBalancerDto.prototype, "disabled", void 0);
|
|
37
|
-
__decorate([
|
|
38
|
-
(0, class_validator_1.IsString)(),
|
|
39
|
-
(0, class_validator_1.IsOptional)(),
|
|
40
|
-
__metadata("design:type", String)
|
|
41
|
-
], CreateKeyBalancerDto.prototype, "description", void 0);
|
|
42
|
-
__decorate([
|
|
43
|
-
(0, class_validator_1.IsString)(),
|
|
44
|
-
__metadata("design:type", String)
|
|
45
|
-
], CreateKeyBalancerDto.prototype, "key", void 0);
|
|
46
|
-
__decorate([
|
|
47
|
-
(0, class_validator_1.IsString)(),
|
|
48
|
-
__metadata("design:type", String)
|
|
49
|
-
], CreateKeyBalancerDto.prototype, "type", void 0);
|
|
50
|
-
__decorate([
|
|
51
|
-
(0, class_validator_1.IsString)(),
|
|
52
|
-
__metadata("design:type", String)
|
|
53
|
-
], CreateKeyBalancerDto.prototype, "provider", void 0);
|
|
54
|
-
//# sourceMappingURL=create-key-balancer.dto.js.map
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CreateKeyUsageDto = void 0;
|
|
4
|
-
class CreateKeyUsageDto {
|
|
5
|
-
id;
|
|
6
|
-
key;
|
|
7
|
-
charCount;
|
|
8
|
-
totalRequest;
|
|
9
|
-
}
|
|
10
|
-
exports.CreateKeyUsageDto = CreateKeyUsageDto;
|
|
11
|
-
//# sourceMappingURL=create-key-usage.dto.js.map
|