mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-19 01:40:15 +01:00
226 lines
5.9 KiB
TypeScript
226 lines
5.9 KiB
TypeScript
|
|
import type { TConversation, TPreset } from './schemas';
|
||
|
|
import type { TEndpointOption } from './types';
|
||
|
|
import {
|
||
|
|
EModelEndpoint,
|
||
|
|
openAISchema,
|
||
|
|
googleSchema,
|
||
|
|
bingAISchema,
|
||
|
|
anthropicSchema,
|
||
|
|
chatGPTBrowserSchema,
|
||
|
|
gptPluginsSchema,
|
||
|
|
assistantSchema,
|
||
|
|
compactOpenAISchema,
|
||
|
|
compactGoogleSchema,
|
||
|
|
compactAnthropicSchema,
|
||
|
|
compactChatGPTSchema,
|
||
|
|
compactPluginsSchema,
|
||
|
|
} from './schemas';
|
||
|
|
import { alternateName } from './config';
|
||
|
|
|
||
|
|
type EndpointSchema =
|
||
|
|
| typeof openAISchema
|
||
|
|
| typeof googleSchema
|
||
|
|
| typeof bingAISchema
|
||
|
|
| typeof anthropicSchema
|
||
|
|
| typeof chatGPTBrowserSchema
|
||
|
|
| typeof gptPluginsSchema
|
||
|
|
| typeof assistantSchema;
|
||
|
|
|
||
|
|
const endpointSchemas: Record<EModelEndpoint, EndpointSchema> = {
|
||
|
|
[EModelEndpoint.openAI]: openAISchema,
|
||
|
|
[EModelEndpoint.azureOpenAI]: openAISchema,
|
||
|
|
[EModelEndpoint.custom]: openAISchema,
|
||
|
|
[EModelEndpoint.google]: googleSchema,
|
||
|
|
[EModelEndpoint.bingAI]: bingAISchema,
|
||
|
|
[EModelEndpoint.anthropic]: anthropicSchema,
|
||
|
|
[EModelEndpoint.chatGPTBrowser]: chatGPTBrowserSchema,
|
||
|
|
[EModelEndpoint.gptPlugins]: gptPluginsSchema,
|
||
|
|
[EModelEndpoint.assistant]: assistantSchema,
|
||
|
|
};
|
||
|
|
|
||
|
|
// const schemaCreators: Record<EModelEndpoint, (customSchema: DefaultSchemaValues) => EndpointSchema> = {
|
||
|
|
// [EModelEndpoint.google]: createGoogleSchema,
|
||
|
|
// };
|
||
|
|
|
||
|
|
export function getFirstDefinedValue(possibleValues: string[]) {
|
||
|
|
let returnValue;
|
||
|
|
for (const value of possibleValues) {
|
||
|
|
if (value) {
|
||
|
|
returnValue = value;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return returnValue;
|
||
|
|
}
|
||
|
|
|
||
|
|
export type TPossibleValues = {
|
||
|
|
models: string[];
|
||
|
|
secondaryModels?: string[];
|
||
|
|
};
|
||
|
|
|
||
|
|
export const parseConvo = ({
|
||
|
|
endpoint,
|
||
|
|
endpointType,
|
||
|
|
conversation,
|
||
|
|
possibleValues,
|
||
|
|
}: {
|
||
|
|
endpoint: EModelEndpoint;
|
||
|
|
endpointType?: EModelEndpoint;
|
||
|
|
conversation: Partial<TConversation | TPreset>;
|
||
|
|
possibleValues?: TPossibleValues;
|
||
|
|
// TODO: POC for default schema
|
||
|
|
// defaultSchema?: Partial<EndpointSchema>,
|
||
|
|
}) => {
|
||
|
|
let schema = endpointSchemas[endpoint];
|
||
|
|
|
||
|
|
if (!schema && !endpointType) {
|
||
|
|
throw new Error(`Unknown endpoint: ${endpoint}`);
|
||
|
|
} else if (!schema && endpointType) {
|
||
|
|
schema = endpointSchemas[endpointType];
|
||
|
|
}
|
||
|
|
|
||
|
|
// if (defaultSchema && schemaCreators[endpoint]) {
|
||
|
|
// schema = schemaCreators[endpoint](defaultSchema);
|
||
|
|
// }
|
||
|
|
|
||
|
|
const convo = schema.parse(conversation) as TConversation;
|
||
|
|
const { models, secondaryModels } = possibleValues ?? {};
|
||
|
|
|
||
|
|
if (models && convo) {
|
||
|
|
convo.model = getFirstDefinedValue(models) ?? convo.model;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (secondaryModels && convo.agentOptions) {
|
||
|
|
convo.agentOptions.model = getFirstDefinedValue(secondaryModels) ?? convo.agentOptions.model;
|
||
|
|
}
|
||
|
|
|
||
|
|
return convo;
|
||
|
|
};
|
||
|
|
|
||
|
|
export const getResponseSender = (endpointOption: TEndpointOption): string => {
|
||
|
|
const { model, endpoint, endpointType, modelDisplayLabel, chatGptLabel, modelLabel, jailbreak } =
|
||
|
|
endpointOption;
|
||
|
|
|
||
|
|
if (
|
||
|
|
[
|
||
|
|
EModelEndpoint.openAI,
|
||
|
|
EModelEndpoint.azureOpenAI,
|
||
|
|
EModelEndpoint.gptPlugins,
|
||
|
|
EModelEndpoint.chatGPTBrowser,
|
||
|
|
].includes(endpoint)
|
||
|
|
) {
|
||
|
|
if (chatGptLabel) {
|
||
|
|
return chatGptLabel;
|
||
|
|
} else if (model && model.includes('gpt-3')) {
|
||
|
|
return 'GPT-3.5';
|
||
|
|
} else if (model && model.includes('gpt-4')) {
|
||
|
|
return 'GPT-4';
|
||
|
|
} else if (model && model.includes('mistral')) {
|
||
|
|
return 'Mistral';
|
||
|
|
}
|
||
|
|
return alternateName[endpoint] ?? 'ChatGPT';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (endpoint === EModelEndpoint.bingAI) {
|
||
|
|
return jailbreak ? 'Sydney' : 'BingAI';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (endpoint === EModelEndpoint.anthropic) {
|
||
|
|
return modelLabel ?? 'Claude';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (endpoint === EModelEndpoint.google) {
|
||
|
|
if (modelLabel) {
|
||
|
|
return modelLabel;
|
||
|
|
} else if (model && model.includes('gemini')) {
|
||
|
|
return 'Gemini';
|
||
|
|
} else if (model && model.includes('code')) {
|
||
|
|
return 'Codey';
|
||
|
|
}
|
||
|
|
|
||
|
|
return 'PaLM2';
|
||
|
|
}
|
||
|
|
|
||
|
|
if (endpoint === EModelEndpoint.custom || endpointType === EModelEndpoint.custom) {
|
||
|
|
if (modelLabel) {
|
||
|
|
return modelLabel;
|
||
|
|
} else if (chatGptLabel) {
|
||
|
|
return chatGptLabel;
|
||
|
|
} else if (model && model.includes('mistral')) {
|
||
|
|
return 'Mistral';
|
||
|
|
} else if (model && model.includes('gpt-3')) {
|
||
|
|
return 'GPT-3.5';
|
||
|
|
} else if (model && model.includes('gpt-4')) {
|
||
|
|
return 'GPT-4';
|
||
|
|
} else if (modelDisplayLabel) {
|
||
|
|
return modelDisplayLabel;
|
||
|
|
}
|
||
|
|
|
||
|
|
return 'AI';
|
||
|
|
}
|
||
|
|
|
||
|
|
return '';
|
||
|
|
};
|
||
|
|
|
||
|
|
type CompactEndpointSchema =
|
||
|
|
| typeof compactOpenAISchema
|
||
|
|
| typeof assistantSchema
|
||
|
|
| typeof compactGoogleSchema
|
||
|
|
| typeof bingAISchema
|
||
|
|
| typeof compactAnthropicSchema
|
||
|
|
| typeof compactChatGPTSchema
|
||
|
|
| typeof compactPluginsSchema;
|
||
|
|
|
||
|
|
const compactEndpointSchemas: Record<string, CompactEndpointSchema> = {
|
||
|
|
openAI: compactOpenAISchema,
|
||
|
|
azureOpenAI: compactOpenAISchema,
|
||
|
|
custom: compactOpenAISchema,
|
||
|
|
assistant: assistantSchema,
|
||
|
|
google: compactGoogleSchema,
|
||
|
|
/* BingAI needs all fields */
|
||
|
|
bingAI: bingAISchema,
|
||
|
|
anthropic: compactAnthropicSchema,
|
||
|
|
chatGPTBrowser: compactChatGPTSchema,
|
||
|
|
gptPlugins: compactPluginsSchema,
|
||
|
|
};
|
||
|
|
|
||
|
|
export const parseCompactConvo = ({
|
||
|
|
endpoint,
|
||
|
|
endpointType,
|
||
|
|
conversation,
|
||
|
|
possibleValues,
|
||
|
|
}: {
|
||
|
|
endpoint?: EModelEndpoint;
|
||
|
|
endpointType?: EModelEndpoint;
|
||
|
|
conversation: Partial<TConversation | TPreset>;
|
||
|
|
possibleValues?: TPossibleValues;
|
||
|
|
// TODO: POC for default schema
|
||
|
|
// defaultSchema?: Partial<EndpointSchema>,
|
||
|
|
}) => {
|
||
|
|
if (!endpoint) {
|
||
|
|
throw new Error(`undefined endpoint: ${endpoint}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
let schema = compactEndpointSchemas[endpoint];
|
||
|
|
|
||
|
|
if (!schema && !endpointType) {
|
||
|
|
throw new Error(`Unknown endpoint: ${endpoint}`);
|
||
|
|
} else if (!schema && endpointType) {
|
||
|
|
schema = compactEndpointSchemas[endpointType];
|
||
|
|
}
|
||
|
|
|
||
|
|
const convo = schema.parse(conversation) as TConversation;
|
||
|
|
// const { models, secondaryModels } = possibleValues ?? {};
|
||
|
|
const { models } = possibleValues ?? {};
|
||
|
|
|
||
|
|
if (models && convo) {
|
||
|
|
convo.model = getFirstDefinedValue(models) ?? convo.model;
|
||
|
|
}
|
||
|
|
|
||
|
|
// if (secondaryModels && convo.agentOptions) {
|
||
|
|
// convo.agentOptionmodel = getFirstDefinedValue(secondaryModels) ?? convo.agentOptionmodel;
|
||
|
|
// }
|
||
|
|
|
||
|
|
return convo;
|
||
|
|
};
|