From 32064a064660227ea128991a14f3f300d00075f5 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Sun, 10 Dec 2023 10:53:38 -0500 Subject: [PATCH] fix empty response when receiving runner error --- docs/api.md | 4 ++-- server/routes.go | 56 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/docs/api.md b/docs/api.md index 329e6ae2..248de114 100644 --- a/docs/api.md +++ b/docs/api.md @@ -252,7 +252,7 @@ curl http://localhost:11434/api/generate -d '{ "penalize_newline": true, "stop": ["\n", "user:"], "numa": false, - "num_ctx": 4, + "num_ctx": 1024, "num_batch": 2, "num_gqa": 1, "num_gpu": 1, @@ -267,7 +267,7 @@ curl http://localhost:11434/api/generate -d '{ "rope_frequency_base": 1.1, "rope_frequency_scale": 0.8, "num_thread": 8 - } + } }' ``` diff --git a/server/routes.go b/server/routes.go index 8005d1cf..3c3e77cc 100644 --- a/server/routes.go +++ b/server/routes.go @@ -300,19 +300,30 @@ func GenerateHandler(c *gin.Context) { }() if req.Stream != nil && !*req.Stream { - // Wait for the channel to close - var r api.GenerateResponse + // Accumulate responses into the final response + var final api.GenerateResponse var sb strings.Builder for resp := range ch { - var ok bool - if r, ok = resp.(api.GenerateResponse); !ok { - c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + switch r := resp.(type) { + case api.GenerateResponse: + sb.WriteString(r.Response) + final = r + 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 response"}) + return + } + default: + c.JSON(http.StatusInternalServerError, gin.H{"error": "unexpected error"}) return } - sb.WriteString(r.Response) } - r.Response = sb.String() - c.JSON(http.StatusOK, r) + + final.Response = sb.String() + c.JSON(http.StatusOK, final) return } @@ -1008,21 +1019,30 @@ func ChatHandler(c *gin.Context) { }() if req.Stream != nil && !*req.Stream { - // Wait for the channel to close - var r api.ChatResponse + // Accumulate responses into the final response + var final api.ChatResponse var sb strings.Builder for resp := range ch { - var ok bool - if r, ok = resp.(api.ChatResponse); !ok { - c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + switch r := resp.(type) { + case api.ChatResponse: + sb.WriteString(r.Message.Content) + final = r + 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 response"}) + return + } + default: + c.JSON(http.StatusInternalServerError, gin.H{"error": "unexpected error"}) return } - if r.Message != nil { - sb.WriteString(r.Message.Content) - } } - r.Message = &api.Message{Role: "assistant", Content: sb.String()} - c.JSON(http.StatusOK, r) + + final.Message = &api.Message{Role: "assistant", Content: sb.String()} + c.JSON(http.StatusOK, final) return }