From 31a759d172b65d34a35b0f08e712eed36b74ccc7 Mon Sep 17 00:00:00 2001 From: Grant Linville Date: Fri, 13 Sep 2024 16:41:23 -0400 Subject: [PATCH 1/2] fix: sdkserver: credentials: ensure credential helpers exist Signed-off-by: Grant Linville --- pkg/sdkserver/credentials.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/pkg/sdkserver/credentials.go b/pkg/sdkserver/credentials.go index adbaacdc..5be0cb44 100644 --- a/pkg/sdkserver/credentials.go +++ b/pkg/sdkserver/credentials.go @@ -1,6 +1,7 @@ package sdkserver import ( + "context" "encoding/json" "fmt" "net/http" @@ -11,14 +12,22 @@ import ( "github.com/gptscript-ai/gptscript/pkg/repos/runtimes" ) -func (s *server) initializeCredentialStore(ctx string) (credentials.CredentialStore, error) { +func (s *server) initializeCredentialStore(ctx context.Context, credCtx string) (credentials.CredentialStore, error) { cfg, err := config.ReadCLIConfig(s.gptscriptOpts.OpenAI.ConfigFile) if err != nil { return nil, fmt.Errorf("failed to read CLI config: %w", err) } // TODO - are we sure we want to always use runtimes.Default here? - store, err := credentials.NewStore(cfg, runtimes.Default(s.gptscriptOpts.Cache.CacheDir), ctx, s.gptscriptOpts.Cache.CacheDir) + runtimeManager := runtimes.Default(s.gptscriptOpts.Cache.CacheDir) + if err := runtimeManager.SetUpCredentialHelpers(ctx, cfg); err != nil { + return nil, fmt.Errorf("failed to set up credential helpers: %w", err) + } + if err := runtimeManager.EnsureCredentialHelpers(ctx); err != nil { + return nil, fmt.Errorf("failed to ensure credential helpers: %w", err) + } + + store, err := credentials.NewStore(cfg, runtimeManager, credCtx, s.gptscriptOpts.Cache.CacheDir) if err != nil { return nil, fmt.Errorf("failed to initialize credential store: %w", err) } @@ -40,7 +49,7 @@ func (s *server) listCredentials(w http.ResponseWriter, r *http.Request) { req.Context = credentials.DefaultCredentialContext } - store, err := s.initializeCredentialStore(req.Context) + store, err := s.initializeCredentialStore(r.Context(), req.Context) if err != nil { writeError(logger, w, http.StatusInternalServerError, err) return @@ -81,7 +90,7 @@ func (s *server) createCredential(w http.ResponseWriter, r *http.Request) { cred.Context = credentials.DefaultCredentialContext } - store, err := s.initializeCredentialStore(cred.Context) + store, err := s.initializeCredentialStore(r.Context(), cred.Context) if err != nil { writeError(logger, w, http.StatusInternalServerError, err) return @@ -115,7 +124,7 @@ func (s *server) revealCredential(w http.ResponseWriter, r *http.Request) { req.Context = credentials.DefaultCredentialContext } - store, err := s.initializeCredentialStore(req.Context) + store, err := s.initializeCredentialStore(r.Context(), req.Context) if err != nil { writeError(logger, w, http.StatusInternalServerError, err) return @@ -152,7 +161,7 @@ func (s *server) deleteCredential(w http.ResponseWriter, r *http.Request) { req.Context = credentials.DefaultCredentialContext } - store, err := s.initializeCredentialStore(req.Context) + store, err := s.initializeCredentialStore(r.Context(), req.Context) if err != nil { writeError(logger, w, http.StatusInternalServerError, err) return From 3e29026f0f45a6530c703d21a6adb4b75bf92b4b Mon Sep 17 00:00:00 2001 From: Grant Linville Date: Fri, 13 Sep 2024 16:48:05 -0400 Subject: [PATCH 2/2] use just one runtime manager Signed-off-by: Grant Linville --- pkg/sdkserver/credentials.go | 9 +++------ pkg/sdkserver/routes.go | 3 +++ pkg/sdkserver/server.go | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/pkg/sdkserver/credentials.go b/pkg/sdkserver/credentials.go index 5be0cb44..d3f86b1f 100644 --- a/pkg/sdkserver/credentials.go +++ b/pkg/sdkserver/credentials.go @@ -9,7 +9,6 @@ import ( "github.com/gptscript-ai/gptscript/pkg/config" gcontext "github.com/gptscript-ai/gptscript/pkg/context" "github.com/gptscript-ai/gptscript/pkg/credentials" - "github.com/gptscript-ai/gptscript/pkg/repos/runtimes" ) func (s *server) initializeCredentialStore(ctx context.Context, credCtx string) (credentials.CredentialStore, error) { @@ -18,16 +17,14 @@ func (s *server) initializeCredentialStore(ctx context.Context, credCtx string) return nil, fmt.Errorf("failed to read CLI config: %w", err) } - // TODO - are we sure we want to always use runtimes.Default here? - runtimeManager := runtimes.Default(s.gptscriptOpts.Cache.CacheDir) - if err := runtimeManager.SetUpCredentialHelpers(ctx, cfg); err != nil { + if err := s.runtimeManager.SetUpCredentialHelpers(ctx, cfg); err != nil { return nil, fmt.Errorf("failed to set up credential helpers: %w", err) } - if err := runtimeManager.EnsureCredentialHelpers(ctx); err != nil { + if err := s.runtimeManager.EnsureCredentialHelpers(ctx); err != nil { return nil, fmt.Errorf("failed to ensure credential helpers: %w", err) } - store, err := credentials.NewStore(cfg, runtimeManager, credCtx, s.gptscriptOpts.Cache.CacheDir) + store, err := credentials.NewStore(cfg, s.runtimeManager, credCtx, s.gptscriptOpts.Cache.CacheDir) if err != nil { return nil, fmt.Errorf("failed to initialize credential store: %w", err) } diff --git a/pkg/sdkserver/routes.go b/pkg/sdkserver/routes.go index c180097e..f82fa8a7 100644 --- a/pkg/sdkserver/routes.go +++ b/pkg/sdkserver/routes.go @@ -13,6 +13,7 @@ import ( "github.com/gptscript-ai/broadcaster" "github.com/gptscript-ai/gptscript/pkg/cache" gcontext "github.com/gptscript-ai/gptscript/pkg/context" + "github.com/gptscript-ai/gptscript/pkg/engine" "github.com/gptscript-ai/gptscript/pkg/gptscript" "github.com/gptscript-ai/gptscript/pkg/input" "github.com/gptscript-ai/gptscript/pkg/loader" @@ -30,6 +31,8 @@ type server struct { client *gptscript.GPTScript events *broadcaster.Broadcaster[event] + runtimeManager engine.RuntimeManager + lock sync.RWMutex waitingToConfirm map[string]chan runner.AuthorizerResponse waitingToPrompt map[string]chan map[string]string diff --git a/pkg/sdkserver/server.go b/pkg/sdkserver/server.go index f72e7ae9..0a68f0fa 100644 --- a/pkg/sdkserver/server.go +++ b/pkg/sdkserver/server.go @@ -17,6 +17,7 @@ import ( "github.com/gptscript-ai/broadcaster" "github.com/gptscript-ai/gptscript/pkg/gptscript" "github.com/gptscript-ai/gptscript/pkg/mvl" + "github.com/gptscript-ai/gptscript/pkg/repos/runtimes" "github.com/gptscript-ai/gptscript/pkg/runner" "github.com/gptscript-ai/gptscript/pkg/types" "github.com/rs/cors" @@ -108,6 +109,7 @@ func run(ctx context.Context, listener net.Listener, opts Options) error { token: token, client: g, events: events, + runtimeManager: runtimes.Default(opts.Options.Cache.CacheDir), // TODO - do we always want to use runtimes.Default here? waitingToConfirm: make(map[string]chan runner.AuthorizerResponse), waitingToPrompt: make(map[string]chan map[string]string), }