@dataclouder/nest-vertex 0.0.55 → 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.
Files changed (47) hide show
  1. package/comfyui/controllers/comfy-sdk.controller.js +12 -2
  2. package/comfyui/services/comfy-connection.service.js +4 -5
  3. package/comfyui/services/comfy-sdk.service.js +1 -1
  4. package/controllers/stt/groq-stt.controller.js +1 -1
  5. package/controllers/stt/local-stt.controller.d.ts +8 -0
  6. package/controllers/stt/local-stt.controller.js +62 -0
  7. package/controllers/tts/vertex-tts-adapter.controller.js +1 -1
  8. package/models/key-balancer.models.d.ts +2 -0
  9. package/nest-vertex.module.js +5 -6
  10. package/package.json +1 -1
  11. package/services/key-balancer-api.service.d.ts +1 -0
  12. package/services/key-balancer-api.service.js +13 -0
  13. package/services/vertex-image.service.js +20 -16
  14. package/services/vertex-tts.service.js +1 -0
  15. package/services/whisper/groq.service.js +1 -0
  16. package/services/whisper/local-stt.service.d.ts +7 -0
  17. package/services/whisper/local-stt.service.js +127 -0
  18. package/drizzle/drizzle.module.d.ts +0 -2
  19. package/drizzle/drizzle.module.js +0 -35
  20. package/drizzle/drizzle.service.d.ts +0 -10
  21. package/drizzle/drizzle.service.js +0 -68
  22. package/drizzle/dto/create-key-balancer.dto.d.ts +0 -9
  23. package/drizzle/dto/create-key-balancer.dto.js +0 -54
  24. package/drizzle/dto/create-key-usage.dto.d.ts +0 -6
  25. package/drizzle/dto/create-key-usage.dto.js +0 -11
  26. package/drizzle/dto/create-user-request.dto.d.ts +0 -7
  27. package/drizzle/dto/create-user-request.dto.js +0 -47
  28. package/drizzle/dto/update-key-balancer.dto.d.ts +0 -5
  29. package/drizzle/dto/update-key-balancer.dto.js +0 -9
  30. package/drizzle/dto/update-user-request.dto.d.ts +0 -5
  31. package/drizzle/dto/update-user-request.dto.js +0 -9
  32. package/drizzle/key-balancer.controller.d.ts +0 -13
  33. package/drizzle/key-balancer.controller.js +0 -103
  34. package/drizzle/key-balancer.model.d.ts +0 -10
  35. package/drizzle/key-balancer.model.js +0 -3
  36. package/drizzle/key-balancer.service.d.ts +0 -11
  37. package/drizzle/key-balancer.service.js +0 -50
  38. package/drizzle/key-usage.service.d.ts +0 -17
  39. package/drizzle/key-usage.service.js +0 -63
  40. package/drizzle/schema.d.ts +0 -395
  41. package/drizzle/schema.js +0 -33
  42. package/drizzle/user-requests.controller.d.ts +0 -47
  43. package/drizzle/user-requests.controller.js +0 -81
  44. package/drizzle/user-requests.service.d.ts +0 -47
  45. package/drizzle/user-requests.service.js +0 -47
  46. package/services/metric-ai.service.d.ts +0 -11
  47. 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
- const status = await this.comfySDKService.getStatus();
25
- return status;
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', (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((res) => res.data);
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: (output) => {
200
+ resolve: output => {
202
201
  clearTimeout(timeout);
203
202
  resolve(output);
204
203
  },
205
- reject: (error) => {
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.224:8188').init();
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/vertex-adapter/tts'),
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);
@@ -50,4 +50,6 @@ export interface AvailableKeyResult {
50
50
  type: string;
51
51
  error?: string;
52
52
  errorDescription?: string;
53
+ service?: string;
54
+ provider?: string;
53
55
  }
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataclouder/nest-vertex",
3
- "version": "0.0.55",
3
+ "version": "0.0.57",
4
4
  "description": "NestJS Vertex AI library for Dataclouder",
5
5
  "author": "dataclouder",
6
6
  "license": "MIT",
@@ -16,4 +16,5 @@ export declare class KeyBalancerClientService {
16
16
  getKeys(): Promise<AvailableKeyResult[]>;
17
17
  private getUnavailableServiceResult;
18
18
  recordFailedRequest(keyId: string, error: any, modelType: ModelType, model: string, ttlSeconds?: number): Promise<void>;
19
+ updateUsage(keyUsageId: string, usageCount: number): Promise<any>;
19
20
  }
@@ -74,6 +74,19 @@ let KeyBalancerClientService = KeyBalancerClientService_1 = class KeyBalancerCli
74
74
  this.logger.warn(`Failed to get LLM key for model ${model} from the external service.`, data);
75
75
  return;
76
76
  }
77
+ async updateUsage(keyUsageId, usageCount) {
78
+ const keyBalancerHost = process.env.KEY_BALANCER_HOST || 'http://localhost:8085';
79
+ const url = `${keyBalancerHost}/api/key-usage/update-usage`;
80
+ try {
81
+ const { data } = await (0, rxjs_1.firstValueFrom)(this.httpService.post(url, { keyUsageId, usageCount }));
82
+ this.logger.verbose(`Usage updated for keyUsageId: ${keyUsageId} with usageCount: ${usageCount}`);
83
+ return data;
84
+ }
85
+ catch (error) {
86
+ this.logger.error(`Failed to update usage for keyUsageId: ${keyUsageId}`, error.stack);
87
+ throw error;
88
+ }
89
+ }
77
90
  };
78
91
  exports.KeyBalancerClientService = KeyBalancerClientService;
79
92
  exports.KeyBalancerClientService = KeyBalancerClientService = KeyBalancerClientService_1 = __decorate([
@@ -38,32 +38,36 @@ let ImageVertexService = ImageVertexService_1 = class ImageVertexService {
38
38
  let apiKey;
39
39
  let keyId;
40
40
  let availableKey = {};
41
- if (this.gemini_key) {
42
- apiKey = this.gemini_key;
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 === null) {
54
- this.logger.error('KEY BALANCER IS DOWN: :::: No available API key from key balancer.');
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,
@@ -32,6 +32,7 @@ let VertextTtsService = class VertextTtsService extends base_tts_service_1.BaseT
32
32
  keyType: 'service_account',
33
33
  }, token);
34
34
  if (selectedKey.key) {
35
+ this.keyBalancerClient.updateUsage(selectedKey.id, input.text.length);
35
36
  this.logger.verbose(` Balanced key Found : ${selectedKey.name} ${selectedKey.id}`);
36
37
  try {
37
38
  const credentials = JSON.parse(selectedKey.key);
@@ -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,7 @@
1
+ export declare class LocalSttService {
2
+ private readonly logger;
3
+ private readonly openai;
4
+ constructor();
5
+ private getExtensionFromMimeType;
6
+ transcribeAudio(fileBuffer: Buffer, originalFileName: string, mimeType: string): Promise<any>;
7
+ }
@@ -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,2 +0,0 @@
1
- export declare class DrizzleModule {
2
- }
@@ -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,9 +0,0 @@
1
- export declare class CreateKeyBalancerDto {
2
- name: string;
3
- email: string;
4
- disabled?: boolean;
5
- description?: string;
6
- key: string;
7
- type: string;
8
- provider: string;
9
- }