Spaces:
Runtime error
Runtime error
File size: 5,665 Bytes
41af422 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
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
}
|