Spaces:
Sleeping
Sleeping
| package common | |
| import ( | |
| "os" | |
| "strconv" | |
| "sync" | |
| "time" | |
| "github.com/google/uuid" | |
| ) | |
| var StartTime = time.Now().Unix() // unit: second | |
| var Version = "v0.0.0" // this hard coding will be replaced automatically when building, no need to manually change | |
| var SystemName = "New API" | |
| var Footer = "" | |
| var Logo = "" | |
| var TopUpLink = "" | |
| // var ChatLink = "" | |
| // var ChatLink2 = "" | |
| var QuotaPerUnit = 500 * 1000.0 // $0.002 / 1K tokens | |
| var DisplayInCurrencyEnabled = true | |
| var DisplayTokenStatEnabled = true | |
| var DrawingEnabled = true | |
| var TaskEnabled = true | |
| var DataExportEnabled = true | |
| var DataExportInterval = 5 // unit: minute | |
| var DataExportDefaultTime = "hour" // unit: minute | |
| var DefaultCollapseSidebar = false // default value of collapse sidebar | |
| // Any options with "Secret", "Token" in its key won't be return by GetOptions | |
| var SessionSecret = uuid.New().String() | |
| var CryptoSecret = uuid.New().String() | |
| var OptionMap map[string]string | |
| var OptionMapRWMutex sync.RWMutex | |
| var ItemsPerPage = 10 | |
| var MaxRecentItems = 100 | |
| var PasswordLoginEnabled = true | |
| var PasswordRegisterEnabled = true | |
| var EmailVerificationEnabled = false | |
| var GitHubOAuthEnabled = false | |
| var LinuxDOOAuthEnabled = false | |
| var WeChatAuthEnabled = false | |
| var TelegramOAuthEnabled = false | |
| var TurnstileCheckEnabled = false | |
| var RegisterEnabled = true | |
| var EmailDomainRestrictionEnabled = false // 是否启用邮箱域名限制 | |
| var EmailAliasRestrictionEnabled = false // 是否启用邮箱别名限制 | |
| var EmailDomainWhitelist = []string{ | |
| "gmail.com", | |
| "163.com", | |
| "126.com", | |
| "qq.com", | |
| "outlook.com", | |
| "hotmail.com", | |
| "icloud.com", | |
| "yahoo.com", | |
| "foxmail.com", | |
| } | |
| var DebugEnabled = os.Getenv("DEBUG") == "true" | |
| var MemoryCacheEnabled = os.Getenv("MEMORY_CACHE_ENABLED") == "true" | |
| var LogConsumeEnabled = true | |
| var SMTPServer = "" | |
| var SMTPPort = 587 | |
| var SMTPSSLEnabled = false | |
| var SMTPAccount = "" | |
| var SMTPFrom = "" | |
| var SMTPToken = "" | |
| var GitHubClientId = "" | |
| var GitHubClientSecret = "" | |
| var LinuxDOClientId = "" | |
| var LinuxDOClientSecret = "" | |
| var WeChatServerAddress = "" | |
| var WeChatServerToken = "" | |
| var WeChatAccountQRCodeImageURL = "" | |
| var TurnstileSiteKey = "" | |
| var TurnstileSecretKey = "" | |
| var TelegramBotToken = "" | |
| var TelegramBotName = "" | |
| var QuotaForNewUser = 0 | |
| var QuotaForInviter = 0 | |
| var QuotaForInvitee = 0 | |
| var ChannelDisableThreshold = 5.0 | |
| var AutomaticDisableChannelEnabled = false | |
| var AutomaticEnableChannelEnabled = false | |
| var QuotaRemindThreshold = 1000 | |
| var PreConsumedQuota = 500 | |
| var RetryTimes = 0 | |
| //var RootUserEmail = "" | |
| var IsMasterNode = os.Getenv("NODE_TYPE") != "slave" | |
| var requestInterval, _ = strconv.Atoi(os.Getenv("POLLING_INTERVAL")) | |
| var RequestInterval = time.Duration(requestInterval) * time.Second | |
| var SyncFrequency = GetEnvOrDefault("SYNC_FREQUENCY", 60) // unit is second | |
| var BatchUpdateEnabled = false | |
| var BatchUpdateInterval = GetEnvOrDefault("BATCH_UPDATE_INTERVAL", 5) | |
| var RelayTimeout = GetEnvOrDefault("RELAY_TIMEOUT", 0) // unit is second | |
| var GeminiSafetySetting = GetEnvOrDefaultString("GEMINI_SAFETY_SETTING", "BLOCK_NONE") | |
| // https://docs.cohere.com/docs/safety-modes Type; NONE/CONTEXTUAL/STRICT | |
| var CohereSafetySetting = GetEnvOrDefaultString("COHERE_SAFETY_SETTING", "NONE") | |
| const ( | |
| RequestIdKey = "X-Oneapi-Request-Id" | |
| ) | |
| const ( | |
| RoleGuestUser = 0 | |
| RoleCommonUser = 1 | |
| RoleAdminUser = 10 | |
| RoleRootUser = 100 | |
| ) | |
| func IsValidateRole(role int) bool { | |
| return role == RoleGuestUser || role == RoleCommonUser || role == RoleAdminUser || role == RoleRootUser | |
| } | |
| var ( | |
| FileUploadPermission = RoleGuestUser | |
| FileDownloadPermission = RoleGuestUser | |
| ImageUploadPermission = RoleGuestUser | |
| ImageDownloadPermission = RoleGuestUser | |
| ) | |
| // All duration's unit is seconds | |
| // Shouldn't larger then RateLimitKeyExpirationDuration | |
| var ( | |
| GlobalApiRateLimitEnable = GetEnvOrDefaultBool("GLOBAL_API_RATE_LIMIT_ENABLE", true) | |
| GlobalApiRateLimitNum = GetEnvOrDefault("GLOBAL_API_RATE_LIMIT", 180) | |
| GlobalApiRateLimitDuration = int64(GetEnvOrDefault("GLOBAL_API_RATE_LIMIT_DURATION", 180)) | |
| GlobalWebRateLimitEnable = GetEnvOrDefaultBool("GLOBAL_WEB_RATE_LIMIT_ENABLE", true) | |
| GlobalWebRateLimitNum = GetEnvOrDefault("GLOBAL_WEB_RATE_LIMIT", 60) | |
| GlobalWebRateLimitDuration = int64(GetEnvOrDefault("GLOBAL_WEB_RATE_LIMIT_DURATION", 180)) | |
| UploadRateLimitNum = 10 | |
| UploadRateLimitDuration int64 = 60 | |
| DownloadRateLimitNum = 10 | |
| DownloadRateLimitDuration int64 = 60 | |
| CriticalRateLimitNum = 20 | |
| CriticalRateLimitDuration int64 = 20 * 60 | |
| ) | |
| var RateLimitKeyExpirationDuration = 20 * time.Minute | |
| const ( | |
| UserStatusEnabled = 1 // don't use 0, 0 is the default value! | |
| UserStatusDisabled = 2 // also don't use 0 | |
| ) | |
| const ( | |
| TokenStatusEnabled = 1 // don't use 0, 0 is the default value! | |
| TokenStatusDisabled = 2 // also don't use 0 | |
| TokenStatusExpired = 3 | |
| TokenStatusExhausted = 4 | |
| ) | |
| const ( | |
| RedemptionCodeStatusEnabled = 1 // don't use 0, 0 is the default value! | |
| RedemptionCodeStatusDisabled = 2 // also don't use 0 | |
| RedemptionCodeStatusUsed = 3 // also don't use 0 | |
| ) | |
| const ( | |
| ChannelStatusUnknown = 0 | |
| ChannelStatusEnabled = 1 // don't use 0, 0 is the default value! | |
| ChannelStatusManuallyDisabled = 2 // also don't use 0 | |
| ChannelStatusAutoDisabled = 3 | |
| ) | |
| const ( | |
| ChannelTypeUnknown = 0 | |
| ChannelTypeOpenAI = 1 | |
| ChannelTypeMidjourney = 2 | |
| ChannelTypeAzure = 3 | |
| ChannelTypeOllama = 4 | |
| ChannelTypeMidjourneyPlus = 5 | |
| ChannelTypeOpenAIMax = 6 | |
| ChannelTypeOhMyGPT = 7 | |
| ChannelTypeCustom = 8 | |
| ChannelTypeAILS = 9 | |
| ChannelTypeAIProxy = 10 | |
| ChannelTypePaLM = 11 | |
| ChannelTypeAPI2GPT = 12 | |
| ChannelTypeAIGC2D = 13 | |
| ChannelTypeAnthropic = 14 | |
| ChannelTypeBaidu = 15 | |
| ChannelTypeZhipu = 16 | |
| ChannelTypeAli = 17 | |
| ChannelTypeXunfei = 18 | |
| ChannelType360 = 19 | |
| ChannelTypeOpenRouter = 20 | |
| ChannelTypeAIProxyLibrary = 21 | |
| ChannelTypeFastGPT = 22 | |
| ChannelTypeTencent = 23 | |
| ChannelTypeGemini = 24 | |
| ChannelTypeMoonshot = 25 | |
| ChannelTypeZhipu_v4 = 26 | |
| ChannelTypePerplexity = 27 | |
| ChannelTypeLingYiWanWu = 31 | |
| ChannelTypeAws = 33 | |
| ChannelTypeCohere = 34 | |
| ChannelTypeMiniMax = 35 | |
| ChannelTypeSunoAPI = 36 | |
| ChannelTypeDify = 37 | |
| ChannelTypeJina = 38 | |
| ChannelCloudflare = 39 | |
| ChannelTypeSiliconFlow = 40 | |
| ChannelTypeVertexAi = 41 | |
| ChannelTypeMistral = 42 | |
| ChannelTypeDeepSeek = 43 | |
| ChannelTypeMokaAI = 44 | |
| ChannelTypeVolcEngine = 45 | |
| ChannelTypeBaiduV2 = 46 | |
| ChannelTypeXinference = 47 | |
| ChannelTypeDummy // this one is only for count, do not add any channel after this | |
| ) | |
| var ChannelBaseURLs = []string{ | |
| "", // 0 | |
| "https://api.openai.com", // 1 | |
| "https://oa.api2d.net", // 2 | |
| "", // 3 | |
| "http://localhost:11434", // 4 | |
| "https://api.openai-sb.com", // 5 | |
| "https://api.openaimax.com", // 6 | |
| "https://api.ohmygpt.com", // 7 | |
| "", // 8 | |
| "https://api.caipacity.com", // 9 | |
| "https://api.aiproxy.io", // 10 | |
| "", // 11 | |
| "https://api.api2gpt.com", // 12 | |
| "https://api.aigc2d.com", // 13 | |
| "https://api.anthropic.com", // 14 | |
| "https://aip.baidubce.com", // 15 | |
| "https://open.bigmodel.cn", // 16 | |
| "https://dashscope.aliyuncs.com", // 17 | |
| "", // 18 | |
| "https://api.360.cn", // 19 | |
| "https://openrouter.ai/api", // 20 | |
| "https://api.aiproxy.io", // 21 | |
| "https://fastgpt.run/api/openapi", // 22 | |
| "https://hunyuan.tencentcloudapi.com", //23 | |
| "https://generativelanguage.googleapis.com", //24 | |
| "https://api.moonshot.cn", //25 | |
| "https://open.bigmodel.cn", //26 | |
| "https://api.perplexity.ai", //27 | |
| "", //28 | |
| "", //29 | |
| "", //30 | |
| "https://api.lingyiwanwu.com", //31 | |
| "", //32 | |
| "", //33 | |
| "https://api.cohere.ai", //34 | |
| "https://api.minimax.chat", //35 | |
| "", //36 | |
| "https://api.dify.ai", //37 | |
| "https://api.jina.ai", //38 | |
| "https://api.cloudflare.com", //39 | |
| "https://api.siliconflow.cn", //40 | |
| "", //41 | |
| "https://api.mistral.ai", //42 | |
| "https://api.deepseek.com", //43 | |
| "https://api.moka.ai", //44 | |
| "https://ark.cn-beijing.volces.com", //45 | |
| "https://qianfan.baidubce.com", //46 | |
| "", //47 | |
| } | |