77"errors"
88"io"
99"net/http"
10+ "reflect"
1011
1112openai "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.
138139ToolCallID 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}
145148if len (m .MultiContent ) > 0 {
146149msg := 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 )
157161return json .Marshal (msg )
158162}
159163
160164msg := 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 )
171176return json .Marshal (msg )
172177}
@@ -177,32 +182,49 @@ func (m *ChatCompletionMessage) UnmarshalJSON(bs []byte) error {
177182Content string `json:"content"`
178183Refusal string `json:"refusal,omitempty"`
179184MultiContent []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
187193if 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
189202return nil
190203}
204+
191205multiMsg := struct {
192206Role string `json:"role"`
193207Content 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}{}
202217if err := json .Unmarshal (bs , & multiMsg ); err != nil {
203218return 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
206228return nil
207229}
208230
0 commit comments