From f636c50c84f1327a7b3baf7d08ca6f8d6b9b9a40 Mon Sep 17 00:00:00 2001 From: Qiying Wang <781345688@qq.com> Date: Tue, 9 Jul 2024 22:43:59 +0800 Subject: [PATCH 1/2] fix: duplicate [DONE] (#1629) --- relay/adaptor/openai/main.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/relay/adaptor/openai/main.go b/relay/adaptor/openai/main.go index 1d534644..9ee547b3 100644 --- a/relay/adaptor/openai/main.go +++ b/relay/adaptor/openai/main.go @@ -4,11 +4,12 @@ import ( "bufio" "bytes" "encoding/json" - "github.com/songquanpeng/one-api/common/render" "io" "net/http" "strings" + "github.com/songquanpeng/one-api/common/render" + "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/common" "github.com/songquanpeng/one-api/common/conv" @@ -31,6 +32,7 @@ func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.E common.SetEventStreamHeaders(c) + doneRendered := false for scanner.Scan() { data := scanner.Text() if len(data) < dataPrefixLength { // ignore blank line or wrong format @@ -41,6 +43,7 @@ func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.E } if strings.HasPrefix(data[dataPrefixLength:], done) { render.StringData(c, data) + doneRendered = true continue } switch relayMode { @@ -81,7 +84,9 @@ func StreamHandler(c *gin.Context, resp *http.Response, relayMode int) (*model.E logger.SysError("error reading stream: " + err.Error()) } - render.Done(c) + if !doneRendered { + render.Done(c) + } err := resp.Body.Close() if err != nil { From 6ad169975fc282689e4f287aa27c93b7467177ff Mon Sep 17 00:00:00 2001 From: zijiren <84728412+zijiren233@users.noreply.github.com> Date: Tue, 9 Jul 2024 22:57:06 +0800 Subject: [PATCH 2/2] fix: impl cloudflare worker ai gateway (#1617) --- relay/adaptor/cloudflare/adaptor.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/relay/adaptor/cloudflare/adaptor.go b/relay/adaptor/cloudflare/adaptor.go index be2fb4ab..97e3dbb2 100644 --- a/relay/adaptor/cloudflare/adaptor.go +++ b/relay/adaptor/cloudflare/adaptor.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net/http" + "strings" "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/relay/adaptor" @@ -28,14 +29,32 @@ func (a *Adaptor) Init(meta *meta.Meta) { a.meta = meta } +// WorkerAI cannot be used across accounts with AIGateWay +// https://developers.cloudflare.com/ai-gateway/providers/workersai/#openai-compatible-endpoints +// https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/workers-ai +func (a *Adaptor) isAIGateWay(baseURL string) bool { + return strings.HasPrefix(baseURL, "https://gateway.ai.cloudflare.com") && strings.HasSuffix(baseURL, "/workers-ai") +} + func (a *Adaptor) GetRequestURL(meta *meta.Meta) (string, error) { + isAIGateWay := a.isAIGateWay(meta.BaseURL) + var urlPrefix string + if isAIGateWay { + urlPrefix = meta.BaseURL + } else { + urlPrefix = fmt.Sprintf("%s/client/v4/accounts/%s/ai", meta.BaseURL, meta.Config.UserID) + } + switch meta.Mode { case relaymode.ChatCompletions: - return fmt.Sprintf("%s/client/v4/accounts/%s/ai/v1/chat/completions", meta.BaseURL, meta.Config.UserID), nil + return fmt.Sprintf("%s/v1/chat/completions", urlPrefix), nil case relaymode.Embeddings: - return fmt.Sprintf("%s/client/v4/accounts/%s/ai/v1/embeddings", meta.BaseURL, meta.Config.UserID), nil + return fmt.Sprintf("%s/v1/embeddings", urlPrefix), nil default: - return fmt.Sprintf("%s/client/v4/accounts/%s/ai/run/%s", meta.BaseURL, meta.Config.UserID, meta.ActualModelName), nil + if isAIGateWay { + return fmt.Sprintf("%s/%s", urlPrefix, meta.ActualModelName), nil + } + return fmt.Sprintf("%s/run/%s", urlPrefix, meta.ActualModelName), nil } }