Spaces:
Runtime error
Runtime error
import { ObjectId } from 'mongodb' | |
import * as dotenv from 'dotenv' | |
import type { TextAuditServiceProvider } from 'src/utils/textAudit' | |
import { isNotEmptyString, isTextAuditServiceProvider } from '../utils/is' | |
import { AuditConfig, CHATMODELS, Config, KeyConfig, MailConfig, SiteConfig, TextAudioType, UserRole } from './model' | |
import { getConfig, getKeys, upsertKey } from './mongo' | |
dotenv.config() | |
let cachedConfig: Config | undefined | |
let cacheExpiration = 0 | |
export async function getCacheConfig(): Promise<Config> { | |
const now = Date.now() | |
if (cachedConfig && cacheExpiration > now) | |
return Promise.resolve(cachedConfig) | |
const loadedConfig = await getOriginConfig() | |
cachedConfig = loadedConfig | |
cacheExpiration = now + 10 * 60 * 1000 | |
return Promise.resolve(cachedConfig) | |
} | |
export async function getOriginConfig() { | |
let config = await getConfig() | |
if (config == null) { | |
config = new Config(new ObjectId(), | |
!isNaN(+process.env.TIMEOUT_MS) ? +process.env.TIMEOUT_MS : 30 * 1000, | |
process.env.OPENAI_API_KEY, | |
process.env.OPENAI_API_DISABLE_DEBUG === 'true', | |
process.env.OPENAI_ACCESS_TOKEN, | |
process.env.OPENAI_API_BASE_URL, | |
process.env.OPENAI_API_MODEL || 'ChatGPTAPI', | |
process.env.API_REVERSE_PROXY, | |
(process.env.SOCKS_PROXY_HOST && process.env.SOCKS_PROXY_PORT) | |
? (`${process.env.SOCKS_PROXY_HOST}:${process.env.SOCKS_PROXY_PORT}`) | |
: '', | |
(process.env.SOCKS_PROXY_USERNAME && process.env.SOCKS_PROXY_PASSWORD) | |
? (`${process.env.SOCKS_PROXY_USERNAME}:${process.env.SOCKS_PROXY_PASSWORD}`) | |
: '', | |
process.env.HTTPS_PROXY, | |
new SiteConfig( | |
process.env.SITE_TITLE || 'ChatGpt Web', | |
isNotEmptyString(process.env.AUTH_SECRET_KEY), | |
process.env.AUTH_SECRET_KEY, | |
process.env.REGISTER_ENABLED === 'true', | |
process.env.REGISTER_REVIEW === 'true', | |
process.env.REGISTER_MAILS, | |
process.env.SITE_DOMAIN), | |
new MailConfig(process.env.SMTP_HOST, | |
!isNaN(+process.env.SMTP_PORT) ? +process.env.SMTP_PORT : 465, | |
process.env.SMTP_TSL === 'true', | |
process.env.SMTP_USERNAME, | |
process.env.SMTP_PASSWORD)) | |
} | |
else { | |
if (config.siteConfig.loginEnabled === undefined) | |
config.siteConfig.loginEnabled = isNotEmptyString(process.env.AUTH_SECRET_KEY) | |
if (config.siteConfig.loginSalt === undefined) | |
config.siteConfig.loginSalt = process.env.AUTH_SECRET_KEY | |
if (config.apiDisableDebug === undefined) | |
config.apiDisableDebug = process.env.OPENAI_API_DISABLE_DEBUG === 'true' | |
if (config.socksAuth === undefined) { | |
config.socksAuth = (process.env.SOCKS_PROXY_USERNAME && process.env.SOCKS_PROXY_PASSWORD) | |
? (`${process.env.SOCKS_PROXY_USERNAME}:${process.env.SOCKS_PROXY_PASSWORD}`) | |
: '' | |
} | |
if (config.siteConfig.registerReview === undefined) | |
config.siteConfig.registerReview = process.env.REGISTER_REVIEW === 'true' | |
} | |
if (config.apiModel !== 'ChatGPTAPI' && config.apiModel !== 'ChatGPTUnofficialProxyAPI') { | |
if (isNotEmptyString(config.accessToken)) | |
config.apiModel = 'ChatGPTUnofficialProxyAPI' | |
else | |
config.apiModel = 'ChatGPTAPI' | |
} | |
if (config.auditConfig === undefined) { | |
config.auditConfig = new AuditConfig( | |
process.env.AUDIT_ENABLED === 'true', | |
isTextAuditServiceProvider(process.env.AUDIT_PROVIDER) | |
? process.env.AUDIT_PROVIDER as TextAuditServiceProvider | |
: 'baidu', | |
{ | |
apiKey: process.env.AUDIT_API_KEY, | |
apiSecret: process.env.AUDIT_API_SECRET, | |
label: process.env.AUDIT_TEXT_LABEL, | |
}, | |
getTextAuditServiceOptionFromString(process.env.AUDIT_TEXT_TYPE), | |
false, | |
'', | |
) | |
} | |
return config | |
} | |
function getTextAuditServiceOptionFromString(value: string): TextAudioType { | |
if (value === undefined) | |
return TextAudioType.None | |
switch (value.toLowerCase()) { | |
case 'request': | |
return TextAudioType.Request | |
case 'response': | |
return TextAudioType.Response | |
case 'all': | |
return TextAudioType.All | |
default: | |
return TextAudioType.None | |
} | |
} | |
export function clearConfigCache() { | |
cacheExpiration = 0 | |
cachedConfig = null | |
} | |
let apiKeysCachedConfig: KeyConfig[] | undefined | |
let apiKeysCacheExpiration = 0 | |
export async function getCacheApiKeys(): Promise<KeyConfig[]> { | |
const now = Date.now() | |
if (apiKeysCachedConfig && apiKeysCacheExpiration > now) | |
return Promise.resolve(apiKeysCachedConfig) | |
const loadedConfig = (await getApiKeys()).keys | |
apiKeysCachedConfig = loadedConfig | |
apiKeysCacheExpiration = now + 10 * 60 * 1000 | |
return Promise.resolve(apiKeysCachedConfig) | |
} | |
export function clearApiKeyCache() { | |
apiKeysCacheExpiration = 0 | |
getCacheApiKeys() | |
} | |
export async function getApiKeys() { | |
const result = await getKeys() | |
if (result.keys.length <= 0) { | |
const config = await getCacheConfig() | |
if (config.apiModel === 'ChatGPTAPI') | |
result.keys.push(await upsertKey(new KeyConfig(config.apiKey, 'ChatGPTAPI', [], [], ''))) | |
if (config.apiModel === 'ChatGPTUnofficialProxyAPI') | |
result.keys.push(await upsertKey(new KeyConfig(config.accessToken, 'ChatGPTUnofficialProxyAPI', [], [], ''))) | |
result.total++ | |
} | |
result.keys.forEach((key) => { | |
if (key.userRoles == null || key.userRoles.length <= 0) { | |
key.userRoles.push(UserRole.Admin) | |
key.userRoles.push(UserRole.User) | |
key.userRoles.push(UserRole.Guest) | |
} | |
if (key.chatModels == null || key.chatModels.length <= 0) { | |
CHATMODELS.forEach((chatModel) => { | |
key.chatModels.push(chatModel) | |
}) | |
} | |
}) | |
return result | |
} | |