feat: sync deployed v1.0.0-rc.38-custom.42
Sync production source including routing, billing, Astra detection and public uptime. Update custom build instructions and license packaging.
This commit is contained in:
1 parent
aa6c3f50f4
commit
ceddfd3d6b
828 files changed
+122253
-13702
No files matched your search
@@ -14,6 +14,7 @@ import (
|
||||
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
||||
relayconstant "github.com/QuantumNous/new-api/relay/constant"
|
||||
"github.com/QuantumNous/new-api/relaykit/dto"
|
||||
"github.com/QuantumNous/new-api/relaykit/relayconvert"
|
||||
relaytypes "github.com/QuantumNous/new-api/relaykit/types"
|
||||
hosttypes "github.com/QuantumNous/new-api/types"
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -21,6 +22,59 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPrepareResponsesRequestRetainsConvertedAdaptor(t *testing.T) {
|
||||
type capturedRequest struct {
|
||||
path string
|
||||
body []byte
|
||||
}
|
||||
captured := make(chan capturedRequest, 1)
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
body, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
captured <- capturedRequest{path: r.URL.Path, body: body}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
_, _ = w.Write([]byte(`{"id":"chatcmpl_1","object":"chat.completion","model":"gpt-4o","choices":[{"index":0,"message":{"role":"assistant","content":"ok"},"finish_reason":"stop"}],"usage":{"prompt_tokens":3,"completion_tokens":2,"total_tokens":5}}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
c, _ := gin.CreateTestContext(httptest.NewRecorder())
|
||||
c.Request = httptest.NewRequest(http.MethodPost, "/v1/responses", nil)
|
||||
c.Request.Header.Set("Content-Type", "application/json")
|
||||
common.SetContextKey(c, constant.ContextKeyOriginalModel, "gpt-4o")
|
||||
common.SetContextKey(c, constant.ContextKeyChannelType, constant.ChannelTypeAdvancedCustom)
|
||||
common.SetContextKey(c, constant.ContextKeyChannelBaseUrl, server.URL)
|
||||
common.SetContextKey(c, constant.ContextKeyChannelKey, "test-key")
|
||||
common.SetContextKey(c, constant.ContextKeyChannelOtherSetting, dto.ChannelOtherSettings{
|
||||
AdvancedCustom: &dto.AdvancedCustomConfig{Routes: []dto.AdvancedCustomRoute{{
|
||||
IncomingPath: "/v1/responses", UpstreamPath: "/v1/chat/completions", Converter: relayconvert.ConverterOpenAIResponsesToOpenAIChat,
|
||||
}}},
|
||||
})
|
||||
request := &dto.OpenAIResponsesRequest{Model: "gpt-4o", Input: []byte(`"hello"`)}
|
||||
info := relaycommon.GenRelayInfoResponses(c, request)
|
||||
adaptor, body, closer, apiErr := PrepareResponsesRequest(c, info, request)
|
||||
require.Nil(t, apiErr)
|
||||
defer closer.Close()
|
||||
response, err := adaptor.DoRequest(c, info, body)
|
||||
require.NoError(t, err)
|
||||
httpResponse, ok := response.(*http.Response)
|
||||
require.True(t, ok)
|
||||
usage, apiErr := adaptor.DoResponse(c, httpResponse, info)
|
||||
require.Nil(t, apiErr)
|
||||
require.IsType(t, &dto.Usage{}, usage)
|
||||
assert.Equal(t, 5, usage.(*dto.Usage).TotalTokens)
|
||||
|
||||
upstream := <-captured
|
||||
assert.Equal(t, "/v1/chat/completions", upstream.path)
|
||||
var upstreamRequest dto.GeneralOpenAIRequest
|
||||
require.NoError(t, common.Unmarshal(upstream.body, &upstreamRequest))
|
||||
require.Len(t, upstreamRequest.Messages, 1)
|
||||
assert.Equal(t, "hello", upstreamRequest.Messages[0].StringContent())
|
||||
assert.Equal(t, []relaytypes.RelayFormat{relaytypes.RelayFormatOpenAIResponses, relaytypes.RelayFormatOpenAI}, info.RequestConversionChain)
|
||||
}
|
||||
|
||||
func TestIsResponsesEventStreamContentType(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
|
||||
Reference in new issue
Block a user