From cc1b401380da047feaf735700a3add4ec6183874 Mon Sep 17 00:00:00 2001 From: wood Date: Fri, 20 Oct 2023 16:01:55 +0800 Subject: [PATCH] update --- .github/ISSUE_TEMPLATE/config.yml | 2 +- README.en.md | 14 +++--- README.ja.md | 14 +++--- README.md | 20 ++++----- common/constants.go | 4 +- common/init.go | 5 +-- controller/billing.go | 2 +- controller/relay-text.go | 2 +- controller/relay-utils.go | 2 +- controller/relay.go | 2 +- i18n/en.json | 4 +- main.go | 2 +- middleware/utils.go | 2 +- model/channel.go | 6 +-- one-api.service | 2 +- web/public/favicon.ico | Bin 4286 -> 16958 bytes web/public/index.html | 42 +++++++++++------- web/public/logo.png | Bin 8085 -> 5611 bytes web/src/components/ChannelsTable.js | 13 ------ web/src/components/Footer.js | 15 ++----- web/src/components/OtherSetting.js | 2 +- web/src/components/PasswordResetConfirm.js | 2 +- web/src/components/PasswordResetForm.js | 2 +- web/src/components/TokensTable.js | 45 ------------------- web/src/components/UsersTable.js | 20 --------- web/src/constants/channel.constants.js | 12 +---- web/src/constants/common.constant.js | 2 +- web/src/helpers/utils.js | 6 +-- web/src/index.css | 49 ++++++++++++++++++++- web/src/pages/About/index.js | 12 ++--- web/src/pages/Channel/EditChannel.js | 4 +- web/src/pages/Home/index.js | 9 +++- 32 files changed, 140 insertions(+), 178 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 83a0f3f4..38693525 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,7 @@ blank_issues_enabled: false contact_links: - name: 项目群聊 url: https://openai.justsong.cn/ - about: QQ 群:828520184,自动审核,备注 One API + about: QQ 群:828520184,自动审核,备注 CZL Oapi - name: 赞赏支持 url: https://iamazing.cn/page/reward about: 请作者喝杯咖啡,以激励作者持续开发 diff --git a/README.en.md b/README.en.md index 783c140c..3dfee9c4 100644 --- a/README.en.md +++ b/README.en.md @@ -3,12 +3,12 @@

- one-api logo + one-api logo

-# One API +# CZL Oapi _✨ Access all LLM through the standard OpenAI API format, easy to deploy & use ✨_ @@ -197,7 +197,7 @@ If you encounter a blank page after deployment, refer to [#97](https://github.co 6. Automatic deployment will start, but please cancel it for now. Go to the Variable tab, add a `PORT` with a value of `3000`, and then add a `SQL_DSN` with a value of `:@tcp(:)/one-api`. Save the changes. Please note that if `SQL_DSN` is not set, data will not be persisted, and the data will be lost after redeployment. 7. Select Redeploy. 8. In the Domains tab, select a suitable domain name prefix, such as "my-one-api". The final domain name will be "my-one-api.zeabur.app". You can also CNAME your own domain name. -9. Wait for the deployment to complete, and click on the generated domain name to access One API. +9. Wait for the deployment to complete, and click on the generated domain name to access CZL Oapi.
@@ -212,16 +212,16 @@ After the system starts, log in as the `root` user to further configure the syst ## Usage Add your API Key on the `Channels` page, and then add an access token on the `Tokens` page. -You can then use your access token to access One API. The usage is consistent with the [OpenAI API](https://platform.openai.com/docs/api-reference/introduction). +You can then use your access token to access CZL Oapi. The usage is consistent with the [OpenAI API](https://platform.openai.com/docs/api-reference/introduction). -In places where the OpenAI API is used, remember to set the API Base to your One API deployment address, for example: `https://openai.justsong.cn`. The API Key should be the token generated in One API. +In places where the OpenAI API is used, remember to set the API Base to your CZL Oapi deployment address, for example: `https://openai.justsong.cn`. The API Key should be the token generated in CZL Oapi. Note that the specific API Base format depends on the client you are using. ```mermaid graph LR A(User) - A --->|Request| B(One API) + A --->|Request| B(CZL Oapi) B -->|Relay Request| C(OpenAI) B -->|Relay Request| D(Azure) B -->|Relay Request| E(Other downstream channels) @@ -265,7 +265,7 @@ If the channel ID is not provided, load balancing will be used to distribute the ![token](https://user-images.githubusercontent.com/39998050/233837971-dab488b7-6d96-43af-b640-a168e8d1c9bf.png) ## FAQ -1. What is quota? How is it calculated? Does One API have quota calculation issues? +1. What is quota? How is it calculated? Does CZL Oapi have quota calculation issues? + Quota = Group multiplier * Model multiplier * (number of prompt tokens + number of completion tokens * completion multiplier) + The completion multiplier is fixed at 1.33 for GPT3.5 and 2 for GPT4, consistent with the official definition. + If it is not a stream mode, the official API will return the total number of tokens consumed. However, please note that the consumption multipliers for prompts and completions are different. diff --git a/README.ja.md b/README.ja.md index fa3339c2..28694348 100644 --- a/README.ja.md +++ b/README.ja.md @@ -3,12 +3,12 @@

- one-api logo + one-api logo

-# One API +# CZL Oapi _✨ 標準的な OpenAI API フォーマットを通じてすべての LLM にアクセスでき、導入と利用が容易です ✨_ @@ -198,7 +198,7 @@ Please refer to the [environment variables](#environment-variables) section for 6. 自動デプロイが開始されますが、一旦キャンセルしてください。Variable タブで `PORT` に `3000` を追加し、`SQL_DSN` に `:@tcp(:)/one-api` を追加します。変更を保存する。SQL_DSN` が設定されていないと、データが永続化されず、再デプロイ後にデータが失われるので注意すること。 7. 再デプロイを選択します。 8. Domains タブで、"my-one-api" のような適切なドメイン名の接頭辞を選択する。最終的なドメイン名は "my-one-api.zeabur.app" となります。独自のドメイン名を CNAME することもできます。 -9. デプロイが完了するのを待ち、生成されたドメイン名をクリックして One API にアクセスします。 +9. デプロイが完了するのを待ち、生成されたドメイン名をクリックして CZL Oapi にアクセスします。
@@ -213,16 +213,16 @@ Please refer to the [environment variables](#environment-variables) section for ## 使用方法 `Channels` ページで API Key を追加し、`Tokens` ページでアクセストークンを追加する。 -アクセストークンを使って One API にアクセスすることができる。使い方は [OpenAI API](https://platform.openai.com/docs/api-reference/introduction) と同じです。 +アクセストークンを使って CZL Oapi にアクセスすることができる。使い方は [OpenAI API](https://platform.openai.com/docs/api-reference/introduction) と同じです。 -OpenAI API が使用されている場所では、API Base に One API のデプロイアドレスを設定することを忘れないでください(例: `https://openai.justsong.cn`)。API Key は One API で生成されたトークンでなければなりません。 +OpenAI API が使用されている場所では、API Base に CZL Oapi のデプロイアドレスを設定することを忘れないでください(例: `https://openai.justsong.cn`)。API Key は CZL Oapi で生成されたトークンでなければなりません。 具体的な API Base のフォーマットは、使用しているクライアントに依存することに注意してください。 ```mermaid graph LR A(ユーザ) - A --->|リクエスト| B(One API) + A --->|リクエスト| B(CZL Oapi) B -->|中継リクエスト| C(OpenAI) B -->|中継リクエスト| D(Azure) B -->|中継リクエスト| E(その他のダウンストリームチャンネル) @@ -266,7 +266,7 @@ graph LR ![token](https://user-images.githubusercontent.com/39998050/233837971-dab488b7-6d96-43af-b640-a168e8d1c9bf.png) ## FAQ -1. ノルマとは何か?どのように計算されますか?One API にはノルマ計算の問題はありますか? +1. ノルマとは何か?どのように計算されますか?CZL Oapi にはノルマ計算の問題はありますか? + ノルマ = グループ倍率 * モデル倍率 * (プロンプトトークンの数 + 完了トークンの数 * 完了倍率) + 完了倍率は、公式の定義と一致するように、GPT3.5 では 1.33、GPT4 では 2 に固定されています。 + ストリームモードでない場合、公式 API は消費したトークンの総数を返す。ただし、プロンプトとコンプリートの消費倍率は異なるので注意してください。 diff --git a/README.md b/README.md index 5d807e2d..22e8b645 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,12 @@

- one-api logo + one-api logo

-# One API +# CZL Oapi _✨ 通过标准的 OpenAI API 格式访问所有的大模型,开箱即用 ✨_ @@ -201,7 +201,7 @@ sudo service nginx restart 如果部署后访问出现空白页面,详见 [#97](https://github.com/songquanpeng/one-api/issues/97)。 -### 部署第三方服务配合 One API 使用 +### 部署第三方服务配合 CZL Oapi 使用 > 欢迎 PR 添加更多示例。 #### ChatGPT Next Web @@ -225,7 +225,7 @@ docker run --name chatgpt-web -d -p 3002:3002 -e OPENAI_API_BASE_URL=https://ope #### QChatGPT - QQ机器人 项目主页:https://github.com/RockChinQ/QChatGPT -根据文档完成部署后,在`config.py`设置配置项`openai_config`的`reverse_proxy`为 One API 后端地址,设置`api_key`为 One API 生成的key,并在配置项`completion_api_params`的`model`参数设置为 One API 支持的模型名称。 +根据文档完成部署后,在`config.py`设置配置项`openai_config`的`reverse_proxy`为 CZL Oapi 后端地址,设置`api_key`为 CZL Oapi 生成的key,并在配置项`completion_api_params`的`model`参数设置为 CZL Oapi 支持的模型名称。 可安装 [Switcher 插件](https://github.com/RockChinQ/Switcher)在运行时切换所使用的模型。 @@ -257,7 +257,7 @@ docker run --name chatgpt-web -d -p 3002:3002 -e OPENAI_API_BASE_URL=https://ope 6. Deploy 会自动开始,先取消。进入下方 Variable,添加一个 `PORT`,值为 `3000`,再添加一个 `SQL_DSN`,值为 `:@tcp(:)/one-api` ,然后保存。 注意如果不填写 `SQL_DSN`,数据将无法持久化,重新部署后数据会丢失。 7. 选择 Redeploy。 8. 进入下方 Domains,选择一个合适的域名前缀,如 "my-one-api",最终域名为 "my-one-api.zeabur.app",也可以 CNAME 自己的域名。 -9. 等待部署完成,点击生成的域名进入 One API。 +9. 等待部署完成,点击生成的域名进入 CZL Oapi。
@@ -285,9 +285,9 @@ Render 可以直接部署 docker 镜像,不需要 fork 仓库:https://dashbo ## 使用方法 在`渠道`页面中添加你的 API Key,之后在`令牌`页面中新增访问令牌。 -之后就可以使用你的令牌访问 One API 了,使用方式与 [OpenAI API](https://platform.openai.com/docs/api-reference/introduction) 一致。 +之后就可以使用你的令牌访问 CZL Oapi 了,使用方式与 [OpenAI API](https://platform.openai.com/docs/api-reference/introduction) 一致。 -你需要在各种用到 OpenAI API 的地方设置 API Base 为你的 One API 的部署地址,例如:`https://openai.justsong.cn`,API Key 则为你在 One API 中生成的令牌。 +你需要在各种用到 OpenAI API 的地方设置 API Base 为你的 CZL Oapi 的部署地址,例如:`https://openai.justsong.cn`,API Key 则为你在 CZL Oapi 中生成的令牌。 注意,具体的 API Base 的格式取决于你所使用的客户端。 @@ -300,7 +300,7 @@ OPENAI_API_BASE="https://:/v1" ```mermaid graph LR A(用户) - A --->|使用 One API 分发的 key 进行请求| B(One API) + A --->|使用 CZL Oapi 分发的 key 进行请求| B(CZL Oapi) B -->|中继请求| C(OpenAI) B -->|中继请求| D(Azure) B -->|中继请求| E(其他 OpenAI API 格式下游渠道) @@ -371,11 +371,11 @@ https://openai.justsong.cn ![token](https://user-images.githubusercontent.com/39998050/233837971-dab488b7-6d96-43af-b640-a168e8d1c9bf.png) ## 常见问题 -1. 额度是什么?怎么计算的?One API 的额度计算有问题? +1. 额度是什么?怎么计算的?CZL Oapi 的额度计算有问题? + 额度 = 分组倍率 * 模型倍率 * (提示 token 数 + 补全 token 数 * 补全倍率) + 其中补全倍率对于 GPT3.5 固定为 1.33,GPT4 为 2,与官方保持一致。 + 如果是非流模式,官方接口会返回消耗的总 token,但是你要注意提示和补全的消耗倍率不一样。 - + 注意,One API 的默认倍率就是官方倍率,是已经调整过的。 + + 注意,CZL Oapi 的默认倍率就是官方倍率,是已经调整过的。 2. 账户额度足够为什么提示额度不足? + 请检查你的令牌额度是否足够,这个和账户额度是分开的。 + 令牌额度仅供用户设置最大使用量,用户可自由设置。 diff --git a/common/constants.go b/common/constants.go index a0361c35..21b61dba 100644 --- a/common/constants.go +++ b/common/constants.go @@ -11,7 +11,7 @@ import ( 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 = "One API" +var SystemName = "CZL Oapi" var ServerAddress = "http://localhost:3000" var Footer = "" var Logo = "" @@ -31,7 +31,7 @@ var SQLitePath = "one-api.db" var OptionMap map[string]string var OptionMapRWMutex sync.RWMutex -var ItemsPerPage = 10 +var ItemsPerPage = 20 var MaxRecentItems = 100 var PasswordLoginEnabled = true diff --git a/common/init.go b/common/init.go index 1e9c85ce..3b64313b 100644 --- a/common/init.go +++ b/common/init.go @@ -16,9 +16,8 @@ var ( ) func printHelp() { - fmt.Println("One API " + Version + " - All in one API service for OpenAI API.") - fmt.Println("Copyright (C) 2023 JustSong. All rights reserved.") - fmt.Println("GitHub: https://github.com/songquanpeng/one-api") + fmt.Println("CZL Oapi " + Version + " - All in CZL Oapi service for OpenAI API.") + fmt.Println("Copyright (C) 2023 CZL. All rights reserved.") fmt.Println("Usage: one-api [--port ] [--log-dir ] [--version] [--help]") } diff --git a/controller/billing.go b/controller/billing.go index 42e86aea..7bdf6c0a 100644 --- a/controller/billing.go +++ b/controller/billing.go @@ -71,7 +71,7 @@ func GetUsage(c *gin.Context) { if err != nil { openAIError := OpenAIError{ Message: err.Error(), - Type: "one_api_error", + Type: "czloapi_error", } c.JSON(200, gin.H{ "error": openAIError, diff --git a/controller/relay-text.go b/controller/relay-text.go index db1ec3a2..234c7e5d 100644 --- a/controller/relay-text.go +++ b/controller/relay-text.go @@ -341,7 +341,7 @@ func relayTextHelper(c *gin.Context, relayMode int) *OpenAIErrorWithStatusCode { req.Header.Set("Authorization", c.Request.Header.Get("Authorization")) if channelType == common.ChannelTypeOpenRouter { req.Header.Set("HTTP-Referer", "https://github.com/songquanpeng/one-api") - req.Header.Set("X-Title", "One API") + req.Header.Set("X-Title", "CZL Oapi") } } case APITypeClaude: diff --git a/controller/relay-utils.go b/controller/relay-utils.go index 4775ec88..71791877 100644 --- a/controller/relay-utils.go +++ b/controller/relay-utils.go @@ -117,7 +117,7 @@ func countTokenText(text string, model string) int { func errorWrapper(err error, code string, statusCode int) *OpenAIErrorWithStatusCode { openAIError := OpenAIError{ Message: err.Error(), - Type: "one_api_error", + Type: "czloapi_error", Code: code, } return &OpenAIErrorWithStatusCode{ diff --git a/controller/relay.go b/controller/relay.go index 1926110e..d0d2f137 100644 --- a/controller/relay.go +++ b/controller/relay.go @@ -227,7 +227,7 @@ func Relay(c *gin.Context) { func RelayNotImplemented(c *gin.Context) { err := OpenAIError{ Message: "API not implemented", - Type: "one_api_error", + Type: "czloapi_error", Param: "", Code: "api_not_implemented", } diff --git a/i18n/en.json b/i18n/en.json index 9b2ca4c8..89ba6cf3 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -242,7 +242,7 @@ "保存首页内容": "Save Home Page Content", "在此输入新的关于内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为关于页面": "Enter new about content here, supports Markdown & HTML code. If a link is entered, it will be used as the src attribute of the iframe, allowing you to set any webpage as the about page.", "保存关于": "Save About", - "移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Removal of One API copyright mark must first be authorized. Project maintenance requires a lot of effort. If this project is meaningful to you, please actively support it.", + "移除 CZL Oapi 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目": "Removal of CZL Oapi copyright mark must first be authorized. Project maintenance requires a lot of effort. If this project is meaningful to you, please actively support it.", "页脚": "Footer", "在此输入新的页脚,留空则使用默认页脚,支持 HTML 代码": "Enter the new footer here, leave blank to use the default footer, supports HTML code.", "设置页脚": "Set Footer", @@ -505,7 +505,7 @@ "请输入显示名称": "Please enter display name", "请输入密码": "Please enter password", "模型部署名称必须和模型名称保持一致": "The model deployment name must be consistent with the model name", - ",因为 One API 会把请求体中的 model": ", because One API will take the model in the request body", + ",因为 CZL Oapi 会把请求体中的 model": ", because CZL Oapi will take the model in the request body", "请输入 AZURE_OPENAI_ENDPOINT": "Please enter AZURE_OPENAI_ENDPOINT", "请输入自定义渠道的 Base URL": "Please enter the Base URL of the custom channel", "Homepage URL 填": "Fill in the Homepage URL", diff --git a/main.go b/main.go index 88938516..b7c1e70c 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ var indexPage []byte func main() { common.SetupLogger() - common.SysLog("One API " + common.Version + " started") + common.SysLog("CZL Oapi " + common.Version + " started") if os.Getenv("GIN_MODE") != "debug" { gin.SetMode(gin.ReleaseMode) } diff --git a/middleware/utils.go b/middleware/utils.go index 536125cc..19b4cc57 100644 --- a/middleware/utils.go +++ b/middleware/utils.go @@ -9,7 +9,7 @@ func abortWithMessage(c *gin.Context, statusCode int, message string) { c.JSON(statusCode, gin.H{ "error": gin.H{ "message": common.MessageWithRequestId(message, c.GetString(common.RequestIdKey)), - "type": "one_api_error", + "type": "czloapi_error", }, }) c.Abort() diff --git a/model/channel.go b/model/channel.go index 091a0d71..e79ec9b2 100644 --- a/model/channel.go +++ b/model/channel.go @@ -45,11 +45,7 @@ func SearchChannels(keyword string) (channels []*Channel, err error) { func GetChannelById(id int, selectAll bool) (*Channel, error) { channel := Channel{Id: id} var err error = nil - if selectAll { - err = DB.First(&channel, "id = ?", id).Error - } else { - err = DB.Omit("key").First(&channel, "id = ?", id).Error - } + err = DB.First(&channel, "id = ?", id).Error return &channel, err } diff --git a/one-api.service b/one-api.service index 17e236bc..3dcddb8a 100644 --- a/one-api.service +++ b/one-api.service @@ -4,7 +4,7 @@ # sudo systemctl enable one-api # sudo systemctl status one-api [Unit] -Description=One API Service +Description=CZL Oapi Service After=network.target [Service] diff --git a/web/public/favicon.ico b/web/public/favicon.ico index c2c8de0c5435fe2ffd94ef6da10fa2662cd9ea17..385421c8125e2ca9df44ef40394073fb8ffa30c0 100644 GIT binary patch literal 16958 zcmeI4eN2^A9LFDDW{tT5Q$yswfaJI@pp_$64oK7POr26WcD3BpRW_$~qm~l|!YgSi zDJmeSBVW=i3C~E&eCr9xSG;4*xx1FFJ@b#&u>Wugr_T+Q%R@CU1nE4NUCw>raL)aF zKj)t3{QN^r>%&)Orp9->mONh5hH9FY%#$B!`8-2E|Lc+2)~N3)0hNGCKqa6OPzk66 zR01jim4He>C7=>e38(~A0xAKOfJ#6maQ`N7v2v7lu`>1eh4PfrbEPS-o!R6X|NRE1 z`&4mqQr%j|$ZuCW(@qw-vX1+mxyK3}`@YF{)_=Xi6+E2lHojcyFlyf&X^5Q1o~v1s zIG}oQ;`sv$?Z#&dY{sXr+l{^RZN{FtHe>f3i?Q<+i&5pZ8auKr#VNe+YgFzdW}kMZz!Pm+(vYrM|`~PZl{P{1Sc%zl2{N z&UH!nCHzw4B-I^!J4vfvl;DG3!Y|>M@Jsk5{1Sc%zl2}HFX5N)OZX-H5`I}SDM7+7 z;g|4B_$B-jehI&XU&1fpmwBl}<#Jc7T;`1XeW_!3c2_e9Y#SBZfxjf2KiS0Z4C8mp zL+$+Xpl`&a1B()(;J^Cs{MMWN7Fpf}{=&}u@;%4!mUkTSFLfn@z_!r?;cp4^zZw7Y z@n4GnYW&yWU*KQhU*KQhU*KQhU*KQhU)1KpeD;3`yZ>Kj|1anK zlirp0x_6%K4g5FZzX|_M?Eg*d|ChJV9R8qrJpAwG^WTL3Cj2+C|2MJ!?>6`A>Fd)a zu7U8EaR0lG|MvU;D(ARJ=l*1#HEPdXYXkg2_=E5VcVt_G+h@klG>^6E`Ghg>2RBTx z2jLIGAA~=+_L(7ebKl;$KDFLq{cf$JF6{hwiTnS+-kAGtnFIdmVf>-pvU+Ui^FU@8$gCT{Cu&)!er?uHo-X{ZrTB z{9oWabR^Fe9m)K==2(32o6rA7#SCkweE|Mi_|514{gKS~U-pGR3I5;O>Yv-^|DUM; zCLdnrx}&Lfy&4|{zYqUD_CFu~eHB?2-_{w{MDqafC&TZc;&WyL?U&p_We;xli^^d-4 zOpM#yw>PhkzVGM@|7_|%)_;fkKg2KLmv>(OTW;0=KbKCib=n7t(}x{`-(3Ii>rLK& zn(M3O?*4rCv#EcNu>Sv`{*8dYz5c)b?;lg_o$8(S>5q>68~&D+PyD}Yz?=#EgW=D@ z|7!eK{Rg=J1z7(9>i+=se}MWw!1=#+^W=mMHRrnY zAsYNutp7&VeC7=>e38(~A0xAKOfJ#6mpb}6Cs0363 zDgl*%Nsu}5oOLB6K-ldYO|g8$jzW~<58XzdCX^IC0fK(yCZgkFc*hiOC4 z(4(lWktgL1TR&c3p)I6s&TIR{jf|VEO+Ijfm#w${Fw{Bp$k+N^%cH%b^|_Wo+pP6z P4z*I#nr)%>o_hQVJkNQJ literal 4286 zcmcK5f2@^r9KiAC+*_U7FZW6~P3jh@`708|s#_stq~%w{YHS)?zeHKdJr#E}G5Uj< zG0jq=#@JY~drMOMW1_Nf?hXB}tDm>rI^OT&e(l-WJ#IC9>~;G-&-p&zAD{2%c|=iy z|H{iF|3>eXMbSl36!ihOq6&CF7yR}=MT&7IV+{`A6pmptUPXT-a4upPgVvxCSu|ij z4mDkSuMRWO5oa6idGK01ggKan+4v34u@%o^1g^sMn1oeuZCZ>DIFo2a=TZ0s=GM9L z{mH$D(Oix_W%q8Mzc2$uIGt!qC-+(p=iGzUcoT19EgaY1cH%``f&3`uhPiV7TJ%Os z;WMuLc$2sI*E(tk!@YW*p8xwe2G`*^OoL?~k4{{ygMHpWKO|8o2JwUYJ%KdLMWJv_ zcjHSqzMRW@VZAhSH4}c{$MrG{^oP7?&Gi!4cLnlm#`7~5LlIw>dv@>Uz-P_LYp`~W z(eMm>N5Z*TzYic@6Fs^1oP2&H;^Eo7gxxrbE(E z{k#q_oW^ndgf2}t-P_|$_rl(+#cgmc&esbeT+c$dzwS*p!~8#ReLk#-kmqk{hjosj z?Hn7B!aev3-jnBi7d#i|Tm-*4=H2{X2xB%1%^&)d(`OSJ@f3`k;r@TeXNcGKRIbCb zG;=lVT0Advdj#t-7F96+&Fw!v#$5WiuZ=J~zdsQ6yNh;n`Sly;`5%OHj)OJ74&L** z3|gB1Ci+;DK4Vy?esfOZV>nNKeVKE|cYoG}^%0^ojVZ{W4lT{!pFX}1&Swo+3+{a> z;(2n8>9FPw!85Bup_tDP@$>gwJ)<8HA9n=T;hnSw9CtG=gOR`}Sa+^-8SaJkF%N~} zX?}42u4soR;l4a)|GyBzF}%M4{$@Kqu64e)>Atyci%Vec-D9Dc!w=Tc{rCW`{R^0f zA{dur3*7TeSOeDnNQ5Y*;hEUSXN^lyhZnpk5U$N<4#PPfLnnl|n8tF1oH(X6;2H)X zg!6v`$MPFu*f#_7YhF_b;kf3>_3gm(=!p=;GzQ~SoPxD}I}CHw-2R)J|5y4tzR&yn zc-)8eaGa&M4%SbIJ~UpzUbt`Vg!c_=z=D z*Nw363UonxG?#zZZZ2CPL=PHO*nte3s{xL;1(VSkhBF;@;jK9 zkf*M+YZ2com$^vr_Zlq0VeCTw_nTX}ckCGdI!?Ski?|+-?Qji8;Tk>LJ7BcM%W!=A z`~uI;e1%BT7=(Us%y@LnS}3QA9M8)JgYLechAIm-IM3y+zpt4Vzd;!=wObm zfi&VZ$7L?c`Rl&IxgDbIdf$aPuEsvN#{HOu5}Z!B{wZ*8p7~r{fc&uEMEL!2o_x;l zd+&GrboNcRf1@3(MKE{1$7?VR!!Qt|VV(aB=dFd`oayiz{UEM}wR^VV8m7Xt2z&D# zGS|Kz-gAA{K%DzRZ%Icz2Iz2DdCRvv%NoG>1WTq@NA~PX1G@VXW z6em&@9TFusQv1WB9+g8YYbz@z)?_AhpI<*9DsJo+B^yhlQVw!RHY&|#tGj3a29D#m A;s5{u diff --git a/web/public/index.html b/web/public/index.html index b8e324d2..e721a79f 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -1,18 +1,26 @@ - - - - - - - - One API - - - -
- - + + + + + + + + + CZLOapi + + + + + +
+ + + + + \ No newline at end of file diff --git a/web/public/logo.png b/web/public/logo.png index 0f237a226583e08f89f14a15d86aa330a11151ae..20633a2dc8da8cec62f796796ef0e5ac3d50ba2f 100644 GIT binary patch literal 5611 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 GJ`k%+d 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 diff --git a/web/src/components/ChannelsTable.js b/web/src/components/ChannelsTable.js index 732189cb..b8ab597e 100644 --- a/web/src/components/ChannelsTable.js +++ b/web/src/components/ChannelsTable.js @@ -317,19 +317,6 @@ const ChannelsTable = () => { onChange={handleKeywordChange} /> - { - showPrompt && ( - { - setShowPrompt(false); - setPromptShown("channel-test"); - }}> - 当前版本测试是通过按照 OpenAI API 格式使用 gpt-3.5-turbo - 模型进行非流式请求实现的,因此测试报错并不一定代表通道不可用,该功能后续会修复。 - - 另外,OpenAI 渠道已经不再支持通过 key 获取余额,因此余额显示为 0。对于支持的渠道类型,请点击余额进行刷新。 - - ) - } diff --git a/web/src/components/Footer.js b/web/src/components/Footer.js index 334ee379..b502b825 100644 --- a/web/src/components/Footer.js +++ b/web/src/components/Footer.js @@ -28,7 +28,7 @@ const Footer = () => { }, []); return ( - + {footer ? (
{ >
) : ( )} diff --git a/web/src/components/OtherSetting.js b/web/src/components/OtherSetting.js index 526a7d86..50fe5511 100644 --- a/web/src/components/OtherSetting.js +++ b/web/src/components/OtherSetting.js @@ -165,7 +165,7 @@ const OtherSetting = () => { /> 保存关于 - 移除 One API 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目。 + 移除 CZL Oapi 的版权标识必须首先获得授权,项目维护需要花费大量精力,如果本项目对你有意义,请主动支持本项目。 {
- 密码重置确认 + 密码重置确认
diff --git a/web/src/components/PasswordResetForm.js b/web/src/components/PasswordResetForm.js index f3610d3a..bd187a2d 100644 --- a/web/src/components/PasswordResetForm.js +++ b/web/src/components/PasswordResetForm.js @@ -59,7 +59,7 @@ const PasswordResetForm = () => {
- 密码重置 + 密码重置
diff --git a/web/src/components/TokensTable.js b/web/src/components/TokensTable.js index a3bb6f91..bf3a13b6 100644 --- a/web/src/components/TokensTable.js +++ b/web/src/components/TokensTable.js @@ -6,16 +6,6 @@ import { API, copy, showError, showSuccess, showWarning, timestamp2string } from import { ITEMS_PER_PAGE } from '../constants'; import { renderQuota } from '../helpers/render'; -const COPY_OPTIONS = [ - { key: 'next', text: 'ChatGPT Next Web', value: 'next' }, - { key: 'ama', text: 'AMA 问天', value: 'ama' }, - { key: 'opencat', text: 'OpenCat', value: 'opencat' }, -]; - -const OPEN_LINK_OPTIONS = [ - { key: 'ama', text: 'AMA 问天', value: 'ama' }, - { key: 'opencat', text: 'OpenCat', value: 'opencat' }, -]; function renderTimestamp(timestamp) { return ( @@ -324,7 +314,6 @@ const TokensTable = () => { {token.expired_time === -1 ? '永不过期' : renderTimestamp(token.expired_time)}
- - ({ - ...option, - onClick: async () => { - await onCopy(option.value, token.key); - } - }))} - trigger={<>} - /> - - {' '} - - - ({ - ...option, - onClick: async () => { - await onOpenLink(option.value, token.key); - } - }))} - trigger={<>} - /> - {' '} { {renderStatus(user.status)}
- - diff --git a/web/src/constants/channel.constants.js b/web/src/constants/channel.constants.js index 76407745..34cddd6e 100644 --- a/web/src/constants/channel.constants.js +++ b/web/src/constants/channel.constants.js @@ -11,15 +11,5 @@ export const CHANNEL_OPTIONS = [ { key: 23, text: '腾讯混元', value: 23, color: 'teal' }, { key: 8, text: '自定义渠道', value: 8, color: 'pink' }, { key: 22, text: '知识库:FastGPT', value: 22, color: 'blue' }, - { key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple' }, - { key: 20, text: '代理:OpenRouter', value: 20, color: 'black' }, - { key: 2, text: '代理:API2D', value: 2, color: 'blue' }, - { key: 5, text: '代理:OpenAI-SB', value: 5, color: 'brown' }, - { key: 7, text: '代理:OhMyGPT', value: 7, color: 'purple' }, - { key: 10, text: '代理:AI Proxy', value: 10, color: 'purple' }, - { key: 4, text: '代理:CloseAI', value: 4, color: 'teal' }, - { key: 6, text: '代理:OpenAI Max', value: 6, color: 'violet' }, - { key: 9, text: '代理:AI.LS', value: 9, color: 'yellow' }, - { key: 12, text: '代理:API2GPT', value: 12, color: 'blue' }, - { key: 13, text: '代理:AIGC2D', value: 13, color: 'purple' } + { key: 21, text: '知识库:AI Proxy', value: 21, color: 'purple' } ]; \ No newline at end of file diff --git a/web/src/constants/common.constant.js b/web/src/constants/common.constant.js index 1a37d5f6..a3b287bb 100644 --- a/web/src/constants/common.constant.js +++ b/web/src/constants/common.constant.js @@ -1 +1 @@ -export const ITEMS_PER_PAGE = 10; // this value must keep same as the one defined in backend! +export const ITEMS_PER_PAGE = 20; // this value must keep same as the one defined in backend! diff --git a/web/src/helpers/utils.js b/web/src/helpers/utils.js index 28ae4992..235087b9 100644 --- a/web/src/helpers/utils.js +++ b/web/src/helpers/utils.js @@ -22,18 +22,18 @@ export function isRoot() { export function getSystemName() { let system_name = localStorage.getItem('system_name'); - if (!system_name) return 'One API'; + if (!system_name) return 'CZL Oapi'; return system_name; } export function getLogo() { let logo = localStorage.getItem('logo'); - if (!logo) return '/logo.png'; + if (!logo) return 'https://cdn-img-r2.czl.net/2023/06/20/649168ebc2b5d.png'; return logo } export function getFooterHTML() { - return localStorage.getItem('footer_html'); + return localStorage.getItem(''); } export async function copy(text) { diff --git a/web/src/index.css b/web/src/index.css index 5d60e377..89617715 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1,8 +1,55 @@ +@font-face { + font-family: 'CZL'; + src: url('https://cdn-r2.czl.net/fonts/CZL/CZL_Sans_SC_Thin.woff2') format('woff2'); + font-weight: 100; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'CZL'; + src: url('https://cdn-r2.czl.net/fonts/CZL/CZL_Sans_SC_Black.woff2') format('woff2'); + font-weight: 900; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'CZL'; + src: url('https://cdn-r2.czl.net/fonts/CZL/CZL_Sans_SC_Bold.woff2') format('woff2'); + font-weight: bold; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'CZL'; + src: url('https://cdn-r2.czl.net/fonts/CZL/CZL_Sans_SC_Light.woff2') format('woff2'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'CZL'; + src: url('https://cdn-r2.czl.net/fonts/CZL/CZL_Sans_SC_Medium.woff2') format('woff2'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'CZL'; + src: url('https://cdn-r2.czl.net/fonts/CZL/CZL_Sans_SC_Regular.woff2') format('woff2'); + font-weight: normal; + font-style: normal; + font-display: swap; +} body { margin: 0; padding-top: 55px; overflow-y: scroll; - font-family: Lato, 'Helvetica Neue', Arial, Helvetica, "Microsoft YaHei", sans-serif; + font-family: "CZL", -apple-system,BlinkMacSystemFont,'Helvetica Neue',Helvetica,Segoe UI,Arial,Roboto,'PingFang SC',miui,'Hiragino Sans GB','Microsoft Yahei',sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; scrollbar-width: none; diff --git a/web/src/pages/About/index.js b/web/src/pages/About/index.js index ec13f151..6a1be173 100644 --- a/web/src/pages/About/index.js +++ b/web/src/pages/About/index.js @@ -27,6 +27,13 @@ const About = () => { useEffect(() => { displayAbout().then(); + const style = document.createElement('style'); + style.type = 'text/css'; + style.innerHTML = `.main-content{width:unset !important;padding:0;} .ui.menu{margin-bottom:0 !important;}`; + document.head.appendChild(style); + return () => { + document.head.removeChild(style); + }; }, []); return ( @@ -35,11 +42,6 @@ const About = () => { aboutLoaded && about === '' ? <>
关于
-

可在设置页面设置关于内容,支持 HTML & Markdown

- 项目仓库地址: - - https://github.com/songquanpeng/one-api -
: <> { diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js index 82077c1f..285d15d7 100644 --- a/web/src/pages/Channel/EditChannel.js +++ b/web/src/pages/Channel/EditChannel.js @@ -123,7 +123,7 @@ const EditChannel = () => { setOriginModelOptions(localModelOptions); setFullModels(res.data.data.map((model) => model.id)); setBasicModels(res.data.data.filter((model) => { - return model.id.startsWith('gpt-3') || model.id.startsWith('text-'); + return model.id.startsWith('gpt-3') || model.id.startsWith('text-') || model.id.startsWith('dall-') || model.id.startsWith('whisper-'); }).map((model) => model.id)); } catch (error) { showError(error.message); @@ -246,7 +246,7 @@ const EditChannel = () => { inputs.type === 3 && ( <> - 注意,模型部署名称必须和模型名称保持一致,因为 One API 会把请求体中的 model + 注意,模型部署名称必须和模型名称保持一致,因为 CZL Oapi 会把请求体中的 model 参数替换为你的部署名称(模型名称中的点会被剔除),图片演示 diff --git a/web/src/pages/Home/index.js b/web/src/pages/Home/index.js index 63d6d77a..1926aa7d 100644 --- a/web/src/pages/Home/index.js +++ b/web/src/pages/Home/index.js @@ -5,7 +5,7 @@ import { StatusContext } from '../../context/Status'; import { marked } from 'marked'; const Home = () => { - const [statusState, statusDispatch] = useContext(StatusContext); + const [statusState] = useContext(StatusContext); const [homePageContentLoaded, setHomePageContentLoaded] = useState(false); const [homePageContent, setHomePageContent] = useState(''); @@ -50,6 +50,13 @@ const Home = () => { useEffect(() => { displayNotice().then(); displayHomePageContent().then(); + const style = document.createElement('style'); + style.type = 'text/css'; + style.innerHTML = `.main-content{width:unset !important;padding:0;margin-top:-81px;} .ui.menu{margin-bottom:0 !important;z-index:999;position: relative;}`; + document.head.appendChild(style); + return () => { + document.head.removeChild(style); + }; }, []); return ( <>