diff --git a/schema/message_parser.go b/schema/message_parser.go index 7bd95b81c..b0597a46f 100644 --- a/schema/message_parser.go +++ b/schema/message_parser.go @@ -50,17 +50,18 @@ type MessageJSONParseConfig struct { // NewMessageJSONParser creates a new MessageJSONParser. func NewMessageJSONParser[T any](config *MessageJSONParseConfig) MessageParser[T] { - if config == nil { - config = &MessageJSONParseConfig{} + var parseConfig MessageJSONParseConfig + if config != nil { + parseConfig = *config } - if config.ParseFrom == "" { - config.ParseFrom = MessageParseFromContent + if parseConfig.ParseFrom == "" { + parseConfig.ParseFrom = MessageParseFromContent } return &MessageJSONParser[T]{ - ParseFrom: config.ParseFrom, - ParseKeyPath: config.ParseKeyPath, + ParseFrom: parseConfig.ParseFrom, + ParseKeyPath: parseConfig.ParseKeyPath, } } diff --git a/schema/message_parser_test.go b/schema/message_parser_test.go index e645f8793..fe1f1c0cd 100644 --- a/schema/message_parser_test.go +++ b/schema/message_parser_test.go @@ -46,6 +46,16 @@ func TestMessageJSONParser(t *testing.T) { assert.Equal(t, 1, parsed.ID) }) + t.Run("default source leaves the config unchanged", func(t *testing.T) { + config := &MessageJSONParseConfig{ParseKeyPath: "id"} + parser := NewMessageJSONParser[int](config) + + parsed, err := parser.Parse(ctx, &Message{Content: `{"id": 7}`}) + assert.NoError(t, err) + assert.Equal(t, 7, parsed) + assert.Equal(t, &MessageJSONParseConfig{ParseKeyPath: "id"}, config) + }) + t.Run("parse from tool call", func(t *testing.T) { t.Run("only one tool call, default use first tool call", func(t *testing.T) { parser := NewMessageJSONParser[TestStructForParse](&MessageJSONParseConfig{