77	"errors" 
88	"io" 
99	"net/http" 
10+ 	"reflect" 
1011
1112	openai "github.com/meguminnnnnnnnn/go-openai/internal" 
1213
@@ -136,6 +137,8 @@ type ChatCompletionMessage struct {
136137
137138	// For Role=tool prompts this should be set to the ID given in the assistant's prior request to call a tool. 
138139	ToolCallID  string  `json:"tool_call_id,omitempty"` 
140+ 
141+ 	ExtraFields  map [string ]json.RawMessage  `json:"-"` 
139142}
140143
141144func  (m  ChatCompletionMessage ) MarshalJSON () ([]byte , error ) {
@@ -144,29 +147,31 @@ func (m ChatCompletionMessage) MarshalJSON() ([]byte, error) {
144147	}
145148	if  len (m .MultiContent ) >  0  {
146149		msg  :=  struct  {
147- 			Role              string             `json:"role"` 
148- 			Content           string             `json:"-"` 
149- 			Refusal           string             `json:"refusal,omitempty"` 
150- 			MultiContent      []ChatMessagePart  `json:"content,omitempty"` 
151- 			Name              string             `json:"name,omitempty"` 
152- 			ReasoningContent  string             `json:"reasoning_content,omitempty"` 
153- 			FunctionCall      * FunctionCall      `json:"function_call,omitempty"` 
154- 			ToolCalls         []ToolCall         `json:"tool_calls,omitempty"` 
155- 			ToolCallID        string             `json:"tool_call_id,omitempty"` 
150+ 			Role              string                      `json:"role"` 
151+ 			Content           string                      `json:"-"` 
152+ 			Refusal           string                      `json:"refusal,omitempty"` 
153+ 			MultiContent      []ChatMessagePart           `json:"content,omitempty"` 
154+ 			Name              string                      `json:"name,omitempty"` 
155+ 			ReasoningContent  string                      `json:"reasoning_content,omitempty"` 
156+ 			FunctionCall      * FunctionCall               `json:"function_call,omitempty"` 
157+ 			ToolCalls         []ToolCall                  `json:"tool_calls,omitempty"` 
158+ 			ToolCallID        string                      `json:"tool_call_id,omitempty"` 
159+ 			ExtraFields       map [string ]json.RawMessage  `json:"-"` 
156160		}(m )
157161		return  json .Marshal (msg )
158162	}
159163
160164	msg  :=  struct  {
161- 		Role              string             `json:"role"` 
162- 		Content           string             `json:"content,omitempty"` 
163- 		Refusal           string             `json:"refusal,omitempty"` 
164- 		MultiContent      []ChatMessagePart  `json:"-"` 
165- 		Name              string             `json:"name,omitempty"` 
166- 		ReasoningContent  string             `json:"reasoning_content,omitempty"` 
167- 		FunctionCall      * FunctionCall      `json:"function_call,omitempty"` 
168- 		ToolCalls         []ToolCall         `json:"tool_calls,omitempty"` 
169- 		ToolCallID        string             `json:"tool_call_id,omitempty"` 
165+ 		Role              string                      `json:"role"` 
166+ 		Content           string                      `json:"content,omitempty"` 
167+ 		Refusal           string                      `json:"refusal,omitempty"` 
168+ 		MultiContent      []ChatMessagePart           `json:"-"` 
169+ 		Name              string                      `json:"name,omitempty"` 
170+ 		ReasoningContent  string                      `json:"reasoning_content,omitempty"` 
171+ 		FunctionCall      * FunctionCall               `json:"function_call,omitempty"` 
172+ 		ToolCalls         []ToolCall                  `json:"tool_calls,omitempty"` 
173+ 		ToolCallID        string                      `json:"tool_call_id,omitempty"` 
174+ 		ExtraFields       map [string ]json.RawMessage  `json:"-"` 
170175	}(m )
171176	return  json .Marshal (msg )
172177}
@@ -177,32 +182,49 @@ func (m *ChatCompletionMessage) UnmarshalJSON(bs []byte) error {
177182		Content           string  `json:"content"` 
178183		Refusal           string  `json:"refusal,omitempty"` 
179184		MultiContent      []ChatMessagePart 
180- 		Name              string         `json:"name,omitempty"` 
181- 		ReasoningContent  string         `json:"reasoning_content,omitempty"` 
182- 		FunctionCall      * FunctionCall  `json:"function_call,omitempty"` 
183- 		ToolCalls         []ToolCall     `json:"tool_calls,omitempty"` 
184- 		ToolCallID        string         `json:"tool_call_id,omitempty"` 
185+ 		Name              string                      `json:"name,omitempty"` 
186+ 		ReasoningContent  string                      `json:"reasoning_content,omitempty"` 
187+ 		FunctionCall      * FunctionCall               `json:"function_call,omitempty"` 
188+ 		ToolCalls         []ToolCall                  `json:"tool_calls,omitempty"` 
189+ 		ToolCallID        string                      `json:"tool_call_id,omitempty"` 
190+ 		ExtraFields       map [string ]json.RawMessage  `json:"-"` 
185191	}{}
186192
187193	if  err  :=  json .Unmarshal (bs , & msg ); err  ==  nil  {
188194		* m  =  ChatCompletionMessage (msg )
195+ 		var  extra  map [string ]json.RawMessage 
196+ 		extra , err  =  openai .UnmarshalExtraFields (reflect .TypeOf (m ), bs )
197+ 		if  err  !=  nil  {
198+ 			return  err 
199+ 		}
200+ 
201+ 		m .ExtraFields  =  extra 
189202		return  nil 
190203	}
204+ 
191205	multiMsg  :=  struct  {
192206		Role              string  `json:"role"` 
193207		Content           string 
194- 		Refusal           string             `json:"refusal,omitempty"` 
195- 		MultiContent      []ChatMessagePart  `json:"content"` 
196- 		Name              string             `json:"name,omitempty"` 
197- 		ReasoningContent  string             `json:"reasoning_content,omitempty"` 
198- 		FunctionCall      * FunctionCall      `json:"function_call,omitempty"` 
199- 		ToolCalls         []ToolCall         `json:"tool_calls,omitempty"` 
200- 		ToolCallID        string             `json:"tool_call_id,omitempty"` 
208+ 		Refusal           string                      `json:"refusal,omitempty"` 
209+ 		MultiContent      []ChatMessagePart           `json:"content"` 
210+ 		Name              string                      `json:"name,omitempty"` 
211+ 		ReasoningContent  string                      `json:"reasoning_content,omitempty"` 
212+ 		FunctionCall      * FunctionCall               `json:"function_call,omitempty"` 
213+ 		ToolCalls         []ToolCall                  `json:"tool_calls,omitempty"` 
214+ 		ToolCallID        string                      `json:"tool_call_id,omitempty"` 
215+ 		ExtraFields       map [string ]json.RawMessage  `json:"-"` 
201216	}{}
202217	if  err  :=  json .Unmarshal (bs , & multiMsg ); err  !=  nil  {
203218		return  err 
204219	}
205220	* m  =  ChatCompletionMessage (multiMsg )
221+ 
222+ 	extra , err  :=  openai .UnmarshalExtraFields (reflect .TypeOf (m ), bs )
223+ 	if  err  !=  nil  {
224+ 		return  err 
225+ 	}
226+ 
227+ 	m .ExtraFields  =  extra 
206228	return  nil 
207229}
208230
0 commit comments