将流式响应解析为非流式响应 - 完全重写版
(body []byte, reqID string)
| 1593 | |
| 1594 | // 将流式响应解析为非流式响应 - 完全重写版 |
| 1595 | func parseStreamResponseAsNonStream(body []byte, reqID string) (*WoCloudResponse, error) { |
| 1596 | logInfo("[reqID:%s] 解析流式响应为非流式", reqID) |
| 1597 | parseStartTime := time.Now() |
| 1598 | |
| 1599 | // 如果配置了诊断,保存响应内容 |
| 1600 | if appConfig.DiagnosticLevel != "none" || appConfig.SaveResponses { |
| 1601 | enhancedDiagnoseChatResponse(body, reqID) |
| 1602 | } |
| 1603 | |
| 1604 | bodyStr := string(body) |
| 1605 | lines := strings.Split(bodyStr, "\n") |
| 1606 | |
| 1607 | // 统计变量 |
| 1608 | totalLines := 0 |
| 1609 | validJsonLines := 0 |
| 1610 | |
| 1611 | // 初始化完整响应对象 |
| 1612 | fullResponse := &WoCloudResponse{ |
| 1613 | Code: 0, |
| 1614 | Response: "", |
| 1615 | ReasoningContent: "", |
| 1616 | Finish: 1, // 默认设置为完成状态 |
| 1617 | } |
| 1618 | |
| 1619 | // 创建一个有序map存储响应行,确保按顺序处理 |
| 1620 | responseMap := make(map[int]string) |
| 1621 | var maxIndex int = 0 |
| 1622 | |
| 1623 | // 第一步:收集所有的data:行并解析 |
| 1624 | for i, line := range lines { |
| 1625 | line = strings.TrimSpace(line) |
| 1626 | |
| 1627 | if !strings.HasPrefix(line, "data:") { |
| 1628 | continue |
| 1629 | } |
| 1630 | |
| 1631 | totalLines++ |
| 1632 | jsonStr := strings.TrimPrefix(line, "data:") |
| 1633 | jsonStr = strings.TrimSpace(jsonStr) |
| 1634 | |
| 1635 | if jsonStr == "[DONE]" { |
| 1636 | continue |
| 1637 | } |
| 1638 | |
| 1639 | // 解析JSON |
| 1640 | var respObj map[string]interface{} |
| 1641 | if err := json.Unmarshal([]byte(jsonStr), &respObj); err != nil { |
| 1642 | // 尝试修复JSON格式 |
| 1643 | fixedJson := sanitizeJsonString(jsonStr, reqID) |
| 1644 | if err := json.Unmarshal([]byte(fixedJson), &respObj); err != nil { |
| 1645 | // 跳过无效的JSON |
| 1646 | continue |
| 1647 | } |
| 1648 | } |
| 1649 | |
| 1650 | validJsonLines++ |
| 1651 | |
| 1652 | // 提取响应内容 |
no test coverage detected