mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-09-22 06:00:56 +02:00

* wip: first pass for azure endpoint schema * refactor: azure config to return groupMap and modelConfigMap * wip: naming and schema changes * refactor(errorsToString): move to data-provider * feat: rename to azureGroups, add additional tests, tests all expected outcomes, return errors * feat(AppService): load Azure groups * refactor(azure): use imported types, write `mapModelToAzureConfig` * refactor: move `extractEnvVariable` to data-provider * refactor(validateAzureGroups): throw on duplicate groups or models; feat(mapModelToAzureConfig): throw if env vars not present, add tests * refactor(AppService): ensure each model is properly configured on startup * refactor: deprecate azureOpenAI environment variables in favor of librechat.yaml config * feat: use helper functions to handle and order enabled/default endpoints; initialize azureOpenAI from config file * refactor: redefine types as well as load azureOpenAI models from config file * chore(ci): fix test description naming * feat(azureOpenAI): use validated model grouping for request authentication * chore: bump data-provider following rebase * chore: bump config file version noting significant changes * feat: add title options and switch azure configs for titling and vision requests * feat: enable azure plugins from config file * fix(ci): pass tests * chore(.env.example): mark `PLUGINS_USE_AZURE` as deprecated * fix(fetchModels): early return if apiKey not passed * chore: fix azure config typing * refactor(mapModelToAzureConfig): return baseURL and headers as well as azureOptions * feat(createLLM): use `azureOpenAIBasePath` * feat(parsers): resolveHeaders * refactor(extractBaseURL): handle invalid input * feat(OpenAIClient): handle headers and baseURL for azureConfig * fix(ci): pass `OpenAIClient` tests * chore: extract env var for azureOpenAI group config, baseURL * docs: azureOpenAI config setup docs * feat: safe check of potential conflicting env vars that map to unique placeholders * fix: reset apiKey when model switches from originally requested model (vision or title) * chore: linting * docs: CONFIG_PATH notes in custom_config.md
64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
const { z } = require('zod');
|
|
|
|
const allowedCharactersRegex = /^[a-zA-Z0-9_.@#$%&*()\p{Script=Latin}\p{Script=Common}]+$/u;
|
|
const injectionPatternsRegex = /('|--|\$ne|\$gt|\$lt|\$or|\{|\}|\*|;|<|>|\/|=)/i;
|
|
|
|
const usernameSchema = z
|
|
.string()
|
|
.min(2)
|
|
.max(80)
|
|
.refine((value) => allowedCharactersRegex.test(value), {
|
|
message: 'Invalid characters in username',
|
|
})
|
|
.refine((value) => !injectionPatternsRegex.test(value), {
|
|
message: 'Potential injection attack detected',
|
|
});
|
|
|
|
const loginSchema = z.object({
|
|
email: z.string().email(),
|
|
password: z
|
|
.string()
|
|
.min(8)
|
|
.max(128)
|
|
.refine((value) => value.trim().length > 0, {
|
|
message: 'Password cannot be only spaces',
|
|
}),
|
|
});
|
|
|
|
const registerSchema = z
|
|
.object({
|
|
name: z.string().min(3).max(80),
|
|
username: z
|
|
.union([z.literal(''), usernameSchema])
|
|
.transform((value) => (value === '' ? null : value))
|
|
.optional()
|
|
.nullable(),
|
|
email: z.string().email(),
|
|
password: z
|
|
.string()
|
|
.min(8)
|
|
.max(128)
|
|
.refine((value) => value.trim().length > 0, {
|
|
message: 'Password cannot be only spaces',
|
|
}),
|
|
confirm_password: z
|
|
.string()
|
|
.min(8)
|
|
.max(128)
|
|
.refine((value) => value.trim().length > 0, {
|
|
message: 'Password cannot be only spaces',
|
|
}),
|
|
})
|
|
.superRefine(({ confirm_password, password }, ctx) => {
|
|
if (confirm_password !== password) {
|
|
ctx.addIssue({
|
|
code: 'custom',
|
|
message: 'The passwords did not match',
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = {
|
|
loginSchema,
|
|
registerSchema,
|
|
};
|