Skip to content

Commit 3c75441

Browse files
authored
Merge pull request #678 from narengogi/feat/converse-api
Feature: Bedrock converse integration
2 parents 6e2d696 + 862ae96 commit 3c75441

File tree

9 files changed

+835
-1233
lines changed

9 files changed

+835
-1233
lines changed

src/globals.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,52 @@ export const MULTIPART_FORM_DATA_ENDPOINTS: endpointStrings[] = [
139139
'createTranscription',
140140
'createTranslation',
141141
];
142+
143+
export const fileExtensionMimeTypeMap = {
144+
mp4: 'video/mp4',
145+
jpeg: 'image/jpeg',
146+
jpg: 'image/jpeg',
147+
png: 'image/png',
148+
bmp: 'image/bmp',
149+
tiff: 'image/tiff',
150+
webp: 'image/webp',
151+
pdf: 'application/pdf',
152+
csv: 'text/csv',
153+
doc: 'application/msword',
154+
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
155+
xls: 'application/vnd.ms-excel',
156+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
157+
html: 'text/html',
158+
md: 'text/markdown',
159+
mp3: 'audio/mp3',
160+
wav: 'audio/wav',
161+
txt: 'text/plain',
162+
mov: 'video/mov',
163+
mpeg: 'video/mpeg',
164+
mpg: 'video/mpg',
165+
avi: 'video/avi',
166+
wmv: 'video/wmv',
167+
mpegps: 'video/mpegps',
168+
flv: 'video/flv',
169+
};
170+
171+
export const imagesMimeTypes = [
172+
fileExtensionMimeTypeMap.jpeg,
173+
fileExtensionMimeTypeMap.jpg,
174+
fileExtensionMimeTypeMap.png,
175+
fileExtensionMimeTypeMap.bmp,
176+
fileExtensionMimeTypeMap.tiff,
177+
fileExtensionMimeTypeMap.webp,
178+
];
179+
180+
export const documentMimeTypes = [
181+
fileExtensionMimeTypeMap.pdf,
182+
fileExtensionMimeTypeMap.csv,
183+
fileExtensionMimeTypeMap.doc,
184+
fileExtensionMimeTypeMap.docx,
185+
fileExtensionMimeTypeMap.xls,
186+
fileExtensionMimeTypeMap.xlsx,
187+
fileExtensionMimeTypeMap.html,
188+
fileExtensionMimeTypeMap.md,
189+
fileExtensionMimeTypeMap.txt,
190+
];

src/handlers/streamHandler.ts

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ function getPayloadFromAWSChunk(chunk: Uint8Array): string {
3333

3434
const payloadLength = chunkLength - headersEnd - 4; // Subtracting 4 for the message crc
3535
const payload = chunk.slice(headersEnd, headersEnd + payloadLength);
36-
return decoder.decode(payload);
36+
const decodedJson = JSON.parse(decoder.decode(payload));
37+
return decodedJson.bytes
38+
? Buffer.from(decodedJson.bytes, 'base64').toString()
39+
: JSON.stringify(decodedJson);
3740
}
3841

3942
function concatenateUint8Arrays(a: Uint8Array, b: Uint8Array): Uint8Array {
@@ -60,10 +63,7 @@ export async function* readAWSStream(
6063
const data = buffer.subarray(0, expectedLength);
6164
buffer = buffer.subarray(expectedLength);
6265
expectedLength = readUInt32BE(buffer, 0);
63-
const payload = Buffer.from(
64-
JSON.parse(getPayloadFromAWSChunk(data)).bytes,
65-
'base64'
66-
).toString();
66+
const payload = getPayloadFromAWSChunk(data);
6767
if (transformFunction) {
6868
const transformedChunk = transformFunction(
6969
payload,
@@ -96,11 +96,7 @@ export async function* readAWSStream(
9696
buffer = buffer.subarray(expectedLength);
9797

9898
expectedLength = readUInt32BE(buffer, 0);
99-
const payload = Buffer.from(
100-
JSON.parse(getPayloadFromAWSChunk(data)).bytes,
101-
'base64'
102-
).toString();
103-
99+
const payload = getPayloadFromAWSChunk(data);
104100
if (transformFunction) {
105101
const transformedChunk = transformFunction(
106102
payload,

src/providers/bedrock/api.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { GatewayError } from '../../errors/GatewayError';
12
import { ProviderAPIConfig } from '../types';
3+
import { bedrockInvokeModels } from './constants';
24
import { generateAWSHeaders } from './utils';
35

46
const BedrockAPIConfig: ProviderAPIConfig = {
@@ -27,12 +29,20 @@ const BedrockAPIConfig: ProviderAPIConfig = {
2729
},
2830
getEndpoint: ({ fn, gatewayRequestBody }) => {
2931
const { model, stream } = gatewayRequestBody;
32+
if (!model) throw new GatewayError('Model is required');
3033
let mappedFn = fn;
3134
if (stream) {
3235
mappedFn = `stream-${fn}`;
3336
}
34-
const endpoint = `/model/${model}/invoke`;
35-
const streamEndpoint = `/model/${model}/invoke-with-response-stream`;
37+
let endpoint = `/model/${model}/invoke`;
38+
let streamEndpoint = `/model/${model}/invoke-with-response-stream`;
39+
if (
40+
(mappedFn === 'chatComplete' || mappedFn === 'stream-chatComplete') &&
41+
!bedrockInvokeModels.includes(model)
42+
) {
43+
endpoint = `/model/${model}/converse`;
44+
streamEndpoint = `/model/${model}/converse-stream`;
45+
}
3646
switch (mappedFn) {
3747
case 'chatComplete': {
3848
return endpoint;

0 commit comments

Comments
 (0)