| 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; |
|
|