mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-21 10:50:14 +01:00
🅰️ feat: Azure Config to Allow Different Deployments per Model (#1863)
* 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
This commit is contained in:
parent
7a55132e42
commit
097a978e5b
37 changed files with 2066 additions and 394 deletions
|
|
@ -8,6 +8,55 @@ export const defaultSocialLogins = ['google', 'facebook', 'openid', 'github', 'd
|
|||
|
||||
export const fileSourceSchema = z.nativeEnum(FileSources);
|
||||
|
||||
export const modelConfigSchema = z
|
||||
.object({
|
||||
deploymentName: z.string().optional(),
|
||||
version: z.string().optional(),
|
||||
})
|
||||
.or(z.boolean());
|
||||
|
||||
export type TAzureModelConfig = z.infer<typeof modelConfigSchema>;
|
||||
|
||||
export const azureBaseSchema = z.object({
|
||||
apiKey: z.string(),
|
||||
instanceName: z.string(),
|
||||
deploymentName: z.string().optional(),
|
||||
version: z.string().optional(),
|
||||
baseURL: z.string().optional(),
|
||||
additionalHeaders: z.record(z.any()).optional(),
|
||||
});
|
||||
|
||||
export type TAzureBaseSchema = z.infer<typeof azureBaseSchema>;
|
||||
|
||||
export const azureGroupSchema = z
|
||||
.object({
|
||||
group: z.string(),
|
||||
models: z.record(z.string(), modelConfigSchema),
|
||||
})
|
||||
.required()
|
||||
.and(azureBaseSchema);
|
||||
|
||||
export const azureGroupConfigsSchema = z.array(azureGroupSchema).min(1);
|
||||
export type TAzureGroups = z.infer<typeof azureGroupConfigsSchema>;
|
||||
|
||||
export type TAzureModelMapSchema = {
|
||||
// deploymentName?: string;
|
||||
// version?: string;
|
||||
group: string;
|
||||
};
|
||||
|
||||
export type TAzureModelGroupMap = Record<string, TAzureModelMapSchema>;
|
||||
export type TAzureGroupMap = Record<
|
||||
string,
|
||||
TAzureBaseSchema & { models: Record<string, TAzureModelConfig> }
|
||||
>;
|
||||
|
||||
export type TValidatedAzureConfig = {
|
||||
modelNames: string[];
|
||||
modelGroupMap: TAzureModelGroupMap;
|
||||
groupMap: TAzureGroupMap;
|
||||
};
|
||||
|
||||
export const assistantEndpointSchema = z.object({
|
||||
/* assistants specific */
|
||||
disableBuilder: z.boolean().optional(),
|
||||
|
|
@ -56,8 +105,30 @@ export const endpointSchema = z.object({
|
|||
headers: z.record(z.any()).optional(),
|
||||
addParams: z.record(z.any()).optional(),
|
||||
dropParams: z.array(z.string()).optional(),
|
||||
customOrder: z.number().optional(),
|
||||
});
|
||||
|
||||
export const azureEndpointSchema = z
|
||||
.object({
|
||||
groups: azureGroupConfigsSchema,
|
||||
plugins: z.boolean().optional(),
|
||||
})
|
||||
.and(
|
||||
endpointSchema
|
||||
.pick({
|
||||
titleConvo: true,
|
||||
titleMethod: true,
|
||||
titleModel: true,
|
||||
summarize: true,
|
||||
summaryModel: true,
|
||||
customOrder: true,
|
||||
})
|
||||
.partial(),
|
||||
);
|
||||
|
||||
export type TAzureConfig = Omit<z.infer<typeof azureEndpointSchema>, 'groups'> &
|
||||
TValidatedAzureConfig;
|
||||
|
||||
export const rateLimitSchema = z.object({
|
||||
fileUploads: z
|
||||
.object({
|
||||
|
|
@ -83,6 +154,7 @@ export const configSchema = z.object({
|
|||
fileConfig: fileConfigSchema.optional(),
|
||||
endpoints: z
|
||||
.object({
|
||||
[EModelEndpoint.azureOpenAI]: azureEndpointSchema.optional(),
|
||||
[EModelEndpoint.assistants]: assistantEndpointSchema.optional(),
|
||||
custom: z.array(endpointSchema.partial()).optional(),
|
||||
})
|
||||
|
|
@ -371,7 +443,7 @@ export enum Constants {
|
|||
/**
|
||||
* Key for the Custom Config's version (librechat.yaml).
|
||||
*/
|
||||
CONFIG_VERSION = '1.0.3',
|
||||
CONFIG_VERSION = '1.0.4',
|
||||
/**
|
||||
* Standard value for the first message's `parentMessageId` value, to indicate no parent exists.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue