diff --git a/README.md b/README.md index fad214c1..9280a347 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ _✨ All in one 的 OpenAI 接口,整合各种 API 访问方式,开箱即用 赞赏支持

+> **Note**:本项目为开源项目,请在遵循 OpenAI 的[使用条款](https://openai.com/policies/terms-of-use)以及**法律法规**的情况下使用,不得用于非法用途。 + > **Note**:使用 Docker 拉取的最新镜像可能是 `alpha` 版本,如果追求稳定性请手动指定版本。 > **Warning**:从 `v0.3` 版本升级到 `v0.4` 版本需要手动迁移数据库,请手动执行[数据库迁移脚本](./bin/migration_v0.3-v0.4.sql)。 @@ -64,6 +66,7 @@ _✨ All in one 的 OpenAI 接口,整合各种 API 访问方式,开箱即用 + [x] [API2D](https://api2d.com/r/197971) + [x] [OhMyGPT](https://aigptx.top?aff=uFpUl2Kf) + [x] [AI Proxy](https://aiproxy.io/?i=OneAPI) (邀请码:`OneAPI`) + + [x] [CloseAI](https://console.closeai-asia.com/r/2412) + [x] 自定义渠道:例如各种未收录的第三方代理服务 2. 支持通过**负载均衡**的方式访问多个渠道。 3. 支持 **stream 模式**,可以通过流式传输实现打字机效果。 @@ -324,7 +327,6 @@ https://openai.justsong.cn [FastGPT](https://github.com/c121914yu/FastGPT): 三分钟搭建 AI 知识库 ## 注意 -本项目为开源项目,请在遵循 OpenAI 的[使用条款](https://openai.com/policies/terms-of-use)以及**法律法规**的情况下使用,不得用于非法用途。 本项目使用 MIT 协议进行开源,**在此基础上**,必须在页面底部保留署名以及指向本项目的链接。如果不想保留署名,必须首先获得授权。 diff --git a/controller/channel-billing.go b/controller/channel-billing.go index 7ec688d9..82873657 100644 --- a/controller/channel-billing.go +++ b/controller/channel-billing.go @@ -32,6 +32,13 @@ type OpenAIUsageDailyCost struct { } } +type OpenAICreditGrants struct { + Object string `json:"object"` + TotalGranted float64 `json:"total_granted"` + TotalUsed float64 `json:"total_used"` + TotalAvailable float64 `json:"total_available"` +} + type OpenAIUsageResponse struct { Object string `json:"object"` //DailyCosts []OpenAIUsageDailyCost `json:"daily_costs"` @@ -100,6 +107,22 @@ func GetResponseBody(method, url string, channel *model.Channel, headers http.He return body, nil } +func updateChannelCloseAIBalance(channel *model.Channel) (float64, error) { + url := fmt.Sprintf("%s/dashboard/billing/credit_grants", channel.BaseURL) + body, err := GetResponseBody("GET", url, channel, GetAuthHeader(channel.Key)) + + if err != nil { + return 0, err + } + response := OpenAICreditGrants{} + err = json.Unmarshal(body, &response) + if err != nil { + return 0, err + } + channel.UpdateBalance(response.TotalAvailable) + return response.TotalAvailable, nil +} + func updateChannelOpenAISBBalance(channel *model.Channel) (float64, error) { url := fmt.Sprintf("https://api.openai-sb.com/sb-api/user/status?api_key=%s", channel.Key) body, err := GetResponseBody("GET", url, channel, GetAuthHeader(channel.Key)) @@ -175,6 +198,9 @@ func updateChannelAIGC2DBalance(channel *model.Channel) (float64, error) { func updateChannelBalance(channel *model.Channel) (float64, error) { baseURL := common.ChannelBaseURLs[channel.Type] + if channel.BaseURL == "" { + channel.BaseURL = baseURL + } switch channel.Type { case common.ChannelTypeOpenAI: if channel.BaseURL != "" { @@ -184,6 +210,8 @@ func updateChannelBalance(channel *model.Channel) (float64, error) { return 0, errors.New("尚未实现") case common.ChannelTypeCustom: baseURL = channel.BaseURL + case common.ChannelTypeCloseAI: + return updateChannelCloseAIBalance(channel) case common.ChannelTypeOpenAISB: return updateChannelOpenAISBBalance(channel) case common.ChannelTypeAIProxy: diff --git a/web/src/components/ChannelsTable.js b/web/src/components/ChannelsTable.js index de27ac98..bcff0cf0 100644 --- a/web/src/components/ChannelsTable.js +++ b/web/src/components/ChannelsTable.js @@ -30,6 +30,9 @@ function renderType(type) { function renderBalance(type, balance) { switch (type) { case 1: // OpenAI + return ${balance.toFixed(2)}; + case 4: // CloseAI + return ¥{balance.toFixed(2)}; case 8: // 自定义 return ${balance.toFixed(2)}; case 5: // OpenAI-SB