Skip to content

Commit 64f8dc3

Browse files
authored
Merge pull request #1049 from narengogi/chore/groq-audio-routes
audio routes for groq and response_format for bedrock
2 parents 8bcfa0a + 757e58f commit 64f8dc3

5 files changed

Lines changed: 115 additions & 5 deletions

File tree

src/providers/bedrock/chatComplete.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,11 @@ export const BedrockConverseChatCompleteConfig: ProviderConfig = {
351351
transform: (params: BedrockChatCompletionsParams) =>
352352
transformAdditionalModelRequestFields(params),
353353
},
354+
response_format: {
355+
param: 'additionalModelRequestFields',
356+
transform: (params: BedrockChatCompletionsParams) =>
357+
transformAdditionalModelRequestFields(params),
358+
},
354359
};
355360

356361
type BedrockContentItem = {

src/providers/bedrock/utils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ export const transformAdditionalModelRequestFields = (
9797
if (params['top_k']) {
9898
additionalModelRequestFields['top_k'] = params['top_k'];
9999
}
100+
if (params['response_format']) {
101+
additionalModelRequestFields['response_format'] = params['response_format'];
102+
}
100103
return additionalModelRequestFields;
101104
};
102105

src/providers/groq/api.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,26 @@ import { ProviderAPIConfig } from '../types';
22

33
const GroqAPIConfig: ProviderAPIConfig = {
44
getBaseURL: () => 'https://api.groq.com/openai/v1',
5-
headers: ({ providerOptions }) => {
6-
return { Authorization: `Bearer ${providerOptions.apiKey}` };
5+
headers: ({ providerOptions, fn }) => {
6+
const headersObj: Record<string, string> = {
7+
Authorization: `Bearer ${providerOptions.apiKey}`,
8+
};
9+
if (fn === 'createTranscription' || fn === 'createTranslation')
10+
headersObj['Content-Type'] = 'multipart/form-data';
11+
return headersObj;
712
},
813
getEndpoint: ({ fn }) => {
914
switch (fn) {
1015
case 'chatComplete':
1116
return '/chat/completions';
17+
case 'createTranscription':
18+
return '/audio/transcriptions';
19+
case 'createTranslation':
20+
return '/audio/translations';
21+
case 'createSpeech':
22+
return '/audio/speech';
23+
case 'createModelResponse':
24+
return '/chat/completions';
1225
default:
1326
return '';
1427
}

src/providers/groq/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
import { ProviderConfigs } from '../types';
22
import GroqAPIConfig from './api';
33
import { GroqChatCompleteStreamChunkTransform } from './chatComplete';
4-
import { chatCompleteParams, responseTransformers } from '../open-ai-base';
4+
import {
5+
chatCompleteParams,
6+
responseTransformers,
7+
createSpeechParams,
8+
} from '../open-ai-base';
59
import { GROQ } from '../../globals';
610

711
const GroqConfig: ProviderConfigs = {
8-
chatComplete: chatCompleteParams(['logprobs', 'logits_bias', 'top_logprobs']),
912
api: GroqAPIConfig,
13+
chatComplete: chatCompleteParams(['logprobs', 'logits_bias', 'top_logprobs']),
14+
createTranscription: {},
15+
createTranslation: {},
16+
createSpeech: createSpeechParams([]),
1017
responseTransforms: {
1118
...responseTransformers(GROQ, {
1219
chatComplete: true,
20+
createSpeech: true,
1321
}),
1422
'stream-chatComplete': GroqChatCompleteStreamChunkTransform,
1523
},

src/providers/open-ai-base/index.ts

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,43 @@ export const embedParams = (
261261
return { ...baseParams, ...(extra ?? {}) };
262262
};
263263

264+
export const createSpeechParams = (
265+
exclude: string[],
266+
defaultValues?: Record<string, string>,
267+
extra?: ProviderConfig
268+
): ProviderConfig => {
269+
const baseParams: ProviderConfig = {
270+
model: {
271+
param: 'model',
272+
required: true,
273+
default: 'tts-1',
274+
},
275+
input: {
276+
param: 'input',
277+
required: true,
278+
},
279+
voice: {
280+
param: 'voice',
281+
required: true,
282+
default: 'alloy',
283+
},
284+
response_format: {
285+
param: 'response_format',
286+
required: false,
287+
default: 'mp3',
288+
},
289+
speed: {
290+
param: 'speed',
291+
required: false,
292+
default: 1,
293+
},
294+
};
295+
296+
excludeObjectKeys(exclude, baseParams);
297+
298+
return { ...baseParams, ...(extra ?? {}) };
299+
};
300+
264301
export const createModelResponseParams = (
265302
exclude: string[],
266303
defaultValues: Record<string, string> = {},
@@ -338,6 +375,39 @@ const CompleteResponseTransformer = <
338375
return transformer;
339376
};
340377

378+
const CreateSpeechResponseTransformer = <T extends Response | ErrorResponse>(
379+
provider: string,
380+
customTransformer?: CustomTransformer<Response | ErrorResponse, T>
381+
) => {
382+
const transformer: (
383+
response: T | ErrorResponse,
384+
responseStatus: number
385+
) => T | ErrorResponse = (response, responseStatus) => {
386+
if (responseStatus !== 200 && 'error' in response) {
387+
const errorResponse = OpenAIErrorResponseTransform(
388+
response,
389+
provider ?? OPEN_AI
390+
);
391+
if (customTransformer) {
392+
return customTransformer(errorResponse, true);
393+
}
394+
}
395+
396+
if (customTransformer) {
397+
return customTransformer(response as T);
398+
}
399+
400+
Object.defineProperty(response, 'provider', {
401+
value: provider,
402+
enumerable: true,
403+
});
404+
405+
return response;
406+
};
407+
408+
return transformer;
409+
};
410+
341411
const ChatCompleteResponseTransformer = <
342412
T extends OpenAIChatCompleteResponse | ErrorResponse,
343413
>(
@@ -528,6 +598,7 @@ export const responseTransformers = <
528598
T extends EmbedResponse | ErrorResponse,
529599
U extends OpenAICompleteResponse | ErrorResponse,
530600
V extends OpenAIChatCompleteResponse | ErrorResponse,
601+
W extends Response | ErrorResponse,
531602
>(
532603
provider: string,
533604
options: {
@@ -538,15 +609,17 @@ export const responseTransformers = <
538609
chatComplete?:
539610
| boolean
540611
| CustomTransformer<OpenAIChatCompleteResponse | ErrorResponse, V>;
612+
createSpeech?: boolean | CustomTransformer<Response | ErrorResponse, W>;
541613
}
542614
) => {
543615
const transformers: Record<
544-
'complete' | 'chatComplete' | 'embed',
616+
'complete' | 'chatComplete' | 'embed' | 'createSpeech',
545617
Function | null
546618
> = {
547619
complete: null,
548620
chatComplete: null,
549621
embed: null,
622+
createSpeech: null,
550623
};
551624

552625
if (options.embed) {
@@ -572,6 +645,14 @@ export const responseTransformers = <
572645
);
573646
}
574647

648+
if (options.createSpeech) {
649+
transformers.createSpeech = CreateSpeechResponseTransformer<W>(
650+
provider,
651+
typeof options.createSpeech === 'function'
652+
? options.createSpeech
653+
: undefined
654+
);
655+
}
575656
return transformers;
576657
};
577658

0 commit comments

Comments
 (0)