@dataclouder/nest-vertex 0.0.45 → 0.0.47
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/comfyui.module.js +4 -2
- package/comfyui/controllers/comfy-sdk.controller.d.ts +10 -0
- package/comfyui/controllers/comfy-sdk.controller.js +45 -0
- package/comfyui/models/comfy-sdk.models.d.ts +14 -0
- package/comfyui/models/comfy-sdk.models.js +3 -0
- package/comfyui/models/comfy.models.d.ts +2 -0
- package/comfyui/services/comfy-sdk.service.d.ts +24 -0
- package/comfyui/services/comfy-sdk.service.js +227 -0
- package/comfyui/services/comfy-video.service.js +1 -0
- package/config/gemini.config.d.ts +1 -0
- package/config/gemini.config.js +17 -0
- package/controllers/groq-stt.controller.js +2 -0
- package/controllers/{vertex-veo-video.controller.js → veo-video.controller.js} +1 -1
- package/controllers/vertex-comfy.controller.js +2 -0
- package/controllers/vertex-gemini-chat.controller.d.ts +13 -1
- package/controllers/vertex-gemini-chat.controller.js +59 -1
- package/controllers/vertex-gemini-tts.controller.d.ts +9 -0
- package/controllers/vertex-gemini-tts.controller.js +82 -0
- package/controllers/vertex-tts-adapter.controller.d.ts +4 -3
- package/controllers/vertex-tts-adapter.controller.js +7 -5
- package/controllers/{vertex-video-adapter.controller.d.ts → video-gen-adapter.controller.d.ts} +6 -3
- package/controllers/{vertex-video-adapter.controller.js → video-gen-adapter.controller.js} +11 -5
- package/drizzle/drizzle.module.d.ts +2 -0
- package/drizzle/drizzle.module.js +35 -0
- package/drizzle/drizzle.service.d.ts +10 -0
- package/drizzle/drizzle.service.js +68 -0
- package/drizzle/dto/create-key-balancer.dto.d.ts +9 -0
- package/drizzle/dto/create-key-balancer.dto.js +54 -0
- package/drizzle/dto/create-key-usage.dto.d.ts +6 -0
- package/drizzle/dto/create-key-usage.dto.js +11 -0
- package/drizzle/dto/create-user-request.dto.d.ts +7 -0
- package/drizzle/dto/create-user-request.dto.js +47 -0
- package/drizzle/dto/update-key-balancer.dto.d.ts +5 -0
- package/drizzle/dto/update-key-balancer.dto.js +9 -0
- package/drizzle/dto/update-user-request.dto.d.ts +5 -0
- package/drizzle/dto/update-user-request.dto.js +9 -0
- package/drizzle/key-balancer.controller.d.ts +13 -0
- package/drizzle/key-balancer.controller.js +103 -0
- package/drizzle/key-balancer.model.d.ts +10 -0
- package/drizzle/key-balancer.model.js +3 -0
- package/drizzle/key-balancer.service.d.ts +11 -0
- package/drizzle/key-balancer.service.js +50 -0
- package/drizzle/key-usage.service.d.ts +17 -0
- package/drizzle/key-usage.service.js +63 -0
- package/drizzle/schema.d.ts +395 -0
- package/drizzle/schema.js +33 -0
- package/drizzle/user-requests.controller.d.ts +47 -0
- package/drizzle/user-requests.controller.js +81 -0
- package/drizzle/user-requests.service.d.ts +47 -0
- package/drizzle/user-requests.service.js +47 -0
- package/models/gemini-models.d.ts +5 -0
- package/models/gemini-models.js +7 -1
- package/models/key-balancer.models.d.ts +2 -1
- package/nest-vertex.module.js +24 -8
- package/package.json +1 -1
- package/services/adapter-audio-gen.service.d.ts +2 -2
- package/services/adapter-audio-gen.service.js +1 -1
- package/services/base-tts.service.d.ts +15 -0
- package/services/base-tts.service.js +81 -0
- package/services/google-genai.service.d.ts +3 -3
- package/services/google-genai.service.js +12 -13
- package/services/key-balancer-api.service.d.ts +9 -6
- package/services/key-balancer-api.service.js +29 -9
- package/services/metric-ai.service.d.ts +11 -0
- package/services/metric-ai.service.js +48 -0
- package/services/vertex-gemini-chat.service.d.ts +2 -2
- package/services/vertex-gemini-chat.service.js +5 -5
- package/services/vertex-gemini-tts.service.d.ts +6 -0
- package/services/vertex-gemini-tts.service.js +42 -0
- package/services/vertex-image.service.d.ts +2 -2
- package/services/vertex-image.service.js +7 -7
- package/services/vertex-tts.service.d.ts +12 -6
- package/services/vertex-tts.service.js +52 -52
- package/services/whisper/groq.service.d.ts +2 -2
- package/services/whisper/groq.service.js +3 -3
- /package/controllers/{vertex-veo-video.controller.d.ts → veo-video.controller.d.ts} +0 -0
|
@@ -10,6 +10,8 @@ exports.ComfyUIModule = void 0;
|
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const comfy_services_providers_1 = require("./providers/comfy-services.providers");
|
|
12
12
|
const comfy_ui_controller_1 = require("./controllers/comfy-ui.controller");
|
|
13
|
+
const comfy_sdk_controller_1 = require("./controllers/comfy-sdk.controller");
|
|
14
|
+
const comfy_sdk_service_1 = require("./services/comfy-sdk.service");
|
|
13
15
|
const axios_1 = require("@nestjs/axios");
|
|
14
16
|
const nest_storage_1 = require("@dataclouder/nest-storage");
|
|
15
17
|
const mongoose_1 = require("@nestjs/mongoose");
|
|
@@ -27,9 +29,9 @@ exports.ComfyUIModule = ComfyUIModule = __decorate([
|
|
|
27
29
|
mongoose_1.MongooseModule.forFeature([{ name: generated_asset_entity_1.GeneratedAsset.name, schema: generated_asset_entity_1.GeneratedAssetSchema }]),
|
|
28
30
|
nest_mongo_1.DCMongoDBModule,
|
|
29
31
|
],
|
|
30
|
-
providers: [...comfy_services_providers_1.comfyServicesProviders, generated_asset_service_1.GeneratedAssetService],
|
|
32
|
+
providers: [...comfy_services_providers_1.comfyServicesProviders, generated_asset_service_1.GeneratedAssetService, comfy_sdk_service_1.ComfySDKService],
|
|
31
33
|
exports: [...comfy_services_providers_1.comfyServicesProviders],
|
|
32
|
-
controllers: [comfy_ui_controller_1.ComfyUiController],
|
|
34
|
+
controllers: [comfy_ui_controller_1.ComfyUiController, comfy_sdk_controller_1.ComfySDKController],
|
|
33
35
|
})
|
|
34
36
|
], ComfyUIModule);
|
|
35
37
|
//# sourceMappingURL=comfyui.module.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ComfySDKService } from '../services/comfy-sdk.service';
|
|
2
|
+
import { StatusResponse } from '../models/comfy-sdk.models';
|
|
3
|
+
export declare class ComfySDKController {
|
|
4
|
+
private readonly comfySDKService;
|
|
5
|
+
constructor(comfySDKService: ComfySDKService);
|
|
6
|
+
testEndpoint(): Promise<{
|
|
7
|
+
status: string;
|
|
8
|
+
}>;
|
|
9
|
+
statusEndpoint(): Promise<StatusResponse>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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.ComfySDKController = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const comfy_sdk_service_1 = require("../services/comfy-sdk.service");
|
|
15
|
+
let ComfySDKController = class ComfySDKController {
|
|
16
|
+
comfySDKService;
|
|
17
|
+
constructor(comfySDKService) {
|
|
18
|
+
this.comfySDKService = comfySDKService;
|
|
19
|
+
}
|
|
20
|
+
testEndpoint() {
|
|
21
|
+
return this.comfySDKService.testMethod();
|
|
22
|
+
}
|
|
23
|
+
async statusEndpoint() {
|
|
24
|
+
const status = await this.comfySDKService.getStatus();
|
|
25
|
+
return status;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.ComfySDKController = ComfySDKController;
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, common_1.Get)('test'),
|
|
31
|
+
__metadata("design:type", Function),
|
|
32
|
+
__metadata("design:paramtypes", []),
|
|
33
|
+
__metadata("design:returntype", void 0)
|
|
34
|
+
], ComfySDKController.prototype, "testEndpoint", null);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, common_1.Get)('status'),
|
|
37
|
+
__metadata("design:type", Function),
|
|
38
|
+
__metadata("design:paramtypes", []),
|
|
39
|
+
__metadata("design:returntype", Promise)
|
|
40
|
+
], ComfySDKController.prototype, "statusEndpoint", null);
|
|
41
|
+
exports.ComfySDKController = ComfySDKController = __decorate([
|
|
42
|
+
(0, common_1.Controller)('api/comfy-sdk'),
|
|
43
|
+
__metadata("design:paramtypes", [comfy_sdk_service_1.ComfySDKService])
|
|
44
|
+
], ComfySDKController);
|
|
45
|
+
//# sourceMappingURL=comfy-sdk.controller.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { StatusResponse } from '../models/comfy-sdk.models';
|
|
2
|
+
import { GeneratedAssetService } from '../../services/generated-asset.service';
|
|
3
|
+
import { HttpService } from '@nestjs/axios';
|
|
4
|
+
import { VideoGenRequest } from '../models/comfy.models';
|
|
5
|
+
import { StorageFactory } from '@dataclouder/nest-storage';
|
|
6
|
+
export declare class ComfySDKService {
|
|
7
|
+
private readonly generatedAssetService;
|
|
8
|
+
private readonly httpService;
|
|
9
|
+
private readonly storageFactory;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private outputDirectory;
|
|
12
|
+
private api;
|
|
13
|
+
constructor(generatedAssetService: GeneratedAssetService, httpService: HttpService, storageFactory: StorageFactory);
|
|
14
|
+
private init;
|
|
15
|
+
testMethod(): Promise<{
|
|
16
|
+
status: string;
|
|
17
|
+
}>;
|
|
18
|
+
getStatus(): Promise<StatusResponse>;
|
|
19
|
+
runVideoGenerationForAssetId(assetId: string, metadata?: any): Promise<import("../..").GeneratedAssetDocument | {
|
|
20
|
+
status: string;
|
|
21
|
+
message: string;
|
|
22
|
+
}>;
|
|
23
|
+
runVideoGenerationFromWorkflow(videoRequest: VideoGenRequest, assetId?: string): Promise<any>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
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 ComfySDKService_1;
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.ComfySDKService = void 0;
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const comfyui_sdk_1 = require("@saintno/comfyui-sdk");
|
|
49
|
+
const generated_asset_service_1 = require("../../services/generated-asset.service");
|
|
50
|
+
const axios_1 = require("@nestjs/axios");
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const fs = __importStar(require("fs/promises"));
|
|
53
|
+
const nest_storage_1 = require("@dataclouder/nest-storage");
|
|
54
|
+
let ComfySDKService = ComfySDKService_1 = class ComfySDKService {
|
|
55
|
+
generatedAssetService;
|
|
56
|
+
httpService;
|
|
57
|
+
storageFactory;
|
|
58
|
+
logger = new common_1.Logger(ComfySDKService_1.name);
|
|
59
|
+
outputDirectory = './comfyui_generated_images';
|
|
60
|
+
api;
|
|
61
|
+
constructor(generatedAssetService, httpService, storageFactory) {
|
|
62
|
+
this.generatedAssetService = generatedAssetService;
|
|
63
|
+
this.httpService = httpService;
|
|
64
|
+
this.storageFactory = storageFactory;
|
|
65
|
+
this.api = new comfyui_sdk_1.ComfyApi('http://192.168.2.224:8188').init();
|
|
66
|
+
console.log('what is in the comfy api?', this.api.apiHost);
|
|
67
|
+
}
|
|
68
|
+
init() {
|
|
69
|
+
}
|
|
70
|
+
async testMethod() {
|
|
71
|
+
this.logger.log('testMethod called');
|
|
72
|
+
const queue = await this.api.getQueue();
|
|
73
|
+
const settings = await this.api.getSettings();
|
|
74
|
+
const stats = await this.api.getSystemStats();
|
|
75
|
+
const pullStatus = await this.api.pollStatus();
|
|
76
|
+
const user = await this.api.getUserConfig();
|
|
77
|
+
console.log('what is in the comfy api?', queue, settings, stats);
|
|
78
|
+
console.log('user', user);
|
|
79
|
+
return { status: 'ok' };
|
|
80
|
+
}
|
|
81
|
+
async getStatus() {
|
|
82
|
+
const stats = await this.api.getSystemStats();
|
|
83
|
+
const devices = stats.devices.map(device => {
|
|
84
|
+
const match = device.name.match(/RTX\s(\d{4})/);
|
|
85
|
+
const model = match ? match[0] : device.name;
|
|
86
|
+
const freeVram = Number(Number(device.vram_free / 1073741824).toFixed(2));
|
|
87
|
+
const totalVram = Number(Number(device.vram_total / 1073741824).toFixed(2));
|
|
88
|
+
return {
|
|
89
|
+
device: model,
|
|
90
|
+
memory: {
|
|
91
|
+
used: totalVram - freeVram,
|
|
92
|
+
free: freeVram,
|
|
93
|
+
total: totalVram,
|
|
94
|
+
},
|
|
95
|
+
so: 'linux hardcoded',
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
console.log('Sending Stats');
|
|
99
|
+
return { status: 'ok', numAvailable: devices.length, servers: devices };
|
|
100
|
+
}
|
|
101
|
+
async runVideoGenerationForAssetId(assetId, metadata = null) {
|
|
102
|
+
try {
|
|
103
|
+
const stats = await this.api.getSystemStats();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
this.logger.error('Error in runVideoGenerationForAssetId endpoint:', error);
|
|
107
|
+
return { status: 'error', message: 'There is not Comfy server running or is not accessible.' };
|
|
108
|
+
}
|
|
109
|
+
console.log('Running video generation for asset ID:', assetId);
|
|
110
|
+
const genAsset = await this.generatedAssetService.findOne(assetId);
|
|
111
|
+
this.logger.verbose(`Generating video for asset ${assetId} with url ${genAsset.assets.firstFrame.url} and metadata ${JSON.stringify(genAsset.request)}`);
|
|
112
|
+
if (metadata) {
|
|
113
|
+
console.log('Updating asset metadata for future retrieval:', metadata);
|
|
114
|
+
await this.generatedAssetService.partialUpdate(assetId, metadata);
|
|
115
|
+
}
|
|
116
|
+
if (!genAsset || !genAsset.assets?.firstFrame?.url) {
|
|
117
|
+
throw new common_1.NotFoundException(`Asset with id ${assetId} not found or does not have a valid image url.`);
|
|
118
|
+
}
|
|
119
|
+
const imageUrl = genAsset.assets.firstFrame.url;
|
|
120
|
+
const response = await this.httpService.axiosRef.get(imageUrl, { responseType: 'arraybuffer' });
|
|
121
|
+
const imageBuffer = Buffer.from(response.data, 'binary');
|
|
122
|
+
const videoRequest = { ...genAsset.request };
|
|
123
|
+
videoRequest.inputImage = imageBuffer;
|
|
124
|
+
videoRequest.positivePrompt = genAsset.prompt || genAsset?.description || 'Random movement for video';
|
|
125
|
+
videoRequest.negativePrompt = 'low quality, blurry, static';
|
|
126
|
+
videoRequest.workflowPath = path.join(process.cwd(), 'comfy_workflows', 'video-15_seconds.json');
|
|
127
|
+
console.log(' -> USANDO el viejo confiable flujo: garantizar que exite: video-15_seconds.json');
|
|
128
|
+
try {
|
|
129
|
+
const result = await this.runVideoGenerationFromWorkflow(videoRequest, assetId);
|
|
130
|
+
this.logger.log(`Video generation for asset ${assetId} completed successfully.`, result);
|
|
131
|
+
return await this.generatedAssetService.findOne(assetId);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
this.logger.error(`Video generation for asset ${assetId} failed.`, error);
|
|
135
|
+
await this.generatedAssetService.partialUpdate(assetId, { status: 'failed' });
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async runVideoGenerationFromWorkflow(videoRequest, assetId) {
|
|
140
|
+
return new Promise(async (resolve, reject) => {
|
|
141
|
+
const { inputImage, positivePrompt, negativePrompt, width, height, seconds } = videoRequest;
|
|
142
|
+
const workflowPath = path.join(process.cwd(), 'comfy_workflows', 'video-15_seconds.json');
|
|
143
|
+
let videoWorkflowJson;
|
|
144
|
+
try {
|
|
145
|
+
const workflowData = await fs.readFile(workflowPath, 'utf-8');
|
|
146
|
+
videoWorkflowJson = JSON.parse(workflowData);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
this.logger.error(`Failed to read or parse workflow file at ${workflowPath}`, error);
|
|
150
|
+
return reject(new Error('Could not load the video generation workflow.'));
|
|
151
|
+
}
|
|
152
|
+
const inputKeys = ['positive', 'negative', 'image', 'width', 'height', 'seconds'];
|
|
153
|
+
const outputKeys = ['video'];
|
|
154
|
+
const workflow = new comfyui_sdk_1.PromptBuilder(videoWorkflowJson, inputKeys, outputKeys)
|
|
155
|
+
.setInputNode('positive', '6.inputs.text')
|
|
156
|
+
.setInputNode('negative', '7.inputs.text')
|
|
157
|
+
.setInputNode('image', '62.inputs.image')
|
|
158
|
+
.setInputNode('width', '84.inputs.width')
|
|
159
|
+
.setInputNode('height', '84.inputs.height')
|
|
160
|
+
.setInputNode('seconds', '63.inputs.length')
|
|
161
|
+
.setOutputNode('video', '90');
|
|
162
|
+
const uploadedImage = await this.api.uploadImage(inputImage, 'input_image.jpg');
|
|
163
|
+
if (!uploadedImage) {
|
|
164
|
+
this.logger.error('Image upload failed.');
|
|
165
|
+
return reject(new Error('Image upload failed.'));
|
|
166
|
+
}
|
|
167
|
+
workflow
|
|
168
|
+
.input('positive', positivePrompt)
|
|
169
|
+
.input('negative', negativePrompt)
|
|
170
|
+
.input('image', uploadedImage.info.filename)
|
|
171
|
+
.input('width', width || 512)
|
|
172
|
+
.input('height', height || 512)
|
|
173
|
+
.input('seconds', (seconds || 15) * 16 + 1);
|
|
174
|
+
new comfyui_sdk_1.CallWrapper(this.api, workflow)
|
|
175
|
+
.onFinished(async (data) => {
|
|
176
|
+
this.logger.log('Workflow finished:', data);
|
|
177
|
+
if (assetId && data.video?.gifs?.[0]) {
|
|
178
|
+
const videoInfo = data.video.gifs[0];
|
|
179
|
+
const videoBlob = await this.api.getImage(videoInfo);
|
|
180
|
+
const videoBuffer = Buffer.from(await videoBlob.arrayBuffer());
|
|
181
|
+
if (videoBuffer) {
|
|
182
|
+
const storageFolder = videoRequest?.storagePath || `generated-videos`;
|
|
183
|
+
const storageFileName = videoRequest?.fileName || `${assetId}.mp4`;
|
|
184
|
+
const storageFinalPath = `${storageFolder}/${storageFileName}`;
|
|
185
|
+
console.log(' -> 📼 Saving video to storage path:', storageFinalPath);
|
|
186
|
+
const storageService = this.storageFactory.getStorageService('CLOUDFLARE');
|
|
187
|
+
console.log(' -> USING STORAGE SERVICE:', storageService);
|
|
188
|
+
const options = { fileName: storageFinalPath, fileBuffer: videoBuffer, contentType: 'video/mp4' };
|
|
189
|
+
const uploadResult = await storageService.uploadPublicFile(options);
|
|
190
|
+
this.logger.log(`Successfully uploaded video to: ${uploadResult.url}`);
|
|
191
|
+
await this.generatedAssetService.partialUpdate(assetId, {
|
|
192
|
+
url: uploadResult.url,
|
|
193
|
+
result: uploadResult,
|
|
194
|
+
status: 'completed',
|
|
195
|
+
assets: {
|
|
196
|
+
video: {
|
|
197
|
+
url: uploadResult.url,
|
|
198
|
+
...videoInfo,
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
resolve(data);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
reject(new Error('Video buffer is empty.'));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
reject(new Error('Asset ID or video data is missing.'));
|
|
210
|
+
}
|
|
211
|
+
})
|
|
212
|
+
.onFailed(err => {
|
|
213
|
+
this.logger.error('Workflow failed:', err);
|
|
214
|
+
reject(err);
|
|
215
|
+
})
|
|
216
|
+
.run();
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
exports.ComfySDKService = ComfySDKService;
|
|
221
|
+
exports.ComfySDKService = ComfySDKService = ComfySDKService_1 = __decorate([
|
|
222
|
+
(0, common_1.Injectable)(),
|
|
223
|
+
__metadata("design:paramtypes", [generated_asset_service_1.GeneratedAssetService,
|
|
224
|
+
axios_1.HttpService,
|
|
225
|
+
nest_storage_1.StorageFactory])
|
|
226
|
+
], ComfySDKService);
|
|
227
|
+
//# sourceMappingURL=comfy-sdk.service.js.map
|
|
@@ -91,6 +91,7 @@ let ComfyVideoService = ComfyVideoService_1 = class ComfyVideoService {
|
|
|
91
91
|
return response;
|
|
92
92
|
}
|
|
93
93
|
async runVideoGenerationForAssetId(assetId, metadata = null) {
|
|
94
|
+
console.log('Running video generation for asset ID:', assetId);
|
|
94
95
|
const genAsset = await this.generatedAssetService.findOne(assetId);
|
|
95
96
|
if (metadata) {
|
|
96
97
|
console.log('Updating asset metadata for future retrieval:', metadata);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GEMINI_API_KEY = "{\n \"type\": \"service_account\",\n \"project_id\": \"dataclouder-dev\",\n \"private_key_id\": \"044453d30d7f99ec3b2231a6e293f003f7dc6e14\",\n \"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCn+rv6kYKpuXtI\\noCe/3pcacKejTfYFAcd63JYGsqXe/iNa1ou4gESG5xVNQ20/0nB0Ubb+x4KpWWNv\\n7Y/LlNN+7V4eTk+fORxt4iZ3iQXBCQfQKMBPEvr/T1h1vviKmiknrFdKEByvXo1Y\\nfLkFtyAUg8B/mSecsQDFlPnqfQnUPARFVtajvy8S8RlRleshoJbaMX0YcLDO6lCa\\np6wx/BoEBdICg9XpNiYm2edvoGwgWQU8PMZmNtHGX6WVLWHlvP9w1k6wPEKBQTry\\nnpFMDVkll63XGgFBiFKO7KKvxVcyrKRafbBXRXHrafDRLljkeltFNRGYw83Xht6Y\\nFLaNsubZAgMBAAECggEAAmYVWd9K1EFksi1uT+I9+mfOLwnxl9H2Dyo3/r29mmT6\\n7ITIj0COqfYCEv3B4UHQLwsNL895zVEMV1h3P5cfG46Ic+qWnr2WKzgJ6FZVtZNb\\nUBTK5T4uRSfVCa5p1nHb4VgH0ZQQEs2I+3DhhARA0iYtAS122DkbW5b0aC2zrpsM\\nW88P5obIg4eWCYTbGnesYLLbJ9ZqpduD6IoSKme+RKNP6dSsH2v62tFmK64067jV\\nMB2LziNGguCJKUe3+/hIhopzxab7+wgxD3Jd58vCDsEUTwjrLfx700rmDDk5mjLG\\nAQCSzeIF15QGvqUbRYMmwfywXUfqUT3ABj1v4TEI4QKBgQDhBAJeRvJtg8RhiQbb\\nJfFOZ61K63d8NHu+a1C/qlVytDEEO5G7BEPrcbHk6fM46xl4wDpGQ7n0kY7ZmH78\\n8eZNkfXgMLvpNzKpj4oTCqAcY4abHuYA0IMA56hp+Sgn+pos7drdVFXCELD6Mys9\\nnh0rP1D/Kiuv2htmHkshchd84QKBgQC/HCZsgfN8O9HrE+oVd9Sp5aW13eaBkG/v\\nNUKxuaGdMGulxFLZQMJrugt2T4yNdjaUq625fmja1ujtIsU7JtlltBLZOAC9ZphF\\nPIfdgX48pvLdJIgOjgoxD4bfVav4Flum16wBskE+PSowdV0XEiOIi0GyofGBAMlT\\nNWDrnThw+QKBgQCcRLaIVulCGUKnIgy64WzmMKZu43yFq8VMhyb7FQZmtLFd6Sja\\nIqowtzL+cWNS4iM8cvOFnL9mFDiK8Zcvf6ebs4R4gB/gZU8v5tnTQ4vSa2QuEpVV\\nd3mjhT626ixzJ10vWrinAUzVi9X8zNB46HgFcuGDc/wHEof4sY0n2x5owQKBgQCY\\nXr1T7hhPiPJJV0tfancoLmz8n7tUufBE7FYMlVCBn0V0mR7lEHjyoxbYcXxCnWnP\\nB0IvjtXTBV4ZE4vlKYhTSkts3PXaDJ6DNUuuE7yuZv1jy+iekikWDKcgEZJW7pyM\\nXZBKmfDiyqmEkU5zQocKKt1qqyt+Cz55FSn9MRD7IQKBgDeUMSwAwQgtRu4RHNCJ\\n5IBaEfEX4fVIRscvFWKxUyhvUb5hpGj1asO0SoUboBw1wGjW/HcKZ7Gw/v+8103v\\n7y1fFqQxMY7eWrLegLtywAfnQW+Uyvaha6n85Ekpuk6X6mSd/IFhe4TPknCbb4+d\\n+NwWPEalsS86ekmB4TeZLQ+H\\n-----END PRIVATE KEY-----\\n\",\n \"client_email\": \"app-keys-dataclouder-dev@dataclouder-dev.iam.gserviceaccount.com\",\n \"client_id\": \"107525823981418207310\",\n \"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\",\n \"token_uri\": \"https://oauth2.googleapis.com/token\",\n \"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\n \"client_x509_cert_url\": \"https://www.googleapis.com/robot/v1/metadata/x509/app-keys-dataclouder-dev%40dataclouder-dev.iam.gserviceaccount.com\",\n \"universe_domain\": \"googleapis.com\"\n}";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GEMINI_API_KEY = void 0;
|
|
4
|
+
exports.GEMINI_API_KEY = `{
|
|
5
|
+
"type": "service_account",
|
|
6
|
+
"project_id": "dataclouder-dev",
|
|
7
|
+
"private_key_id": "044453d30d7f99ec3b2231a6e293f003f7dc6e14",
|
|
8
|
+
"private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCn+rv6kYKpuXtI\\noCe/3pcacKejTfYFAcd63JYGsqXe/iNa1ou4gESG5xVNQ20/0nB0Ubb+x4KpWWNv\\n7Y/LlNN+7V4eTk+fORxt4iZ3iQXBCQfQKMBPEvr/T1h1vviKmiknrFdKEByvXo1Y\\nfLkFtyAUg8B/mSecsQDFlPnqfQnUPARFVtajvy8S8RlRleshoJbaMX0YcLDO6lCa\\np6wx/BoEBdICg9XpNiYm2edvoGwgWQU8PMZmNtHGX6WVLWHlvP9w1k6wPEKBQTry\\nnpFMDVkll63XGgFBiFKO7KKvxVcyrKRafbBXRXHrafDRLljkeltFNRGYw83Xht6Y\\nFLaNsubZAgMBAAECggEAAmYVWd9K1EFksi1uT+I9+mfOLwnxl9H2Dyo3/r29mmT6\\n7ITIj0COqfYCEv3B4UHQLwsNL895zVEMV1h3P5cfG46Ic+qWnr2WKzgJ6FZVtZNb\\nUBTK5T4uRSfVCa5p1nHb4VgH0ZQQEs2I+3DhhARA0iYtAS122DkbW5b0aC2zrpsM\\nW88P5obIg4eWCYTbGnesYLLbJ9ZqpduD6IoSKme+RKNP6dSsH2v62tFmK64067jV\\nMB2LziNGguCJKUe3+/hIhopzxab7+wgxD3Jd58vCDsEUTwjrLfx700rmDDk5mjLG\\nAQCSzeIF15QGvqUbRYMmwfywXUfqUT3ABj1v4TEI4QKBgQDhBAJeRvJtg8RhiQbb\\nJfFOZ61K63d8NHu+a1C/qlVytDEEO5G7BEPrcbHk6fM46xl4wDpGQ7n0kY7ZmH78\\n8eZNkfXgMLvpNzKpj4oTCqAcY4abHuYA0IMA56hp+Sgn+pos7drdVFXCELD6Mys9\\nnh0rP1D/Kiuv2htmHkshchd84QKBgQC/HCZsgfN8O9HrE+oVd9Sp5aW13eaBkG/v\\nNUKxuaGdMGulxFLZQMJrugt2T4yNdjaUq625fmja1ujtIsU7JtlltBLZOAC9ZphF\\nPIfdgX48pvLdJIgOjgoxD4bfVav4Flum16wBskE+PSowdV0XEiOIi0GyofGBAMlT\\nNWDrnThw+QKBgQCcRLaIVulCGUKnIgy64WzmMKZu43yFq8VMhyb7FQZmtLFd6Sja\\nIqowtzL+cWNS4iM8cvOFnL9mFDiK8Zcvf6ebs4R4gB/gZU8v5tnTQ4vSa2QuEpVV\\nd3mjhT626ixzJ10vWrinAUzVi9X8zNB46HgFcuGDc/wHEof4sY0n2x5owQKBgQCY\\nXr1T7hhPiPJJV0tfancoLmz8n7tUufBE7FYMlVCBn0V0mR7lEHjyoxbYcXxCnWnP\\nB0IvjtXTBV4ZE4vlKYhTSkts3PXaDJ6DNUuuE7yuZv1jy+iekikWDKcgEZJW7pyM\\nXZBKmfDiyqmEkU5zQocKKt1qqyt+Cz55FSn9MRD7IQKBgDeUMSwAwQgtRu4RHNCJ\\n5IBaEfEX4fVIRscvFWKxUyhvUb5hpGj1asO0SoUboBw1wGjW/HcKZ7Gw/v+8103v\\n7y1fFqQxMY7eWrLegLtywAfnQW+Uyvaha6n85Ekpuk6X6mSd/IFhe4TPknCbb4+d\\n+NwWPEalsS86ekmB4TeZLQ+H\\n-----END PRIVATE KEY-----\\n",
|
|
9
|
+
"client_email": "app-keys-dataclouder-dev@dataclouder-dev.iam.gserviceaccount.com",
|
|
10
|
+
"client_id": "107525823981418207310",
|
|
11
|
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
|
12
|
+
"token_uri": "https://oauth2.googleapis.com/token",
|
|
13
|
+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
|
14
|
+
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/app-keys-dataclouder-dev%40dataclouder-dev.iam.gserviceaccount.com",
|
|
15
|
+
"universe_domain": "googleapis.com"
|
|
16
|
+
}`;
|
|
17
|
+
//# sourceMappingURL=gemini.config.js.map
|
|
@@ -18,6 +18,7 @@ const common_1 = require("@nestjs/common");
|
|
|
18
18
|
const nest_fastify_file_upload_1 = require("@webundsoehne/nest-fastify-file-upload");
|
|
19
19
|
const swagger_1 = require("@nestjs/swagger");
|
|
20
20
|
const groq_service_1 = require("../services/whisper/groq.service");
|
|
21
|
+
const nest_core_1 = require("@dataclouder/nest-core");
|
|
21
22
|
let GroqSttController = GroqSttController_1 = class GroqSttController {
|
|
22
23
|
groqService;
|
|
23
24
|
logger = new common_1.Logger(GroqSttController_1.name);
|
|
@@ -55,6 +56,7 @@ __decorate([
|
|
|
55
56
|
exports.GroqSttController = GroqSttController = GroqSttController_1 = __decorate([
|
|
56
57
|
(0, swagger_1.ApiTags)('Speech-to-Text'),
|
|
57
58
|
(0, common_1.Controller)('api/groq-stt'),
|
|
59
|
+
(0, common_1.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
58
60
|
__metadata("design:paramtypes", [groq_service_1.GroqService])
|
|
59
61
|
], GroqSttController);
|
|
60
62
|
//# sourceMappingURL=groq-stt.controller.js.map
|
|
@@ -44,4 +44,4 @@ exports.VertexVeoGenerationController = VertexVeoGenerationController = VertexVe
|
|
|
44
44
|
(0, common_1.Controller)('api/vertex-veo/video'),
|
|
45
45
|
__metadata("design:paramtypes", [vertex_veo_genai_service_1.VertexVeoGenaiService])
|
|
46
46
|
], VertexVeoGenerationController);
|
|
47
|
-
//# sourceMappingURL=
|
|
47
|
+
//# sourceMappingURL=veo-video.controller.js.map
|
|
@@ -21,6 +21,7 @@ const comfy_status_dto_1 = require("../dto/comfy-status.dto");
|
|
|
21
21
|
const comfy_image_service_1 = require("../comfyui/services/comfy-image.service");
|
|
22
22
|
const comfy_video_service_1 = require("../comfyui/services/comfy-video.service");
|
|
23
23
|
const comfy_models_1 = require("../comfyui/models/comfy.models");
|
|
24
|
+
const nest_core_1 = require("@dataclouder/nest-core");
|
|
24
25
|
let VertexComfyController = VertexComfyController_1 = class VertexComfyController {
|
|
25
26
|
comfyImageService;
|
|
26
27
|
comfyVideoService;
|
|
@@ -106,6 +107,7 @@ __decorate([
|
|
|
106
107
|
exports.VertexComfyController = VertexComfyController = VertexComfyController_1 = __decorate([
|
|
107
108
|
(0, swagger_1.ApiTags)('Vertex AI'),
|
|
108
109
|
(0, common_1.Controller)('api/vertex-comfy'),
|
|
110
|
+
(0, common_1.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
109
111
|
__metadata("design:paramtypes", [comfy_image_service_1.ComfyImageService,
|
|
110
112
|
comfy_video_service_1.ComfyVideoService,
|
|
111
113
|
generated_asset_service_1.GeneratedAssetService])
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import { GeminiChatService } from '../services/vertex-gemini-chat.service';
|
|
2
2
|
import { GenerateTextDto } from '../dto/generate-text.dto';
|
|
3
|
+
import { ChatMessageDict, IAIModel } from '../models/adapter.models';
|
|
4
|
+
export declare class ConversationDTO {
|
|
5
|
+
id?: string;
|
|
6
|
+
entityId?: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
createdAt?: Date;
|
|
9
|
+
messages: Array<ChatMessageDict>;
|
|
10
|
+
transcription?: boolean;
|
|
11
|
+
model?: IAIModel;
|
|
12
|
+
returnJson?: boolean;
|
|
13
|
+
}
|
|
3
14
|
export declare class GeminiChatController {
|
|
4
15
|
private readonly geminiChatService;
|
|
5
16
|
private readonly logger;
|
|
6
17
|
constructor(geminiChatService: GeminiChatService);
|
|
7
|
-
generateText(generateTextDto: GenerateTextDto): Promise<
|
|
18
|
+
generateText(generateTextDto: GenerateTextDto): Promise<ChatMessageDict>;
|
|
19
|
+
continueConversation(conversation: ConversationDTO): Promise<ChatMessageDict>;
|
|
8
20
|
}
|
|
@@ -13,11 +13,25 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
13
13
|
};
|
|
14
14
|
var GeminiChatController_1;
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.GeminiChatController = void 0;
|
|
16
|
+
exports.GeminiChatController = exports.ConversationDTO = void 0;
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const vertex_gemini_chat_service_1 = require("../services/vertex-gemini-chat.service");
|
|
19
19
|
const swagger_1 = require("@nestjs/swagger");
|
|
20
20
|
const generate_text_dto_1 = require("../dto/generate-text.dto");
|
|
21
|
+
const nest_core_1 = require("@dataclouder/nest-core");
|
|
22
|
+
const gemini_models_1 = require("../models/gemini-models");
|
|
23
|
+
const adapter_models_1 = require("../models/adapter.models");
|
|
24
|
+
class ConversationDTO {
|
|
25
|
+
id;
|
|
26
|
+
entityId;
|
|
27
|
+
type;
|
|
28
|
+
createdAt;
|
|
29
|
+
messages;
|
|
30
|
+
transcription;
|
|
31
|
+
model;
|
|
32
|
+
returnJson;
|
|
33
|
+
}
|
|
34
|
+
exports.ConversationDTO = ConversationDTO;
|
|
21
35
|
let GeminiChatController = GeminiChatController_1 = class GeminiChatController {
|
|
22
36
|
geminiChatService;
|
|
23
37
|
logger = new common_1.Logger(GeminiChatController_1.name);
|
|
@@ -35,6 +49,40 @@ let GeminiChatController = GeminiChatController_1 = class GeminiChatController {
|
|
|
35
49
|
throw error;
|
|
36
50
|
}
|
|
37
51
|
}
|
|
52
|
+
async continueConversation(conversation) {
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
if (!conversation?.model) {
|
|
55
|
+
conversation.model = { provider: 'google', modelName: gemini_models_1.GeminiModels.Gemini2_5Lite, id: 'no-id' };
|
|
56
|
+
}
|
|
57
|
+
if (conversation?.model?.quality) {
|
|
58
|
+
conversation.model.provider = 'google';
|
|
59
|
+
conversation.model.modelName = this.geminiChatService.getDefaultQualityModel(conversation.model.quality);
|
|
60
|
+
}
|
|
61
|
+
const returnJson = conversation.returnJson;
|
|
62
|
+
if (returnJson) {
|
|
63
|
+
const obj = await this.geminiChatService.chatAndExtractJson(conversation.messages, conversation.model.modelName);
|
|
64
|
+
const endTime = Date.now();
|
|
65
|
+
const processTime = (endTime - startTime) / 1000;
|
|
66
|
+
const metadata = {
|
|
67
|
+
type: 'json',
|
|
68
|
+
provider: conversation.model.provider,
|
|
69
|
+
model: conversation.model.modelName,
|
|
70
|
+
processTime,
|
|
71
|
+
...obj?.metadata,
|
|
72
|
+
};
|
|
73
|
+
return { content: obj.json, role: adapter_models_1.ChatRole.Assistant, metadata };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const response = await this.geminiChatService.chat(conversation.messages, conversation.model.modelName);
|
|
77
|
+
const endTime = Date.now();
|
|
78
|
+
const processTime = (endTime - startTime) / 1000;
|
|
79
|
+
return {
|
|
80
|
+
content: response.content,
|
|
81
|
+
role: response.role,
|
|
82
|
+
metadata: { provider: conversation.model.provider, model: conversation.model.modelName, processTime, tokens: response.metadata.tokens },
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
38
86
|
};
|
|
39
87
|
exports.GeminiChatController = GeminiChatController;
|
|
40
88
|
__decorate([
|
|
@@ -44,9 +92,19 @@ __decorate([
|
|
|
44
92
|
__metadata("design:paramtypes", [generate_text_dto_1.GenerateTextDto]),
|
|
45
93
|
__metadata("design:returntype", Promise)
|
|
46
94
|
], GeminiChatController.prototype, "generateText", null);
|
|
95
|
+
__decorate([
|
|
96
|
+
(0, common_1.Post)('/chat'),
|
|
97
|
+
(0, swagger_1.ApiOperation)({ summary: 'Continue the conversation' }),
|
|
98
|
+
(0, swagger_1.ApiResponse)({ status: 200, description: 'Return the conversation.' }),
|
|
99
|
+
__param(0, (0, common_1.Body)()),
|
|
100
|
+
__metadata("design:type", Function),
|
|
101
|
+
__metadata("design:paramtypes", [ConversationDTO]),
|
|
102
|
+
__metadata("design:returntype", Promise)
|
|
103
|
+
], GeminiChatController.prototype, "continueConversation", null);
|
|
47
104
|
exports.GeminiChatController = GeminiChatController = GeminiChatController_1 = __decorate([
|
|
48
105
|
(0, swagger_1.ApiTags)('LLM Gemini '),
|
|
49
106
|
(0, common_1.Controller)('api/ai-services/gemini'),
|
|
107
|
+
(0, common_1.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
50
108
|
__metadata("design:paramtypes", [vertex_gemini_chat_service_1.GeminiChatService])
|
|
51
109
|
], GeminiChatController);
|
|
52
110
|
//# sourceMappingURL=vertex-gemini-chat.controller.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type FastifyReply } from 'fastify';
|
|
2
|
+
import { VertexGeminiTtsService } from '../services/vertex-gemini-tts.service';
|
|
3
|
+
import { type SynthesizeSpeechInput } from '../services/vertex-tts.service';
|
|
4
|
+
export declare class VertexGeminiTtsController {
|
|
5
|
+
private readonly vertexGeminiTtsService;
|
|
6
|
+
private readonly logger;
|
|
7
|
+
constructor(vertexGeminiTtsService: VertexGeminiTtsService);
|
|
8
|
+
synthesizeSpeech(body: SynthesizeSpeechInput, res: FastifyReply): Promise<Buffer<ArrayBufferLike>>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.VertexGeminiTtsController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const vertex_gemini_tts_service_1 = require("../services/vertex-gemini-tts.service");
|
|
19
|
+
const nest_core_1 = require("@dataclouder/nest-core");
|
|
20
|
+
let VertexGeminiTtsController = class VertexGeminiTtsController {
|
|
21
|
+
vertexGeminiTtsService;
|
|
22
|
+
logger = new common_1.Logger('VertexGeminiTtsController');
|
|
23
|
+
constructor(vertexGeminiTtsService) {
|
|
24
|
+
this.vertexGeminiTtsService = vertexGeminiTtsService;
|
|
25
|
+
}
|
|
26
|
+
async synthesizeSpeech(body, res) {
|
|
27
|
+
this.logger.log(`Received Gemini synthesize request for text: "${body.text.substring(0, 50)}..."`);
|
|
28
|
+
const audioBuffer = await this.vertexGeminiTtsService.synthesizeSpeech(body);
|
|
29
|
+
if (!audioBuffer) {
|
|
30
|
+
this.logger.error('Synthesis resulted in null buffer');
|
|
31
|
+
throw new nest_core_1.AppException({
|
|
32
|
+
error_message: 'Could not generate audio for the given input.',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
res.header('Content-Length', audioBuffer.length.toString());
|
|
36
|
+
this.logger.log(`Successfully synthesized audio (${audioBuffer.length} bytes)`);
|
|
37
|
+
return audioBuffer;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.VertexGeminiTtsController = VertexGeminiTtsController;
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, common_1.Post)('synthesize'),
|
|
43
|
+
(0, swagger_1.ApiOperation)({ summary: 'Synthesize speech from text using Gemini' }),
|
|
44
|
+
(0, swagger_1.ApiBody)({
|
|
45
|
+
description: 'Text and configuration for speech synthesis with Gemini',
|
|
46
|
+
schema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
text: { type: 'string', example: 'Hello, this is a test.' },
|
|
50
|
+
prompt: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
example: 'Say it in a friendly tone.',
|
|
53
|
+
description: 'Optional styling instructions.',
|
|
54
|
+
},
|
|
55
|
+
voiceName: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
example: 'Charon',
|
|
58
|
+
description: 'Optional specific voice name (default: Charon)',
|
|
59
|
+
},
|
|
60
|
+
languageCode: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
example: 'en-US',
|
|
63
|
+
description: 'Optional language code (default: en-US)',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
required: ['text'],
|
|
67
|
+
},
|
|
68
|
+
}),
|
|
69
|
+
(0, common_1.Header)('Content-Type', 'audio/mpeg'),
|
|
70
|
+
__param(0, (0, common_1.Body)()),
|
|
71
|
+
__param(1, (0, common_1.Res)({ passthrough: true })),
|
|
72
|
+
__metadata("design:type", Function),
|
|
73
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
74
|
+
__metadata("design:returntype", Promise)
|
|
75
|
+
], VertexGeminiTtsController.prototype, "synthesizeSpeech", null);
|
|
76
|
+
exports.VertexGeminiTtsController = VertexGeminiTtsController = __decorate([
|
|
77
|
+
(0, swagger_1.ApiTags)('Vertex Gemini TTS'),
|
|
78
|
+
(0, common_1.Controller)('api/vertex-gemini/tts'),
|
|
79
|
+
(0, common_1.UseFilters)(nest_core_1.AllExceptionsHandler),
|
|
80
|
+
__metadata("design:paramtypes", [vertex_gemini_tts_service_1.VertexGeminiTtsService])
|
|
81
|
+
], VertexGeminiTtsController);
|
|
82
|
+
//# sourceMappingURL=vertex-gemini-tts.controller.js.map
|