Skip to content

Commit 495fc62

Browse files
committed
feat: support gpt-4 with vision (#683, #714)
1 parent 76f9288 commit 495fc62

File tree

10 files changed

+56
-17
lines changed

10 files changed

+56
-17
lines changed

controller/relay-aiproxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ type AIProxyLibraryStreamResponse struct {
4848
func requestOpenAI2AIProxyLibrary(request GeneralOpenAIRequest) *AIProxyLibraryRequest {
4949
query := ""
5050
if len(request.Messages) != 0 {
51-
query = request.Messages[len(request.Messages)-1].Content
51+
query = request.Messages[len(request.Messages)-1].StringContent()
5252
}
5353
return &AIProxyLibraryRequest{
5454
Model: request.Model,

controller/relay-ali.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,18 @@ func requestOpenAI2Ali(request GeneralOpenAIRequest) *AliChatRequest {
8888
message := request.Messages[i]
8989
if message.Role == "system" {
9090
messages = append(messages, AliMessage{
91-
User: message.Content,
91+
User: message.StringContent(),
9292
Bot: "Okay",
9393
})
9494
continue
9595
} else {
9696
if i == len(request.Messages)-1 {
97-
prompt = message.Content
97+
prompt = message.StringContent()
9898
break
9999
}
100100
messages = append(messages, AliMessage{
101-
User: message.Content,
102-
Bot: request.Messages[i+1].Content,
101+
User: message.StringContent(),
102+
Bot: request.Messages[i+1].StringContent(),
103103
})
104104
i++
105105
}

controller/relay-baidu.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func requestOpenAI2Baidu(request GeneralOpenAIRequest) *BaiduChatRequest {
8989
if message.Role == "system" {
9090
messages = append(messages, BaiduMessage{
9191
Role: "user",
92-
Content: message.Content,
92+
Content: message.StringContent(),
9393
})
9494
messages = append(messages, BaiduMessage{
9595
Role: "assistant",
@@ -98,7 +98,7 @@ func requestOpenAI2Baidu(request GeneralOpenAIRequest) *BaiduChatRequest {
9898
} else {
9999
messages = append(messages, BaiduMessage{
100100
Role: message.Role,
101-
Content: message.Content,
101+
Content: message.StringContent(),
102102
})
103103
}
104104
}

controller/relay-openai.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func openaiHandler(c *gin.Context, resp *http.Response, consumeQuota bool, promp
132132
if textResponse.Usage.TotalTokens == 0 {
133133
completionTokens := 0
134134
for _, choice := range textResponse.Choices {
135-
completionTokens += countTokenText(choice.Message.Content, model)
135+
completionTokens += countTokenText(choice.Message.StringContent(), model)
136136
}
137137
textResponse.Usage = Usage{
138138
PromptTokens: promptTokens,

controller/relay-palm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func requestOpenAI2PaLM(textRequest GeneralOpenAIRequest) *PaLMChatRequest {
5959
}
6060
for _, message := range textRequest.Messages {
6161
palmMessage := PaLMChatMessage{
62-
Content: message.Content,
62+
Content: message.StringContent(),
6363
}
6464
if message.Role == "user" {
6565
palmMessage.Author = "0"

controller/relay-tencent.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func requestOpenAI2Tencent(request GeneralOpenAIRequest) *TencentChatRequest {
8484
if message.Role == "system" {
8585
messages = append(messages, TencentMessage{
8686
Role: "user",
87-
Content: message.Content,
87+
Content: message.StringContent(),
8888
})
8989
messages = append(messages, TencentMessage{
9090
Role: "assistant",
@@ -93,7 +93,7 @@ func requestOpenAI2Tencent(request GeneralOpenAIRequest) *TencentChatRequest {
9393
continue
9494
}
9595
messages = append(messages, TencentMessage{
96-
Content: message.Content,
96+
Content: message.StringContent(),
9797
Role: message.Role,
9898
})
9999
}

controller/relay-utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func countTokenMessages(messages []Message, model string) int {
8787
tokenNum := 0
8888
for _, message := range messages {
8989
tokenNum += tokensPerMessage
90-
tokenNum += getTokenNum(tokenEncoder, message.Content)
90+
tokenNum += getTokenNum(tokenEncoder, message.StringContent())
9191
tokenNum += getTokenNum(tokenEncoder, message.Role)
9292
if message.Name != nil {
9393
tokenNum += tokensPerName

controller/relay-xunfei.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func requestOpenAI2Xunfei(request GeneralOpenAIRequest, xunfeiAppId string, doma
8181
if message.Role == "system" {
8282
messages = append(messages, XunfeiMessage{
8383
Role: "user",
84-
Content: message.Content,
84+
Content: message.StringContent(),
8585
})
8686
messages = append(messages, XunfeiMessage{
8787
Role: "assistant",
@@ -90,7 +90,7 @@ func requestOpenAI2Xunfei(request GeneralOpenAIRequest, xunfeiAppId string, doma
9090
} else {
9191
messages = append(messages, XunfeiMessage{
9292
Role: message.Role,
93-
Content: message.Content,
93+
Content: message.StringContent(),
9494
})
9595
}
9696
}

controller/relay-zhipu.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func requestOpenAI2Zhipu(request GeneralOpenAIRequest) *ZhipuRequest {
114114
if message.Role == "system" {
115115
messages = append(messages, ZhipuMessage{
116116
Role: "system",
117-
Content: message.Content,
117+
Content: message.StringContent(),
118118
})
119119
messages = append(messages, ZhipuMessage{
120120
Role: "user",
@@ -123,7 +123,7 @@ func requestOpenAI2Zhipu(request GeneralOpenAIRequest) *ZhipuRequest {
123123
} else {
124124
messages = append(messages, ZhipuMessage{
125125
Role: message.Role,
126-
Content: message.Content,
126+
Content: message.StringContent(),
127127
})
128128
}
129129
}

controller/relay.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,49 @@ import (
1212

1313
type Message struct {
1414
Role string `json:"role"`
15-
Content string `json:"content"`
15+
Content any `json:"content"`
1616
Name *string `json:"name,omitempty"`
1717
}
1818

19+
type ImageURL struct {
20+
Url string `json:"url,omitempty"`
21+
Detail string `json:"detail,omitempty"`
22+
}
23+
24+
type TextContent struct {
25+
Type string `json:"type,omitempty"`
26+
Text string `json:"text,omitempty"`
27+
}
28+
29+
type ImageContent struct {
30+
Type string `json:"type,omitempty"`
31+
ImageURL *ImageURL `json:"image_url,omitempty"`
32+
}
33+
34+
func (m Message) StringContent() string {
35+
content, ok := m.Content.(string)
36+
if ok {
37+
return content
38+
}
39+
contentList, ok := m.Content.([]any)
40+
if ok {
41+
var contentStr string
42+
for _, contentItem := range contentList {
43+
contentMap, ok := contentItem.(map[string]any)
44+
if !ok {
45+
continue
46+
}
47+
if contentMap["type"] == "text" {
48+
if subStr, ok := contentMap["text"].(string); ok {
49+
contentStr += subStr
50+
}
51+
}
52+
}
53+
return contentStr
54+
}
55+
return ""
56+
}
57+
1958
const (
2059
RelayModeUnknown = iota
2160
RelayModeChatCompletions

0 commit comments

Comments
 (0)