Merge pull request #2224 from jarvis-u/main

fix: 错误解析responses api中的input字段
This commit is contained in:
Seefs
2025-11-22 00:31:24 +08:00
committed by GitHub
+30 -10
View File
@@ -897,6 +897,12 @@ type Reasoning struct {
Summary string `json:"summary,omitempty"` Summary string `json:"summary,omitempty"`
} }
type Input struct {
Type string `json:"type,omitempty"`
Role string `json:"role,omitempty"`
Content json.RawMessage `json:"content,omitempty"`
}
type MediaInput struct { type MediaInput struct {
Type string `json:"type"` Type string `json:"type"`
Text string `json:"text,omitempty"` Text string `json:"text,omitempty"`
@@ -915,7 +921,7 @@ func (r *OpenAIResponsesRequest) ParseInput() []MediaInput {
return nil return nil
} }
var inputs []MediaInput var mediaInputs []MediaInput
// Try string first // Try string first
// if str, ok := common.GetJsonType(r.Input); ok { // if str, ok := common.GetJsonType(r.Input); ok {
@@ -925,25 +931,37 @@ func (r *OpenAIResponsesRequest) ParseInput() []MediaInput {
if common.GetJsonType(r.Input) == "string" { if common.GetJsonType(r.Input) == "string" {
var str string var str string
_ = common.Unmarshal(r.Input, &str) _ = common.Unmarshal(r.Input, &str)
inputs = append(inputs, MediaInput{Type: "input_text", Text: str}) mediaInputs = append(mediaInputs, MediaInput{Type: "input_text", Text: str})
return inputs return mediaInputs
} }
// Try array of parts // Try array of parts
if common.GetJsonType(r.Input) == "array" { if common.GetJsonType(r.Input) == "array" {
var inputs []Input
_ = common.Unmarshal(r.Input, &inputs)
for _, input := range inputs {
if common.GetJsonType(input.Content) == "string" {
var str string
_ = common.Unmarshal(input.Content, &str)
mediaInputs = append(mediaInputs, MediaInput{Type: "input_text", Text: str})
}
if common.GetJsonType(input.Content) == "array" {
var array []any var array []any
_ = common.Unmarshal(r.Input, &array) _ = common.Unmarshal(input.Content, &array)
for _, itemAny := range array { for _, itemAny := range array {
// Already parsed MediaInput // Already parsed MediaContent
if media, ok := itemAny.(MediaInput); ok { if media, ok := itemAny.(MediaInput); ok {
inputs = append(inputs, media) mediaInputs = append(mediaInputs, media)
continue continue
} }
// Generic map // Generic map
item, ok := itemAny.(map[string]any) item, ok := itemAny.(map[string]any)
if !ok { if !ok {
continue continue
} }
typeVal, ok := item["type"].(string) typeVal, ok := item["type"].(string)
if !ok { if !ok {
continue continue
@@ -951,7 +969,7 @@ func (r *OpenAIResponsesRequest) ParseInput() []MediaInput {
switch typeVal { switch typeVal {
case "input_text": case "input_text":
text, _ := item["text"].(string) text, _ := item["text"].(string)
inputs = append(inputs, MediaInput{Type: "input_text", Text: text}) mediaInputs = append(mediaInputs, MediaInput{Type: "input_text", Text: text})
case "input_image": case "input_image":
// image_url may be string or object with url field // image_url may be string or object with url field
var imageUrl string var imageUrl string
@@ -963,7 +981,7 @@ func (r *OpenAIResponsesRequest) ParseInput() []MediaInput {
imageUrl = url imageUrl = url
} }
} }
inputs = append(inputs, MediaInput{Type: "input_image", ImageUrl: imageUrl}) mediaInputs = append(mediaInputs, MediaInput{Type: "input_image", ImageUrl: imageUrl})
case "input_file": case "input_file":
// file_url may be string or object with url field // file_url may be string or object with url field
var fileUrl string var fileUrl string
@@ -975,10 +993,12 @@ func (r *OpenAIResponsesRequest) ParseInput() []MediaInput {
fileUrl = url fileUrl = url
} }
} }
inputs = append(inputs, MediaInput{Type: "input_file", FileUrl: fileUrl}) mediaInputs = append(mediaInputs, MediaInput{Type: "input_file", FileUrl: fileUrl})
}
}
} }
} }
} }
return inputs return mediaInputs
} }