diff --git a/pkg/cli/eval.go b/pkg/cli/eval.go index db84dd6b..7beaa8a0 100644 --- a/pkg/cli/eval.go +++ b/pkg/cli/eval.go @@ -56,7 +56,7 @@ func (e *Eval) Run(cmd *cobra.Command, args []string) error { return err } - runner, err := gptscript.New(&opts) + runner, err := gptscript.New(opts) if err != nil { return err } diff --git a/pkg/cli/gptscript.go b/pkg/cli/gptscript.go index ca9254a0..c97271d6 100644 --- a/pkg/cli/gptscript.go +++ b/pkg/cli/gptscript.go @@ -378,7 +378,7 @@ func (r *GPTScript) Run(cmd *cobra.Command, args []string) (retErr error) { return s.Start(ctx) } - gptScript, err := gptscript.New(&gptOpt) + gptScript, err := gptscript.New(gptOpt) if err != nil { return err } diff --git a/pkg/gptscript/gptscript.go b/pkg/gptscript/gptscript.go index 24498468..f7cf01d1 100644 --- a/pkg/gptscript/gptscript.go +++ b/pkg/gptscript/gptscript.go @@ -48,10 +48,25 @@ type Options struct { Env []string } -func complete(opts *Options) (result *Options) { - result = opts - if result == nil { - result = &Options{} +func complete(opts ...Options) (Options, error) { + var ( + result Options + err error + ) + + for _, opt := range opts { + result.Cache = cache.Complete(result.Cache, opt.Cache) + result.Monitor = monitor.Complete(result.Monitor, opt.Monitor) + result.Runner = runner.Complete(result.Runner, opt.Runner) + result.OpenAI, err = openai.Complete(result.OpenAI, opt.OpenAI) + if err != nil { + return Options{}, err + } + + result.CredentialContext = types.FirstSet(opt.CredentialContext, result.CredentialContext) + result.Quiet = types.FirstSet(opt.Quiet, result.Quiet) + result.Workspace = types.FirstSet(opt.Workspace, result.Workspace) + result.Env = append(result.Env, opt.Env...) } if result.Quiet == nil { result.Quiet = new(bool) @@ -60,13 +75,17 @@ func complete(opts *Options) (result *Options) { result.Env = os.Environ() } if result.CredentialContext == "" { - opts.CredentialContext = "default" + result.CredentialContext = "default" } - return + + return result, nil } -func New(opts *Options) (*GPTScript, error) { - opts = complete(opts) +func New(o ...Options) (*GPTScript, error) { + opts, err := complete(o...) + if err != nil { + return nil, err + } registry := llm.NewRegistry() diff --git a/pkg/monitor/display.go b/pkg/monitor/display.go index bbdfc8ee..36c7a35d 100644 --- a/pkg/monitor/display.go +++ b/pkg/monitor/display.go @@ -25,7 +25,7 @@ type Options struct { DebugMessages bool `usage:"Enable logging of chat completion calls"` } -func complete(opts ...Options) (result Options) { +func Complete(opts ...Options) (result Options) { for _, opt := range opts { result.DumpState = types.FirstSet(opt.DumpState, result.DumpState) result.DisplayProgress = types.FirstSet(opt.DisplayProgress, result.DisplayProgress) @@ -313,7 +313,7 @@ func (d *display) Stop(output string, err error) { } func NewConsole(opts ...Options) *Console { - opt := complete(opts...) + opt := Complete(opts...) return &Console{ dumpState: opt.DumpState, displayProgress: opt.DisplayProgress, diff --git a/pkg/openai/client.go b/pkg/openai/client.go index 05c9fcf7..63b64f8d 100644 --- a/pkg/openai/client.go +++ b/pkg/openai/client.go @@ -58,7 +58,7 @@ type Options struct { Cache *cache.Client } -func complete(opts ...Options) (result Options, err error) { +func Complete(opts ...Options) (result Options, err error) { for _, opt := range opts { result.BaseURL = types.FirstSet(opt.BaseURL, result.BaseURL) result.APIKey = types.FirstSet(opt.APIKey, result.APIKey) @@ -87,7 +87,7 @@ func complete(opts ...Options) (result Options, err error) { } func NewClient(credStore credentials.CredentialStore, opts ...Options) (*Client, error) { - opt, err := complete(opts...) + opt, err := Complete(opts...) if err != nil { return nil, err } diff --git a/pkg/runner/runner.go b/pkg/runner/runner.go index 0eaf1416..5d824cc5 100644 --- a/pkg/runner/runner.go +++ b/pkg/runner/runner.go @@ -52,7 +52,7 @@ func DefaultAuthorizer(engine.Context, string) (AuthorizerResponse, error) { }, nil } -func complete(opts ...Options) (result Options) { +func Complete(opts ...Options) (result Options) { for _, opt := range opts { result.MonitorFactory = types.FirstSet(opt.MonitorFactory, result.MonitorFactory) result.RuntimeManager = types.FirstSet(opt.RuntimeManager, result.RuntimeManager) @@ -91,7 +91,7 @@ type Runner struct { } func New(client engine.Model, credStore credentials.CredentialStore, opts ...Options) (*Runner, error) { - opt := complete(opts...) + opt := Complete(opts...) runner := &Runner{ c: client, diff --git a/pkg/sdkserver/routes.go b/pkg/sdkserver/routes.go index e3a7dd68..d6205ece 100644 --- a/pkg/sdkserver/routes.go +++ b/pkg/sdkserver/routes.go @@ -13,10 +13,12 @@ import ( "time" "github.com/acorn-io/broadcaster" + "github.com/gptscript-ai/gptscript/pkg/cache" gcontext "github.com/gptscript-ai/gptscript/pkg/context" "github.com/gptscript-ai/gptscript/pkg/gptscript" "github.com/gptscript-ai/gptscript/pkg/input" "github.com/gptscript-ai/gptscript/pkg/loader" + "github.com/gptscript-ai/gptscript/pkg/openai" "github.com/gptscript-ai/gptscript/pkg/parser" "github.com/gptscript-ai/gptscript/pkg/runner" gserver "github.com/gptscript-ai/gptscript/pkg/server" @@ -27,6 +29,7 @@ import ( const toolRunTimeout = 15 * time.Minute type server struct { + gptscriptOpts gptscript.Options address, token string client *gptscript.GPTScript events *broadcaster.Broadcaster[event] @@ -189,8 +192,9 @@ func (s *server) execHandler(w http.ResponseWriter, r *http.Request) { programLoader = loader.Program } - opts := &gptscript.Options{ - Cache: reqObject.Options, + opts := gptscript.Options{ + Cache: cache.Options(reqObject.cacheOptions), + OpenAI: openai.Options(reqObject.openAIOptions), Env: reqObject.Env, Workspace: reqObject.Workspace, CredentialContext: reqObject.CredentialContext, diff --git a/pkg/sdkserver/run.go b/pkg/sdkserver/run.go index 33740899..321e76c1 100644 --- a/pkg/sdkserver/run.go +++ b/pkg/sdkserver/run.go @@ -16,8 +16,8 @@ import ( type loaderFunc func(context.Context, string, string, ...loader.Options) (types.Program, error) -func (s *server) execAndStream(ctx context.Context, programLoader loaderFunc, logger mvl.Logger, w http.ResponseWriter, opts *gptscript.Options, chatState, input, subTool string, toolDef fmt.Stringer) { - g, err := gptscript.New(opts) +func (s *server) execAndStream(ctx context.Context, programLoader loaderFunc, logger mvl.Logger, w http.ResponseWriter, opts gptscript.Options, chatState, input, subTool string, toolDef fmt.Stringer) { + g, err := gptscript.New(s.gptscriptOpts, opts) if err != nil { writeError(logger, w, http.StatusInternalServerError, fmt.Errorf("failed to initialize gptscript: %w", err)) return diff --git a/pkg/sdkserver/server.go b/pkg/sdkserver/server.go index ee111ac5..805e4103 100644 --- a/pkg/sdkserver/server.go +++ b/pkg/sdkserver/server.go @@ -53,7 +53,7 @@ func Start(ctx context.Context, opts Options) error { // prompt server because it is only used for fmt, parse, etc. opts.Env = append(opts.Env, fmt.Sprintf("%s=%s", types.PromptTokenEnvVar, token)) - g, err := gptscript.New(&opts.Options) + g, err := gptscript.New(opts.Options) if err != nil { return err } @@ -64,6 +64,7 @@ func Start(ctx context.Context, opts Options) error { } s := &server{ + gptscriptOpts: opts.Options, address: listener.Addr().String(), token: token, client: g, diff --git a/pkg/sdkserver/types.go b/pkg/sdkserver/types.go index 3d7d0bba..0025539c 100644 --- a/pkg/sdkserver/types.go +++ b/pkg/sdkserver/types.go @@ -7,6 +7,7 @@ import ( "github.com/gptscript-ai/gptscript/pkg/cache" "github.com/gptscript-ai/gptscript/pkg/engine" + "github.com/gptscript-ai/gptscript/pkg/openai" "github.com/gptscript-ai/gptscript/pkg/parser" "github.com/gptscript-ai/gptscript/pkg/runner" gserver "github.com/gptscript-ai/gptscript/pkg/server" @@ -40,10 +41,16 @@ func (t toolDefs) String() string { return s.String() } +type ( + cacheOptions cache.Options + openAIOptions openai.Options +) + type toolOrFileRequest struct { content `json:",inline"` file `json:",inline"` - cache.Options `json:",inline"` + cacheOptions `json:",inline"` + openAIOptions `json:",inline"` ToolDefs toolDefs `json:"toolDefs,inline"` SubTool string `json:"subTool"` diff --git a/pkg/server/server.go b/pkg/server/server.go index 6d863f18..5b74a99d 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -54,7 +54,7 @@ func New(opts *Options) (*Server, error) { opts = complete(opts) opts.GPTScript.Runner.MonitorFactory = NewSessionFactory(events) - g, err := gptscript.New(&opts.GPTScript) + g, err := gptscript.New(opts.GPTScript) if err != nil { return nil, err }