From c6c526275d6c8ab2a3b70d5cf0071f9630e626f0 Mon Sep 17 00:00:00 2001 From: Parth Sareen Date: Wed, 4 Dec 2024 17:37:12 -0800 Subject: [PATCH] api: add generate endpoint for structured outputs (#7939) --- api/types.go | 2 +- cmd/cmd.go | 2 +- server/routes.go | 7 ++----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/api/types.go b/api/types.go index a04fd9943..249bc990b 100644 --- a/api/types.go +++ b/api/types.go @@ -67,7 +67,7 @@ type GenerateRequest struct { Raw bool `json:"raw,omitempty"` // Format specifies the format to return a response in. - Format string `json:"format"` + Format json.RawMessage `json:"format,omitempty"` // KeepAlive controls how long the model will stay loaded in memory following // this request. diff --git a/cmd/cmd.go b/cmd/cmd.go index 8b2031316..3d59be281 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1126,7 +1126,7 @@ func generate(cmd *cobra.Command, opts runOptions) error { Prompt: opts.Prompt, Context: generateContext, Images: opts.Images, - Format: opts.Format, + Format: json.RawMessage(opts.Format), System: opts.System, Options: opts.Options, KeepAlive: opts.KeepAlive, diff --git a/server/routes.go b/server/routes.go index bab29757e..9e97565c9 100644 --- a/server/routes.go +++ b/server/routes.go @@ -148,10 +148,7 @@ func (s *Server) GenerateHandler(c *gin.Context) { return } - if req.Format != "" && req.Format != "json" { - c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "format must be empty or \"json\""}) - return - } else if req.Raw && (req.Template != "" || req.System != "" || len(req.Context) > 0) { + if req.Raw && (req.Template != "" || req.System != "" || len(req.Context) > 0) { c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "raw mode does not support template, system, or context"}) return } @@ -278,7 +275,7 @@ func (s *Server) GenerateHandler(c *gin.Context) { if err := r.Completion(c.Request.Context(), llm.CompletionRequest{ Prompt: prompt, Images: images, - Format: json.RawMessage(req.Format), + Format: req.Format, Options: opts, }, func(cr llm.CompletionResponse) { res := api.GenerateResponse{