-
Notifications
You must be signed in to change notification settings - Fork 111
Expand file tree
/
Copy pathprovider-response-handler.ts
More file actions
82 lines (76 loc) · 2.64 KB
/
provider-response-handler.ts
File metadata and controls
82 lines (76 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import {
handleNonStreamingMode,
handleStreamingMode
} from './response-handler-utils';
import Providers from '@/dev/providers';
import { dlog } from '../dlog';
import type { ModelParams } from 'types/providers';
/**
* Handles various types of responses based on the specified parameters
* and returns a mapped response in OpenAI format
* @param {Response} response - The HTTP response recieved from LLM.
* @param {boolean} streamingMode - Indicates whether streaming mode is enabled.
* @param {string} provider - The provider name string.
* @param {string | undefined} responseTransformer - The response transform name given in provider/index.ts. Usually is LLM endpoint. For example GoogleChatCompleteResponseTransform.
* @param {string} requestURL - The URL of the original LLM request.
* @returns {Promise<any>} - A promise that resolves to the processed response.
*/
export function handleProviderResponse({
response,
streamingMode,
provider,
responseTransformer,
requestURL,
modelParams
}: {
response: Response;
streamingMode: boolean;
provider: string;
responseTransformer: string | undefined;
requestURL: string;
modelParams: ModelParams;
}): Promise<any> {
try {
let responseTransformerFunction: Function | undefined;
// const responseContentType = response.headers?.get("content-type");
const providerConfig = Providers[provider];
// Get all response transformers of the provider
let providerTransformers = Providers[provider]?.responseTransforms;
if (providerConfig.getConfig) {
providerTransformers =
providerConfig.getConfig(modelParams).responseTransforms;
}
// Extract the relevant response transformer
if (responseTransformer && streamingMode && response.status === 200) {
responseTransformerFunction =
providerTransformers?.[`stream-${responseTransformer}`];
} else if (responseTransformer) {
responseTransformerFunction =
providerTransformers?.[responseTransformer];
}
dlog(
'transforming provider response using',
responseTransformerFunction
? `${provider}${responseTransformer}ResponseTransform`
: 'No transformer found'
);
// STREAMING: Convert the stream into OpenAI Stream.
if (streamingMode && response.status === 200) {
return handleStreamingMode(
response,
provider,
responseTransformerFunction,
requestURL
);
}
// NON-STREAMING: Apply the appropriate response transformer to the response.
return handleNonStreamingMode({
response,
responseTransformer: responseTransformerFunction
});
} catch (error) {
// Handle the error here, log it, or throw a new error
console.error('An error occurred in responseHandler:', error);
throw error;
}
}