Skip to content

Commit 0a34704

Browse files
authored
Merge pull request #1053 from Portkey-AI/feat/passthough-oai-embed-without-opening-body
feat: passthrough oai embed response without opening body
2 parents 48f0a89 + 3e14edb commit 0a34704

5 files changed

Lines changed: 42 additions & 13 deletions

File tree

src/handlers/handlerUtils.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ export async function tryPost(
344344

345345
let mappedResponse: Response;
346346
let retryCount: number | undefined;
347-
let originalResponseJson: Record<string, any> | undefined;
347+
let originalResponseJson: Record<string, any> | null | undefined;
348348

349349
let cacheKey: string | undefined;
350350
let { cacheMode, cacheMaxAge, cacheStatus } = getCacheOptions(
@@ -355,6 +355,12 @@ export async function tryPost(
355355
const requestOptions = c.get('requestOptions') ?? [];
356356
let transformedRequestBody: ReadableStream | FormData | Params = {};
357357
let fetchOptions: RequestInit = {};
358+
const areSyncHooksAvailable = Boolean(
359+
hooksManager.getHooksToExecute(hookSpan, [
360+
'syncBeforeRequestHook',
361+
'syncAfterRequestHook',
362+
]).length
363+
);
358364

359365
// before_request_hooks handler
360366
({
@@ -471,7 +477,8 @@ export async function tryPost(
471477
isCacheHit,
472478
params,
473479
strictOpenAiCompliance,
474-
c.req.url
480+
c.req.url,
481+
areSyncHooksAvailable
475482
));
476483
}
477484

@@ -1247,7 +1254,7 @@ export async function recursiveAfterRequestHookHandler(
12471254
mappedResponse: Response;
12481255
retryCount: number;
12491256
createdAt: Date;
1250-
originalResponseJson?: Record<string, any>;
1257+
originalResponseJson?: Record<string, any> | null;
12511258
}> {
12521259
let response, retryCount, createdAt, executionTime, retrySkipped;
12531260
const requestTimeout =
@@ -1287,6 +1294,17 @@ export async function recursiveAfterRequestHookHandler(
12871294
retry?.useRetryAfterHeader || false
12881295
));
12891296

1297+
const hooksManager = c.get('hooksManager') as HooksManager;
1298+
const hookSpan = hooksManager.getSpan(hookSpanId) as HookSpan;
1299+
// Check if sync hooks are available
1300+
// This will be used to determine if we need to parse the response body or simply passthrough the response as is
1301+
const areSyncHooksAvailable = Boolean(
1302+
hooksManager.getHooksToExecute(hookSpan, [
1303+
'syncBeforeRequestHook',
1304+
'syncAfterRequestHook',
1305+
]).length
1306+
);
1307+
12901308
const {
12911309
response: mappedResponse,
12921310
responseJson: mappedResponseJson,
@@ -1300,7 +1318,8 @@ export async function recursiveAfterRequestHookHandler(
13001318
false,
13011319
gatewayParams,
13021320
strictOpenAiCompliance,
1303-
c.req.url
1321+
c.req.url,
1322+
areSyncHooksAvailable
13041323
);
13051324

13061325
const arhResponse = await afterRequestHookHandler(

src/handlers/responseHandlers.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ export async function responseHandler(
4242
isCacheHit: boolean = false,
4343
gatewayRequest: Params,
4444
strictOpenAiCompliance: boolean,
45-
gatewayRequestUrl: string
45+
gatewayRequestUrl: string,
46+
areSyncHooksAvailable: boolean
4647
): Promise<{
4748
response: Response;
4849
responseJson: Record<string, any> | null;
49-
originalResponseJson?: Record<string, any>;
50+
originalResponseJson?: Record<string, any> | null;
5051
}> {
5152
let responseTransformerFunction: Function | undefined;
5253
const responseContentType = response.headers?.get('content-type');
@@ -160,7 +161,8 @@ export async function responseHandler(
160161
responseTransformerFunction,
161162
strictOpenAiCompliance,
162163
gatewayRequestUrl,
163-
gatewayRequest
164+
gatewayRequest,
165+
areSyncHooksAvailable
164166
);
165167

166168
return {

src/handlers/streamHandler.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -226,11 +226,12 @@ export async function handleNonStreamingMode(
226226
responseTransformer: Function | undefined,
227227
strictOpenAiCompliance: boolean,
228228
gatewayRequestUrl: string,
229-
gatewayRequest: Params
229+
gatewayRequest: Params,
230+
areSyncHooksAvailable: boolean
230231
): Promise<{
231232
response: Response;
232-
json: Record<string, any>;
233-
originalResponseBodyJson?: Record<string, any>;
233+
json: Record<string, any> | null;
234+
originalResponseBodyJson?: Record<string, any> | null;
234235
}> {
235236
// 408 is thrown whenever a request takes more than request_timeout to respond.
236237
// In that case, response thrown by gateway is already in OpenAI format.
@@ -244,7 +245,9 @@ export async function handleNonStreamingMode(
244245
return { response, json: await response.clone().json() };
245246
}
246247

247-
const originalResponseBodyJson: Record<string, any> = await response.json();
248+
const isJsonParsingRequired = responseTransformer || areSyncHooksAvailable;
249+
const originalResponseBodyJson: Record<string, any> | null =
250+
isJsonParsingRequired ? await response.json() : null;
248251
let responseBodyJson = originalResponseBodyJson;
249252
if (responseTransformer) {
250253
responseBodyJson = responseTransformer(
@@ -255,6 +258,12 @@ export async function handleNonStreamingMode(
255258
gatewayRequestUrl,
256259
gatewayRequest
257260
);
261+
} else if (!areSyncHooksAvailable) {
262+
return {
263+
response: new Response(response.body, response),
264+
json: null,
265+
originalResponseBodyJson,
266+
};
258267
}
259268

260269
return {

src/middlewares/hooks/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ export class HooksManager {
465465
.join(', ');
466466
}
467467

468-
private getHooksToExecute(
468+
public getHooksToExecute(
469469
span: HookSpan,
470470
eventTypePresets: string[]
471471
): HookObject[] {

src/providers/openai/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ const OpenAIConfig: ProviderConfigs = {
7676
// 'stream-complete': OpenAICompleteResponseTransform,
7777
chatComplete: OpenAIChatCompleteResponseTransform,
7878
// 'stream-chatComplete': OpenAIChatCompleteResponseTransform,
79-
embed: OpenAIEmbedResponseTransform,
8079
imageGenerate: OpenAIImageGenerateResponseTransform,
8180
createSpeech: OpenAICreateSpeechResponseTransform,
8281
createTranscription: OpenAICreateTranscriptionResponseTransform,

0 commit comments

Comments
 (0)