diff --git a/service/task/worker.go b/service/task/worker.go index 7bad2ec..20dd537 100644 --- a/service/task/worker.go +++ b/service/task/worker.go @@ -277,7 +277,7 @@ func (w *asyncWorker) parseAndRetry(ctx context.Context, body map[string]any, ta return body, nil } -// injectErrorMessage 将错误信息拼接到 user 消息中 +// injectErrorMessage 将错误信息插入到最后一个 user 消息之前 func injectErrorMessage(payload map[string]any, err error) map[string]any { if err == nil { return payload @@ -288,30 +288,34 @@ func injectErrorMessage(payload map[string]any, err error) map[string]any { return payload } - errMsg := fmt.Sprintf("\n\n【上一轮输出错误,请修正】%s", err.Error()) + errMsg := fmt.Sprintf("【上一轮输出错误,请修正】%s", err.Error()) - // 找到最后一个 role=user 的消息,追加错误提示 + // 找到最后一个 user 的位置 + lastUserIdx := -1 for i := len(messages) - 1; i >= 0; i-- { msg, ok := messages[i].(map[string]any) if !ok { continue } - if gconv.String(msg["role"]) != "user" { - continue + if gconv.String(msg["role"]) == "user" { + lastUserIdx = i + break } - - switch c := msg["content"].(type) { - case string: - msg["content"] = c + errMsg - case []any: - msg["content"] = append(c, map[string]any{ - "type": "text", - "text": errMsg, - }) - } - break } + if lastUserIdx == -1 { + return payload + } + + // 在最后一个 user 之前插入错误消息 + errMsgObj := map[string]any{ + "role": "user", + "content": []map[string]any{{"type": "text", "text": errMsg}}, + } + + // 切片插入 + messages = append(messages[:lastUserIdx], append([]any{errMsgObj}, messages[lastUserIdx:]...)...) + payload["messages"] = messages return payload }