From 5c59455b59a3a6b53bad0f029b17d90aec173bfc Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Thu, 12 Oct 2023 15:56:40 -0700 Subject: [PATCH 1/6] cmd: use existing cmd context --- cmd/cmd.go | 54 ++++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index df0d90c8..073b1b4a 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -133,7 +133,7 @@ func CreateHandler(cmd *cobra.Command, args []string) error { } request := api.CreateRequest{Name: args[0], Modelfile: string(modelfile)} - if err := client.Create(context.Background(), &request, fn); err != nil { + if err := client.Create(cmd.Context(), &request, fn); err != nil { return err } @@ -148,7 +148,7 @@ func RunHandler(cmd *cobra.Command, args []string) error { name := args[0] // check if the model exists on the server - _, err = client.Show(context.Background(), &api.ShowRequest{Name: name}) + _, err = client.Show(cmd.Context(), &api.ShowRequest{Name: name}) var statusError api.StatusError switch { case errors.As(err, &statusError) && statusError.StatusCode == http.StatusNotFound: @@ -208,7 +208,7 @@ func PushHandler(cmd *cobra.Command, args []string) error { } request := api.PushRequest{Name: args[0], Insecure: insecure} - if err := client.Push(context.Background(), &request, fn); err != nil { + if err := client.Push(cmd.Context(), &request, fn); err != nil { return err } @@ -222,7 +222,7 @@ func ListHandler(cmd *cobra.Command, args []string) error { return err } - models, err := client.List(context.Background()) + models, err := client.List(cmd.Context()) if err != nil { return err } @@ -257,7 +257,7 @@ func DeleteHandler(cmd *cobra.Command, args []string) error { for _, name := range args { req := api.DeleteRequest{Name: name} - if err := client.Delete(context.Background(), &req); err != nil { + if err := client.Delete(cmd.Context(), &req); err != nil { return err } fmt.Printf("deleted '%s'\n", name) @@ -322,7 +322,7 @@ func ShowHandler(cmd *cobra.Command, args []string) error { } req := api.ShowRequest{Name: args[0]} - resp, err := client.Show(context.Background(), &req) + resp, err := client.Show(cmd.Context(), &req) if err != nil { return err } @@ -350,7 +350,7 @@ func CopyHandler(cmd *cobra.Command, args []string) error { } req := api.CopyRequest{Source: args[0], Destination: args[1]} - if err := client.Copy(context.Background(), &req); err != nil { + if err := client.Copy(cmd.Context(), &req); err != nil { return err } fmt.Printf("copied '%s' to '%s'\n", args[0], args[1]) @@ -404,7 +404,7 @@ func PullHandler(cmd *cobra.Command, args []string) error { } request := api.PullRequest{Name: args[0], Insecure: insecure} - if err := client.Pull(context.Background(), &request, fn); err != nil { + if err := client.Pull(cmd.Context(), &request, fn); err != nil { return err } @@ -493,7 +493,7 @@ func generate(cmd *cobra.Command, opts generateOptions) error { opts.WordWrap = false } - cancelCtx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(cmd.Context()) defer cancel() sigChan := make(chan os.Signal, 1) @@ -507,15 +507,6 @@ func generate(cmd *cobra.Command, opts generateOptions) error { var currentLineLength int var wordBuffer string - request := api.GenerateRequest{ - Model: opts.Model, - Prompt: opts.Prompt, - Context: generateContext, - Format: opts.Format, - System: opts.System, - Template: opts.Template, - Options: opts.Options, - } fn := func(response api.GenerateResponse) error { p.StopAndClear() @@ -560,7 +551,17 @@ func generate(cmd *cobra.Command, opts generateOptions) error { return nil } - if err := client.Generate(cancelCtx, &request, fn); err != nil { + request := api.GenerateRequest{ + Model: opts.Model, + Prompt: opts.Prompt, + Context: generateContext, + Format: opts.Format, + System: opts.System, + Template: opts.Template, + Options: opts.Options, + } + + if err := client.Generate(ctx, &request, fn); err != nil { if errors.Is(err, context.Canceled) { return nil } @@ -584,10 +585,7 @@ func generate(cmd *cobra.Command, opts generateOptions) error { latest.Summary() } - ctx := cmd.Context() - ctx = context.WithValue(ctx, generateContextKey("context"), latest.Context) - cmd.SetContext(ctx) - + cmd.SetContext(context.WithValue(cmd.Context(), generateContextKey("context"), latest.Context)) return nil } @@ -988,7 +986,7 @@ func initializeKeypair() error { return nil } -func startMacApp(client *api.Client) error { +func startMacApp(ctx context.Context, client *api.Client) error { exe, err := os.Executable() if err != nil { return err @@ -1012,24 +1010,24 @@ func startMacApp(client *api.Client) error { case <-timeout: return errors.New("timed out waiting for server to start") case <-tick: - if err := client.Heartbeat(context.Background()); err == nil { + if err := client.Heartbeat(ctx); err == nil { return nil // server has started } } } } -func checkServerHeartbeat(_ *cobra.Command, _ []string) error { +func checkServerHeartbeat(cmd *cobra.Command, _ []string) error { client, err := api.ClientFromEnvironment() if err != nil { return err } - if err := client.Heartbeat(context.Background()); err != nil { + if err := client.Heartbeat(cmd.Context()); err != nil { if !strings.Contains(err.Error(), "connection refused") { return err } if runtime.GOOS == "darwin" { - if err := startMacApp(client); err != nil { + if err := startMacApp(cmd.Context(), client); err != nil { return fmt.Errorf("could not connect to ollama app, is it running?") } } else { From 1ebdbd9694de0746dd0860ffb88f25559794665b Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Thu, 12 Oct 2023 15:45:07 -0700 Subject: [PATCH 2/6] server: add version handler --- server/routes.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/routes.go b/server/routes.go index bc8ea804..42203cb6 100644 --- a/server/routes.go +++ b/server/routes.go @@ -782,6 +782,9 @@ func Serve(ln net.Listener, allowOrigins []string) error { }) r.Handle(method, "/api/tags", ListModelsHandler) + r.Handle(method, "/api/version", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{"version": version.Version}) + }) } log.Printf("Listening on %s (version %s)", ln.Addr(), version.Version) From 0db4706ec243dbeaf5db71b5d31dbb53d32e63b4 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 22 Nov 2023 09:41:44 -0800 Subject: [PATCH 3/6] api: add version api handler --- api/client.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/api/client.go b/api/client.go index 44af222c..3751c87d 100644 --- a/api/client.go +++ b/api/client.go @@ -311,3 +311,15 @@ func (c *Client) CreateBlob(ctx context.Context, digest string, r io.Reader) err return nil } + +func (c *Client) Version(ctx context.Context) (string, error) { + var version struct { + Version string `json:"version"` + } + + if err := c.do(ctx, http.MethodGet, "/api/version", nil, &version); err != nil { + return "", err + } + + return version.Version, nil +} From 0f0cd265a7a494dce095be6a69aead01a234907b Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Wed, 22 Nov 2023 09:41:02 -0800 Subject: [PATCH 4/6] cmd: add server version --- cmd/cmd.go | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 073b1b4a..2fd5cacc 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1037,8 +1037,25 @@ func checkServerHeartbeat(cmd *cobra.Command, _ []string) error { return nil } +func versionHandler(cmd *cobra.Command, _ []string) { + fmt.Printf("ollama version %s\n", version.Version) + + client, err := api.ClientFromEnvironment() + if err != nil { + return + } + + serverVersion, err := client.Version(cmd.Context()) + if err != nil { + return + } + + fmt.Printf("server version %s\n", serverVersion) +} + func NewCLI() *cobra.Command { log.SetFlags(log.LstdFlags | log.Lshortfile) + cobra.EnableCommandSorting = false rootCmd := &cobra.Command{ Use: "ollama", @@ -1049,9 +1066,17 @@ func NewCLI() *cobra.Command { DisableDefaultCmd: true, }, Version: version.Version, + Run: func(cmd *cobra.Command, args []string) { + if version, _ := cmd.Flags().GetBool("version"); version { + versionHandler(cmd, args) + return + } + + cmd.Print(cmd.UsageString()) + }, } - cobra.EnableCommandSorting = false + rootCmd.Flags().BoolP("version", "v", false, "Show version information") createCmd := &cobra.Command{ Use: "create MODEL", From cde13bcdeabec1aac945a126a14ee41ef366126d Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Mon, 16 Oct 2023 09:57:19 -0700 Subject: [PATCH 5/6] cmd: only print server version when different --- cmd/cmd.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index 2fd5cacc..db4c8f50 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1050,7 +1050,9 @@ func versionHandler(cmd *cobra.Command, _ []string) { return } - fmt.Printf("server version %s\n", serverVersion) + if serverVersion != version.Version { + fmt.Printf("ollama host version %s\n", serverVersion) + } } func NewCLI() *cobra.Command { From 4b77fcb2b94f0e98a89243ff2b55a0b7a4333ebb Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Fri, 1 Dec 2023 12:10:27 -0800 Subject: [PATCH 6/6] comments --- cmd/cmd.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/cmd.go b/cmd/cmd.go index db4c8f50..2d31a121 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1038,8 +1038,6 @@ func checkServerHeartbeat(cmd *cobra.Command, _ []string) error { } func versionHandler(cmd *cobra.Command, _ []string) { - fmt.Printf("ollama version %s\n", version.Version) - client, err := api.ClientFromEnvironment() if err != nil { return @@ -1047,11 +1045,15 @@ func versionHandler(cmd *cobra.Command, _ []string) { serverVersion, err := client.Version(cmd.Context()) if err != nil { - return + fmt.Println("Warning: could not connect to a running Ollama instance") + } + + if serverVersion != "" { + fmt.Printf("ollama version is %s\n", serverVersion) } if serverVersion != version.Version { - fmt.Printf("ollama host version %s\n", serverVersion) + fmt.Printf("Warning: client version is %s\n", version.Version) } } @@ -1067,7 +1069,6 @@ func NewCLI() *cobra.Command { CompletionOptions: cobra.CompletionOptions{ DisableDefaultCmd: true, }, - Version: version.Version, Run: func(cmd *cobra.Command, args []string) { if version, _ := cmd.Flags().GetBool("version"); version { versionHandler(cmd, args)