Browse Source

cmd: enable use of structured outputs

ParthSareen 4 months ago
parent
commit
11eecdde86
2 changed files with 18 additions and 11 deletions
  1. 9 7
      cmd/cmd.go
  2. 9 4
      cmd/interactive.go

+ 9 - 7
cmd/cmd.go

@@ -1038,14 +1038,15 @@ func chat(cmd *cobra.Command, opts runOptions) (*api.Message, error) {
 		return nil
 		return nil
 	}
 	}
 
 
-	if opts.Format == "json" {
-		opts.Format = `"` + opts.Format + `"`
+	var format json.RawMessage
+	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" {
-		opts.Format = `"` + opts.Format + `"`
+	var format json.RawMessage
+	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",

+ 9 - 4
cmd/interactive.go

@@ -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" {
-						fmt.Println("Invalid or missing format. For 'json' mode use '/set format json'")
+					if len(args) < 3 {
+						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.Printf("Set format to '%s' mode.\n", args[2])
+						fmt.Println("Invalid or missing format. For 'json' mode use '/set format json or provide a JSON schema'")
 					}
 					}
 				case "noformat":
 				case "noformat":
 					opts.Format = ""
 					opts.Format = ""