From 368e2f36ea3d24f92738b6a1a2c3718ca5c393b4 Mon Sep 17 00:00:00 2001 From: Donnie Adams Date: Sun, 20 Oct 2024 10:48:43 -0400 Subject: [PATCH] feat: make the SDK server workspace tool a global option Signed-off-by: Donnie Adams --- pkg/cli/sdk_server.go | 2 ++ pkg/sdkserver/routes.go | 1 + pkg/sdkserver/server.go | 7 +++++++ pkg/sdkserver/workspaces.go | 29 +++++++++++++++-------------- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/pkg/cli/sdk_server.go b/pkg/cli/sdk_server.go index c9cf480f..5ce65305 100644 --- a/pkg/cli/sdk_server.go +++ b/pkg/cli/sdk_server.go @@ -11,6 +11,7 @@ import ( type SDKServer struct { *GPTScript + WorkspaceTool string `usage:"Tool to use for workspace"` } func (c *SDKServer) Customize(cmd *cobra.Command) { @@ -37,5 +38,6 @@ func (c *SDKServer) Run(cmd *cobra.Command, _ []string) error { Options: opts, ListenAddress: c.ListenAddress, Debug: c.Debug, + WorkspaceTool: c.WorkspaceTool, }) } diff --git a/pkg/sdkserver/routes.go b/pkg/sdkserver/routes.go index 4d4ceb2e..8afdb8a4 100644 --- a/pkg/sdkserver/routes.go +++ b/pkg/sdkserver/routes.go @@ -28,6 +28,7 @@ import ( type server struct { gptscriptOpts gptscript.Options address, token string + workspaceTool string client *gptscript.GPTScript events *broadcaster.Broadcaster[event] diff --git a/pkg/sdkserver/server.go b/pkg/sdkserver/server.go index 0a68f0fa..1368fd54 100644 --- a/pkg/sdkserver/server.go +++ b/pkg/sdkserver/server.go @@ -27,6 +27,7 @@ type Options struct { gptscript.Options ListenAddress string + WorkspaceTool string Debug bool DisableServerErrorLogging bool } @@ -107,6 +108,7 @@ func run(ctx context.Context, listener net.Listener, opts Options) error { gptscriptOpts: opts.Options, address: listener.Addr().String(), token: token, + workspaceTool: opts.WorkspaceTool, client: g, events: events, runtimeManager: runtimes.Default(opts.Options.Cache.CacheDir), // TODO - do we always want to use runtimes.Default here? @@ -157,6 +159,7 @@ func complete(opts ...Options) Options { for _, opt := range opts { result.Options = gptscript.Complete(result.Options, opt.Options) result.ListenAddress = types.FirstSet(opt.ListenAddress, result.ListenAddress) + result.WorkspaceTool = types.FirstSet(opt.WorkspaceTool, result.WorkspaceTool) result.Debug = types.FirstSet(opt.Debug, result.Debug) result.DisableServerErrorLogging = types.FirstSet(opt.DisableServerErrorLogging, result.DisableServerErrorLogging) } @@ -165,5 +168,9 @@ func complete(opts ...Options) Options { result.ListenAddress = "127.0.0.1:0" } + if result.WorkspaceTool == "" { + result.WorkspaceTool = "github.com/gptscript-ai/workspace-provider" + } + return result } diff --git a/pkg/sdkserver/workspaces.go b/pkg/sdkserver/workspaces.go index dd2df692..e3989117 100644 --- a/pkg/sdkserver/workspaces.go +++ b/pkg/sdkserver/workspaces.go @@ -11,19 +11,20 @@ import ( "github.com/gptscript-ai/gptscript/pkg/loader" ) +func (s *server) getWorkspaceTool(req workspaceCommonRequest) string { + if req.WorkspaceTool != "" { + return req.WorkspaceTool + } + + return s.workspaceTool +} + type workspaceCommonRequest struct { ID string `json:"id"` WorkspaceTool string `json:"workspaceTool"` Env []string `json:"env"` } -func (w workspaceCommonRequest) getToolRepo() string { - if w.WorkspaceTool != "" { - return w.WorkspaceTool - } - return "github.com/gptscript-ai/workspace-provider" -} - type createWorkspaceRequest struct { workspaceCommonRequest `json:",inline"` ProviderType string `json:"providerType"` @@ -38,7 +39,7 @@ func (s *server) createWorkspace(w http.ResponseWriter, r *http.Request) { return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Create Workspace", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Create Workspace", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return @@ -77,7 +78,7 @@ func (s *server) deleteWorkspace(w http.ResponseWriter, r *http.Request) { return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Delete Workspace", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Delete Workspace", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return @@ -114,7 +115,7 @@ func (s *server) listWorkspaceContents(w http.ResponseWriter, r *http.Request) { return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "List Workspace Contents", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "List Workspace Contents", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return @@ -150,7 +151,7 @@ func (s *server) removeAllWithPrefixInWorkspace(w http.ResponseWriter, r *http.R return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Remove All With Prefix In Workspace", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Remove All With Prefix In Workspace", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return @@ -187,7 +188,7 @@ func (s *server) writeFileInWorkspace(w http.ResponseWriter, r *http.Request) { return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Write File In Workspace", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Write File In Workspace", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return @@ -223,7 +224,7 @@ func (s *server) removeFileInWorkspace(w http.ResponseWriter, r *http.Request) { return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Remove File In Workspace", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Remove File In Workspace", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return @@ -259,7 +260,7 @@ func (s *server) readFileInWorkspace(w http.ResponseWriter, r *http.Request) { return } - prg, err := loader.Program(r.Context(), reqObject.getToolRepo(), "Read File In Workspace", loader.Options{Cache: s.client.Cache}) + prg, err := loader.Program(r.Context(), s.getWorkspaceTool(reqObject.workspaceCommonRequest), "Read File In Workspace", loader.Options{Cache: s.client.Cache}) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to load program: %w", err)) return