diff --git a/controller/channel-billing.go b/controller/channel-billing.go index 41f8d8f7..2bda0fd2 100644 --- a/controller/channel-billing.go +++ b/controller/channel-billing.go @@ -108,6 +108,13 @@ type DeepSeekUsageResponse struct { } `json:"balance_infos"` } +type OpenRouterCreditResponse struct { + Data struct { + TotalCredits float64 `json:"total_credits"` + TotalUsage float64 `json:"total_usage"` + } `json:"data"` +} + // GetAuthHeader get auth header func GetAuthHeader(token string) http.Header { h := http.Header{} @@ -281,6 +288,22 @@ func updateChannelAIGC2DBalance(channel *model.Channel) (float64, error) { return response.TotalAvailable, nil } +func updateChannelOpenRouterBalance(channel *model.Channel) (float64, error) { + url := "https://openrouter.ai/api/v1/credits" + body, err := GetResponseBody("GET", url, channel, GetAuthHeader(channel.Key)) + if err != nil { + return 0, err + } + response := OpenRouterCreditResponse{} + err = json.Unmarshal(body, &response) + if err != nil { + return 0, err + } + balance := response.Data.TotalCredits - response.Data.TotalUsage + channel.UpdateBalance(balance) + return balance, nil +} + func updateChannelBalance(channel *model.Channel) (float64, error) { baseURL := common.ChannelBaseURLs[channel.Type] if channel.GetBaseURL() == "" { @@ -307,6 +330,8 @@ func updateChannelBalance(channel *model.Channel) (float64, error) { return updateChannelSiliconFlowBalance(channel) case common.ChannelTypeDeepSeek: return updateChannelDeepSeekBalance(channel) + case common.ChannelTypeOpenRouter: + return updateChannelOpenRouterBalance(channel) default: return 0, errors.New("尚未实现") }