update
continuous-integration/drone Build is passing Details

dev
kelvin 3 years ago
parent 2d8ffaed9a
commit ef35077d23

@ -10,7 +10,6 @@ import (
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"io" "io"
"log"
"math/rand" "math/rand"
"net/http" "net/http"
"net/http/httputil" "net/http/httputil"
@ -32,11 +31,11 @@ func Images(c *gin.Context) {
serverInfo, err := service.CheckBlanceForImages(key, modelStr, imagesRequest.N) serverInfo, err := service.CheckBlanceForImages(key, modelStr, imagesRequest.N)
if err != nil { if err != nil {
c.AbortWithStatusJSON(403, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(403, gin.H{"error": err.Error()})
log.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, modelStr, err) fmt.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, modelStr, err)
return return
} }
log.Printf("请求的KEY: %v Model: %v", key, modelStr) fmt.Printf("请求的KEY: %v Model: %v", key, modelStr)
remote, err := url.Parse(serverInfo.ServerAddress) remote, err := url.Parse(serverInfo.ServerAddress)
if err != nil { if err != nil {
@ -47,7 +46,7 @@ func Images(c *gin.Context) {
proxy := httputil.NewSingleHostReverseProxy(remote) proxy := httputil.NewSingleHostReverseProxy(remote)
newReqBody, err := json.Marshal(imagesRequest) newReqBody, err := json.Marshal(imagesRequest)
if err != nil { if err != nil {
log.Printf("http request err: %v", err) fmt.Printf("http request err: %v", err)
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return return
} }
@ -74,7 +73,7 @@ func Images(c *gin.Context) {
req.Body = io.NopCloser(bytes.NewReader(newReqBody)) req.Body = io.NopCloser(bytes.NewReader(newReqBody))
} }
sss, err := json.Marshal(imagesRequest) sss, err := json.Marshal(imagesRequest)
log.Printf("开始处理返回逻辑 %d", string(sss)) fmt.Printf("开始处理返回逻辑 %d", string(sss))
proxy.ModifyResponse = func(resp *http.Response) error { proxy.ModifyResponse = func(resp *http.Response) error {
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
@ -89,16 +88,16 @@ func Images(c *gin.Context) {
var imagesResponse model.ImagesResponse var imagesResponse model.ImagesResponse
body, err := io.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Printf("读取返回数据出错: %v", err) fmt.Printf("读取返回数据出错: %v", err)
return err return err
} }
err = json.Unmarshal(body, &imagesResponse) err = json.Unmarshal(body, &imagesResponse)
if err != nil { if err != nil {
log.Printf("json解析数据出错: %v", err) fmt.Printf("json解析数据出错: %v", err)
return err return err
} }
resp.Body = io.NopCloser(bytes.NewReader(body)) resp.Body = io.NopCloser(bytes.NewReader(body))
log.Printf("image size: %v", len(imagesResponse.Data)) fmt.Printf("image size: %v", len(imagesResponse.Data))
timestamp := time.Now().Unix() timestamp := time.Now().Unix()
timestampID := "img-" + fmt.Sprintf("%d", timestamp) timestampID := "img-" + fmt.Sprintf("%d", timestamp)
//消费余额 //消费余额
@ -127,11 +126,11 @@ func Edit(c *gin.Context) {
serverInfo, err := service.CheckBlance(key, chatRequest.Model, chatRequest.MaxTokens) serverInfo, err := service.CheckBlance(key, chatRequest.Model, chatRequest.MaxTokens)
if err != nil { if err != nil {
c.AbortWithStatusJSON(403, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(403, gin.H{"error": err.Error()})
log.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, chatRequest.Model, err) fmt.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, chatRequest.Model, err)
return return
} }
log.Printf("请求的KEY: %v Model: %v", key, chatRequest.Model) fmt.Printf("请求的KEY: %v Model: %v", key, chatRequest.Model)
remote, err := url.Parse(serverInfo.ServerAddress) remote, err := url.Parse(serverInfo.ServerAddress)
if err != nil { if err != nil {
@ -142,7 +141,7 @@ func Edit(c *gin.Context) {
proxy := httputil.NewSingleHostReverseProxy(remote) proxy := httputil.NewSingleHostReverseProxy(remote)
newReqBody, err := json.Marshal(chatRequest) newReqBody, err := json.Marshal(chatRequest)
if err != nil { if err != nil {
log.Printf("http request err: %v", err) fmt.Printf("http request err: %v", err)
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return return
} }
@ -169,26 +168,26 @@ func Edit(c *gin.Context) {
req.Body = io.NopCloser(bytes.NewReader(newReqBody)) req.Body = io.NopCloser(bytes.NewReader(newReqBody))
} }
sss, err := json.Marshal(chatRequest) sss, err := json.Marshal(chatRequest)
log.Printf("开始处理返回逻辑 %d", string(sss)) fmt.Printf("开始处理返回逻辑 %d", string(sss))
proxy.ModifyResponse = func(resp *http.Response) error { proxy.ModifyResponse = func(resp *http.Response) error {
resp.Header.Set("Openai-Organization", "api2gpt") resp.Header.Set("Openai-Organization", "api2gpt")
var chatResponse model.ChatResponse var chatResponse model.ChatResponse
body, err := io.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Printf("读取返回数据出错: %v", err) fmt.Printf("读取返回数据出错: %v", err)
return err return err
} }
err = json.Unmarshal(body, &chatResponse) err = json.Unmarshal(body, &chatResponse)
if err != nil { if err != nil {
log.Printf("json解析数据出错: %v", err) fmt.Printf("json解析数据出错: %v", err)
return err return err
} }
promptTokens = chatResponse.Usage.PromptTokens promptTokens = chatResponse.Usage.PromptTokens
complateTokens = chatResponse.Usage.CompletionTokens complateTokens = chatResponse.Usage.CompletionTokens
totalTokens = chatResponse.Usage.TotalTokens totalTokens = chatResponse.Usage.TotalTokens
resp.Body = io.NopCloser(bytes.NewReader(body)) resp.Body = io.NopCloser(bytes.NewReader(body))
log.Printf("prompt_tokens: %v complate_tokens: %v total_tokens: %v", promptTokens, complateTokens, totalTokens) fmt.Printf("prompt_tokens: %v complate_tokens: %v total_tokens: %v", promptTokens, complateTokens, totalTokens)
timestamp := time.Now().Unix() timestamp := time.Now().Unix()
timestampID := "edit-" + fmt.Sprintf("%d", timestamp) timestampID := "edit-" + fmt.Sprintf("%d", timestamp)
//消费余额 //消费余额
@ -216,11 +215,11 @@ func Embeddings(c *gin.Context) {
serverInfo, err := service.CheckBlance(key, chatRequest.Model, chatRequest.MaxTokens) serverInfo, err := service.CheckBlance(key, chatRequest.Model, chatRequest.MaxTokens)
if err != nil { if err != nil {
c.AbortWithStatusJSON(403, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(403, gin.H{"error": err.Error()})
log.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, chatRequest.Model, err) fmt.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, chatRequest.Model, err)
return return
} }
log.Printf("请求的KEY: %v Model: %v", key, chatRequest.Model) fmt.Printf("请求的KEY: %v Model: %v", key, chatRequest.Model)
remote, err := url.Parse(serverInfo.ServerAddress) remote, err := url.Parse(serverInfo.ServerAddress)
if err != nil { if err != nil {
@ -231,7 +230,7 @@ func Embeddings(c *gin.Context) {
proxy := httputil.NewSingleHostReverseProxy(remote) proxy := httputil.NewSingleHostReverseProxy(remote)
newReqBody, err := json.Marshal(chatRequest) newReqBody, err := json.Marshal(chatRequest)
if err != nil { if err != nil {
log.Printf("http request err: %v", err) fmt.Printf("http request err: %v", err)
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return return
} }
@ -258,25 +257,25 @@ func Embeddings(c *gin.Context) {
req.Body = io.NopCloser(bytes.NewReader(newReqBody)) req.Body = io.NopCloser(bytes.NewReader(newReqBody))
} }
sss, err := json.Marshal(chatRequest) sss, err := json.Marshal(chatRequest)
log.Printf("开始处理返回逻辑 %d", string(sss)) fmt.Printf("开始处理返回逻辑 %d", string(sss))
proxy.ModifyResponse = func(resp *http.Response) error { proxy.ModifyResponse = func(resp *http.Response) error {
resp.Header.Set("Openai-Organization", "api2gpt") resp.Header.Set("Openai-Organization", "api2gpt")
var chatResponse model.ChatResponse var chatResponse model.ChatResponse
body, err := io.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Printf("读取返回数据出错: %v", err) fmt.Printf("读取返回数据出错: %v", err)
return err return err
} }
err = json.Unmarshal(body, &chatResponse) err = json.Unmarshal(body, &chatResponse)
if err != nil { if err != nil {
log.Printf("json解析数据出错: %v", err) fmt.Printf("json解析数据出错: %v", err)
return err return err
} }
promptTokens = chatResponse.Usage.PromptTokens promptTokens = chatResponse.Usage.PromptTokens
totalTokens = chatResponse.Usage.TotalTokens totalTokens = chatResponse.Usage.TotalTokens
resp.Body = io.NopCloser(bytes.NewReader(body)) resp.Body = io.NopCloser(bytes.NewReader(body))
log.Printf("prompt_tokens: %v total_tokens: %v", promptTokens, totalTokens) fmt.Printf("prompt_tokens: %v total_tokens: %v", promptTokens, totalTokens)
timestamp := time.Now().Unix() timestamp := time.Now().Unix()
timestampID := "emb-" + fmt.Sprintf("%d", timestamp) timestampID := "emb-" + fmt.Sprintf("%d", timestamp)
//消费余额 //消费余额
@ -306,11 +305,11 @@ func Completions(c *gin.Context) {
serverInfo, err := service.CheckBlance(key, chatRequest.Model, chatRequest.MaxTokens) serverInfo, err := service.CheckBlance(key, chatRequest.Model, chatRequest.MaxTokens)
if err != nil { if err != nil {
c.AbortWithStatusJSON(403, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(403, gin.H{"error": err.Error()})
log.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, chatRequest.Model, err) fmt.Printf("请求出错 KEY: %v Model: %v ERROR: %v", key, chatRequest.Model, err)
return return
} }
log.Printf("请求的KEY: %v Model: %v", key, chatRequest.Model) fmt.Printf("请求的KEY: %v Model: %v", key, chatRequest.Model)
remote, err := url.Parse(serverInfo.ServerAddress) remote, err := url.Parse(serverInfo.ServerAddress)
if err != nil { if err != nil {
@ -321,7 +320,7 @@ func Completions(c *gin.Context) {
proxy := httputil.NewSingleHostReverseProxy(remote) proxy := httputil.NewSingleHostReverseProxy(remote)
newReqBody, err := json.Marshal(chatRequest) newReqBody, err := json.Marshal(chatRequest)
if err != nil { if err != nil {
log.Printf("http request err: %v", err) fmt.Printf("http request err: %v", err)
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return return
} }
@ -348,13 +347,13 @@ func Completions(c *gin.Context) {
} }
sss, err := json.Marshal(chatRequest) sss, err := json.Marshal(chatRequest)
if err != nil { if err != nil {
log.Printf("chatRequest 转化出错 %v", err) fmt.Printf("chatRequest 转化出错 %v", err)
} }
log.Printf("开始处理返回逻辑: %v", string(sss)) fmt.Printf("开始处理返回逻辑: %v", string(sss))
if chatRequest.Stream { if chatRequest.Stream {
// 流式回应,处理 // 流式回应,处理
proxy.ModifyResponse = func(resp *http.Response) error { proxy.ModifyResponse = func(resp *http.Response) error {
log.Printf("流式回应 http status code: %v", resp.StatusCode) fmt.Printf("流式回应 http status code: %v", resp.StatusCode)
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
//退回预扣除的余额 //退回预扣除的余额
err = service.CheckBlanceReturn(key, chatRequest.Model, chatRequest.MaxTokens) err = service.CheckBlanceReturn(key, chatRequest.Model, chatRequest.MaxTokens)
@ -377,7 +376,7 @@ func Completions(c *gin.Context) {
if err == io.EOF { if err == io.EOF {
break break
} }
log.Printf("流式回应,处理 err %v:", err.Error()) fmt.Printf("流式回应,处理 err %v:", err.Error())
break break
//return err //return err
} }
@ -402,7 +401,7 @@ func Completions(c *gin.Context) {
// 写回数据 // 写回数据
_, err = c.Writer.Write([]byte(string(chunk) + "\n")) _, err = c.Writer.Write([]byte(string(chunk) + "\n"))
if err != nil { if err != nil {
log.Printf("写回数据 err: %v", err.Error()) fmt.Printf("写回数据 err: %v", err.Error())
return err return err
} }
c.Writer.(http.Flusher).Flush() c.Writer.(http.Flusher).Flush()
@ -414,9 +413,9 @@ func Completions(c *gin.Context) {
promptTokens = common.NumTokensFromMessages(chatRequest.Messages, chatRequest.Model) promptTokens = common.NumTokensFromMessages(chatRequest.Messages, chatRequest.Model)
} }
completionTokens = common.NumTokensFromString(reqContent, chatRequest.Model) completionTokens = common.NumTokensFromString(reqContent, chatRequest.Model)
log.Printf("返回内容:%v", reqContent) fmt.Printf("返回内容:%v", reqContent)
totalTokens = promptTokens + completionTokens totalTokens = promptTokens + completionTokens
log.Printf("prompt_tokens: %v completion_tokens: %v total_tokens: %v", promptTokens, completionTokens, totalTokens) fmt.Printf("prompt_tokens: %v completion_tokens: %v total_tokens: %v", promptTokens, completionTokens, totalTokens)
//消费余额 //消费余额
_, err := service.Consumption(key, chatRequest.Model, promptTokens, completionTokens, totalTokens, chatRequestId) _, err := service.Consumption(key, chatRequest.Model, promptTokens, completionTokens, totalTokens, chatRequestId)
if err != nil { if err != nil {
@ -431,7 +430,7 @@ func Completions(c *gin.Context) {
var chatResponse model.ChatResponse var chatResponse model.ChatResponse
body, err := io.ReadAll(resp.Body) body, err := io.ReadAll(resp.Body)
if err != nil { if err != nil {
log.Printf("非流式回应,处理 err: %v", err) fmt.Printf("非流式回应,处理 err: %v", err)
return err return err
} }
err = json.Unmarshal(body, &chatResponse) err = json.Unmarshal(body, &chatResponse)
@ -442,7 +441,7 @@ func Completions(c *gin.Context) {
completionTokens = chatResponse.Usage.CompletionTokens completionTokens = chatResponse.Usage.CompletionTokens
totalTokens = chatResponse.Usage.TotalTokens totalTokens = chatResponse.Usage.TotalTokens
resp.Body = io.NopCloser(bytes.NewReader(body)) resp.Body = io.NopCloser(bytes.NewReader(body))
log.Printf("prompt_tokens: %v completion_tokens: %v total_tokens: %v", promptTokens, completionTokens, totalTokens) fmt.Printf("prompt_tokens: %v completion_tokens: %v total_tokens: %v", promptTokens, completionTokens, totalTokens)
//消费余额 //消费余额
_, err = service.Consumption(key, chatRequest.Model, promptTokens, completionTokens, totalTokens, chatResponse.Id) _, err = service.Consumption(key, chatRequest.Model, promptTokens, completionTokens, totalTokens, chatResponse.Id)
if err != nil { if err != nil {

@ -6,7 +6,7 @@ import (
"api2gpt-mid/model" "api2gpt-mid/model"
"encoding/json" "encoding/json"
"errors" "errors"
"log" "fmt"
"strconv" "strconv"
"time" "time"
) )
@ -16,7 +16,7 @@ func CheckKeyAndTimeCount(key string) (int, error) {
var timeOut = 60 * time.Second var timeOut = 60 * time.Second
var timeCount = 60 var timeCount = 60
userInfoStr, err := common.RedisGet("user:" + key) userInfoStr, err := common.RedisGet("user:" + key)
log.Printf("用户信息 %s", userInfoStr) common.SysLog("用户信息" + userInfoStr)
if err != nil { if err != nil {
//用户不存在 //用户不存在
return 401, errors.New("40003") return 401, errors.New("40003")
@ -31,15 +31,15 @@ func CheckKeyAndTimeCount(key string) (int, error) {
timeCount = userInfo.RPM timeCount = userInfo.RPM
} }
count, err := common.RedisIncr("user:count:" + key) count, err := common.RedisIncr("user:count:" + key)
log.Printf("用户请求次数 %d", count) common.SysLog("用户请求次数" + strconv.FormatInt(count, 10))
if err != nil { if err != nil {
log.Printf("系统计数器设置异常 %s", err.Error()) fmt.Printf("系统计数器设置异常 %s", err.Error())
return 500, errors.New("系统计数器设置异常") return 500, errors.New("系统计数器设置异常")
} }
if count == 1 { if count == 1 {
_, err := common.RedisExpire("user:count:"+key, timeOut) _, err := common.RedisExpire("user:count:"+key, timeOut)
if err != nil { if err != nil {
log.Printf("系统计数器异常 %s", err.Error()) fmt.Printf("系统计数器异常 %s", err.Error())
return 500, errors.New("系统计数器异常") return 500, errors.New("系统计数器异常")
} }
} }
@ -99,7 +99,7 @@ func CheckBlance(key string, modelStr string, maxTokens int) (model.ServerInfo,
if err != nil { if err != nil {
return serverInfo, errors.New("余额计算失败") return serverInfo, errors.New("余额计算失败")
} }
log.Printf("用户余额 %f key: %v 预扣了:%f", balance, key, (float64(maxTokens) * modelInfo.ModelPrice)) fmt.Printf("用户余额 %f key: %v 预扣了:%f", balance, key, (float64(maxTokens) * modelInfo.ModelPrice))
if balance < 0 { if balance < 0 {
_, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", float64(maxTokens)*modelInfo.ModelPrice) _, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", float64(maxTokens)*modelInfo.ModelPrice)
if err != nil { if err != nil {
@ -145,7 +145,7 @@ func CheckBlanceForImages(key string, modelStr string, n int) (model.ServerInfo,
if err != nil { if err != nil {
return serverInfo, errors.New("余额计算失败") return serverInfo, errors.New("余额计算失败")
} }
log.Printf("用户余额 %f key: %v 预扣了:%f", balance, key, (float64(modelInfo.ModelPrepayment*n) * modelInfo.ModelPrice)) fmt.Printf("用户余额 %f key: %v 预扣了:%f", balance, key, (float64(modelInfo.ModelPrepayment*n) * modelInfo.ModelPrice))
if balance < 0 { if balance < 0 {
_, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", float64(modelInfo.ModelPrepayment*n)*modelInfo.ModelPrice) _, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", float64(modelInfo.ModelPrepayment*n)*modelInfo.ModelPrice)
if err != nil { if err != nil {
@ -178,7 +178,7 @@ func CheckBlanceReturn(key string, modelStr string, maxTokens int) error {
maxTokens = modelInfo.ModelPrepayment maxTokens = modelInfo.ModelPrepayment
} }
balance, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", (float64(maxTokens) * modelInfo.ModelPrice)) balance, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", (float64(maxTokens) * modelInfo.ModelPrice))
log.Printf("用户余额 %f key: %v 返还预扣:%f", balance, key, (float64(maxTokens) * modelInfo.ModelPrice)) fmt.Printf("用户余额 %f key: %v 返还预扣:%f", balance, key, (float64(maxTokens) * modelInfo.ModelPrice))
return nil return nil
} }
@ -199,7 +199,7 @@ func CheckBlanceReturnForImages(key string, modelStr string, n int) error {
return errors.New("模型信息解析失败") return errors.New("模型信息解析失败")
} }
balance, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", (float64(modelInfo.ModelPrepayment*n) * modelInfo.ModelPrice)) balance, err := common.RedisIncrByFloat("user:"+userInfo.UID+":balance", (float64(modelInfo.ModelPrepayment*n) * modelInfo.ModelPrice))
log.Printf("用户余额 %f key: %v 返还预扣:%f", balance, key, (float64(modelInfo.ModelPrepayment*n) * modelInfo.ModelPrice)) fmt.Printf("用户余额 %f key: %v 返还预扣:%f", balance, key, (float64(modelInfo.ModelPrepayment*n) * modelInfo.ModelPrice))
return nil return nil
} }
@ -229,9 +229,9 @@ func Consumption(key string, modelStr string, prompt_tokens int, completion_toke
// 余额消费日志请求 // 余额消费日志请求
result, err := api.BalanceConsumption(key, modelStr, prompt_tokens, completion_tokens, total_tokens, msg_id) result, err := api.BalanceConsumption(key, modelStr, prompt_tokens, completion_tokens, total_tokens, msg_id)
log.Printf("用户余额:%f 扣费KEY: %s 扣费token数: %d 扣费:%f 扣费日志发送结果 %s", balance, key, total_tokens, float64(modelInfo.ModelPrepayment)*modelInfo.ModelPrice-(float64(prompt_tokens)*modelInfo.ModelPrice+float64(completion_tokens)*modelInfo.ModelPrice2), result) fmt.Printf("用户余额:%f 扣费KEY: %s 扣费token数: %d 扣费:%f 扣费日志发送结果 %s", balance, key, total_tokens, float64(modelInfo.ModelPrepayment)*modelInfo.ModelPrice-(float64(prompt_tokens)*modelInfo.ModelPrice+float64(completion_tokens)*modelInfo.ModelPrice2), result)
if err != nil { if err != nil {
log.Printf("%s 余额消费日志请求失败 %v", key, err) fmt.Printf("%s 余额消费日志请求失败 %v", key, err)
return "", err return "", err
} }
return result, nil return result, nil
@ -263,9 +263,9 @@ func ConsumptionForImages(key string, modelStr string, n int, dataNum int, msg_i
// 余额消费日志请求 // 余额消费日志请求
result, err := api.BalanceConsumption(key, modelStr, 0, 1000*dataNum, 1000*dataNum, msg_id) result, err := api.BalanceConsumption(key, modelStr, 0, 1000*dataNum, 1000*dataNum, msg_id)
log.Printf("用户余额:%f 扣费KEY: %s 扣费token数: %d 扣费:%f 扣费日志发送结果 %s", balance, key, 1000*dataNum, float64(1000*dataNum)*modelInfo.ModelPrice, result) fmt.Printf("用户余额:%f 扣费KEY: %s 扣费token数: %d 扣费:%f 扣费日志发送结果 %s", balance, key, 1000*dataNum, float64(1000*dataNum)*modelInfo.ModelPrice, result)
if err != nil { if err != nil {
log.Printf("%s 余额消费日志请求失败 %v", key, err) fmt.Printf("%s 余额消费日志请求失败 %v", key, err)
return "", err return "", err
} }
return result, nil return result, nil

Loading…
Cancel
Save