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
 	}
 
-	if opts.Format == "json" {
-		opts.Format = `"` + opts.Format + `"`
+	var format json.RawMessage
+	if opts.Format != "" {
+		format = json.RawMessage(opts.Format)
 	}
 
 	req := &api.ChatRequest{
 		Model:    opts.Model,
 		Messages: opts.Messages,
-		Format:   json.RawMessage(opts.Format),
+		Format:   format,
 		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{
@@ -1136,7 +1138,7 @@ func generate(cmd *cobra.Command, opts runOptions) error {
 		Prompt:    opts.Prompt,
 		Context:   generateContext,
 		Images:    opts.Images,
-		Format:    json.RawMessage(opts.Format),
+		Format:    format,
 		System:    opts.System,
 		Options:   opts.Options,
 		KeepAlive: opts.KeepAlive,
@@ -1353,7 +1355,7 @@ func NewCLI() *cobra.Command {
 	runCmd.Flags().Bool("verbose", false, "Show timings for response")
 	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().String("format", "", "Response format (e.g. json)")
+	runCmd.Flags().String("format", "", `Response format ("json" or a JSON Schema)`)
 
 	stopCmd := &cobra.Command{
 		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.")
 				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 {
-						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":
 					opts.Format = ""