diff --git a/commands/compose.go b/commands/compose.go index 8c55235c..5aa909d7 100644 --- a/commands/compose.go +++ b/commands/compose.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/spf13/pflag" "slices" "strings" @@ -18,8 +19,9 @@ func newComposeCmd() *cobra.Command { c := &cobra.Command{ Use: "compose EVENT", } - c.AddCommand(newUpCommand()) - c.AddCommand(newDownCommand()) + upCmd := newUpCommand() + downCmd := newDownCommand() + c.AddCommand(upCmd, downCmd, newMetadataCommand(upCmd, downCmd)) c.Hidden = true c.PersistentFlags().String("project-name", "", "compose project name") // unused by model @@ -95,11 +97,11 @@ func newUpCommand() *cobra.Command { c.Flags().Int64Var(&ctxSize, "context-size", -1, "context size for the model") c.Flags().StringVar(&rawRuntimeFlags, "runtime-flags", "", "raw runtime flags to pass to the inference engine") c.Flags().StringVar(&backend, "backend", llamacpp.Name, "inference backend to use") + _ = c.MarkFlagRequired("model") return c } func newDownCommand() *cobra.Command { - var model []string c := &cobra.Command{ Use: "down", RunE: func(cmd *cobra.Command, args []string) error { @@ -107,7 +109,28 @@ func newDownCommand() *cobra.Command { return nil }, } - c.Flags().StringArrayVar(&model, "model", nil, "model to use") + return c +} + +func newMetadataCommand(upCmd, downCmd *cobra.Command) *cobra.Command { + c := &cobra.Command{ + Use: "metadata", + Short: "Metadata for Docker Compose", + RunE: func(cmd *cobra.Command, args []string) error { + providerMetadata := ProviderMetadata{ + Description: "Docker Model Runner", + } + providerMetadata.Up = commandParameters(upCmd) + providerMetadata.Down = commandParameters(downCmd) + + jsonMetadata, err := json.Marshal(providerMetadata) + if err != nil { + return err + } + fmt.Printf(string(jsonMetadata)) + return nil + }, + } return c } @@ -188,3 +211,36 @@ func sendInfo(s string) error { _, err = fmt.Println(string(marshal)) return err } + +func commandParameters(cmd *cobra.Command) CommandMetadata { + cmdMetadata := CommandMetadata{} + cmd.Flags().VisitAll(func(f *pflag.Flag) { + _, isRequired := f.Annotations[cobra.BashCompOneRequiredFlag] + cmdMetadata.Parameters = append(cmdMetadata.Parameters, ParameterMetadata{ + Name: f.Name, + Description: f.Usage, + Required: isRequired, + Type: f.Value.Type(), + Default: f.DefValue, + }) + }) + return cmdMetadata +} + +type ProviderMetadata struct { + Description string `json:"description"` + Up CommandMetadata `json:"up"` + Down CommandMetadata `json:"down"` +} + +type CommandMetadata struct { + Parameters []ParameterMetadata `json:"parameters"` +} + +type ParameterMetadata struct { + Name string `json:"name"` + Description string `json:"description"` + Required bool `json:"required"` + Type string `json:"type"` + Default string `json:"default,omitempty"` +} diff --git a/docs/reference/docker_model_compose.yaml b/docs/reference/docker_model_compose.yaml index c87cca13..79353c66 100644 --- a/docs/reference/docker_model_compose.yaml +++ b/docs/reference/docker_model_compose.yaml @@ -3,9 +3,11 @@ pname: docker model plink: docker_model.yaml cname: - docker model compose down + - docker model compose metadata - docker model compose up clink: - docker_model_compose_down.yaml + - docker_model_compose_metadata.yaml - docker_model_compose_up.yaml options: - option: project-name diff --git a/docs/reference/docker_model_compose_down.yaml b/docs/reference/docker_model_compose_down.yaml index 9020db51..9770b566 100644 --- a/docs/reference/docker_model_compose_down.yaml +++ b/docs/reference/docker_model_compose_down.yaml @@ -2,17 +2,6 @@ command: docker model compose down usage: docker model compose down pname: docker model compose plink: docker_model_compose.yaml -options: - - option: model - value_type: stringArray - default_value: '[]' - description: model to use - deprecated: false - hidden: false - experimental: false - experimentalcli: false - kubernetes: false - swarm: false inherited_options: - option: project-name value_type: string diff --git a/docs/reference/docker_model_compose_metadata.yaml b/docs/reference/docker_model_compose_metadata.yaml new file mode 100644 index 00000000..ae54bc67 --- /dev/null +++ b/docs/reference/docker_model_compose_metadata.yaml @@ -0,0 +1,23 @@ +command: docker model compose metadata +short: Metadata for Docker Compose +long: Metadata for Docker Compose +usage: docker model compose metadata +pname: docker model compose +plink: docker_model_compose.yaml +inherited_options: + - option: project-name + value_type: string + description: compose project name + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false +deprecated: false +hidden: true +experimental: false +experimentalcli: true +kubernetes: false +swarm: false +