This commit is contained in:
Jani Ranta 2024-09-27 15:12:35 +05:30 committed by GitHub
commit 7a54a58955
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 180 additions and 1 deletions

View File

@ -27,6 +27,7 @@
"dependencies": {
"@iarna/toml": "^2.2.5",
"@langchain/anthropic": "^0.2.3",
"@langchain/azure-openai": "^0.0.4",
"@langchain/community": "^0.2.16",
"@langchain/openai": "^0.0.25",
"@xenova/transformers": "^2.17.1",

View File

@ -6,7 +6,21 @@ SIMILARITY_MEASURE = "cosine" # "cosine" or "dot"
OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef
GROQ = "" # Groq API key - gsk_1234567890abcdef1234567890abcdef
ANTHROPIC = "" # Anthropic API key - sk-ant-1234567890abcdef1234567890abcdef
AZURE = "" # Azure OpenAI API key
[API_ENDPOINTS]
SEARXNG = "http://localhost:32768" # SearxNG API URL
OLLAMA = "" # Ollama API URL - http://host.docker.internal:11434
OLLAMA = "" # Ollama API URL - http://host.docker.internal:11434
AZURE = "" # Azure OpenAI Endpoint URL - https://endpointhere.openai.azure.com/
[AZURE_OPENAI]
DEPLOYMENT_NAME_GPT35_TURBO = "gpt-35-turbo" # Deployment name for GPT-3.5 turbo
DEPLOYMENT_NAME_GPT35_TURBO_16K = "gpt-35-turbo-16k" # Deployment name for GPT-3.5-turbo 16k
DEPLOYMENT_NAME_GPT35_TURBO_INSTRUCT = "gpt-35-turbo-instruct" # Deployment name for GPT-3.5 turbo instruct
DEPLOYMENT_NAME_GPT4 = "gpt4" # Deployment name for GPT-4
DEPLOYMENT_NAME_GPT4_32K = "gpt432k" # Deployment name for GPT-4 32K
DEPLOYMENT_NAME_GPT4_OMNI = "gpt-4o" # Deployment name for GPT-4 omni
DEPLOYMENT_NAME_GPT4_OMNI_MINI = "gpt-4o-mini" # Deployment name for GPT-4 omni mini
DEPLOYMENT_NAME_EMBEDDINGS_ADA = "text-embeddings-ada-002" # Deployment name for text embeddings ada 002
DEPLOYMENT_NAME_EMBEDDINGS_SMALL = "text-embedding-3-small" # Deployment name for text embedding 3 small
DEPLOYMENT_NAME_EMBEDDINGS_LARGE = "text-embedding-3-large" # Deployment name for text embedding 3 large

View File

@ -13,10 +13,24 @@ interface Config {
OPENAI: string;
GROQ: string;
ANTHROPIC: string;
AZURE: string;
};
API_ENDPOINTS: {
SEARXNG: string;
OLLAMA: string;
AZURE: string;
};
AZURE_OPENAI: {
DEPLOYMENT_NAME_GPT35_TURBO: string;
DEPLOYMENT_NAME_GPT35_TURBO_16K: string;
DEPLOYMENT_NAME_GPT35_TURBO_INSTRUCT: string;
DEPLOYMENT_NAME_GPT4: string;
DEPLOYMENT_NAME_GPT4_32K: string;
DEPLOYMENT_NAME_GPT4_OMNI: string;
DEPLOYMENT_NAME_GPT4_OMNI_MINI: string;
DEPLOYMENT_NAME_EMBEDDINGS_ADA: string;
DEPLOYMENT_NAME_EMBEDDINGS_SMALL: string;
DEPLOYMENT_NAME_EMBEDDINGS_LARGE: string;
};
}
@ -45,6 +59,40 @@ export const getSearxngApiEndpoint = () =>
export const getOllamaApiEndpoint = () => loadConfig().API_ENDPOINTS.OLLAMA;
export const getAzureOpenaiApiKey = () => loadConfig().API_KEYS.AZURE;
export const getAzureOpenaiEndpoint = () => loadConfig().API_ENDPOINTS.AZURE;
export const getAzureOpenaiDeploymentNameGpt35 = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT35_TURBO;
export const getAzureOpenaiDeploymentNameGpt35_16K = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT35_TURBO_16K;
export const getAzureOpenaiDeploymentNameGpt35TurboInstruct = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT35_TURBO_INSTRUCT;
export const getAzureOpenaiDeploymentNameGpt4 = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT4;
export const getAzureOpenaiDeploymentNameGpt4_32K = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT4_32K;
export const getAzureOpenaiDeploymentNameGpt4o = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT4_OMNI;
export const getAzureOpenaiDeploymentNameGpt4oMini = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_GPT4_OMNI_MINI;
export const getAzureOpenaiDeploymentNameEmbeddingsAda = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_EMBEDDINGS_ADA;
export const getAzureOpenaiDeploymentNameEmbeddingsSmall = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_EMBEDDINGS_SMALL;
export const getAzureOpenaiDeploymentNameEmbeddingsLarge = () =>
loadConfig().AZURE_OPENAI.DEPLOYMENT_NAME_EMBEDDINGS_LARGE;
export const updateConfig = (config: RecursivePartial<Config>) => {
const currentConfig = loadConfig();

113
src/lib/providers/azure.ts Normal file
View File

@ -0,0 +1,113 @@
import {
AzureChatOpenAI,
AzureOpenAIEmbeddings,
} from '@langchain/azure-openai';
import { getAzureOpenaiApiKey, getAzureOpenaiEndpoint } from '../../config';
import {
getAzureOpenaiDeploymentNameGpt35,
getAzureOpenaiDeploymentNameGpt35_16K,
getAzureOpenaiDeploymentNameGpt35TurboInstruct,
getAzureOpenaiDeploymentNameGpt4,
getAzureOpenaiDeploymentNameGpt4_32K,
getAzureOpenaiDeploymentNameGpt4o,
getAzureOpenaiDeploymentNameGpt4oMini,
getAzureOpenaiDeploymentNameEmbeddingsAda,
getAzureOpenaiDeploymentNameEmbeddingsSmall,
getAzureOpenaiDeploymentNameEmbeddingsLarge,
} from '../../config';
import logger from '../../utils/logger';
export const loadAzureOpenAIChatModels = async () => {
const azureApiKey = getAzureOpenaiApiKey();
const azureEndpoint = getAzureOpenaiEndpoint();
if (!azureApiKey || !azureEndpoint) {
logger.error('Azure OpenAI API key or endpoint is missing');
return {};
}
const chatModels = {};
try {
const deploymentNames = {
'GPT-3.5 turbo': getAzureOpenaiDeploymentNameGpt35(),
'GPT-3.5 turbo 16K': getAzureOpenaiDeploymentNameGpt35_16K(),
'GPT-3.5 turbo instruct':
getAzureOpenaiDeploymentNameGpt35TurboInstruct(),
'GPT-4': getAzureOpenaiDeploymentNameGpt4(),
'GPT-4 32K': getAzureOpenaiDeploymentNameGpt4_32K(),
'GPT-4 omni': getAzureOpenaiDeploymentNameGpt4o(),
'GPT-4 omni mini': getAzureOpenaiDeploymentNameGpt4oMini(),
};
let atLeastOneModelLoaded = false;
for (const [modelName, deploymentName] of Object.entries(deploymentNames)) {
try {
if (deploymentName) {
chatModels[modelName] = new AzureChatOpenAI({
azureOpenAIEndpoint: azureEndpoint,
azureOpenAIApiKey: azureApiKey,
azureOpenAIApiDeploymentName: deploymentName,
temperature: 0.7,
});
atLeastOneModelLoaded = true;
}
} catch (error) {
logger.warn(
`Deployment for ${modelName} is missing or failed to load:`,
error,
);
// Continue the loop even if a specific model fails
}
}
// Check if at least one model is loaded, log error if not
if (!atLeastOneModelLoaded) {
logger.error(
'No chat models for Azure OpenAI could be loaded. At least one model is required.',
);
return {};
}
return chatModels;
} catch (error) {
logger.error('Failed to load Azure OpenAI chat models', error);
return {};
}
};
export const loadAzureOpenAIEmbeddings = async () => {
const azureApiKey = getAzureOpenaiApiKey();
const azureEndpoint = getAzureOpenaiEndpoint();
if (!azureApiKey || !azureEndpoint) return {};
try {
const embeddings = {
'Text embedding Ada 002': new AzureOpenAIEmbeddings({
azureOpenAIEndpoint: azureEndpoint,
azureOpenAIApiKey: azureApiKey,
azureOpenAIApiDeploymentName:
getAzureOpenaiDeploymentNameEmbeddingsAda(),
}),
'Text embedding 3 small': new AzureOpenAIEmbeddings({
azureOpenAIEndpoint: azureEndpoint,
azureOpenAIApiKey: azureApiKey,
azureOpenAIApiDeploymentName:
getAzureOpenaiDeploymentNameEmbeddingsSmall(),
}),
'Text embedding 3 large': new AzureOpenAIEmbeddings({
azureOpenAIEndpoint: azureEndpoint,
azureOpenAIApiKey: azureApiKey,
azureOpenAIApiDeploymentName:
getAzureOpenaiDeploymentNameEmbeddingsLarge(),
}),
};
return embeddings;
} catch (error) {
logger.error('Failed to load Azure OpenAI embeddings', error);
return {};
}
};

View File

@ -1,11 +1,13 @@
import { loadGroqChatModels } from './groq';
import { loadOllamaChatModels, loadOllamaEmbeddingsModels } from './ollama';
import { loadOpenAIChatModels, loadOpenAIEmbeddingsModels } from './openai';
import { loadAzureOpenAIChatModels, loadAzureOpenAIEmbeddings } from './azure';
import { loadAnthropicChatModels } from './anthropic';
import { loadTransformersEmbeddingsModels } from './transformers';
const chatModelProviders = {
openai: loadOpenAIChatModels,
azure: loadAzureOpenAIChatModels,
groq: loadGroqChatModels,
ollama: loadOllamaChatModels,
anthropic: loadAnthropicChatModels,
@ -13,6 +15,7 @@ const chatModelProviders = {
const embeddingModelProviders = {
openai: loadOpenAIEmbeddingsModels,
azure: loadAzureOpenAIEmbeddings,
local: loadTransformersEmbeddingsModels,
ollama: loadOllamaEmbeddingsModels,
};