mirror of
https://github.com/coaidev/coai.git
synced 2025-05-19 21:10:18 +09:00
feat: add error body info
This commit is contained in:
parent
898b336afe
commit
0a31d550ce
@ -30,13 +30,13 @@ func NewChatRequest(conf globals.ChannelConfig, props *ChatProps, hook globals.H
|
|||||||
if isQPSOverLimit(props.Model, err) {
|
if isQPSOverLimit(props.Model, err) {
|
||||||
// sleep for 0.5s to avoid qps limit
|
// sleep for 0.5s to avoid qps limit
|
||||||
|
|
||||||
fmt.Println(fmt.Sprintf("qps limit for %s, sleep and retry (times: %d)", props.Model, props.Current))
|
globals.Info(fmt.Sprintf("qps limit for %s, sleep and retry (times: %d)", props.Model, props.Current))
|
||||||
time.Sleep(500 * time.Millisecond)
|
time.Sleep(500 * time.Millisecond)
|
||||||
return NewChatRequest(conf, props, hook)
|
return NewChatRequest(conf, props, hook)
|
||||||
}
|
}
|
||||||
|
|
||||||
if props.Current < retries {
|
if props.Current < retries {
|
||||||
fmt.Println(fmt.Sprintf("retrying chat request for %s (attempt %d/%d, error: %s)", props.Model, props.Current+1, retries, err.Error()))
|
globals.Warn(fmt.Sprintf("retrying chat request for %s (attempt %d/%d, error: %s)", props.Model, props.Current+1, retries, err.Error()))
|
||||||
return NewChatRequest(conf, props, hook)
|
return NewChatRequest(conf, props, hook)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var defaultMaxRetries = 1
|
var defaultMaxRetries = 1
|
||||||
|
var defaultReplacer = []string{
|
||||||
|
"openai_api", "anthropic_api",
|
||||||
|
"api2d", "closeai_api", "one_api", "new_api",
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Channel) GetId() int {
|
func (c *Channel) GetId() int {
|
||||||
return c.Id
|
return c.Id
|
||||||
@ -173,5 +177,9 @@ func (c *Channel) ProcessError(err error) error {
|
|||||||
content = strings.Replace(content, domain, "channel", -1)
|
content = strings.Replace(content, domain, "channel", -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, item := range defaultReplacer {
|
||||||
|
content = strings.Replace(content, item, "chatnio_upstream", -1)
|
||||||
|
}
|
||||||
|
|
||||||
return errors.New(content)
|
return errors.New(content)
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"chat/globals"
|
"chat/globals"
|
||||||
"chat/utils"
|
"chat/utils"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/spf13/viper"
|
"github.com/cloudwego/hertz/cmd/hz/util/logs"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewChatRequest(props *adapter.ChatProps, hook globals.Hook) error {
|
func NewChatRequest(props *adapter.ChatProps, hook globals.Hook) error {
|
||||||
@ -15,29 +15,18 @@ func NewChatRequest(props *adapter.ChatProps, hook globals.Hook) error {
|
|||||||
|
|
||||||
ticker := ConduitInstance.GetTicker(props.Model)
|
ticker := ConduitInstance.GetTicker(props.Model)
|
||||||
|
|
||||||
debug := viper.GetBool("debug")
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
for !ticker.IsDone() {
|
for !ticker.IsDone() {
|
||||||
if channel := ticker.Next(); channel != nil {
|
if channel := ticker.Next(); channel != nil {
|
||||||
if debug {
|
|
||||||
fmt.Println(fmt.Sprintf("[channel] try channel %s for model %s", channel.GetName(), props.Model))
|
|
||||||
}
|
|
||||||
|
|
||||||
props.MaxRetries = utils.ToPtr(channel.GetRetry())
|
props.MaxRetries = utils.ToPtr(channel.GetRetry())
|
||||||
if err = adapter.NewChatRequest(channel, props, hook); err == nil {
|
if err = adapter.NewChatRequest(channel, props, hook); err == nil {
|
||||||
if debug {
|
|
||||||
fmt.Println(fmt.Sprintf("[channel] hit channel %s for model %s", channel.GetName(), props.Model))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
fmt.Println(fmt.Sprintf("[channel] caught error %s for model %s at channel %s -> goto next channel", err.Error(), props.Model, channel.GetName()))
|
|
||||||
|
logs.Warn(fmt.Sprintf("[channel] caught error %s for model %s at channel %s", err.Error(), props.Model, channel.GetName()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if debug {
|
logs.Info(fmt.Sprintf("[channel] channels are exhausted for model %s", props.Model))
|
||||||
fmt.Println(fmt.Sprintf("[channel] channels are exhausted for model %s", props.Model))
|
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,21 @@ func Marshal[T interface{}](data T) string {
|
|||||||
return string(res)
|
return string(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func MarshalWithIndent[T interface{}](data T, length ...int) string {
|
||||||
|
var indent string
|
||||||
|
if len(length) > 0 {
|
||||||
|
indent = strings.Repeat(" ", length[0])
|
||||||
|
} else {
|
||||||
|
indent = " "
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := json.MarshalIndent(data, "", indent)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return string(res)
|
||||||
|
}
|
||||||
|
|
||||||
func MapToStruct[T any](data interface{}) *T {
|
func MapToStruct[T any](data interface{}) *T {
|
||||||
val := Marshal(data)
|
val := Marshal(data)
|
||||||
if form, err := Unmarshal[T]([]byte(val)); err == nil {
|
if form, err := Unmarshal[T]([]byte(val)); err == nil {
|
||||||
|
12
utils/net.go
12
utils/net.go
@ -6,7 +6,6 @@ import (
|
|||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/goccy/go-json"
|
"github.com/goccy/go-json"
|
||||||
"github.com/spf13/viper"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
@ -128,8 +127,9 @@ func EventSource(method string, uri string, headers map[string]string, body inte
|
|||||||
client := newClient()
|
client := newClient()
|
||||||
req, err := http.NewRequest(method, uri, ConvertBody(body))
|
req, err := http.NewRequest(method, uri, ConvertBody(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for key, value := range headers {
|
for key, value := range headers {
|
||||||
req.Header.Set(key, value)
|
req.Header.Set(key, value)
|
||||||
}
|
}
|
||||||
@ -142,10 +142,10 @@ func EventSource(method string, uri string, headers map[string]string, body inte
|
|||||||
defer res.Body.Close()
|
defer res.Body.Close()
|
||||||
|
|
||||||
if res.StatusCode >= 400 {
|
if res.StatusCode >= 400 {
|
||||||
// print body
|
if content, err := io.ReadAll(res.Body); err == nil {
|
||||||
if viper.GetBool("debug") {
|
if form, err := Unmarshal[map[string]interface{}](content); err == nil {
|
||||||
if content, err := io.ReadAll(res.Body); err == nil {
|
data := MarshalWithIndent(form, 2)
|
||||||
fmt.Println(fmt.Sprintf("request failed with status: %s, body: %s", res.Status, string(content)))
|
return fmt.Errorf("request failed with status: %s\n```json\n%s\n```", res.Status, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user