feat(captain): align streaming fallbacks
This commit is contained in:
@@ -111,13 +111,13 @@ func (h *CaptainTaskHandler) Rewrite(c *gin.Context) {
|
||||
func (h *CaptainTaskHandler) StreamReplySuggestion(c *gin.Context) {
|
||||
accountID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
captainWriteSSEError(c, "invalid account_id")
|
||||
captainWriteSSEError(c, http.StatusBadRequest, "invalid account_id")
|
||||
return
|
||||
}
|
||||
|
||||
var req service.TaskReplySuggestionRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
captainWriteSSEError(c, "invalid request body: "+err.Error())
|
||||
captainWriteSSEError(c, http.StatusBadRequest, "invalid request body: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -144,8 +144,7 @@ func (h *CaptainTaskHandler) StreamReplySuggestion(c *gin.Context) {
|
||||
|
||||
if err != nil && err != io.EOF {
|
||||
applogger.L().Errorf("StreamReplySuggestion: %v", err)
|
||||
captainWriteSSEMessage(c, "error", fmt.Sprintf(`{"error": "%s"}`, captainEscapeJSONString(err.Error())))
|
||||
captainWriteSSEMessage(c, "done", `{"done": true}`)
|
||||
captainWriteSSETaskError(c, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,13 +153,13 @@ func (h *CaptainTaskHandler) StreamReplySuggestion(c *gin.Context) {
|
||||
func (h *CaptainTaskHandler) StreamSummarize(c *gin.Context) {
|
||||
accountID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
captainWriteSSEError(c, "invalid account_id")
|
||||
captainWriteSSEError(c, http.StatusBadRequest, "invalid account_id")
|
||||
return
|
||||
}
|
||||
|
||||
var req service.TaskSummarizeRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
captainWriteSSEError(c, "invalid request body: "+err.Error())
|
||||
captainWriteSSEError(c, http.StatusBadRequest, "invalid request body: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -187,8 +186,7 @@ func (h *CaptainTaskHandler) StreamSummarize(c *gin.Context) {
|
||||
|
||||
if err != nil && err != io.EOF {
|
||||
applogger.L().Errorf("StreamSummarize: %v", err)
|
||||
captainWriteSSEMessage(c, "error", fmt.Sprintf(`{"error": "%s"}`, captainEscapeJSONString(err.Error())))
|
||||
captainWriteSSEMessage(c, "done", `{"done": true}`)
|
||||
captainWriteSSETaskError(c, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,13 +195,13 @@ func (h *CaptainTaskHandler) StreamSummarize(c *gin.Context) {
|
||||
func (h *CaptainTaskHandler) StreamRewrite(c *gin.Context) {
|
||||
accountID, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
captainWriteSSEError(c, "invalid account_id")
|
||||
captainWriteSSEError(c, http.StatusBadRequest, "invalid account_id")
|
||||
return
|
||||
}
|
||||
|
||||
var req service.TaskRewriteRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
captainWriteSSEError(c, "invalid request body: "+err.Error())
|
||||
captainWriteSSEError(c, http.StatusBadRequest, "invalid request body: "+err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
@@ -230,8 +228,7 @@ func (h *CaptainTaskHandler) StreamRewrite(c *gin.Context) {
|
||||
|
||||
if err != nil && err != io.EOF {
|
||||
applogger.L().Errorf("StreamRewrite: %v", err)
|
||||
captainWriteSSEMessage(c, "error", fmt.Sprintf(`{"error": "%s"}`, captainEscapeJSONString(err.Error())))
|
||||
captainWriteSSEMessage(c, "done", `{"done": true}`)
|
||||
captainWriteSSETaskError(c, err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,12 +250,21 @@ func captainWriteSSEMessage(c *gin.Context, event string, data string) {
|
||||
}
|
||||
|
||||
// captainWriteSSEError writes an error SSE event followed by a done event.
|
||||
func captainWriteSSEError(c *gin.Context, errMsg string) {
|
||||
func captainWriteSSEError(c *gin.Context, status int, errMsg string) {
|
||||
captainSetSSEHeaders(c)
|
||||
captainWriteSSEMessage(c, "error", fmt.Sprintf(`{"error": "%s"}`, captainEscapeJSONString(errMsg)))
|
||||
captainWriteSSEMessage(c, "error", fmt.Sprintf(`{"error": "%s", "status": %d, "done": true}`, captainEscapeJSONString(errMsg), status))
|
||||
captainWriteSSEMessage(c, "done", `{"done": true}`)
|
||||
}
|
||||
|
||||
func captainWriteSSETaskError(c *gin.Context, err error) {
|
||||
status, message, ok := service.CaptainTaskErrorStatus(err)
|
||||
if !ok {
|
||||
status = http.StatusUnprocessableEntity
|
||||
message = err.Error()
|
||||
}
|
||||
captainWriteSSEError(c, status, message)
|
||||
}
|
||||
|
||||
// captainEscapeJSONString escapes special characters for safe JSON embedding.
|
||||
func captainEscapeJSONString(s string) string {
|
||||
var result strings.Builder
|
||||
|
||||
Reference in New Issue
Block a user