From be9eb59fbbcfb87d56f1e9fed7fbabd37c1d96bb Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:11:36 +0800 Subject: [PATCH 01/15] feat: support lingyiwanwu --- README.md | 1 + common/constants.go | 2 ++ common/model-ratio.go | 4 ++++ relay/channel/lingyiwanwu/constants.go | 9 +++++++++ relay/channel/openai/compatible.go | 4 ++++ web/berry/src/constants/ChannelConstants.js | 6 ++++++ web/berry/src/views/Channel/type/Config.js | 3 +++ web/default/src/constants/channel.constants.js | 1 + 8 files changed, 30 insertions(+) create mode 100644 relay/channel/lingyiwanwu/constants.go diff --git a/README.md b/README.md index 8f6c6bf7..0ba659c4 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ _✨ 通过标准的 OpenAI API 格式访问所有的大模型,开箱即用 + [x] [MINIMAX](https://api.minimax.chat/) + [x] [Groq](https://wow.groq.com/) + [x] [Ollama](https://github.com/ollama/ollama) + + [x] [零一万物](https://platform.lingyiwanwu.com/) 2. 支持配置镜像以及众多[第三方代理服务](https://iamazing.cn/page/openai-api-third-party-services)。 3. 支持通过**负载均衡**的方式访问多个渠道。 4. 支持 **stream 模式**,可以通过流式传输实现打字机效果。 diff --git a/common/constants.go b/common/constants.go index f4f575ba..849bdce7 100644 --- a/common/constants.go +++ b/common/constants.go @@ -70,6 +70,7 @@ const ( ChannelTypeMistral ChannelTypeGroq ChannelTypeOllama + ChannelTypeLingYiWanWu ChannelTypeDummy ) @@ -106,6 +107,7 @@ var ChannelBaseURLs = []string{ "https://api.mistral.ai", // 28 "https://api.groq.com/openai", // 29 "http://localhost:11434", // 30 + "https://api.lingyiwanwu.com", // 31 } const ( diff --git a/common/model-ratio.go b/common/model-ratio.go index 5b0a759b..c1b2856d 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -130,6 +130,10 @@ var ModelRatio = map[string]float64{ "llama2-7b-2048": 0.1 / 1000 * USD, "mixtral-8x7b-32768": 0.27 / 1000 * USD, "gemma-7b-it": 0.1 / 1000 * USD, + // https://platform.lingyiwanwu.com/docs#-计费单元 + "yi-34b-chat-0205": 2.5 / 1000000 * RMB, + "yi-34b-chat-200k": 12.0 / 1000000 * RMB, + "yi-vl-plus": 6.0 / 1000000 * RMB, } var CompletionRatio = map[string]float64{} diff --git a/relay/channel/lingyiwanwu/constants.go b/relay/channel/lingyiwanwu/constants.go new file mode 100644 index 00000000..30000e9d --- /dev/null +++ b/relay/channel/lingyiwanwu/constants.go @@ -0,0 +1,9 @@ +package lingyiwanwu + +// https://platform.lingyiwanwu.com/docs + +var ModelList = []string{ + "yi-34b-chat-0205", + "yi-34b-chat-200k", + "yi-vl-plus", +} diff --git a/relay/channel/openai/compatible.go b/relay/channel/openai/compatible.go index 767eec4b..e4951a34 100644 --- a/relay/channel/openai/compatible.go +++ b/relay/channel/openai/compatible.go @@ -5,6 +5,7 @@ import ( "github.com/songquanpeng/one-api/relay/channel/ai360" "github.com/songquanpeng/one-api/relay/channel/baichuan" "github.com/songquanpeng/one-api/relay/channel/groq" + "github.com/songquanpeng/one-api/relay/channel/lingyiwanwu" "github.com/songquanpeng/one-api/relay/channel/minimax" "github.com/songquanpeng/one-api/relay/channel/mistral" "github.com/songquanpeng/one-api/relay/channel/moonshot" @@ -18,6 +19,7 @@ var CompatibleChannels = []int{ common.ChannelTypeMinimax, common.ChannelTypeMistral, common.ChannelTypeGroq, + common.ChannelTypeLingYiWanWu, } func GetCompatibleChannelMeta(channelType int) (string, []string) { @@ -36,6 +38,8 @@ func GetCompatibleChannelMeta(channelType int) (string, []string) { return "mistralai", mistral.ModelList case common.ChannelTypeGroq: return "groq", groq.ModelList + case common.ChannelTypeLingYiWanWu: + return "lingyiwanwu", lingyiwanwu.ModelList default: return "openai", ModelList } diff --git a/web/berry/src/constants/ChannelConstants.js b/web/berry/src/constants/ChannelConstants.js index c0379381..06597b93 100644 --- a/web/berry/src/constants/ChannelConstants.js +++ b/web/berry/src/constants/ChannelConstants.js @@ -101,6 +101,12 @@ export const CHANNEL_OPTIONS = { value: 30, color: 'default' }, + 31: { + key: 31, + text: '零一万物', + value: 31, + color: 'default' + }, 8: { key: 8, text: '自定义渠道', diff --git a/web/berry/src/views/Channel/type/Config.js b/web/berry/src/views/Channel/type/Config.js index c42c0253..8dfe77a4 100644 --- a/web/berry/src/views/Channel/type/Config.js +++ b/web/berry/src/views/Channel/type/Config.js @@ -169,6 +169,9 @@ const typeConfig = { 30: { modelGroup: "ollama", }, + 31: { + modelGroup: "lingyiwanwu", + }, }; export { defaultConfig, typeConfig }; diff --git a/web/default/src/constants/channel.constants.js b/web/default/src/constants/channel.constants.js index c8284ef2..8d536e58 100644 --- a/web/default/src/constants/channel.constants.js +++ b/web/default/src/constants/channel.constants.js @@ -16,6 +16,7 @@ export const CHANNEL_OPTIONS = [ { key: 27, text: 'MiniMax', value: 27, color: 'red' }, { key: 29, text: 'Groq', value: 29, color: 'orange' }, { key: 30, text: 'Ollama', value: 30, color: 'black' }, + { key: 31, text: '零一万物', value: 31, color: 'green' }, { key: 8, text: '自定义渠道', value: 8, color: 'pink' }, { key: 22, text: '知识库:FastGPT', value: 22, color: 'blue' }, { key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple' }, From e3767cbb07b83fc28a41a5257a85cd34acfb209c Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:13:05 +0800 Subject: [PATCH 02/15] fix: fix haiku model name (close #1149) --- common/model-ratio.go | 2 +- relay/channel/anthropic/constants.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/model-ratio.go b/common/model-ratio.go index c1b2856d..044f4f80 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -69,7 +69,7 @@ var ModelRatio = map[string]float64{ "claude-instant-1.2": 0.8 / 1000 * USD, "claude-2.0": 8.0 / 1000 * USD, "claude-2.1": 8.0 / 1000 * USD, - "claude-3-haiku-20240229": 0.25 / 1000 * USD, + "claude-3-haiku-20240307": 0.25 / 1000 * USD, "claude-3-sonnet-20240229": 3.0 / 1000 * USD, "claude-3-opus-20240229": 15.0 / 1000 * USD, // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/hlrk4akp7 diff --git a/relay/channel/anthropic/constants.go b/relay/channel/anthropic/constants.go index fcc0c2a3..cadcedc8 100644 --- a/relay/channel/anthropic/constants.go +++ b/relay/channel/anthropic/constants.go @@ -2,7 +2,7 @@ package anthropic var ModelList = []string{ "claude-instant-1.2", "claude-2.0", "claude-2.1", - "claude-3-haiku-20240229", + "claude-3-haiku-20240307", "claude-3-sonnet-20240229", "claude-3-opus-20240229", } From c28ec1079504529fdc506560de8c74b18b15907a Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:14:39 +0800 Subject: [PATCH 03/15] fix: fix cors for dashboard api --- router/dashboard.go | 1 + 1 file changed, 1 insertion(+) diff --git a/router/dashboard.go b/router/dashboard.go index 0b539d44..5952d698 100644 --- a/router/dashboard.go +++ b/router/dashboard.go @@ -9,6 +9,7 @@ import ( func SetDashboardRouter(router *gin.Engine) { apiRouter := router.Group("/") + apiRouter.Use(middleware.CORS()) apiRouter.Use(gzip.Gzip(gzip.DefaultCompression)) apiRouter.Use(middleware.GlobalAPIRateLimit()) apiRouter.Use(middleware.TokenAuth()) From f33555ae78b96c86834e5c77e0bc7098fc6bae81 Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:17:19 +0800 Subject: [PATCH 04/15] fix: update max token for test (close #1154) --- controller/channel-test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/channel-test.go b/controller/channel-test.go index 6d18305a..67ac91d0 100644 --- a/controller/channel-test.go +++ b/controller/channel-test.go @@ -30,7 +30,7 @@ import ( func buildTestRequest() *relaymodel.GeneralOpenAIRequest { testRequest := &relaymodel.GeneralOpenAIRequest{ - MaxTokens: 1, + MaxTokens: 2, Stream: false, Model: "gpt-3.5-turbo", } From b16917386043bbce6db52ea3bf4f2c8ff57caf0d Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:20:38 +0800 Subject: [PATCH 05/15] fix: force set Accept header for ali stream request (close #1151) --- relay/channel/ali/adaptor.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/relay/channel/ali/adaptor.go b/relay/channel/ali/adaptor.go index 6c6f433e..6a3245ad 100644 --- a/relay/channel/ali/adaptor.go +++ b/relay/channel/ali/adaptor.go @@ -32,6 +32,9 @@ func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Request, meta *util.RelayMeta) error { channel.SetupCommonRequestHeader(c, req, meta) + if meta.IsStream { + req.Header.Set("Accept", "text/event-stream") + } req.Header.Set("Authorization", "Bearer "+meta.APIKey) if meta.IsStream { req.Header.Set("X-DashScope-SSE", "enable") From 8ede66a896053fae4b233fb97701ec3f4919c456 Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:27:47 +0800 Subject: [PATCH 06/15] fix: fix ci --- .github/workflows/docker-image-amd64-en.yml | 8 +++++++- .github/workflows/docker-image-amd64.yml | 8 +++++++- .github/workflows/docker-image-arm64.yml | 8 +++++++- .github/workflows/linux-release.yml | 7 ++++++- .github/workflows/macos-release.yml | 7 ++++++- .github/workflows/windows-release.yml | 7 ++++++- 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-image-amd64-en.yml b/.github/workflows/docker-image-amd64-en.yml index fc0e8994..af488256 100644 --- a/.github/workflows/docker-image-amd64-en.yml +++ b/.github/workflows/docker-image-amd64-en.yml @@ -4,7 +4,6 @@ on: push: tags: - '*' - - '!*-pro*' workflow_dispatch: inputs: name: @@ -21,6 +20,13 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 + - name: Check repository URL + run: | + REPO_URL=$(git config --get remote.origin.url) + if [[ $REPO_URL == *"pro" ]]; then + exit 1 + fi + - name: Save version info run: | git describe --tags > VERSION diff --git a/.github/workflows/docker-image-amd64.yml b/.github/workflows/docker-image-amd64.yml index 983cd877..2079d31f 100644 --- a/.github/workflows/docker-image-amd64.yml +++ b/.github/workflows/docker-image-amd64.yml @@ -4,7 +4,6 @@ on: push: tags: - '*' - - '!*-pro*' workflow_dispatch: inputs: name: @@ -21,6 +20,13 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 + - name: Check repository URL + run: | + REPO_URL=$(git config --get remote.origin.url) + if [[ $REPO_URL == *"pro" ]]; then + exit 1 + fi + - name: Save version info run: | git describe --tags > VERSION diff --git a/.github/workflows/docker-image-arm64.yml b/.github/workflows/docker-image-arm64.yml index d756830f..39d1a401 100644 --- a/.github/workflows/docker-image-arm64.yml +++ b/.github/workflows/docker-image-arm64.yml @@ -5,7 +5,6 @@ on: tags: - '*' - '!*-alpha*' - - '!*-pro*' workflow_dispatch: inputs: name: @@ -22,6 +21,13 @@ jobs: - name: Check out the repo uses: actions/checkout@v3 + - name: Check repository URL + run: | + REPO_URL=$(git config --get remote.origin.url) + if [[ $REPO_URL == *"pro" ]]; then + exit 1 + fi + - name: Save version info run: | git describe --tags > VERSION diff --git a/.github/workflows/linux-release.yml b/.github/workflows/linux-release.yml index b40bd629..6f30a1d5 100644 --- a/.github/workflows/linux-release.yml +++ b/.github/workflows/linux-release.yml @@ -7,7 +7,6 @@ on: tags: - '*' - '!*-alpha*' - - '!*-pro*' workflow_dispatch: inputs: name: @@ -21,6 +20,12 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 + - name: Check repository URL + run: | + REPO_URL=$(git config --get remote.origin.url) + if [[ $REPO_URL == *"pro" ]]; then + exit 1 + fi - uses: actions/setup-node@v3 with: node-version: 16 diff --git a/.github/workflows/macos-release.yml b/.github/workflows/macos-release.yml index 166f15f8..359c2c92 100644 --- a/.github/workflows/macos-release.yml +++ b/.github/workflows/macos-release.yml @@ -7,7 +7,6 @@ on: tags: - '*' - '!*-alpha*' - - '!*-pro*' workflow_dispatch: inputs: name: @@ -21,6 +20,12 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 + - name: Check repository URL + run: | + REPO_URL=$(git config --get remote.origin.url) + if [[ $REPO_URL == *"pro" ]]; then + exit 1 + fi - uses: actions/setup-node@v3 with: node-version: 16 diff --git a/.github/workflows/windows-release.yml b/.github/workflows/windows-release.yml index 02908d15..4e99b75c 100644 --- a/.github/workflows/windows-release.yml +++ b/.github/workflows/windows-release.yml @@ -7,7 +7,6 @@ on: tags: - '*' - '!*-alpha*' - - '!*-pro*' workflow_dispatch: inputs: name: @@ -24,6 +23,12 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 + - name: Check repository URL + run: | + REPO_URL=$(git config --get remote.origin.url) + if [[ $REPO_URL == *"pro" ]]; then + exit 1 + fi - uses: actions/setup-node@v3 with: node-version: 16 From 66efabd5ae540d60e91e6bf3af89b7a9bad06231 Mon Sep 17 00:00:00 2001 From: Jguobao <779188083@qq.com> Date: Thu, 14 Mar 2024 23:31:07 +0800 Subject: [PATCH 07/15] fix: fix baidu url check (#1143) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加百度的另外3个向量模型【"bge-large-zh", "bge-large-en", "tao-8k", 】 --- relay/channel/baidu/adaptor.go | 21 +++++++++++++++++---- relay/channel/baidu/constants.go | 3 +++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/relay/channel/baidu/adaptor.go b/relay/channel/baidu/adaptor.go index 1a96997a..2d2e24f6 100644 --- a/relay/channel/baidu/adaptor.go +++ b/relay/channel/baidu/adaptor.go @@ -3,14 +3,15 @@ package baidu import ( "errors" "fmt" + "io" + "net/http" + "strings" + "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/relay/channel" "github.com/songquanpeng/one-api/relay/constant" "github.com/songquanpeng/one-api/relay/model" "github.com/songquanpeng/one-api/relay/util" - "io" - "net/http" - "strings" ) type Adaptor struct { @@ -23,7 +24,13 @@ func (a *Adaptor) Init(meta *util.RelayMeta) { func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { // https://cloud.baidu.com/doc/WENXINWORKSHOP/s/clntwmv7t suffix := "chat/" - if strings.HasPrefix("Embedding", meta.ActualModelName) { + if strings.HasPrefix(meta.ActualModelName, "Embedding") { + suffix = "embeddings/" + } + if strings.HasPrefix(meta.ActualModelName, "bge-large") { + suffix = "embeddings/" + } + if strings.HasPrefix(meta.ActualModelName, "tao-8k") { suffix = "embeddings/" } switch meta.ActualModelName { @@ -45,6 +52,12 @@ func (a *Adaptor) GetRequestURL(meta *util.RelayMeta) (string, error) { suffix += "bloomz_7b1" case "Embedding-V1": suffix += "embedding-v1" + case "bge-large-zh": + suffix += "bge_large_zh" + case "bge-large-en": + suffix += "bge_large_en" + case "tao-8k": + suffix += "tao_8k" default: suffix += meta.ActualModelName } diff --git a/relay/channel/baidu/constants.go b/relay/channel/baidu/constants.go index 0fa8f2d6..45a4e901 100644 --- a/relay/channel/baidu/constants.go +++ b/relay/channel/baidu/constants.go @@ -7,4 +7,7 @@ var ModelList = []string{ "ERNIE-Speed", "ERNIE-Bot-turbo", "Embedding-V1", + "bge-large-zh", + "bge-large-en", + "tao-8k", } From 7cd57f3125ce60ed0d61bed1edf86409b1be7906 Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:36:10 +0800 Subject: [PATCH 08/15] chore: update ratio for baidu embedding --- common/model-ratio.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/model-ratio.go b/common/model-ratio.go index 044f4f80..4a1a0013 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -78,6 +78,9 @@ var ModelRatio = map[string]float64{ "ERNIE-Bot-4": 0.12 * RMB, // ¥0.12 / 1k tokens "ERNIE-Bot-8k": 0.024 * RMB, "Embedding-V1": 0.1429, // ¥0.002 / 1k tokens + "bge-large-zh": 0.002 * RMB, + "bge-large-en": 0.002 * RMB, + "bge-large-8k": 0.002 * RMB, "PaLM-2": 1, "gemini-pro": 1, // $0.00025 / 1k characters -> $0.001 / 1k tokens "gemini-pro-vision": 1, // $0.00025 / 1k characters -> $0.001 / 1k tokens From 0926b6206bd1c913ac1c7fbc24dba33d385b0426 Mon Sep 17 00:00:00 2001 From: afafw <82748932+afafw@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:44:46 +0800 Subject: [PATCH 09/15] chore: update client name (#934) --- web/berry/src/views/Token/component/TableRow.js | 2 +- web/default/src/components/TokensTable.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/berry/src/views/Token/component/TableRow.js b/web/berry/src/views/Token/component/TableRow.js index 19594b4c..2753764c 100644 --- a/web/berry/src/views/Token/component/TableRow.js +++ b/web/berry/src/views/Token/component/TableRow.js @@ -31,7 +31,7 @@ const COPY_OPTIONS = [ url: 'https://chat.oneapi.pro/#/?settings={"key":"sk-{key}","url":"{serverAddress}"}', encode: false }, - { key: 'ama', text: 'AMA 问天', url: 'ama://set-api-key?server={serverAddress}&key=sk-{key}', encode: true }, + { key: 'ama', text: 'BotGem', url: 'ama://set-api-key?server={serverAddress}&key=sk-{key}', encode: true }, { key: 'opencat', text: 'OpenCat', url: 'opencat://team/join?domain={serverAddress}&token=sk-{key}', encode: true } ]; diff --git a/web/default/src/components/TokensTable.js b/web/default/src/components/TokensTable.js index db4745e4..d6ad2a21 100644 --- a/web/default/src/components/TokensTable.js +++ b/web/default/src/components/TokensTable.js @@ -8,12 +8,12 @@ import { renderQuota } from '../helpers/render'; const COPY_OPTIONS = [ { key: 'next', text: 'ChatGPT Next Web', value: 'next' }, - { key: 'ama', text: 'AMA 问天', value: 'ama' }, + { key: 'ama', text: 'BotGem', value: 'ama' }, { key: 'opencat', text: 'OpenCat', value: 'opencat' }, ]; const OPEN_LINK_OPTIONS = [ - { key: 'ama', text: 'AMA 问天', value: 'ama' }, + { key: 'ama', text: 'BotGem', value: 'ama' }, { key: 'opencat', text: 'OpenCat', value: 'opencat' }, ]; From 3edf7247c49b788d8d268d22d30730e299fb0d09 Mon Sep 17 00:00:00 2001 From: "E.da" <46555117+yooyui@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:45:50 +0800 Subject: [PATCH 10/15] fix: fix theme berry copy (#1148) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整berry主题页脚`label`表述 --- web/berry/src/views/Setting/component/OtherSetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/berry/src/views/Setting/component/OtherSetting.js b/web/berry/src/views/Setting/component/OtherSetting.js index 01f92f77..426b8c81 100644 --- a/web/berry/src/views/Setting/component/OtherSetting.js +++ b/web/berry/src/views/Setting/component/OtherSetting.js @@ -265,7 +265,7 @@ const OtherSetting = () => { multiline maxRows={15} id="Footer" - label="公告" + label="页脚" value={inputs.Footer} name="Footer" onChange={handleInputChange} From 3e2e805d61981fb73c8e03e661e3c5865bbb34d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:46:17 +0800 Subject: [PATCH 11/15] chore(deps): bump google.golang.org/protobuf from 1.30.0 to 1.33.0 (#1145) Bumps google.golang.org/protobuf from 1.30.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4ab23003..8d255cf0 100644 --- a/go.mod +++ b/go.mod @@ -60,6 +60,6 @@ require ( golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 21bcddc6..e8d0aad6 100644 --- a/go.sum +++ b/go.sum @@ -177,8 +177,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= From ebfee3b46cb4e6f9b36a18cfbc7e85e3a96cb913 Mon Sep 17 00:00:00 2001 From: warjiang <1096409085@qq.com> Date: Thu, 14 Mar 2024 23:47:46 +0800 Subject: [PATCH 12/15] feat: add support for private registry in docker-compose.yml (#1103) --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 30edb281..1325a818 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.4' services: one-api: - image: justsong/one-api:latest + image: "${REGISTRY:-docker.io}/justsong/one-api:latest" container_name: one-api restart: always command: --log-dir /app/logs @@ -29,12 +29,12 @@ services: retries: 3 redis: - image: redis:latest + image: "${REGISTRY:-docker.io}/redis:latest" container_name: redis restart: always db: - image: mysql:8.2.0 + image: "${REGISTRY:-docker.io}/mysql:8.2.0" restart: always container_name: mysql volumes: From 996f4d99dded958ecc072c30a241e73c22a4c9fb Mon Sep 17 00:00:00 2001 From: JustSong Date: Thu, 14 Mar 2024 23:53:25 +0800 Subject: [PATCH 13/15] ci: fix ci --- .github/workflows/docker-image-amd64-en.yml | 2 +- .github/workflows/docker-image-amd64.yml | 2 +- .github/workflows/docker-image-arm64.yml | 2 +- .github/workflows/linux-release.yml | 2 +- .github/workflows/macos-release.yml | 2 +- .github/workflows/windows-release.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docker-image-amd64-en.yml b/.github/workflows/docker-image-amd64-en.yml index af488256..92c8a67f 100644 --- a/.github/workflows/docker-image-amd64-en.yml +++ b/.github/workflows/docker-image-amd64-en.yml @@ -24,7 +24,7 @@ jobs: run: | REPO_URL=$(git config --get remote.origin.url) if [[ $REPO_URL == *"pro" ]]; then - exit 1 + exit 0 fi - name: Save version info diff --git a/.github/workflows/docker-image-amd64.yml b/.github/workflows/docker-image-amd64.yml index 2079d31f..9fd20f46 100644 --- a/.github/workflows/docker-image-amd64.yml +++ b/.github/workflows/docker-image-amd64.yml @@ -24,7 +24,7 @@ jobs: run: | REPO_URL=$(git config --get remote.origin.url) if [[ $REPO_URL == *"pro" ]]; then - exit 1 + exit 0 fi - name: Save version info diff --git a/.github/workflows/docker-image-arm64.yml b/.github/workflows/docker-image-arm64.yml index 39d1a401..24b4a4b7 100644 --- a/.github/workflows/docker-image-arm64.yml +++ b/.github/workflows/docker-image-arm64.yml @@ -25,7 +25,7 @@ jobs: run: | REPO_URL=$(git config --get remote.origin.url) if [[ $REPO_URL == *"pro" ]]; then - exit 1 + exit 0 fi - name: Save version info diff --git a/.github/workflows/linux-release.yml b/.github/workflows/linux-release.yml index 6f30a1d5..4b5694e7 100644 --- a/.github/workflows/linux-release.yml +++ b/.github/workflows/linux-release.yml @@ -24,7 +24,7 @@ jobs: run: | REPO_URL=$(git config --get remote.origin.url) if [[ $REPO_URL == *"pro" ]]; then - exit 1 + exit 0 fi - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/macos-release.yml b/.github/workflows/macos-release.yml index 359c2c92..8304de05 100644 --- a/.github/workflows/macos-release.yml +++ b/.github/workflows/macos-release.yml @@ -24,7 +24,7 @@ jobs: run: | REPO_URL=$(git config --get remote.origin.url) if [[ $REPO_URL == *"pro" ]]; then - exit 1 + exit 0 fi - uses: actions/setup-node@v3 with: diff --git a/.github/workflows/windows-release.yml b/.github/workflows/windows-release.yml index 4e99b75c..eb1cbe21 100644 --- a/.github/workflows/windows-release.yml +++ b/.github/workflows/windows-release.yml @@ -27,7 +27,7 @@ jobs: run: | REPO_URL=$(git config --get remote.origin.url) if [[ $REPO_URL == *"pro" ]]; then - exit 1 + exit 0 fi - uses: actions/setup-node@v3 with: From 752639560fd2a6a5c655f66e3ed6a04159faf8db Mon Sep 17 00:00:00 2001 From: JustSong Date: Fri, 15 Mar 2024 00:30:15 +0800 Subject: [PATCH 14/15] feat: able to use separated database for table logs --- README.md | 39 +++++++++++++++++++------------------ main.go | 16 +++++++++++++++- model/log.go | 24 +++++++++++------------ model/main.go | 53 ++++++++++++++++++++++++++++++--------------------- 4 files changed, 78 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 0ba659c4..d0b6b70c 100644 --- a/README.md +++ b/README.md @@ -349,38 +349,39 @@ graph LR + `SQL_MAX_OPEN_CONNS`:最大打开连接数,默认为 `1000`。 + 如果报错 `Error 1040: Too many connections`,请适当减小该值。 + `SQL_CONN_MAX_LIFETIME`:连接的最大生命周期,默认为 `60`,单位分钟。 -4. `FRONTEND_BASE_URL`:设置之后将重定向页面请求到指定的地址,仅限从服务器设置。 +4. `LOG_SQL_DSN`:设置之后将为 `logs` 表使用独立的数据库,请使用 MySQL 或 PostgreSQL。 +5. `FRONTEND_BASE_URL`:设置之后将重定向页面请求到指定的地址,仅限从服务器设置。 + 例子:`FRONTEND_BASE_URL=https://openai.justsong.cn` -5. `MEMORY_CACHE_ENABLED`:启用内存缓存,会导致用户额度的更新存在一定的延迟,可选值为 `true` 和 `false`,未设置则默认为 `false`。 +6. `MEMORY_CACHE_ENABLED`:启用内存缓存,会导致用户额度的更新存在一定的延迟,可选值为 `true` 和 `false`,未设置则默认为 `false`。 + 例子:`MEMORY_CACHE_ENABLED=true` -6. `SYNC_FREQUENCY`:在启用缓存的情况下与数据库同步配置的频率,单位为秒,默认为 `600` 秒。 +7. `SYNC_FREQUENCY`:在启用缓存的情况下与数据库同步配置的频率,单位为秒,默认为 `600` 秒。 + 例子:`SYNC_FREQUENCY=60` -7. `NODE_TYPE`:设置之后将指定节点类型,可选值为 `master` 和 `slave`,未设置则默认为 `master`。 +8. `NODE_TYPE`:设置之后将指定节点类型,可选值为 `master` 和 `slave`,未设置则默认为 `master`。 + 例子:`NODE_TYPE=slave` -8. `CHANNEL_UPDATE_FREQUENCY`:设置之后将定期更新渠道余额,单位为分钟,未设置则不进行更新。 +9. `CHANNEL_UPDATE_FREQUENCY`:设置之后将定期更新渠道余额,单位为分钟,未设置则不进行更新。 + 例子:`CHANNEL_UPDATE_FREQUENCY=1440` -9. `CHANNEL_TEST_FREQUENCY`:设置之后将定期检查渠道,单位为分钟,未设置则不进行检查。 - + 例子:`CHANNEL_TEST_FREQUENCY=1440` -10. `POLLING_INTERVAL`:批量更新渠道余额以及测试可用性时的请求间隔,单位为秒,默认无间隔。 +10. `CHANNEL_TEST_FREQUENCY`:设置之后将定期检查渠道,单位为分钟,未设置则不进行检查。 + + 例子:`CHANNEL_TEST_FREQUENCY=1440` +11. `POLLING_INTERVAL`:批量更新渠道余额以及测试可用性时的请求间隔,单位为秒,默认无间隔。 + 例子:`POLLING_INTERVAL=5` -11. `BATCH_UPDATE_ENABLED`:启用数据库批量更新聚合,会导致用户额度的更新存在一定的延迟可选值为 `true` 和 `false`,未设置则默认为 `false`。 +12. `BATCH_UPDATE_ENABLED`:启用数据库批量更新聚合,会导致用户额度的更新存在一定的延迟可选值为 `true` 和 `false`,未设置则默认为 `false`。 + 例子:`BATCH_UPDATE_ENABLED=true` + 如果你遇到了数据库连接数过多的问题,可以尝试启用该选项。 -12. `BATCH_UPDATE_INTERVAL=5`:批量更新聚合的时间间隔,单位为秒,默认为 `5`。 +13. `BATCH_UPDATE_INTERVAL=5`:批量更新聚合的时间间隔,单位为秒,默认为 `5`。 + 例子:`BATCH_UPDATE_INTERVAL=5` -13. 请求频率限制: +14. 请求频率限制: + `GLOBAL_API_RATE_LIMIT`:全局 API 速率限制(除中继请求外),单 ip 三分钟内的最大请求数,默认为 `180`。 + `GLOBAL_WEB_RATE_LIMIT`:全局 Web 速率限制,单 ip 三分钟内的最大请求数,默认为 `60`。 -14. 编码器缓存设置: +15. 编码器缓存设置: + `TIKTOKEN_CACHE_DIR`:默认程序启动时会联网下载一些通用的词元的编码,如:`gpt-3.5-turbo`,在一些网络环境不稳定,或者离线情况,可能会导致启动有问题,可以配置此目录缓存数据,可迁移到离线环境。 + `DATA_GYM_CACHE_DIR`:目前该配置作用与 `TIKTOKEN_CACHE_DIR` 一致,但是优先级没有它高。 -15. `RELAY_TIMEOUT`:中继超时设置,单位为秒,默认不设置超时时间。 -16. `SQLITE_BUSY_TIMEOUT`:SQLite 锁等待超时设置,单位为毫秒,默认 `3000`。 -17. `GEMINI_SAFETY_SETTING`:Gemini 的安全设置,默认 `BLOCK_NONE`。 -18. `THEME`:系统的主题设置,默认为 `default`,具体可选值参考[此处](./web/README.md)。 -19. `ENABLE_METRIC`:是否根据请求成功率禁用渠道,默认不开启,可选值为 `true` 和 `false`。 -20. `METRIC_QUEUE_SIZE`:请求成功率统计队列大小,默认为 `10`。 -21. `METRIC_SUCCESS_RATE_THRESHOLD`:请求成功率阈值,默认为 `0.8`。 +16. `RELAY_TIMEOUT`:中继超时设置,单位为秒,默认不设置超时时间。 +17. `SQLITE_BUSY_TIMEOUT`:SQLite 锁等待超时设置,单位为毫秒,默认 `3000`。 +18. `GEMINI_SAFETY_SETTING`:Gemini 的安全设置,默认 `BLOCK_NONE`。 +19. `THEME`:系统的主题设置,默认为 `default`,具体可选值参考[此处](./web/README.md)。 +20. `ENABLE_METRIC`:是否根据请求成功率禁用渠道,默认不开启,可选值为 `true` 和 `false`。 +21. `METRIC_QUEUE_SIZE`:请求成功率统计队列大小,默认为 `10`。 +22. `METRIC_SUCCESS_RATE_THRESHOLD`:请求成功率阈值,默认为 `0.8`。 ### 命令行参数 1. `--port `: 指定服务器监听的端口号,默认为 `3000`。 diff --git a/main.go b/main.go index 83d7e7ed..b20c6daf 100644 --- a/main.go +++ b/main.go @@ -30,11 +30,25 @@ func main() { if config.DebugEnabled { logger.SysLog("running in debug mode") } + var err error // Initialize SQL Database - err := model.InitDB() + model.DB, err = model.InitDB("SQL_DSN") if err != nil { logger.FatalLog("failed to initialize database: " + err.Error()) } + if os.Getenv("LOG_SQL_DSN") != "" { + logger.SysLog("using secondary database for table logs") + model.LOG_DB, err = model.InitDB("LOG_SQL_DSN") + if err != nil { + logger.FatalLog("failed to initialize secondary database: " + err.Error()) + } + } else { + model.LOG_DB = model.DB + } + err = model.CreateRootAccountIfNeed() + if err != nil { + logger.FatalLog("database init error: " + err.Error()) + } defer func() { err := model.CloseDB() if err != nil { diff --git a/model/log.go b/model/log.go index 85c0ba90..4409f73e 100644 --- a/model/log.go +++ b/model/log.go @@ -45,7 +45,7 @@ func RecordLog(userId int, logType int, content string) { Type: logType, Content: content, } - err := DB.Create(log).Error + err := LOG_DB.Create(log).Error if err != nil { logger.SysError("failed to record log: " + err.Error()) } @@ -69,7 +69,7 @@ func RecordConsumeLog(ctx context.Context, userId int, channelId int, promptToke Quota: int(quota), ChannelId: channelId, } - err := DB.Create(log).Error + err := LOG_DB.Create(log).Error if err != nil { logger.Error(ctx, "failed to record log: "+err.Error()) } @@ -78,9 +78,9 @@ func RecordConsumeLog(ctx context.Context, userId int, channelId int, promptToke func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName string, username string, tokenName string, startIdx int, num int, channel int) (logs []*Log, err error) { var tx *gorm.DB if logType == LogTypeUnknown { - tx = DB + tx = LOG_DB } else { - tx = DB.Where("type = ?", logType) + tx = LOG_DB.Where("type = ?", logType) } if modelName != "" { tx = tx.Where("model_name = ?", modelName) @@ -107,9 +107,9 @@ func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int64, modelName string, tokenName string, startIdx int, num int) (logs []*Log, err error) { var tx *gorm.DB if logType == LogTypeUnknown { - tx = DB.Where("user_id = ?", userId) + tx = LOG_DB.Where("user_id = ?", userId) } else { - tx = DB.Where("user_id = ? and type = ?", userId, logType) + tx = LOG_DB.Where("user_id = ? and type = ?", userId, logType) } if modelName != "" { tx = tx.Where("model_name = ?", modelName) @@ -128,17 +128,17 @@ func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int } func SearchAllLogs(keyword string) (logs []*Log, err error) { - err = DB.Where("type = ? or content LIKE ?", keyword, keyword+"%").Order("id desc").Limit(config.MaxRecentItems).Find(&logs).Error + err = LOG_DB.Where("type = ? or content LIKE ?", keyword, keyword+"%").Order("id desc").Limit(config.MaxRecentItems).Find(&logs).Error return logs, err } func SearchUserLogs(userId int, keyword string) (logs []*Log, err error) { - err = DB.Where("user_id = ? and type = ?", userId, keyword).Order("id desc").Limit(config.MaxRecentItems).Omit("id").Find(&logs).Error + err = LOG_DB.Where("user_id = ? and type = ?", userId, keyword).Order("id desc").Limit(config.MaxRecentItems).Omit("id").Find(&logs).Error return logs, err } func SumUsedQuota(logType int, startTimestamp int64, endTimestamp int64, modelName string, username string, tokenName string, channel int) (quota int64) { - tx := DB.Table("logs").Select("ifnull(sum(quota),0)") + tx := LOG_DB.Table("logs").Select("ifnull(sum(quota),0)") if username != "" { tx = tx.Where("username = ?", username) } @@ -162,7 +162,7 @@ func SumUsedQuota(logType int, startTimestamp int64, endTimestamp int64, modelNa } func SumUsedToken(logType int, startTimestamp int64, endTimestamp int64, modelName string, username string, tokenName string) (token int) { - tx := DB.Table("logs").Select("ifnull(sum(prompt_tokens),0) + ifnull(sum(completion_tokens),0)") + tx := LOG_DB.Table("logs").Select("ifnull(sum(prompt_tokens),0) + ifnull(sum(completion_tokens),0)") if username != "" { tx = tx.Where("username = ?", username) } @@ -183,7 +183,7 @@ func SumUsedToken(logType int, startTimestamp int64, endTimestamp int64, modelNa } func DeleteOldLog(targetTimestamp int64) (int64, error) { - result := DB.Where("created_at < ?", targetTimestamp).Delete(&Log{}) + result := LOG_DB.Where("created_at < ?", targetTimestamp).Delete(&Log{}) return result.RowsAffected, result.Error } @@ -207,7 +207,7 @@ func SearchLogsByDayAndModel(userId, start, end int) (LogStatistics []*LogStatis groupSelect = "strftime('%Y-%m-%d', datetime(created_at, 'unixepoch')) as day" } - err = DB.Raw(` + err = LOG_DB.Raw(` SELECT `+groupSelect+`, model_name, count(1) as request_count, sum(quota) as quota, diff --git a/model/main.go b/model/main.go index 05150fd9..ca7a35b2 100644 --- a/model/main.go +++ b/model/main.go @@ -17,8 +17,9 @@ import ( ) var DB *gorm.DB +var LOG_DB *gorm.DB -func createRootAccountIfNeed() error { +func CreateRootAccountIfNeed() error { var user User //if user.Status != util.UserStatusEnabled { if err := DB.First(&user).Error; err != nil { @@ -41,9 +42,9 @@ func createRootAccountIfNeed() error { return nil } -func chooseDB() (*gorm.DB, error) { - if os.Getenv("SQL_DSN") != "" { - dsn := os.Getenv("SQL_DSN") +func chooseDB(envName string) (*gorm.DB, error) { + if os.Getenv(envName) != "" { + dsn := os.Getenv(envName) if strings.HasPrefix(dsn, "postgres://") { // Use PostgreSQL logger.SysLog("using PostgreSQL as database") @@ -71,23 +72,22 @@ func chooseDB() (*gorm.DB, error) { }) } -func InitDB() (err error) { - db, err := chooseDB() +func InitDB(envName string) (db *gorm.DB, err error) { + db, err = chooseDB(envName) if err == nil { if config.DebugSQLEnabled { db = db.Debug() } - DB = db - sqlDB, err := DB.DB() + sqlDB, err := db.DB() if err != nil { - return err + return nil, err } sqlDB.SetMaxIdleConns(env.Int("SQL_MAX_IDLE_CONNS", 100)) sqlDB.SetMaxOpenConns(env.Int("SQL_MAX_OPEN_CONNS", 1000)) sqlDB.SetConnMaxLifetime(time.Second * time.Duration(env.Int("SQL_MAX_LIFETIME", 60))) if !config.IsMasterNode { - return nil + return db, err } if common.UsingMySQL { _, _ = sqlDB.Exec("DROP INDEX idx_channels_key ON channels;") // TODO: delete this line when most users have upgraded @@ -95,46 +95,55 @@ func InitDB() (err error) { logger.SysLog("database migration started") err = db.AutoMigrate(&Channel{}) if err != nil { - return err + return nil, err } err = db.AutoMigrate(&Token{}) if err != nil { - return err + return nil, err } err = db.AutoMigrate(&User{}) if err != nil { - return err + return nil, err } err = db.AutoMigrate(&Option{}) if err != nil { - return err + return nil, err } err = db.AutoMigrate(&Redemption{}) if err != nil { - return err + return nil, err } err = db.AutoMigrate(&Ability{}) if err != nil { - return err + return nil, err } err = db.AutoMigrate(&Log{}) if err != nil { - return err + return nil, err } logger.SysLog("database migrated") - err = createRootAccountIfNeed() - return err + return db, err } else { logger.FatalLog(err) } - return err + return db, err } -func CloseDB() error { - sqlDB, err := DB.DB() +func closeDB(db *gorm.DB) error { + sqlDB, err := db.DB() if err != nil { return err } err = sqlDB.Close() return err } + +func CloseDB() error { + if LOG_DB != DB { + err := closeDB(LOG_DB) + if err != nil { + return err + } + } + return closeDB(DB) +} From b204f6d82b73c382e0debdb4f43872b906e07f45 Mon Sep 17 00:00:00 2001 From: JustSong Date: Fri, 15 Mar 2024 00:55:28 +0800 Subject: [PATCH 15/15] docs: update README --- README.md | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index d0b6b70c..0ba659c4 100644 --- a/README.md +++ b/README.md @@ -349,39 +349,38 @@ graph LR + `SQL_MAX_OPEN_CONNS`:最大打开连接数,默认为 `1000`。 + 如果报错 `Error 1040: Too many connections`,请适当减小该值。 + `SQL_CONN_MAX_LIFETIME`:连接的最大生命周期,默认为 `60`,单位分钟。 -4. `LOG_SQL_DSN`:设置之后将为 `logs` 表使用独立的数据库,请使用 MySQL 或 PostgreSQL。 -5. `FRONTEND_BASE_URL`:设置之后将重定向页面请求到指定的地址,仅限从服务器设置。 +4. `FRONTEND_BASE_URL`:设置之后将重定向页面请求到指定的地址,仅限从服务器设置。 + 例子:`FRONTEND_BASE_URL=https://openai.justsong.cn` -6. `MEMORY_CACHE_ENABLED`:启用内存缓存,会导致用户额度的更新存在一定的延迟,可选值为 `true` 和 `false`,未设置则默认为 `false`。 +5. `MEMORY_CACHE_ENABLED`:启用内存缓存,会导致用户额度的更新存在一定的延迟,可选值为 `true` 和 `false`,未设置则默认为 `false`。 + 例子:`MEMORY_CACHE_ENABLED=true` -7. `SYNC_FREQUENCY`:在启用缓存的情况下与数据库同步配置的频率,单位为秒,默认为 `600` 秒。 +6. `SYNC_FREQUENCY`:在启用缓存的情况下与数据库同步配置的频率,单位为秒,默认为 `600` 秒。 + 例子:`SYNC_FREQUENCY=60` -8. `NODE_TYPE`:设置之后将指定节点类型,可选值为 `master` 和 `slave`,未设置则默认为 `master`。 +7. `NODE_TYPE`:设置之后将指定节点类型,可选值为 `master` 和 `slave`,未设置则默认为 `master`。 + 例子:`NODE_TYPE=slave` -9. `CHANNEL_UPDATE_FREQUENCY`:设置之后将定期更新渠道余额,单位为分钟,未设置则不进行更新。 +8. `CHANNEL_UPDATE_FREQUENCY`:设置之后将定期更新渠道余额,单位为分钟,未设置则不进行更新。 + 例子:`CHANNEL_UPDATE_FREQUENCY=1440` -10. `CHANNEL_TEST_FREQUENCY`:设置之后将定期检查渠道,单位为分钟,未设置则不进行检查。 - + 例子:`CHANNEL_TEST_FREQUENCY=1440` -11. `POLLING_INTERVAL`:批量更新渠道余额以及测试可用性时的请求间隔,单位为秒,默认无间隔。 +9. `CHANNEL_TEST_FREQUENCY`:设置之后将定期检查渠道,单位为分钟,未设置则不进行检查。 + + 例子:`CHANNEL_TEST_FREQUENCY=1440` +10. `POLLING_INTERVAL`:批量更新渠道余额以及测试可用性时的请求间隔,单位为秒,默认无间隔。 + 例子:`POLLING_INTERVAL=5` -12. `BATCH_UPDATE_ENABLED`:启用数据库批量更新聚合,会导致用户额度的更新存在一定的延迟可选值为 `true` 和 `false`,未设置则默认为 `false`。 +11. `BATCH_UPDATE_ENABLED`:启用数据库批量更新聚合,会导致用户额度的更新存在一定的延迟可选值为 `true` 和 `false`,未设置则默认为 `false`。 + 例子:`BATCH_UPDATE_ENABLED=true` + 如果你遇到了数据库连接数过多的问题,可以尝试启用该选项。 -13. `BATCH_UPDATE_INTERVAL=5`:批量更新聚合的时间间隔,单位为秒,默认为 `5`。 +12. `BATCH_UPDATE_INTERVAL=5`:批量更新聚合的时间间隔,单位为秒,默认为 `5`。 + 例子:`BATCH_UPDATE_INTERVAL=5` -14. 请求频率限制: +13. 请求频率限制: + `GLOBAL_API_RATE_LIMIT`:全局 API 速率限制(除中继请求外),单 ip 三分钟内的最大请求数,默认为 `180`。 + `GLOBAL_WEB_RATE_LIMIT`:全局 Web 速率限制,单 ip 三分钟内的最大请求数,默认为 `60`。 -15. 编码器缓存设置: +14. 编码器缓存设置: + `TIKTOKEN_CACHE_DIR`:默认程序启动时会联网下载一些通用的词元的编码,如:`gpt-3.5-turbo`,在一些网络环境不稳定,或者离线情况,可能会导致启动有问题,可以配置此目录缓存数据,可迁移到离线环境。 + `DATA_GYM_CACHE_DIR`:目前该配置作用与 `TIKTOKEN_CACHE_DIR` 一致,但是优先级没有它高。 -16. `RELAY_TIMEOUT`:中继超时设置,单位为秒,默认不设置超时时间。 -17. `SQLITE_BUSY_TIMEOUT`:SQLite 锁等待超时设置,单位为毫秒,默认 `3000`。 -18. `GEMINI_SAFETY_SETTING`:Gemini 的安全设置,默认 `BLOCK_NONE`。 -19. `THEME`:系统的主题设置,默认为 `default`,具体可选值参考[此处](./web/README.md)。 -20. `ENABLE_METRIC`:是否根据请求成功率禁用渠道,默认不开启,可选值为 `true` 和 `false`。 -21. `METRIC_QUEUE_SIZE`:请求成功率统计队列大小,默认为 `10`。 -22. `METRIC_SUCCESS_RATE_THRESHOLD`:请求成功率阈值,默认为 `0.8`。 +15. `RELAY_TIMEOUT`:中继超时设置,单位为秒,默认不设置超时时间。 +16. `SQLITE_BUSY_TIMEOUT`:SQLite 锁等待超时设置,单位为毫秒,默认 `3000`。 +17. `GEMINI_SAFETY_SETTING`:Gemini 的安全设置,默认 `BLOCK_NONE`。 +18. `THEME`:系统的主题设置,默认为 `default`,具体可选值参考[此处](./web/README.md)。 +19. `ENABLE_METRIC`:是否根据请求成功率禁用渠道,默认不开启,可选值为 `true` 和 `false`。 +20. `METRIC_QUEUE_SIZE`:请求成功率统计队列大小,默认为 `10`。 +21. `METRIC_SUCCESS_RATE_THRESHOLD`:请求成功率阈值,默认为 `0.8`。 ### 命令行参数 1. `--port `: 指定服务器监听的端口号,默认为 `3000`。