diff --git a/.golangci.yaml b/.golangci.yaml index 03be8a7..c2c3ee3 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,24 +1,35 @@ +version: "2" run: timeout: 5m - -output: - formats: - - format: colored-line-number - linters: - disable-all: true + default: none enable: - errcheck - - gofmt - - gosimple - govet - ineffassign + - revive - staticcheck - - typecheck - thelper - unused - - goimports - whitespace - - revive - fast: false - max-same-issues: 50 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/Makefile b/Makefile index ecb61c5..0227d0a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ tidy: test: go test -v ./... -GOLANGCI_LINT_VERSION ?= v1.60.1 +GOLANGCI_LINT_VERSION ?= v2.1.2 lint: if ! command -v golangci-lint &> /dev/null; then \ echo "Could not find golangci-lint, installing version $(GOLANGCI_LINT_VERSION)."; \ diff --git a/go.mod b/go.mod index b642e52..a625857 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,9 @@ module github.com/gptscript-ai/go-gptscript -go 1.23.0 - -replace github.com/danielgtaylor/huma/v2 => github.com/gptscript-ai/huma v0.0.0-20250617131016-b2081da6c65b +go 1.24.2 require ( - github.com/danielgtaylor/huma/v2 v2.32.1-0.20250509235652-c7ead6f3c67f + github.com/modelcontextprotocol/go-sdk v0.2.0 github.com/stretchr/testify v1.10.0 ) diff --git a/go.sum b/go.sum index c9b2029..10b0c7a 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,14 @@ 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/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gptscript-ai/huma v0.0.0-20250617131016-b2081da6c65b h1:QReUetqY+ep2sj6g83oqldPHzwH2T2TG1sv0IWE2hL0= -github.com/gptscript-ai/huma v0.0.0-20250617131016-b2081da6c65b/go.mod h1:y2Eq35Y5Xy6+MZRPgn81/bjNBiEHqEQba+vY+fLigjU= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/modelcontextprotocol/go-sdk v0.2.0 h1:PESNYOmyM1c369tRkzXLY5hHrazj8x9CY1Xu0fLCryM= +github.com/modelcontextprotocol/go-sdk v0.2.0/go.mod h1:0sL9zUKKs2FTTkeCCVnKqbLJTw5TScefPAzojjU459E= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= diff --git a/gptscript_test.go b/gptscript_test.go index 9349ccd..4cf7a6b 100644 --- a/gptscript_test.go +++ b/gptscript_test.go @@ -13,7 +13,7 @@ import ( "testing" "time" - humav2 "github.com/danielgtaylor/huma/v2" + "github.com/modelcontextprotocol/go-sdk/jsonschema" "github.com/stretchr/testify/require" ) @@ -567,7 +567,7 @@ func TestRestartFailedRun(t *testing.T) { t.Errorf("Expected error but got nil") } - run.opts.GlobalOptions.Env = nil + run.opts.Env = nil run, err = run.NextChat(context.Background(), "") if err != nil { t.Fatalf("Error executing next run: %v", err) @@ -768,12 +768,12 @@ func TestFmt(t *testing.T) { ToolDef: ToolDef{ Name: "echo", Instructions: "#!/bin/bash\necho hello there", - Arguments: &humav2.Schema{ - Type: humav2.TypeObject, - Properties: map[string]*humav2.Schema{ + Arguments: &jsonschema.Schema{ + Type: "object", + Properties: map[string]*jsonschema.Schema{ "input": { Description: "The string input to echo", - Type: humav2.TypeString, + Type: "string", }, }, }, @@ -827,12 +827,12 @@ func TestFmtWithTextNode(t *testing.T) { ToolDef: ToolDef{ Instructions: "#!/bin/bash\necho hello there", Name: "echo", - Arguments: &humav2.Schema{ - Type: humav2.TypeObject, - Properties: map[string]*humav2.Schema{ + Arguments: &jsonschema.Schema{ + Type: "object", + Properties: map[string]*jsonschema.Schema{ "input": { Description: "The string input to echo", - Type: humav2.TypeString, + Type: "string", }, }, }, @@ -1037,21 +1037,23 @@ func TestToolWithGlobalTools(t *testing.T) { for e := range run.Events() { if e.Run != nil { - if e.Run.Type == EventTypeRunStart { + switch e.Run.Type { + case EventTypeRunStart: runStartSeen = true - } else if e.Run.Type == EventTypeRunFinish { + case EventTypeRunFinish: runFinishSeen = true } } else if e.Call != nil { - if e.Call.Type == EventTypeCallStart { + switch e.Call.Type { + case EventTypeCallStart: callStartSeen = true - } else if e.Call.Type == EventTypeCallFinish { + case EventTypeCallFinish: callFinishSeen = true for _, o := range e.Call.Output { eventContent += o.Content } - } else if e.Call.Type == EventTypeCallProgress { + case EventTypeCallProgress: callProgressSeen = true } } diff --git a/tool.go b/tool.go index 5603ec3..18e8486 100644 --- a/tool.go +++ b/tool.go @@ -4,38 +4,38 @@ import ( "fmt" "strings" - humav2 "github.com/danielgtaylor/huma/v2" + "github.com/modelcontextprotocol/go-sdk/jsonschema" ) // ToolDef struct represents a tool with various configurations. type ToolDef struct { - Name string `json:"name,omitempty"` - Description string `json:"description,omitempty"` - MaxTokens int `json:"maxTokens,omitempty"` - ModelName string `json:"modelName,omitempty"` - ModelProvider bool `json:"modelProvider,omitempty"` - JSONResponse bool `json:"jsonResponse,omitempty"` - Chat bool `json:"chat,omitempty"` - Temperature *float32 `json:"temperature,omitempty"` - Cache *bool `json:"cache,omitempty"` - InternalPrompt *bool `json:"internalPrompt"` - Arguments *humav2.Schema `json:"arguments,omitempty"` - Tools []string `json:"tools,omitempty"` - GlobalTools []string `json:"globalTools,omitempty"` - GlobalModelName string `json:"globalModelName,omitempty"` - Context []string `json:"context,omitempty"` - ExportContext []string `json:"exportContext,omitempty"` - Export []string `json:"export,omitempty"` - Agents []string `json:"agents,omitempty"` - Credentials []string `json:"credentials,omitempty"` - ExportCredentials []string `json:"exportCredentials,omitempty"` - InputFilters []string `json:"inputFilters,omitempty"` - ExportInputFilters []string `json:"exportInputFilters,omitempty"` - OutputFilters []string `json:"outputFilters,omitempty"` - ExportOutputFilters []string `json:"exportOutputFilters,omitempty"` - Instructions string `json:"instructions,omitempty"` - Type string `json:"type,omitempty"` - MetaData map[string]string `json:"metadata,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + MaxTokens int `json:"maxTokens,omitempty"` + ModelName string `json:"modelName,omitempty"` + ModelProvider bool `json:"modelProvider,omitempty"` + JSONResponse bool `json:"jsonResponse,omitempty"` + Chat bool `json:"chat,omitempty"` + Temperature *float32 `json:"temperature,omitempty"` + Cache *bool `json:"cache,omitempty"` + InternalPrompt *bool `json:"internalPrompt"` + Arguments *jsonschema.Schema `json:"arguments,omitempty"` + Tools []string `json:"tools,omitempty"` + GlobalTools []string `json:"globalTools,omitempty"` + GlobalModelName string `json:"globalModelName,omitempty"` + Context []string `json:"context,omitempty"` + ExportContext []string `json:"exportContext,omitempty"` + Export []string `json:"export,omitempty"` + Agents []string `json:"agents,omitempty"` + Credentials []string `json:"credentials,omitempty"` + ExportCredentials []string `json:"exportCredentials,omitempty"` + InputFilters []string `json:"inputFilters,omitempty"` + ExportInputFilters []string `json:"exportInputFilters,omitempty"` + OutputFilters []string `json:"outputFilters,omitempty"` + ExportOutputFilters []string `json:"exportOutputFilters,omitempty"` + Instructions string `json:"instructions,omitempty"` + Type string `json:"type,omitempty"` + MetaData map[string]string `json:"metadata,omitempty"` } func ToolDefsToNodes(tools []ToolDef) []Node { @@ -52,16 +52,16 @@ func ToolDefsToNodes(tools []ToolDef) []Node { return nodes } -func ObjectSchema(kv ...string) *humav2.Schema { - s := &humav2.Schema{ - Type: humav2.TypeObject, - Properties: make(map[string]*humav2.Schema, len(kv)/2), +func ObjectSchema(kv ...string) *jsonschema.Schema { + s := &jsonschema.Schema{ + Type: "object", + Properties: make(map[string]*jsonschema.Schema, len(kv)/2), } for i, v := range kv { if i%2 == 1 { - s.Properties[kv[i-1]] = &humav2.Schema{ + s.Properties[kv[i-1]] = &jsonschema.Schema{ Description: v, - Type: humav2.TypeString, + Type: "string", } } }