cmd: enable use of structured outputs

This commit is contained in:
ParthSareen 2024-12-12 15:47:12 -08:00
parent c216850523
commit 11eecdde86
2 changed files with 18 additions and 11 deletions

View File

@ -1038,14 +1038,15 @@ func chat(cmd *cobra.Command, opts runOptions) (*api.Message, error) {
return nil return nil
} }
if opts.Format == "json" { var format json.RawMessage
opts.Format = `"` + opts.Format + `"` if opts.Format != "" {
format = json.RawMessage(opts.Format)
} }
req := &api.ChatRequest{ req := &api.ChatRequest{
Model: opts.Model, Model: opts.Model,
Messages: opts.Messages, Messages: opts.Messages,
Format: json.RawMessage(opts.Format), Format: format,
Options: opts.Options, Options: opts.Options,
} }
@ -1127,8 +1128,9 @@ func generate(cmd *cobra.Command, opts runOptions) error {
} }
} }
if opts.Format == "json" { var format json.RawMessage
opts.Format = `"` + opts.Format + `"` if opts.Format != "" {
format = json.RawMessage(opts.Format)
} }
request := api.GenerateRequest{ request := api.GenerateRequest{
@ -1136,7 +1138,7 @@ func generate(cmd *cobra.Command, opts runOptions) error {
Prompt: opts.Prompt, Prompt: opts.Prompt,
Context: generateContext, Context: generateContext,
Images: opts.Images, Images: opts.Images,
Format: json.RawMessage(opts.Format), Format: format,
System: opts.System, System: opts.System,
Options: opts.Options, Options: opts.Options,
KeepAlive: opts.KeepAlive, KeepAlive: opts.KeepAlive,
@ -1353,7 +1355,7 @@ func NewCLI() *cobra.Command {
runCmd.Flags().Bool("verbose", false, "Show timings for response") runCmd.Flags().Bool("verbose", false, "Show timings for response")
runCmd.Flags().Bool("insecure", false, "Use an insecure registry") runCmd.Flags().Bool("insecure", false, "Use an insecure registry")
runCmd.Flags().Bool("nowordwrap", false, "Don't wrap words to the next line automatically") runCmd.Flags().Bool("nowordwrap", false, "Don't wrap words to the next line automatically")
runCmd.Flags().String("format", "", "Response format (e.g. json)") runCmd.Flags().String("format", "", `Response format ("json" or a JSON Schema)`)
stopCmd := &cobra.Command{ stopCmd := &cobra.Command{
Use: "stop MODEL", Use: "stop MODEL",

View File

@ -261,11 +261,16 @@ func generateInteractive(cmd *cobra.Command, opts runOptions) error {
} }
fmt.Println("Set 'quiet' mode.") fmt.Println("Set 'quiet' mode.")
case "format": case "format":
if len(args) < 3 || args[2] != "json" { if len(args) < 3 {
fmt.Println("Invalid or missing format. For 'json' mode use '/set format json'") fmt.Println("Invalid or missing format. For 'json' mode use '/set format json or provide a JSON schema'")
} else if len(args) == 3 && (args[2] == "json" || args[2] == `"json"`) {
opts.Format = `"json"`
fmt.Println("Set format to 'json' mode.")
} else if len(args) > 3 && strings.HasPrefix(args[2], "{") {
opts.Format = strings.Join(args[2:], " ")
fmt.Printf("Set format to schema: \n'%s'.\n", opts.Format)
} else { } else {
opts.Format = args[2] fmt.Println("Invalid or missing format. For 'json' mode use '/set format json or provide a JSON schema'")
fmt.Printf("Set format to '%s' mode.\n", args[2])
} }
case "noformat": case "noformat":
opts.Format = "" opts.Format = ""