fix(cmd): unload model before removal (#12832)

this change fixes two bugs with `ollama rm`:

1. before a model is removed, it will first be stopped. this only
   happens for the first argument and skipped for all other models
2. models are unloaded indiscriminately. this errors for cloud models
   and should be omitted
This commit is contained in:
Michael Yang
2025-10-30 10:41:49 -07:00
committed by GitHub
parent d432ade714
commit ed78e127d0

View File

@@ -280,6 +280,13 @@ func loadOrUnloadModel(cmd *cobra.Command, opts *runOptions) error {
return err return err
} }
if info, err := client.Show(cmd.Context(), &api.ShowRequest{Model: opts.Model}); err != nil {
return err
} else if info.RemoteHost != "" {
// Cloud model, no need to load/unload
return nil
}
req := &api.GenerateRequest{ req := &api.GenerateRequest{
Model: opts.Model, Model: opts.Model,
KeepAlive: opts.KeepAlive, KeepAlive: opts.KeepAlive,
@@ -720,23 +727,21 @@ func DeleteHandler(cmd *cobra.Command, args []string) error {
return err return err
} }
for _, arg := range args {
// Unload the model if it's running before deletion // Unload the model if it's running before deletion
opts := &runOptions{ if err := loadOrUnloadModel(cmd, &runOptions{
Model: args[0], Model: args[0],
KeepAlive: &api.Duration{Duration: 0}, KeepAlive: &api.Duration{Duration: 0},
} }); err != nil {
if err := loadOrUnloadModel(cmd, opts); err != nil {
if !strings.Contains(strings.ToLower(err.Error()), "not found") { if !strings.Contains(strings.ToLower(err.Error()), "not found") {
fmt.Fprintf(os.Stderr, "Warning: unable to stop model '%s'\n", args[0]) fmt.Fprintf(os.Stderr, "Warning: unable to stop model '%s'\n", args[0])
} }
} }
for _, name := range args { if err := client.Delete(cmd.Context(), &api.DeleteRequest{Name: arg}); err != nil {
req := api.DeleteRequest{Name: name}
if err := client.Delete(cmd.Context(), &req); err != nil {
return err return err
} }
fmt.Printf("deleted '%s'\n", name) fmt.Printf("deleted '%s'\n", arg)
} }
return nil return nil
} }