From 2dd136242c903126ed0827232e9e40f6898f94aa Mon Sep 17 00:00:00 2001 From: sthipp005 Date: Mon, 22 Sep 2025 15:06:41 +0530 Subject: [PATCH 1/4] veenamax - tts integration --- src/data/providers.json | 7 + src/globals.ts | 2 + src/providers/index.ts | 2 + src/providers/veenamax/api.test.ts | 67 +++++++++ src/providers/veenamax/api.ts | 22 +++ src/providers/veenamax/createSpeech.test.ts | 138 ++++++++++++++++++ src/providers/veenamax/createSpeech.ts | 148 ++++++++++++++++++++ src/providers/veenamax/index.ts | 16 +++ 8 files changed, 402 insertions(+) create mode 100644 src/providers/veenamax/api.test.ts create mode 100644 src/providers/veenamax/api.ts create mode 100644 src/providers/veenamax/createSpeech.test.ts create mode 100644 src/providers/veenamax/createSpeech.ts create mode 100644 src/providers/veenamax/index.ts diff --git a/src/data/providers.json b/src/data/providers.json index cf6fcea9d..2e5b1ee4e 100644 --- a/src/data/providers.json +++ b/src/data/providers.json @@ -302,6 +302,13 @@ "object": "provider", "description": "Dashscope provides intelligent analytics solutions designed to help businesses visualize and interpret complex data effectively. Their platform integrates advanced machine learning algorithms to generate real-time insights from diverse datasets, enabling organizations to make informed decisions quickly. Dashscope focuses on enhancing data accessibility and usability, empowering teams to leverage analytics for strategic planning and operational efficiency.", "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1" + }, + { + "id": "veenamax", + "name": "VeenaMAX", + "object": "provider", + "description": "VeenaMAX is an advanced Text-to-Speech (TTS) service by Maya Research, specializing in high-quality multilingual voice synthesis. It supports Hindi, English, and Hinglish with multiple native voice personalities. VeenaMAX provides natural-sounding speech generation with customizable voice characteristics, speed control, and multiple audio formats for diverse applications.", + "base_url": "https://flash.mayaresearch.ai" } ] } diff --git a/src/globals.ts b/src/globals.ts index 6b06b1cdd..ee960d290 100644 --- a/src/globals.ts +++ b/src/globals.ts @@ -105,6 +105,7 @@ export const THREE_ZERO_TWO_AI: string = '302ai'; export const MESHY: string = 'meshy'; export const TRIPO3D: string = 'tripo3d'; export const NEXTBIT: string = 'nextbit'; +export const VEENA_MAX: string = 'veenamax'; export const VALID_PROVIDERS = [ ANTHROPIC, @@ -173,6 +174,7 @@ export const VALID_PROVIDERS = [ MESHY, TRIPO3D, NEXTBIT, + VEENA_MAX, ]; export const CONTENT_TYPES = { diff --git a/src/providers/index.ts b/src/providers/index.ts index fb5a9f788..050180478 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -66,6 +66,7 @@ import AI302Config from './302ai'; import MeshyConfig from './meshy'; import Tripo3DConfig from './tripo3d'; import { NextBitConfig } from './nextbit'; +import VeenaMaxConfig from './veenamax'; const Providers: { [key: string]: ProviderConfigs } = { openai: OpenAIConfig, @@ -132,6 +133,7 @@ const Providers: { [key: string]: ProviderConfigs } = { meshy: MeshyConfig, nextbit: NextBitConfig, tripo3d: Tripo3DConfig, + veenamax: VeenaMaxConfig, }; export default Providers; diff --git a/src/providers/veenamax/api.test.ts b/src/providers/veenamax/api.test.ts new file mode 100644 index 000000000..53da46711 --- /dev/null +++ b/src/providers/veenamax/api.test.ts @@ -0,0 +1,67 @@ +import VeenaMaxAPIConfig from './api'; + +describe('VeenaMAX API Config', () => { + test('should return correct base URL', () => { + const baseURL = VeenaMaxAPIConfig.getBaseURL({ + providerOptions: { + provider: 'veenamax', + apiKey: 'test-key', + }, + fn: 'createSpeech', + requestHeaders: {}, + c: {} as any, + gatewayRequestURL: '', + params: {}, + }); + expect(baseURL).toBe('https://flash.mayaresearch.ai'); + }); + + test('should generate correct headers with API key', async () => { + const headers = await VeenaMaxAPIConfig.headers({ + providerOptions: { + provider: 'veenamax', + apiKey: 'vna_***', + }, + fn: 'createSpeech', + c: {} as any, + transformedRequestBody: {}, + transformedRequestUrl: '', + gatewayRequestBody: {}, + }); + + expect(headers.Authorization).toBe('Bearer vna_***'); + expect(headers['Content-Type']).toBe('application/json'); + }); + + test('should return correct endpoint for createSpeech', () => { + const endpoint = VeenaMaxAPIConfig.getEndpoint({ + c: {} as any, + providerOptions: { + provider: 'veenamax', + apiKey: 'test-key', + }, + fn: 'createSpeech', + gatewayRequestBodyJSON: {}, + gatewayRequestBody: {}, + gatewayRequestURL: '', + }); + + expect(endpoint).toBe('/generate'); + }); + + test('should return empty string for unsupported functions', () => { + const endpoint = VeenaMaxAPIConfig.getEndpoint({ + c: {} as any, + providerOptions: { + provider: 'veenamax', + apiKey: 'test-key', + }, + fn: 'chatComplete', + gatewayRequestBodyJSON: {}, + gatewayRequestBody: {}, + gatewayRequestURL: '', + }); + + expect(endpoint).toBe(''); + }); +}); diff --git a/src/providers/veenamax/api.ts b/src/providers/veenamax/api.ts new file mode 100644 index 000000000..96be936aa --- /dev/null +++ b/src/providers/veenamax/api.ts @@ -0,0 +1,22 @@ +import { ProviderAPIConfig } from '../types'; + +const VeenaMaxAPIConfig: ProviderAPIConfig = { + getBaseURL: () => 'https://flash.mayaresearch.ai', + headers: ({ providerOptions }) => { + const headersObj: Record = { + Authorization: `Bearer ${providerOptions.apiKey}`, + 'Content-Type': 'application/json', + }; + return headersObj; + }, + getEndpoint: ({ fn }) => { + switch (fn) { + case 'createSpeech': + return '/generate'; + default: + return ''; + } + }, +}; + +export default VeenaMaxAPIConfig; diff --git a/src/providers/veenamax/createSpeech.test.ts b/src/providers/veenamax/createSpeech.test.ts new file mode 100644 index 000000000..a94b36f72 --- /dev/null +++ b/src/providers/veenamax/createSpeech.test.ts @@ -0,0 +1,138 @@ +import { + VeenaMaxCreateSpeechResponseTransform, + VEENAMAX_VOICES, +} from './createSpeech'; +import { VEENA_MAX } from '../../globals'; +import { ErrorResponse } from '../types'; + +// Mock fetch for testing +global.fetch = jest.fn(); + +describe('VeenaMAX CreateSpeech', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('should pass through Response object for successful audio response', () => { + const mockResponse = new Response(new ArrayBuffer(1024), { + status: 200, + headers: { + 'Content-Type': 'audio/wav', + 'Content-Length': '1024', + }, + }); + + const result = VeenaMaxCreateSpeechResponseTransform(mockResponse, 200); + + expect(result).toBeInstanceOf(Response); + expect(result).toBe(mockResponse); + }); + + test('should handle 400 error responses', () => { + const mockErrorResponse = { + error: { + message: + 'Invalid request format. Check JSON syntax and required fields.', + code: 400, + type: 'invalid_request_error', + }, + }; + + const result = VeenaMaxCreateSpeechResponseTransform( + mockErrorResponse, + 400 + ) as ErrorResponse; + + expect(result).toHaveProperty('error'); + expect(result.provider).toBe(VEENA_MAX); + expect(result.error.message).toBe( + 'Invalid request format. Check JSON syntax and required fields.' + ); + expect(result.error.type).toBe('invalid_request_error'); + }); + + test('should handle 401 authentication error', () => { + const mockErrorResponse = { + error: { + message: 'Authentication failed', + code: 401, + type: 'authentication_error', + }, + }; + + const result = VeenaMaxCreateSpeechResponseTransform( + mockErrorResponse, + 401 + ) as ErrorResponse; + + expect(result).toHaveProperty('error'); + expect(result.provider).toBe(VEENA_MAX); + expect(result.error.message).toBe('Authentication failed'); + expect(result.error.type).toBe('authentication_error'); + }); + + test('should handle 429 rate limit error', () => { + const result = VeenaMaxCreateSpeechResponseTransform( + {}, + 429 + ) as ErrorResponse; + + expect(result).toHaveProperty('error'); + expect(result.provider).toBe(VEENA_MAX); + expect(result.error.message).toBe( + 'Rate limit exceeded. Implement exponential backoff.' + ); + expect(result.error.type).toBe('rate_limit_error'); + }); + + test('should handle 500 internal server error', () => { + const result = VeenaMaxCreateSpeechResponseTransform( + {}, + 500 + ) as ErrorResponse; + + expect(result).toHaveProperty('error'); + expect(result.provider).toBe(VEENA_MAX); + expect(result.error.message).toBe( + 'Internal server error. Contact support if persistent.' + ); + expect(result.error.type).toBe('api_error'); + }); + + test('should handle generic error responses', () => { + const result = VeenaMaxCreateSpeechResponseTransform( + {}, + 503 + ) as ErrorResponse; + + expect(result).toHaveProperty('error'); + expect(result.provider).toBe(VEENA_MAX); + expect(result.error.message).toBe( + 'VeenaMAX TTS request failed with status 503' + ); + expect(result.error.type).toBe('api_error'); + }); + + test('should have correct voice mappings', () => { + // Test VeenaMAX native voices + expect(VEENAMAX_VOICES['varun_chat']).toBe('varun_chat'); + expect(VEENAMAX_VOICES['charu_soft']).toBe('charu_soft'); + expect(VEENAMAX_VOICES['keerti_joy']).toBe('keerti_joy'); + expect(VEENAMAX_VOICES['mohini_whispers']).toBe('mohini_whispers'); + expect(VEENAMAX_VOICES['maitri_connect']).toBe('maitri_connect'); + expect(VEENAMAX_VOICES['soumya_calm']).toBe('soumya_calm'); + expect(VEENAMAX_VOICES['vinaya_assist']).toBe('vinaya_assist'); + }); + + test('should handle invalid response format', () => { + const invalidResponse = { some: 'invalid', data: 'structure' }; + + const result = VeenaMaxCreateSpeechResponseTransform( + invalidResponse, + 200 + ) as ErrorResponse; + + expect(result).toHaveProperty('error'); + expect(result.provider).toBe(VEENA_MAX); + }); +}); diff --git a/src/providers/veenamax/createSpeech.ts b/src/providers/veenamax/createSpeech.ts new file mode 100644 index 000000000..f43951399 --- /dev/null +++ b/src/providers/veenamax/createSpeech.ts @@ -0,0 +1,148 @@ +import { VEENA_MAX } from '../../globals'; +import { ErrorResponse, ProviderConfig } from '../types'; +import { + generateErrorResponse, + generateInvalidProviderResponseError, +} from '../utils'; + +// VeenaMAX API request interface +export interface VeenaMaxTTSRequest { + text: string; + speaker_id: string; + streaming?: boolean; + normalize?: boolean; +} + +// VeenaMAX API response interface +export interface VeenaMaxTTSResponse { + // VeenaMAX returns audio data directly as Response +} + +// VeenaMAX API error response interface +export interface VeenaMaxErrorResponse { + error: { + message: string; + code: number; + type: string; + }; +} + +// Parameter configuration mapping OpenAI format to VeenaMAX format +export const VeenaMaxCreateSpeechConfig: ProviderConfig = { + model: { + param: 'model', + required: false, + default: 'veenamax-1', + }, + input: { + param: 'text', + required: true, + }, + voice: { + param: 'speaker_id', + required: true, + default: 'charu_soft', + }, + response_format: { + param: 'response_format', + required: false, + default: 'wav', + }, + speed: { + param: 'speed', + required: false, + default: 1, + min: 0.25, + max: 4.0, + }, + + streaming: { + param: 'streaming', + required: false, + default: false, + }, + normalize: { + param: 'normalize', + required: false, + default: true, + }, +}; + +export const VEENAMAX_VOICES = { + charu_soft: 'charu_soft', + keerti_joy: 'keerti_joy', + mohini_whispers: 'mohini_whispers', + maitri_connect: 'maitri_connect', + soumya_calm: 'soumya_calm', + vinaya_assist: 'vinaya_assist', +}; + +export const VeenaMaxCreateSpeechResponseTransform = ( + response: VeenaMaxTTSResponse | VeenaMaxErrorResponse | Response, + responseStatus: number +) => { + if (responseStatus !== 200) { + if (response && typeof response === 'object' && 'error' in response) { + const errorResponse = response as VeenaMaxErrorResponse; + return generateErrorResponse( + { + message: errorResponse.error.message, + type: errorResponse.error.type, + param: null, + code: + errorResponse.error.code?.toString() || responseStatus.toString(), + }, + VEENA_MAX + ); + } + + let errorMessage = 'TTS request failed'; + let errorType = 'api_error'; + + switch (responseStatus) { + case 400: + errorMessage = + 'Invalid request format. Check JSON syntax and required fields.'; + errorType = 'invalid_request_error'; + break; + case 401: + errorMessage = + 'Authentication failed. Verify API key and Bearer token format.'; + errorType = 'authentication_error'; + break; + case 403: + errorMessage = 'Access denied. Check API permissions and quotas.'; + errorType = 'permission_error'; + break; + case 429: + errorMessage = 'Rate limit exceeded. Implement exponential backoff.'; + errorType = 'rate_limit_error'; + break; + case 500: + errorMessage = 'Internal server error. Contact support if persistent.'; + errorType = 'api_error'; + break; + default: + errorMessage = `VeenaMAX TTS request failed with status ${responseStatus}`; + } + + return generateErrorResponse( + { + message: errorMessage, + type: errorType, + param: null, + code: responseStatus.toString(), + }, + VEENA_MAX + ); + } + + // If VeenaMAX returns a Response object (audio stream), pass it through + // VeenaMAX returns WAV format audio data directly + if (response instanceof Response) { + return response; + } + + // If somehow we get an unexpected response format + return generateInvalidProviderResponseError(response, VEENA_MAX); +}; diff --git a/src/providers/veenamax/index.ts b/src/providers/veenamax/index.ts new file mode 100644 index 000000000..f674ba3e8 --- /dev/null +++ b/src/providers/veenamax/index.ts @@ -0,0 +1,16 @@ +import { ProviderConfigs } from '../types'; +import VeenaMaxAPIConfig from './api'; +import { + VeenaMaxCreateSpeechConfig, + VeenaMaxCreateSpeechResponseTransform, +} from './createSpeech'; + +const VeenaMaxConfig: ProviderConfigs = { + api: VeenaMaxAPIConfig, + createSpeech: VeenaMaxCreateSpeechConfig, + responseTransforms: { + createSpeech: VeenaMaxCreateSpeechResponseTransform, + }, +}; + +export default VeenaMaxConfig; From 6ab58b69af2abf4d28a8fa6e52b1868636d70dfb Mon Sep 17 00:00:00 2001 From: sthipp005 Date: Mon, 22 Sep 2025 17:07:14 +0530 Subject: [PATCH 2/4] veenamax : code_cleanup --- src/providers/veenamax/api.test.ts | 67 ---------- src/providers/veenamax/createSpeech.test.ts | 138 -------------------- src/providers/veenamax/createSpeech.ts | 9 -- 3 files changed, 214 deletions(-) delete mode 100644 src/providers/veenamax/api.test.ts delete mode 100644 src/providers/veenamax/createSpeech.test.ts diff --git a/src/providers/veenamax/api.test.ts b/src/providers/veenamax/api.test.ts deleted file mode 100644 index 53da46711..000000000 --- a/src/providers/veenamax/api.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import VeenaMaxAPIConfig from './api'; - -describe('VeenaMAX API Config', () => { - test('should return correct base URL', () => { - const baseURL = VeenaMaxAPIConfig.getBaseURL({ - providerOptions: { - provider: 'veenamax', - apiKey: 'test-key', - }, - fn: 'createSpeech', - requestHeaders: {}, - c: {} as any, - gatewayRequestURL: '', - params: {}, - }); - expect(baseURL).toBe('https://flash.mayaresearch.ai'); - }); - - test('should generate correct headers with API key', async () => { - const headers = await VeenaMaxAPIConfig.headers({ - providerOptions: { - provider: 'veenamax', - apiKey: 'vna_***', - }, - fn: 'createSpeech', - c: {} as any, - transformedRequestBody: {}, - transformedRequestUrl: '', - gatewayRequestBody: {}, - }); - - expect(headers.Authorization).toBe('Bearer vna_***'); - expect(headers['Content-Type']).toBe('application/json'); - }); - - test('should return correct endpoint for createSpeech', () => { - const endpoint = VeenaMaxAPIConfig.getEndpoint({ - c: {} as any, - providerOptions: { - provider: 'veenamax', - apiKey: 'test-key', - }, - fn: 'createSpeech', - gatewayRequestBodyJSON: {}, - gatewayRequestBody: {}, - gatewayRequestURL: '', - }); - - expect(endpoint).toBe('/generate'); - }); - - test('should return empty string for unsupported functions', () => { - const endpoint = VeenaMaxAPIConfig.getEndpoint({ - c: {} as any, - providerOptions: { - provider: 'veenamax', - apiKey: 'test-key', - }, - fn: 'chatComplete', - gatewayRequestBodyJSON: {}, - gatewayRequestBody: {}, - gatewayRequestURL: '', - }); - - expect(endpoint).toBe(''); - }); -}); diff --git a/src/providers/veenamax/createSpeech.test.ts b/src/providers/veenamax/createSpeech.test.ts deleted file mode 100644 index a94b36f72..000000000 --- a/src/providers/veenamax/createSpeech.test.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { - VeenaMaxCreateSpeechResponseTransform, - VEENAMAX_VOICES, -} from './createSpeech'; -import { VEENA_MAX } from '../../globals'; -import { ErrorResponse } from '../types'; - -// Mock fetch for testing -global.fetch = jest.fn(); - -describe('VeenaMAX CreateSpeech', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - test('should pass through Response object for successful audio response', () => { - const mockResponse = new Response(new ArrayBuffer(1024), { - status: 200, - headers: { - 'Content-Type': 'audio/wav', - 'Content-Length': '1024', - }, - }); - - const result = VeenaMaxCreateSpeechResponseTransform(mockResponse, 200); - - expect(result).toBeInstanceOf(Response); - expect(result).toBe(mockResponse); - }); - - test('should handle 400 error responses', () => { - const mockErrorResponse = { - error: { - message: - 'Invalid request format. Check JSON syntax and required fields.', - code: 400, - type: 'invalid_request_error', - }, - }; - - const result = VeenaMaxCreateSpeechResponseTransform( - mockErrorResponse, - 400 - ) as ErrorResponse; - - expect(result).toHaveProperty('error'); - expect(result.provider).toBe(VEENA_MAX); - expect(result.error.message).toBe( - 'Invalid request format. Check JSON syntax and required fields.' - ); - expect(result.error.type).toBe('invalid_request_error'); - }); - - test('should handle 401 authentication error', () => { - const mockErrorResponse = { - error: { - message: 'Authentication failed', - code: 401, - type: 'authentication_error', - }, - }; - - const result = VeenaMaxCreateSpeechResponseTransform( - mockErrorResponse, - 401 - ) as ErrorResponse; - - expect(result).toHaveProperty('error'); - expect(result.provider).toBe(VEENA_MAX); - expect(result.error.message).toBe('Authentication failed'); - expect(result.error.type).toBe('authentication_error'); - }); - - test('should handle 429 rate limit error', () => { - const result = VeenaMaxCreateSpeechResponseTransform( - {}, - 429 - ) as ErrorResponse; - - expect(result).toHaveProperty('error'); - expect(result.provider).toBe(VEENA_MAX); - expect(result.error.message).toBe( - 'Rate limit exceeded. Implement exponential backoff.' - ); - expect(result.error.type).toBe('rate_limit_error'); - }); - - test('should handle 500 internal server error', () => { - const result = VeenaMaxCreateSpeechResponseTransform( - {}, - 500 - ) as ErrorResponse; - - expect(result).toHaveProperty('error'); - expect(result.provider).toBe(VEENA_MAX); - expect(result.error.message).toBe( - 'Internal server error. Contact support if persistent.' - ); - expect(result.error.type).toBe('api_error'); - }); - - test('should handle generic error responses', () => { - const result = VeenaMaxCreateSpeechResponseTransform( - {}, - 503 - ) as ErrorResponse; - - expect(result).toHaveProperty('error'); - expect(result.provider).toBe(VEENA_MAX); - expect(result.error.message).toBe( - 'VeenaMAX TTS request failed with status 503' - ); - expect(result.error.type).toBe('api_error'); - }); - - test('should have correct voice mappings', () => { - // Test VeenaMAX native voices - expect(VEENAMAX_VOICES['varun_chat']).toBe('varun_chat'); - expect(VEENAMAX_VOICES['charu_soft']).toBe('charu_soft'); - expect(VEENAMAX_VOICES['keerti_joy']).toBe('keerti_joy'); - expect(VEENAMAX_VOICES['mohini_whispers']).toBe('mohini_whispers'); - expect(VEENAMAX_VOICES['maitri_connect']).toBe('maitri_connect'); - expect(VEENAMAX_VOICES['soumya_calm']).toBe('soumya_calm'); - expect(VEENAMAX_VOICES['vinaya_assist']).toBe('vinaya_assist'); - }); - - test('should handle invalid response format', () => { - const invalidResponse = { some: 'invalid', data: 'structure' }; - - const result = VeenaMaxCreateSpeechResponseTransform( - invalidResponse, - 200 - ) as ErrorResponse; - - expect(result).toHaveProperty('error'); - expect(result.provider).toBe(VEENA_MAX); - }); -}); diff --git a/src/providers/veenamax/createSpeech.ts b/src/providers/veenamax/createSpeech.ts index f43951399..c36b48870 100644 --- a/src/providers/veenamax/createSpeech.ts +++ b/src/providers/veenamax/createSpeech.ts @@ -68,15 +68,6 @@ export const VeenaMaxCreateSpeechConfig: ProviderConfig = { }, }; -export const VEENAMAX_VOICES = { - charu_soft: 'charu_soft', - keerti_joy: 'keerti_joy', - mohini_whispers: 'mohini_whispers', - maitri_connect: 'maitri_connect', - soumya_calm: 'soumya_calm', - vinaya_assist: 'vinaya_assist', -}; - export const VeenaMaxCreateSpeechResponseTransform = ( response: VeenaMaxTTSResponse | VeenaMaxErrorResponse | Response, responseStatus: number From dd51f3910775b8fc4e0ca1b26f4590e2034636df Mon Sep 17 00:00:00 2001 From: sthipp005 Date: Mon, 22 Sep 2025 17:09:32 +0530 Subject: [PATCH 3/4] veenamax : code_cleanup --- src/data/providers.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/data/providers.json b/src/data/providers.json index 2e5b1ee4e..cf6fcea9d 100644 --- a/src/data/providers.json +++ b/src/data/providers.json @@ -302,13 +302,6 @@ "object": "provider", "description": "Dashscope provides intelligent analytics solutions designed to help businesses visualize and interpret complex data effectively. Their platform integrates advanced machine learning algorithms to generate real-time insights from diverse datasets, enabling organizations to make informed decisions quickly. Dashscope focuses on enhancing data accessibility and usability, empowering teams to leverage analytics for strategic planning and operational efficiency.", "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1" - }, - { - "id": "veenamax", - "name": "VeenaMAX", - "object": "provider", - "description": "VeenaMAX is an advanced Text-to-Speech (TTS) service by Maya Research, specializing in high-quality multilingual voice synthesis. It supports Hindi, English, and Hinglish with multiple native voice personalities. VeenaMAX provides natural-sounding speech generation with customizable voice characteristics, speed control, and multiple audio formats for diverse applications.", - "base_url": "https://flash.mayaresearch.ai" } ] } From b1e3d07b8e85efe2d0ebaf7075ecf33144da1c0e Mon Sep 17 00:00:00 2001 From: sthipp005 Date: Mon, 22 Sep 2025 17:11:49 +0530 Subject: [PATCH 4/4] veenamax : code_cleanup --- src/providers/veenamax/createSpeech.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/providers/veenamax/createSpeech.ts b/src/providers/veenamax/createSpeech.ts index c36b48870..3488c949b 100644 --- a/src/providers/veenamax/createSpeech.ts +++ b/src/providers/veenamax/createSpeech.ts @@ -128,12 +128,9 @@ export const VeenaMaxCreateSpeechResponseTransform = ( ); } - // If VeenaMAX returns a Response object (audio stream), pass it through - // VeenaMAX returns WAV format audio data directly if (response instanceof Response) { return response; } - // If somehow we get an unexpected response format return generateInvalidProviderResponseError(response, VEENA_MAX); };