|
const { z } = require('zod'); |
|
|
|
const EModelEndpoint = { |
|
azureOpenAI: 'azureOpenAI', |
|
openAI: 'openAI', |
|
bingAI: 'bingAI', |
|
chatGPTBrowser: 'chatGPTBrowser', |
|
google: 'google', |
|
gptPlugins: 'gptPlugins', |
|
anthropic: 'anthropic', |
|
}; |
|
|
|
const eModelEndpointSchema = z.nativeEnum(EModelEndpoint); |
|
|
|
const tPluginAuthConfigSchema = z.object({ |
|
authField: z.string(), |
|
label: z.string(), |
|
description: z.string(), |
|
}); |
|
|
|
const tPluginSchema = z.object({ |
|
name: z.string(), |
|
pluginKey: z.string(), |
|
description: z.string(), |
|
icon: z.string(), |
|
authConfig: z.array(tPluginAuthConfigSchema), |
|
authenticated: z.boolean().optional(), |
|
isButton: z.boolean().optional(), |
|
}); |
|
|
|
const tExampleSchema = z.object({ |
|
input: z.object({ |
|
content: z.string(), |
|
}), |
|
output: z.object({ |
|
content: z.string(), |
|
}), |
|
}); |
|
|
|
const tAgentOptionsSchema = z.object({ |
|
agent: z.string(), |
|
skipCompletion: z.boolean(), |
|
model: z.string(), |
|
temperature: z.number(), |
|
}); |
|
|
|
const tConversationSchema = z.object({ |
|
conversationId: z.string().nullable(), |
|
title: z.string().nullable().or(z.literal('New Chat')).default('New Chat'), |
|
user: z.string().optional(), |
|
endpoint: eModelEndpointSchema.nullable(), |
|
suggestions: z.array(z.string()).optional(), |
|
messages: z.array(z.string()).optional(), |
|
tools: z.array(tPluginSchema).optional(), |
|
createdAt: z.string(), |
|
updatedAt: z.string(), |
|
systemMessage: z.string().nullable().optional(), |
|
modelLabel: z.string().nullable().optional(), |
|
examples: z.array(tExampleSchema).optional(), |
|
chatGptLabel: z.string().nullable().optional(), |
|
userLabel: z.string().optional(), |
|
model: z.string().nullable().optional(), |
|
promptPrefix: z.string().nullable().optional(), |
|
temperature: z.number().optional(), |
|
topP: z.number().optional(), |
|
topK: z.number().optional(), |
|
context: z.string().nullable().optional(), |
|
top_p: z.number().optional(), |
|
frequency_penalty: z.number().optional(), |
|
presence_penalty: z.number().optional(), |
|
jailbreak: z.boolean().optional(), |
|
jailbreakConversationId: z.string().nullable().optional(), |
|
conversationSignature: z.string().nullable().optional(), |
|
parentMessageId: z.string().optional(), |
|
clientId: z.string().nullable().optional(), |
|
invocationId: z.number().nullable().optional(), |
|
toneStyle: z.string().nullable().optional(), |
|
maxOutputTokens: z.number().optional(), |
|
agentOptions: tAgentOptionsSchema.nullable().optional(), |
|
}); |
|
|
|
const openAISchema = tConversationSchema |
|
.pick({ |
|
model: true, |
|
chatGptLabel: true, |
|
promptPrefix: true, |
|
temperature: true, |
|
top_p: true, |
|
presence_penalty: true, |
|
frequency_penalty: true, |
|
}) |
|
.transform((obj) => ({ |
|
...obj, |
|
model: obj.model ?? 'gpt-3.5-turbo', |
|
chatGptLabel: obj.chatGptLabel ?? null, |
|
promptPrefix: obj.promptPrefix ?? null, |
|
temperature: obj.temperature ?? 1, |
|
top_p: obj.top_p ?? 1, |
|
presence_penalty: obj.presence_penalty ?? 0, |
|
frequency_penalty: obj.frequency_penalty ?? 0, |
|
})) |
|
.catch(() => ({ |
|
model: 'gpt-3.5-turbo', |
|
chatGptLabel: null, |
|
promptPrefix: null, |
|
temperature: 1, |
|
top_p: 1, |
|
presence_penalty: 0, |
|
frequency_penalty: 0, |
|
})); |
|
|
|
const googleSchema = tConversationSchema |
|
.pick({ |
|
model: true, |
|
modelLabel: true, |
|
promptPrefix: true, |
|
examples: true, |
|
temperature: true, |
|
maxOutputTokens: true, |
|
topP: true, |
|
topK: true, |
|
}) |
|
.transform((obj) => ({ |
|
...obj, |
|
model: obj.model ?? 'chat-bison', |
|
modelLabel: obj.modelLabel ?? null, |
|
promptPrefix: obj.promptPrefix ?? null, |
|
temperature: obj.temperature ?? 0.2, |
|
maxOutputTokens: obj.maxOutputTokens ?? 1024, |
|
topP: obj.topP ?? 0.95, |
|
topK: obj.topK ?? 40, |
|
})) |
|
.catch(() => ({ |
|
model: 'chat-bison', |
|
modelLabel: null, |
|
promptPrefix: null, |
|
temperature: 0.2, |
|
maxOutputTokens: 1024, |
|
topP: 0.95, |
|
topK: 40, |
|
})); |
|
|
|
const bingAISchema = tConversationSchema |
|
.pick({ |
|
jailbreak: true, |
|
systemMessage: true, |
|
context: true, |
|
toneStyle: true, |
|
jailbreakConversationId: true, |
|
conversationSignature: true, |
|
clientId: true, |
|
invocationId: true, |
|
}) |
|
.transform((obj) => ({ |
|
...obj, |
|
model: '', |
|
jailbreak: obj.jailbreak ?? false, |
|
systemMessage: obj.systemMessage ?? null, |
|
context: obj.context ?? null, |
|
toneStyle: obj.toneStyle ?? 'creative', |
|
jailbreakConversationId: obj.jailbreakConversationId ?? null, |
|
conversationSignature: obj.conversationSignature ?? null, |
|
clientId: obj.clientId ?? null, |
|
invocationId: obj.invocationId ?? 1, |
|
})) |
|
.catch(() => ({ |
|
model: '', |
|
jailbreak: false, |
|
systemMessage: null, |
|
context: null, |
|
toneStyle: 'creative', |
|
jailbreakConversationId: null, |
|
conversationSignature: null, |
|
clientId: null, |
|
invocationId: 1, |
|
})); |
|
|
|
const anthropicSchema = tConversationSchema |
|
.pick({ |
|
model: true, |
|
modelLabel: true, |
|
promptPrefix: true, |
|
temperature: true, |
|
maxOutputTokens: true, |
|
topP: true, |
|
topK: true, |
|
}) |
|
.transform((obj) => ({ |
|
...obj, |
|
model: obj.model ?? 'claude-1', |
|
modelLabel: obj.modelLabel ?? null, |
|
promptPrefix: obj.promptPrefix ?? null, |
|
temperature: obj.temperature ?? 1, |
|
maxOutputTokens: obj.maxOutputTokens ?? 4000, |
|
topP: obj.topP ?? 0.7, |
|
topK: obj.topK ?? 5, |
|
})) |
|
.catch(() => ({ |
|
model: 'claude-1', |
|
modelLabel: null, |
|
promptPrefix: null, |
|
temperature: 1, |
|
maxOutputTokens: 4000, |
|
topP: 0.7, |
|
topK: 5, |
|
})); |
|
|
|
const chatGPTBrowserSchema = tConversationSchema |
|
.pick({ |
|
model: true, |
|
}) |
|
.transform((obj) => ({ |
|
...obj, |
|
model: obj.model ?? 'text-davinci-002-render-sha', |
|
})) |
|
.catch(() => ({ |
|
model: 'text-davinci-002-render-sha', |
|
})); |
|
|
|
const gptPluginsSchema = tConversationSchema |
|
.pick({ |
|
model: true, |
|
chatGptLabel: true, |
|
promptPrefix: true, |
|
temperature: true, |
|
top_p: true, |
|
presence_penalty: true, |
|
frequency_penalty: true, |
|
tools: true, |
|
agentOptions: true, |
|
}) |
|
.transform((obj) => ({ |
|
...obj, |
|
model: obj.model ?? 'gpt-3.5-turbo', |
|
chatGptLabel: obj.chatGptLabel ?? null, |
|
promptPrefix: obj.promptPrefix ?? null, |
|
temperature: obj.temperature ?? 0.8, |
|
top_p: obj.top_p ?? 1, |
|
presence_penalty: obj.presence_penalty ?? 0, |
|
frequency_penalty: obj.frequency_penalty ?? 0, |
|
tools: obj.tools ?? [], |
|
agentOptions: obj.agentOptions ?? { |
|
agent: 'functions', |
|
skipCompletion: true, |
|
model: 'gpt-3.5-turbo', |
|
temperature: 0, |
|
}, |
|
})) |
|
.catch(() => ({ |
|
model: 'gpt-3.5-turbo', |
|
chatGptLabel: null, |
|
promptPrefix: null, |
|
temperature: 0.8, |
|
top_p: 1, |
|
presence_penalty: 0, |
|
frequency_penalty: 0, |
|
tools: [], |
|
agentOptions: { |
|
agent: 'functions', |
|
skipCompletion: true, |
|
model: 'gpt-3.5-turbo', |
|
temperature: 0, |
|
}, |
|
})); |
|
|
|
const endpointSchemas = { |
|
openAI: openAISchema, |
|
azureOpenAI: openAISchema, |
|
google: googleSchema, |
|
bingAI: bingAISchema, |
|
anthropic: anthropicSchema, |
|
chatGPTBrowser: chatGPTBrowserSchema, |
|
gptPlugins: gptPluginsSchema, |
|
}; |
|
|
|
function getFirstDefinedValue(possibleValues) { |
|
let returnValue; |
|
for (const value of possibleValues) { |
|
if (value) { |
|
returnValue = value; |
|
break; |
|
} |
|
} |
|
return returnValue; |
|
} |
|
|
|
const parseConvo = (endpoint, conversation, possibleValues) => { |
|
const schema = endpointSchemas[endpoint]; |
|
|
|
if (!schema) { |
|
throw new Error(`Unknown endpoint: ${endpoint}`); |
|
} |
|
|
|
const convo = schema.parse(conversation); |
|
|
|
if (possibleValues && convo) { |
|
convo.model = getFirstDefinedValue(possibleValues.model) ?? convo.model; |
|
} |
|
|
|
return convo; |
|
}; |
|
|
|
const getResponseSender = (endpointOption) => { |
|
const { endpoint, chatGptLabel, modelLabel, jailbreak } = endpointOption; |
|
|
|
if (['openAI', 'azureOpenAI', 'gptPlugins', 'chatGPTBrowser'].includes(endpoint)) { |
|
return chatGptLabel ?? 'ChatGPT'; |
|
} |
|
|
|
if (endpoint === 'bingAI') { |
|
return jailbreak ? 'Sydney' : 'BingAI'; |
|
} |
|
|
|
if (endpoint === 'anthropic') { |
|
return modelLabel ?? 'Anthropic'; |
|
} |
|
|
|
if (endpoint === 'google') { |
|
return modelLabel ?? 'PaLM2'; |
|
} |
|
|
|
return ''; |
|
}; |
|
|
|
module.exports = { |
|
parseConvo, |
|
getResponseSender, |
|
}; |
|
|