| | const path = require('path'); |
| | const { EModelEndpoint, AuthKeys } = require('librechat-data-provider'); |
| | const { getGoogleConfig, isEnabled, loadServiceKey } = require('@librechat/api'); |
| | const { getUserKey, checkUserKeyExpiry } = require('~/server/services/UserService'); |
| | const { GoogleClient } = require('~/app'); |
| |
|
| | const initializeClient = async ({ req, res, endpointOption, overrideModel, optionsOnly }) => { |
| | const { GOOGLE_KEY, GOOGLE_REVERSE_PROXY, GOOGLE_AUTH_HEADER, PROXY } = process.env; |
| | const isUserProvided = GOOGLE_KEY === 'user_provided'; |
| | const { key: expiresAt } = req.body; |
| |
|
| | let userKey = null; |
| | if (expiresAt && isUserProvided) { |
| | checkUserKeyExpiry(expiresAt, EModelEndpoint.google); |
| | userKey = await getUserKey({ userId: req.user.id, name: EModelEndpoint.google }); |
| | } |
| |
|
| | let serviceKey = {}; |
| |
|
| | |
| | const isGoogleKeyProvided = |
| | (GOOGLE_KEY && GOOGLE_KEY.trim() !== '') || (isUserProvided && userKey != null); |
| |
|
| | if (!isGoogleKeyProvided) { |
| | |
| | try { |
| | const serviceKeyPath = |
| | process.env.GOOGLE_SERVICE_KEY_FILE || |
| | path.join(__dirname, '../../../..', 'data', 'auth.json'); |
| | serviceKey = await loadServiceKey(serviceKeyPath); |
| | if (!serviceKey) { |
| | serviceKey = {}; |
| | } |
| | } catch (_e) { |
| | |
| | serviceKey = {}; |
| | } |
| | } |
| |
|
| | const credentials = isUserProvided |
| | ? userKey |
| | : { |
| | [AuthKeys.GOOGLE_SERVICE_KEY]: serviceKey, |
| | [AuthKeys.GOOGLE_API_KEY]: GOOGLE_KEY, |
| | }; |
| |
|
| | let clientOptions = {}; |
| |
|
| | const appConfig = req.config; |
| | |
| | const allConfig = appConfig.endpoints?.all; |
| | |
| | const googleConfig = appConfig.endpoints?.[EModelEndpoint.google]; |
| |
|
| | if (googleConfig) { |
| | clientOptions.streamRate = googleConfig.streamRate; |
| | clientOptions.titleModel = googleConfig.titleModel; |
| | } |
| |
|
| | if (allConfig) { |
| | clientOptions.streamRate = allConfig.streamRate; |
| | } |
| |
|
| | clientOptions = { |
| | req, |
| | res, |
| | reverseProxyUrl: GOOGLE_REVERSE_PROXY ?? null, |
| | authHeader: isEnabled(GOOGLE_AUTH_HEADER) ?? null, |
| | proxy: PROXY ?? null, |
| | ...clientOptions, |
| | ...endpointOption, |
| | }; |
| |
|
| | if (optionsOnly) { |
| | clientOptions = Object.assign( |
| | { |
| | modelOptions: endpointOption?.model_parameters ?? {}, |
| | }, |
| | clientOptions, |
| | ); |
| | if (overrideModel) { |
| | clientOptions.modelOptions.model = overrideModel; |
| | } |
| | return getGoogleConfig(credentials, clientOptions); |
| | } |
| |
|
| | const client = new GoogleClient(credentials, clientOptions); |
| |
|
| | return { |
| | client, |
| | credentials, |
| | }; |
| | }; |
| |
|
| | module.exports = initializeClient; |
| |
|