optional parameter to not stream response (#639)

* update streaming request accept header
* add optional stream param to request bodies
This commit is contained in:
Bruce MacDonald
2023-10-11 12:54:27 -04:00
committed by GitHub
parent 77295f716e
commit 274d5a5fdf
4 changed files with 94 additions and 18 deletions

View File

@@ -240,6 +240,23 @@ func GenerateHandler(c *gin.Context) {
}
}()
if req.Stream != nil && !*req.Stream {
var response api.GenerateResponse
generated := ""
for resp := range ch {
if r, ok := resp.(api.GenerateResponse); ok {
generated += r.Response
response = r
} else {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
}
response.Response = generated
c.JSON(http.StatusOK, response)
return
}
streamResponse(c, ch)
}
@@ -309,6 +326,11 @@ func PullModelHandler(c *gin.Context) {
}
}()
if req.Stream != nil && !*req.Stream {
waitForStream(c, ch)
return
}
streamResponse(c, ch)
}
@@ -336,6 +358,11 @@ func PushModelHandler(c *gin.Context) {
}
}()
if req.Stream != nil && !*req.Stream {
waitForStream(c, ch)
return
}
streamResponse(c, ch)
}
@@ -363,6 +390,11 @@ func CreateModelHandler(c *gin.Context) {
}
}()
if req.Stream != nil && !*req.Stream {
waitForStream(c, ch)
return
}
streamResponse(c, ch)
}
@@ -603,6 +635,31 @@ func Serve(ln net.Listener, allowOrigins []string) error {
return s.Serve(ln)
}
func waitForStream(c *gin.Context, ch chan interface{}) {
c.Header("Content-Type", "application/json")
for resp := range ch {
switch r := resp.(type) {
case api.ProgressResponse:
if r.Status == "success" {
c.JSON(http.StatusOK, r)
return
}
case gin.H:
if errorMsg, ok := r["error"].(string); ok {
c.JSON(http.StatusInternalServerError, gin.H{"error": errorMsg})
return
} else {
c.JSON(http.StatusInternalServerError, gin.H{"error": "unexpected error format in progress response"})
return
}
default:
c.JSON(http.StatusInternalServerError, gin.H{"error": "unexpected progress response"})
return
}
}
c.JSON(http.StatusInternalServerError, gin.H{"error": "unexpected end of progress response"})
}
func streamResponse(c *gin.Context, ch chan any) {
c.Header("Content-Type", "application/x-ndjson")
c.Stream(func(w io.Writer) bool {