diff --git a/go.mod b/go.mod index c139e7a0653fc940b9fc8985f95d0a5e6c54673c..1353ace5d5f704fe61f57b3fb8e94870f04a898f 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.24.5 require ( github.com/anthropics/anthropic-sdk-go v1.10.0 + github.com/charmbracelet/x/json v0.2.0 github.com/go-viper/mapstructure/v2 v2.4.0 github.com/google/uuid v1.6.0 github.com/openai/openai-go/v2 v2.3.0 diff --git a/go.sum b/go.sum index 21cd1efb3cabc401e221e349198ddb6f53f2b6c9..f0842950eff85bf44d2d221921d1696a5938aa79 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/anthropics/anthropic-sdk-go v1.10.0 h1:jDKQTfC0miIEj21eMmPrNSLKTNdNa3nHZOhd4wZz1cI= github.com/anthropics/anthropic-sdk-go v1.10.0/go.mod h1:WTz31rIUHUHqai2UslPpw5CwXrQP3geYBioRV4WOLvE= +github.com/charmbracelet/x/json v0.2.0 h1:DqB+ZGx2h+Z+1s98HOuOyli+i97wsFQIxP2ZQANTPrQ= +github.com/charmbracelet/x/json v0.2.0/go.mod h1:opFIflx2YgXgi49xVUu8gEQ21teFAxyMwvOiZhIvWNM= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= diff --git a/openai/json.go b/openai/json.go deleted file mode 100644 index 0601aa0c38c8229a86d82787cc2b93aa36262f1b..0000000000000000000000000000000000000000 --- a/openai/json.go +++ /dev/null @@ -1,14 +0,0 @@ -package openai - -import ( - "encoding/json" -) - -func isValidJSON[T string | []byte](data T) bool { - if len(data) == 0 { // hot path - return false - } - var m json.RawMessage - err := json.Unmarshal([]byte(data), &m) - return err == nil -} diff --git a/openai/openai.go b/openai/openai.go index c62a8da3c539a1f49740fa8ae38e8968312819d5..40dab7fe5873ef4424a985c5bf84d99634f3a23d 100644 --- a/openai/openai.go +++ b/openai/openai.go @@ -12,6 +12,7 @@ import ( "strings" "github.com/charmbracelet/ai/ai" + xjson "github.com/charmbracelet/x/json" "github.com/google/uuid" "github.com/openai/openai-go/v2" "github.com/openai/openai-go/v2/option" @@ -584,7 +585,7 @@ func (o languageModel) Stream(ctx context.Context, call ai.Call) (ai.StreamRespo return } toolCalls[toolCallDelta.Index] = existingToolCall - if isValidJSON(existingToolCall.arguments) { + if xjson.IsValid(existingToolCall.arguments) { if !yield(ai.StreamPart{ Type: ai.StreamPartTypeToolInputEnd, ID: existingToolCall.id, @@ -645,7 +646,7 @@ func (o languageModel) Stream(ctx context.Context, call ai.Call) (ai.StreamRespo }) { return } - if isValidJSON(toolCalls[toolCallDelta.Index].arguments) { + if xjson.IsValid(toolCalls[toolCallDelta.Index].arguments) { if !yield(ai.StreamPart{ Type: ai.StreamPartTypeToolInputEnd, ID: toolCallDelta.ID,