|
@@ -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 {
|
|
type OpenAIUsageResponse struct {
|
|
|
Object string `json:"object"`
|
|
Object string `json:"object"`
|
|
|
//DailyCosts []OpenAIUsageDailyCost `json:"daily_costs"`
|
|
//DailyCosts []OpenAIUsageDailyCost `json:"daily_costs"`
|
|
@@ -100,6 +107,22 @@ func GetResponseBody(method, url string, channel *model.Channel, headers http.He
|
|
|
return body, nil
|
|
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) {
|
|
func updateChannelOpenAISBBalance(channel *model.Channel) (float64, error) {
|
|
|
url := fmt.Sprintf("https://api.openai-sb.com/sb-api/user/status?api_key=%s", channel.Key)
|
|
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))
|
|
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) {
|
|
func updateChannelBalance(channel *model.Channel) (float64, error) {
|
|
|
baseURL := common.ChannelBaseURLs[channel.Type]
|
|
baseURL := common.ChannelBaseURLs[channel.Type]
|
|
|
|
|
+ if channel.BaseURL == "" {
|
|
|
|
|
+ channel.BaseURL = baseURL
|
|
|
|
|
+ }
|
|
|
switch channel.Type {
|
|
switch channel.Type {
|
|
|
case common.ChannelTypeOpenAI:
|
|
case common.ChannelTypeOpenAI:
|
|
|
if channel.BaseURL != "" {
|
|
if channel.BaseURL != "" {
|
|
@@ -184,6 +210,8 @@ func updateChannelBalance(channel *model.Channel) (float64, error) {
|
|
|
return 0, errors.New("尚未实现")
|
|
return 0, errors.New("尚未实现")
|
|
|
case common.ChannelTypeCustom:
|
|
case common.ChannelTypeCustom:
|
|
|
baseURL = channel.BaseURL
|
|
baseURL = channel.BaseURL
|
|
|
|
|
+ case common.ChannelTypeCloseAI:
|
|
|
|
|
+ return updateChannelCloseAIBalance(channel)
|
|
|
case common.ChannelTypeOpenAISB:
|
|
case common.ChannelTypeOpenAISB:
|
|
|
return updateChannelOpenAISBBalance(channel)
|
|
return updateChannelOpenAISBBalance(channel)
|
|
|
case common.ChannelTypeAIProxy:
|
|
case common.ChannelTypeAIProxy:
|