fix: 错误解析responses api中的input字段

This commit is contained in:
wujiacheng
2025-11-14 09:58:39 +08:00
parent 3138483319
commit 733e3870e2
+30 -10
View File
@@ -895,6 +895,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"`
@@ -913,7 +919,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 {
@@ -923,25 +929,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
@@ -949,7 +967,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
@@ -961,7 +979,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
@@ -973,10 +991,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
} }