Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions src/handlers/handlerUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ export async function tryPost(

let mappedResponse: Response;
let retryCount: number | undefined;
let originalResponseJson: Record<string, any> | undefined;
let originalResponseJson: Record<string, any> | null | undefined;

let cacheKey: string | undefined;
let { cacheMode, cacheMaxAge, cacheStatus } = getCacheOptions(
Expand All @@ -355,6 +355,12 @@ export async function tryPost(
const requestOptions = c.get('requestOptions') ?? [];
let transformedRequestBody: ReadableStream | FormData | Params = {};
let fetchOptions: RequestInit = {};
const areSyncHooksAvailable = Boolean(
hooksManager.getHooksToExecute(hookSpan, [
'syncBeforeRequestHook',
'syncAfterRequestHook',
]).length
);

// before_request_hooks handler
({
Expand Down Expand Up @@ -471,7 +477,8 @@ export async function tryPost(
isCacheHit,
params,
strictOpenAiCompliance,
c.req.url
c.req.url,
areSyncHooksAvailable
));
}

Expand Down Expand Up @@ -1247,7 +1254,7 @@ export async function recursiveAfterRequestHookHandler(
mappedResponse: Response;
retryCount: number;
createdAt: Date;
originalResponseJson?: Record<string, any>;
originalResponseJson?: Record<string, any> | null;
}> {
let response, retryCount, createdAt, executionTime, retrySkipped;
const requestTimeout =
Expand Down Expand Up @@ -1287,6 +1294,17 @@ export async function recursiveAfterRequestHookHandler(
retry?.useRetryAfterHeader || false
));

const hooksManager = c.get('hooksManager') as HooksManager;
const hookSpan = hooksManager.getSpan(hookSpanId) as HookSpan;
// Check if sync hooks are available
// This will be used to determine if we need to parse the response body or simply passthrough the response as is
const areSyncHooksAvailable = Boolean(
hooksManager.getHooksToExecute(hookSpan, [
'syncBeforeRequestHook',
'syncAfterRequestHook',
]).length
);

const {
response: mappedResponse,
responseJson: mappedResponseJson,
Expand All @@ -1300,7 +1318,8 @@ export async function recursiveAfterRequestHookHandler(
false,
gatewayParams,
strictOpenAiCompliance,
c.req.url
c.req.url,
areSyncHooksAvailable
);

const arhResponse = await afterRequestHookHandler(
Expand Down
8 changes: 5 additions & 3 deletions src/handlers/responseHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,12 @@ export async function responseHandler(
isCacheHit: boolean = false,
gatewayRequest: Params,
strictOpenAiCompliance: boolean,
gatewayRequestUrl: string
gatewayRequestUrl: string,
areSyncHooksAvailable: boolean
): Promise<{
response: Response;
responseJson: Record<string, any> | null;
originalResponseJson?: Record<string, any>;
originalResponseJson?: Record<string, any> | null;
}> {
let responseTransformerFunction: Function | undefined;
const responseContentType = response.headers?.get('content-type');
Expand Down Expand Up @@ -160,7 +161,8 @@ export async function responseHandler(
responseTransformerFunction,
strictOpenAiCompliance,
gatewayRequestUrl,
gatewayRequest
gatewayRequest,
areSyncHooksAvailable
);

return {
Expand Down
17 changes: 13 additions & 4 deletions src/handlers/streamHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,11 +226,12 @@ export async function handleNonStreamingMode(
responseTransformer: Function | undefined,
strictOpenAiCompliance: boolean,
gatewayRequestUrl: string,
gatewayRequest: Params
gatewayRequest: Params,
areSyncHooksAvailable: boolean
): Promise<{
response: Response;
json: Record<string, any>;
originalResponseBodyJson?: Record<string, any>;
json: Record<string, any> | null;
originalResponseBodyJson?: Record<string, any> | null;
}> {
// 408 is thrown whenever a request takes more than request_timeout to respond.
// In that case, response thrown by gateway is already in OpenAI format.
Expand All @@ -244,7 +245,9 @@ export async function handleNonStreamingMode(
return { response, json: await response.clone().json() };
}

const originalResponseBodyJson: Record<string, any> = await response.json();
const isJsonParsingRequired = responseTransformer || areSyncHooksAvailable;
const originalResponseBodyJson: Record<string, any> | null =
isJsonParsingRequired ? await response.json() : null;
let responseBodyJson = originalResponseBodyJson;
if (responseTransformer) {
responseBodyJson = responseTransformer(
Expand All @@ -255,6 +258,12 @@ export async function handleNonStreamingMode(
gatewayRequestUrl,
gatewayRequest
);
} else if (!areSyncHooksAvailable) {
return {
response: new Response(response.body, response),
json: null,
originalResponseBodyJson,
};
}

return {
Expand Down
2 changes: 1 addition & 1 deletion src/middlewares/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ export class HooksManager {
.join(', ');
}

private getHooksToExecute(
public getHooksToExecute(
span: HookSpan,
eventTypePresets: string[]
): HookObject[] {
Expand Down
1 change: 0 additions & 1 deletion src/providers/openai/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ const OpenAIConfig: ProviderConfigs = {
// 'stream-complete': OpenAICompleteResponseTransform,
chatComplete: OpenAIChatCompleteResponseTransform,
// 'stream-chatComplete': OpenAIChatCompleteResponseTransform,
embed: OpenAIEmbedResponseTransform,
imageGenerate: OpenAIImageGenerateResponseTransform,
createSpeech: OpenAICreateSpeechResponseTransform,
createTranscription: OpenAICreateTranscriptionResponseTransform,
Expand Down