diff --git a/README.md b/README.md
index fad214c1..96112892 100644
--- a/README.md
+++ b/README.md
@@ -60,6 +60,7 @@ _✨ All in one 的 OpenAI 接口,整合各种 API 访问方式,开箱即用
+ [x] OpenAI 官方通道(支持配置镜像)
+ [x] **Azure OpenAI API**
+ [x] [API Distribute](https://api.gptjk.top/register?aff=QGxj)
+ + [x] [CloseAI](https://console.closeai-asia.com/r/2412)
+ [x] [OpenAI-SB](https://openai-sb.com)
+ [x] [API2D](https://api2d.com/r/197971)
+ [x] [OhMyGPT](https://aigptx.top?aff=uFpUl2Kf)
diff --git a/common/constants.go b/common/constants.go
index a850b3e8..08754213 100644
--- a/common/constants.go
+++ b/common/constants.go
@@ -152,18 +152,18 @@ const (
)
var ChannelBaseURLs = []string{
- "", // 0
- "https://api.openai.com", // 1
- "https://oa.api2d.net", // 2
- "", // 3
- "https://api.openai-proxy.org", // 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
+ "", // 0
+ "https://api.openai.com", // 1
+ "https://oa.api2d.net", // 2
+ "", // 3
+ "https://api.closeai-proxy.xyz", // 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
}
diff --git a/controller/channel-billing.go b/controller/channel-billing.go
index 4026e583..b4385192 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))
@@ -184,6 +207,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 0b29ff9e..d9166e5b 100644
--- a/web/src/components/ChannelsTable.js
+++ b/web/src/components/ChannelsTable.js
@@ -28,8 +28,11 @@ function renderType(type) {
}
function renderBalance(type, balance) {
+ console.log(type,balance)
switch (type) {
case 1: // OpenAI
+ case 4: // CloseAI
+ return ¥{balance.toFixed(2)};
case 8: // 自定义
return ${balance.toFixed(2)};
case 5: // OpenAI-SB