mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-20 02:10:15 +01:00
🅰️ feat: Azure OpenAI Assistants API Support (#1992)
* chore: rename dir from `assistant` to plural * feat: `assistants` field for azure config, spread options in AppService * refactor: rename constructAzureURL param for azure as `azureOptions` * chore: bump openai and bun * chore(loadDefaultModels): change naming of assistant -> assistants * feat: load azure settings with currect baseURL for assistants' initializeClient * refactor: add `assistants` flags to groups and model configs, add mapGroupToAzureConfig * feat(loadConfigEndpoints): initialize assistants endpoint if azure flag `assistants` is enabled * feat(AppService): determine assistant models on startup, throw Error if none * refactor(useDeleteAssistantMutation): send model along with assistant id for delete mutations * feat: support listing and deleting assistants with azure * feat: add model query to assistant avatar upload * feat: add azure support for retrieveRun method * refactor: update OpenAIClient initialization * chore: update README * fix(ci): tests passing * refactor(uploadOpenAIFile): improve logging and use more efficient REST API method * refactor(useFileHandling): add model to metadata to target Azure region compatible with current model * chore(files): add azure naming pattern for valid file id recognition * fix(assistants): initialize openai with first available assistant model if none provided * refactor(uploadOpenAIFile): add content type for azure, initialize formdata before azure options * refactor(sleep): move sleep function out of Runs and into `~/server/utils` * fix(azureOpenAI/assistants): make sure to only overwrite models with assistant models if `assistants` flag is enabled * refactor(uploadOpenAIFile): revert to old method * chore(uploadOpenAIFile): use enum for file purpose * docs: azureOpenAI update guide with more info, examples * feat: enable/disable assistant capabilities and specify retrieval models * refactor: optional chain conditional statement in loadConfigModels.js * docs: add assistants examples * chore: update librechat.example.yaml * docs(azure): update note of file upload behavior in Azure OpenAI Assistants * chore: update docs and add descriptive message about assistant errors * fix: prevent message submission with invalid assistant or if files loading * style: update Landing icon & text when assistant is not selected * chore: bump librechat-data-provider to 0.4.8 * fix(assistants/azure): assign req.body.model for proper azure init to abort runs
This commit is contained in:
parent
1b243c6f8c
commit
5cd5c3bef8
60 changed files with 1044 additions and 300 deletions
|
|
@ -234,14 +234,16 @@ export function mapModelToAzureConfig({
|
|||
}
|
||||
|
||||
const modelDetails = groupConfig.models[modelName];
|
||||
const deploymentName =
|
||||
const { deploymentName, version } =
|
||||
typeof modelDetails === 'object'
|
||||
? modelDetails.deploymentName || groupConfig.deploymentName
|
||||
: groupConfig.deploymentName;
|
||||
const version =
|
||||
typeof modelDetails === 'object'
|
||||
? modelDetails.version || groupConfig.version
|
||||
: groupConfig.version;
|
||||
? {
|
||||
deploymentName: modelDetails.deploymentName || groupConfig.deploymentName,
|
||||
version: modelDetails.version || groupConfig.version,
|
||||
}
|
||||
: {
|
||||
deploymentName: groupConfig.deploymentName,
|
||||
version: groupConfig.version,
|
||||
};
|
||||
|
||||
if (!deploymentName || !version) {
|
||||
throw new Error(
|
||||
|
|
@ -274,3 +276,86 @@ export function mapModelToAzureConfig({
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function mapGroupToAzureConfig({
|
||||
groupName,
|
||||
groupMap,
|
||||
}: {
|
||||
groupName: string;
|
||||
groupMap: TAzureGroupMap;
|
||||
}): MappedAzureConfig {
|
||||
const groupConfig = groupMap[groupName];
|
||||
if (!groupConfig) {
|
||||
throw new Error(`Group named "${groupName}" not found in configuration.`);
|
||||
}
|
||||
|
||||
const instanceName = groupConfig.instanceName as string;
|
||||
|
||||
if (!instanceName && !groupConfig.serverless) {
|
||||
throw new Error(
|
||||
`Group "${groupName}" is missing an instanceName for non-serverless configuration.`,
|
||||
);
|
||||
}
|
||||
|
||||
if (groupConfig.serverless && !groupConfig.baseURL) {
|
||||
throw new Error(
|
||||
`Group "${groupName}" is missing the required base URL for serverless configuration.`,
|
||||
);
|
||||
}
|
||||
|
||||
const models = Object.keys(groupConfig.models);
|
||||
if (models.length === 0) {
|
||||
throw new Error(`Group "${groupName}" does not have any models configured.`);
|
||||
}
|
||||
|
||||
// Use the first available model in the group
|
||||
const firstModelName = models[0];
|
||||
const modelDetails = groupConfig.models[firstModelName];
|
||||
|
||||
const azureOptions: AzureOptions = {
|
||||
azureOpenAIApiKey: extractEnvVariable(groupConfig.apiKey),
|
||||
azureOpenAIApiInstanceName: extractEnvVariable(instanceName),
|
||||
// DeploymentName and Version set below
|
||||
};
|
||||
|
||||
if (groupConfig.serverless) {
|
||||
return {
|
||||
azureOptions,
|
||||
baseURL: extractEnvVariable(groupConfig.baseURL ?? ''),
|
||||
serverless: true,
|
||||
...(groupConfig.additionalHeaders && { headers: groupConfig.additionalHeaders }),
|
||||
};
|
||||
}
|
||||
|
||||
const { deploymentName, version } =
|
||||
typeof modelDetails === 'object'
|
||||
? {
|
||||
deploymentName: modelDetails.deploymentName || groupConfig.deploymentName,
|
||||
version: modelDetails.version || groupConfig.version,
|
||||
}
|
||||
: {
|
||||
deploymentName: groupConfig.deploymentName,
|
||||
version: groupConfig.version,
|
||||
};
|
||||
|
||||
if (!deploymentName || !version) {
|
||||
throw new Error(
|
||||
`Model "${firstModelName}" in group "${groupName}" or the group itself is missing a deploymentName ("${deploymentName}") or version ("${version}").`,
|
||||
);
|
||||
}
|
||||
|
||||
azureOptions.azureOpenAIApiDeploymentName = extractEnvVariable(deploymentName);
|
||||
azureOptions.azureOpenAIApiVersion = extractEnvVariable(version);
|
||||
|
||||
const result: MappedAzureConfig = { azureOptions };
|
||||
|
||||
if (groupConfig.baseURL) {
|
||||
result.baseURL = extractEnvVariable(groupConfig.baseURL);
|
||||
}
|
||||
|
||||
if (groupConfig.additionalHeaders) {
|
||||
result.headers = groupConfig.additionalHeaders;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue