44 "bytes"
55 "fmt"
66 "os"
7+ "slices"
8+ "strings"
79 "time"
810
911 "github.com/docker/go-units"
@@ -50,14 +52,18 @@ func newListCmd() *cobra.Command {
5052 if _ , err := ensureStandaloneRunnerAvailable (cmd .Context (), standaloneInstallPrinter ); err != nil {
5153 return fmt .Errorf ("unable to initialize standalone model runner: %w" , err )
5254 }
53- models , err := listModels (openai , backend , desktopClient , quiet , jsonFormat , apiKey )
55+ var modelFilter string
56+ if len (args ) > 0 {
57+ modelFilter = args [0 ]
58+ }
59+ models , err := listModels (openai , backend , desktopClient , quiet , jsonFormat , apiKey , modelFilter )
5460 if err != nil {
5561 return err
5662 }
5763 cmd .Print (models )
5864 return nil
5965 },
60- ValidArgsFunction : completion .NoComplete ,
66+ ValidArgsFunction : completion .ModelNamesAndTags ( getDesktopClient , 1 ) ,
6167 }
6268 c .Flags ().BoolVar (& jsonFormat , "json" , false , "List models in a JSON format" )
6369 c .Flags ().BoolVar (& openai , "openai" , false , "List models in an OpenAI format" )
@@ -67,7 +73,7 @@ func newListCmd() *cobra.Command {
6773 return c
6874}
6975
70- func listModels (openai bool , backend string , desktopClient * desktop.Client , quiet bool , jsonFormat bool , apiKey string ) (string , error ) {
76+ func listModels (openai bool , backend string , desktopClient * desktop.Client , quiet bool , jsonFormat bool , apiKey string , modelFilter string ) (string , error ) {
7177 if openai || backend == "openai" {
7278 models , err := desktopClient .ListOpenAI (backend , apiKey )
7379 if err != nil {
@@ -81,6 +87,25 @@ func listModels(openai bool, backend string, desktopClient *desktop.Client, quie
8187 err = handleClientError (err , "Failed to list models" )
8288 return "" , handleNotRunningError (err )
8389 }
90+
91+ if modelFilter != "" {
92+ var filteredModels []dmrm.Model
93+ for _ , m := range models {
94+ hasMatchingTag := false
95+ for _ , tag := range m .Tags {
96+ modelName , _ , _ := strings .Cut (tag , ":" )
97+ if slices .Contains ([]string {modelName , tag + ":latest" , tag }, modelFilter ) {
98+ hasMatchingTag = true
99+ break
100+ }
101+ }
102+ if hasMatchingTag {
103+ filteredModels = append (filteredModels , m )
104+ }
105+ }
106+ models = filteredModels
107+ }
108+
84109 if jsonFormat {
85110 return formatter .ToStandardJSON (models )
86111 }
0 commit comments