|
|
@@ -1,10 +1,12 @@
|
|
|
package claude
|
|
|
|
|
|
import (
|
|
|
+ "encoding/base64"
|
|
|
"strings"
|
|
|
"testing"
|
|
|
|
|
|
"github.com/QuantumNous/new-api/dto"
|
|
|
+ "github.com/stretchr/testify/require"
|
|
|
)
|
|
|
|
|
|
func TestFormatClaudeResponseInfo_MessageStart(t *testing.T) {
|
|
|
@@ -255,3 +257,109 @@ func TestBuildOpenAIStyleUsageFromClaudeUsagePreservesCacheCreationRemainder(t *
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestRequestOpenAI2ClaudeMessage_IgnoresUnsupportedFileContent(t *testing.T) {
|
|
|
+ request := dto.GeneralOpenAIRequest{
|
|
|
+ Model: "claude-3-5-sonnet",
|
|
|
+ Messages: []dto.Message{
|
|
|
+ {
|
|
|
+ Role: "user",
|
|
|
+ Content: []any{
|
|
|
+ dto.MediaContent{
|
|
|
+ Type: dto.ContentTypeText,
|
|
|
+ Text: "see attachment",
|
|
|
+ },
|
|
|
+ dto.MediaContent{
|
|
|
+ Type: dto.ContentTypeFile,
|
|
|
+ File: &dto.MessageFile{
|
|
|
+ FileName: "blob.bin",
|
|
|
+ FileData: "JVBERi0xLjQK",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ claudeRequest, err := RequestOpenAI2ClaudeMessage(nil, request)
|
|
|
+ require.NoError(t, err)
|
|
|
+ require.Len(t, claudeRequest.Messages, 1)
|
|
|
+
|
|
|
+ content, ok := claudeRequest.Messages[0].Content.([]dto.ClaudeMediaMessage)
|
|
|
+ require.True(t, ok)
|
|
|
+ require.Len(t, content, 1)
|
|
|
+ require.Equal(t, "text", content[0].Type)
|
|
|
+ require.NotNil(t, content[0].Text)
|
|
|
+ require.Equal(t, "see attachment", *content[0].Text)
|
|
|
+}
|
|
|
+
|
|
|
+func TestRequestOpenAI2ClaudeMessage_SupportsPDFFileContent(t *testing.T) {
|
|
|
+ request := dto.GeneralOpenAIRequest{
|
|
|
+ Model: "claude-3-5-sonnet",
|
|
|
+ Messages: []dto.Message{
|
|
|
+ {
|
|
|
+ Role: "user",
|
|
|
+ Content: []any{
|
|
|
+ dto.MediaContent{
|
|
|
+ Type: dto.ContentTypeFile,
|
|
|
+ File: &dto.MessageFile{
|
|
|
+ FileName: "spec.pdf",
|
|
|
+ FileData: "JVBERi0xLjQK",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ dto.MediaContent{
|
|
|
+ Type: dto.ContentTypeText,
|
|
|
+ Text: "summarize it",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ claudeRequest, err := RequestOpenAI2ClaudeMessage(nil, request)
|
|
|
+ require.NoError(t, err)
|
|
|
+ require.Len(t, claudeRequest.Messages, 1)
|
|
|
+
|
|
|
+ content, ok := claudeRequest.Messages[0].Content.([]dto.ClaudeMediaMessage)
|
|
|
+ require.True(t, ok)
|
|
|
+ require.Len(t, content, 2)
|
|
|
+ require.Equal(t, "document", content[0].Type)
|
|
|
+ require.NotNil(t, content[0].Source)
|
|
|
+ require.Equal(t, "base64", content[0].Source.Type)
|
|
|
+ require.Equal(t, "application/pdf", content[0].Source.MediaType)
|
|
|
+ require.Equal(t, "JVBERi0xLjQK", content[0].Source.Data)
|
|
|
+ require.Equal(t, "text", content[1].Type)
|
|
|
+ require.NotNil(t, content[1].Text)
|
|
|
+ require.Equal(t, "summarize it", *content[1].Text)
|
|
|
+}
|
|
|
+
|
|
|
+func TestRequestOpenAI2ClaudeMessage_ConvertsTextFileContentToText(t *testing.T) {
|
|
|
+ request := dto.GeneralOpenAIRequest{
|
|
|
+ Model: "claude-3-5-sonnet",
|
|
|
+ Messages: []dto.Message{
|
|
|
+ {
|
|
|
+ Role: "user",
|
|
|
+ Content: []any{
|
|
|
+ dto.MediaContent{
|
|
|
+ Type: dto.ContentTypeFile,
|
|
|
+ File: &dto.MessageFile{
|
|
|
+ FileName: "notes.txt",
|
|
|
+ FileData: base64.StdEncoding.EncodeToString([]byte("alpha\nbeta")),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ claudeRequest, err := RequestOpenAI2ClaudeMessage(nil, request)
|
|
|
+ require.NoError(t, err)
|
|
|
+ require.Len(t, claudeRequest.Messages, 1)
|
|
|
+
|
|
|
+ content, ok := claudeRequest.Messages[0].Content.([]dto.ClaudeMediaMessage)
|
|
|
+ require.True(t, ok)
|
|
|
+ require.Len(t, content, 1)
|
|
|
+ require.Equal(t, "text", content[0].Type)
|
|
|
+ require.NotNil(t, content[0].Text)
|
|
|
+ require.Equal(t, "alpha\nbeta", *content[0].Text)
|
|
|
+}
|