From d043a849a9ba50e7fd5efad72251af50f559f9d9 Mon Sep 17 00:00:00 2001 From: madonchik123 <68397448+madonchik123@users.noreply.github.com> Date: Tue, 21 Nov 2023 04:12:53 +0300 Subject: [PATCH] Added Reverse Proxy for Anthropic (#1106) * Update AnthropicClient.js Added BaseURL * Update .env.example Added ANTHROPIC_REVERSE_PROXY ENV * Update initializeClient.js Added Reverse_Proxy * Update .env.example * Update initializeClient.js * Update AnthropicClient.js * Update .env.example Request * Update initializeClient.js Mae ANTHROPIC_REVERSE_PROXY let instead of const * fix: lint errors, refactor(initializeClient) * chore: change casing of reverseProxy --------- Co-authored-by: Marco Beretta <81851188+Berry-13@users.noreply.github.com> Co-authored-by: Danny Avila <110412045+danny-avila@users.noreply.github.com> --- .env.example | 5 +++++ api/app/clients/AnthropicClient.js | 9 ++++++--- .../endpoints/anthropic/initializeClient.js | 20 ++++++++++++------- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/.env.example b/.env.example index 14d5aaeb69..86d529fde5 100644 --- a/.env.example +++ b/.env.example @@ -318,6 +318,11 @@ PALM_KEY=user_provided ANTHROPIC_API_KEY=user_provided ANTHROPIC_MODELS=claude-1,claude-instant-1,claude-2 +# In case if you have reverse proxy for ANTHROPIC_REVERSE_PROXY you can add it here +# leave blank to use default base url + +# ANTHROPIC_REVERSE_PROXY= + ########################## # Proxy: To be Used by all endpoints ########################## diff --git a/api/app/clients/AnthropicClient.js b/api/app/clients/AnthropicClient.js index 04e5563bf2..cdc105d258 100644 --- a/api/app/clients/AnthropicClient.js +++ b/api/app/clients/AnthropicClient.js @@ -9,10 +9,13 @@ const AI_PROMPT = '\n\nAssistant:'; const tokenizersCache = {}; class AnthropicClient extends BaseClient { - constructor(apiKey, options = {}, cacheOptions = {}) { + constructor(apiKey, options = {}, cacheOptions = {}, baseURL) { super(apiKey, options, cacheOptions); this.apiKey = apiKey || process.env.ANTHROPIC_API_KEY; this.sender = 'Anthropic'; + if (baseURL) { + this.baseURL = baseURL; + } this.userLabel = HUMAN_PROMPT; this.assistantLabel = AI_PROMPT; this.setOptions(options); @@ -78,10 +81,10 @@ class AnthropicClient extends BaseClient { } getClient() { - if (this.options.reverseProxyUrl) { + if (this.baseURL) { return new Anthropic({ apiKey: this.apiKey, - baseURL: this.options.reverseProxyUrl, + baseURL: this.baseURL, }); } else { return new Anthropic({ diff --git a/api/server/routes/endpoints/anthropic/initializeClient.js b/api/server/routes/endpoints/anthropic/initializeClient.js index 0b5bc6e0f9..5160611e7e 100644 --- a/api/server/routes/endpoints/anthropic/initializeClient.js +++ b/api/server/routes/endpoints/anthropic/initializeClient.js @@ -2,25 +2,31 @@ const { AnthropicClient } = require('../../../../app'); const { getUserKey, checkUserKeyExpiry } = require('../../../services/UserService'); const initializeClient = async ({ req, res }) => { - const { ANTHROPIC_API_KEY } = process.env; - const { key: expiresAt } = req.body; - + const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY; + const expiresAt = req.body.key; const isUserProvided = ANTHROPIC_API_KEY === 'user_provided'; - let key = null; + let anthropicApiKey = isUserProvided ? await getAnthropicUserKey(req.user.id) : ANTHROPIC_API_KEY; + let reverseProxy = process.env.ANTHROPIC_REVERSE_PROXY || undefined; + console.log('ANTHROPIC_REVERSE_PROXY', reverseProxy); + if (expiresAt && isUserProvided) { checkUserKeyExpiry( expiresAt, 'Your ANTHROPIC_API_KEY has expired. Please provide your API key again.', ); - key = await getUserKey({ userId: req.user.id, name: 'anthropic' }); } - let anthropicApiKey = isUserProvided ? key : ANTHROPIC_API_KEY; - const client = new AnthropicClient(anthropicApiKey, { req, res }); + + const client = new AnthropicClient(anthropicApiKey, { req, res }, {}, reverseProxy); + return { client, anthropicApiKey, }; }; +const getAnthropicUserKey = async (userId) => { + return await getUserKey({ userId, name: 'anthropic' }); +}; + module.exports = initializeClient;