From 8b4a140e75885ed0d58b0520b59953ec90d4c37c Mon Sep 17 00:00:00 2001 From: 123XieC <323077714+123XieC@users.noreply.github.com> Date: Thu, 12 Nov 2026 13:45:47 +0800 Subject: [PATCH] fix(schema): preserve caller-owned JSON parser config --- schema/message_parser.go | 13 +++++++------ schema/message_parser_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) 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{