83721f98d4
- Added Swiper library to package dependencies for improved UI components. - Updated chat API to include summary model ID in message handling, allowing for more flexible model selection. - Enhanced InputField component to manage model selection and state more effectively. - Improved event handling in chat components to support new model features and ensure accurate message processing. - Refactored SVG assets for better visual consistency and updated styles for improved user experience.
6.2 KiB
6.2 KiB
Session Handler 重构总结
📋 优化概述
本次重构主要通过提取公共辅助函数来简化代码,消除重复逻辑,提高代码的可维护性和可读性。
🆕 新增文件
helpers.go - 辅助函数集合
创建了一个专门的辅助函数文件,包含以下功能:
SSE 相关
setSSEHeaders(c *gin.Context)- 设置 SSE 标准头部sendCompletionEvent(c, requestID)- 发送完成事件buildStreamResponse(evt, requestID)- 从 StreamEvent 构建 StreamResponse
事件和流处理
createAgentQueryEvent(sessionID, assistantMessageID)- 创建 agent query 事件writeAgentQueryEvent(ctx, sessionID, assistantMessageID)- 写入 agent query 事件到流管理器
消息处理
createUserMessage(ctx, sessionID, query, requestID)- 创建用户消息createAssistantMessage(ctx, assistantMessage)- 创建助手消息
StreamHandler 设置
setupStreamHandler(...)- 创建并订阅流处理器setupStopEventHandler(...)- 注册停止事件处理器
配置相关
createDefaultSummaryConfig()- 创建默认摘要配置fillSummaryConfigDefaults(config)- 填充摘要配置默认值
工具函数
validateSessionID(c)- 验证并提取 session IDgetRequestID(c)- 获取 request IDgetString(m, key)- 安全获取字符串值getFloat64(m, key)- 安全获取浮点数值
🔄 优化的文件
1. agent_stream_handler.go
减少行数: 428 → 410 行 (-18 行)
优化内容:
- 移除了重复的辅助函数
getString和getFloat64(现在在helpers.go中)
2. stream.go
减少行数: 440 → 364 行 (-76 行, -17.3%)
优化内容:
- 使用
setSSEHeaders()替代重复的 4 行头部设置代码 - 使用
buildStreamResponse()替代 10+ 行的响应构建逻辑(3 处) - 使用
sendCompletionEvent()替代重复的完成事件发送代码(3 处)
优化示例:
// Before (10+ lines)
response := &types.StreamResponse{
ID: message.RequestID,
ResponseType: evt.Type,
Content: evt.Content,
Done: evt.Done,
Data: evt.Data,
}
if evt.Type == types.ResponseTypeReferences {
if refs, ok := evt.Data["references"].(types.References); ok {
response.KnowledgeReferences = refs
}
}
// After (1 line)
response := buildStreamResponse(evt, message.RequestID)
3. qa.go
减少行数: 536 → 485 行 (-51 行, -9.5%)
优化内容:
- 使用
setSSEHeaders()替代重复的头部设置(2 处) - 使用
createUserMessage()替代 9 行的用户消息创建(3 处) - 使用
createAssistantMessage()替代 3 行的助手消息创建(3 处) - 使用
writeAgentQueryEvent()替代 15+ 行的事件写入代码(2 处) - 使用
setupStreamHandler()替代 7 行的处理器设置(2 处) - 使用
setupStopEventHandler()替代 7 行的停止事件处理器设置(2 处) - 使用
getRequestID()简化请求 ID 获取(1 处)
4. handler.go
减少行数: 354 → 312 行 (-42 行, -11.9%)
优化内容:
- 使用
createDefaultSummaryConfig()替代 12 行的配置创建(2 处) - 使用
fillSummaryConfigDefaults()替代 9 行的默认值填充(1 处)
优化示例:
// Before (21 lines)
if request.SessionStrategy.SummaryParameters != nil {
createdSession.SummaryParameters = request.SessionStrategy.SummaryParameters
} else {
createdSession.SummaryParameters = &types.SummaryConfig{
MaxTokens: h.config.Conversation.Summary.MaxTokens,
TopP: h.config.Conversation.Summary.TopP,
// ... 8 more fields
}
}
if createdSession.SummaryParameters.Prompt == "" {
createdSession.SummaryParameters.Prompt = h.config.Conversation.Summary.Prompt
}
// ... 2 more field checks
// After (5 lines)
if request.SessionStrategy.SummaryParameters != nil {
createdSession.SummaryParameters = request.SessionStrategy.SummaryParameters
} else {
createdSession.SummaryParameters = h.createDefaultSummaryConfig()
}
h.fillSummaryConfigDefaults(createdSession.SummaryParameters)
📊 总体统计
| 文件 | 优化前 | 优化后 | 减少 | 比例 |
|---|---|---|---|---|
| agent_stream_handler.go | 428 | 410 | -18 | -4.2% |
| stream.go | 440 | 364 | -76 | -17.3% |
| qa.go | 536 | 485 | -51 | -9.5% |
| handler.go | 354 | 312 | -42 | -11.9% |
| 总计 | 1,758 | 1,571 | -187 | -10.6% |
| helpers.go (新增) | 0 | 204 | +204 | - |
| 净变化 | 1,758 | 1,775 | +17 | +1.0% |
虽然总行数略有增加(+17 行),但代码质量显著提升:
- ✅ 消除了大量重复代码
- ✅ 提高了代码复用性
- ✅ 增强了可维护性
- ✅ 统一了代码风格
- ✅ 便于未来扩展
🎯 关键改进
1. 代码复用性
通过提取公共函数,同样的逻辑只需维护一处,修改时更新一个地方即可。
2. 可读性提升
// Before: 需要阅读 10+ 行才能理解
response := &types.StreamResponse{ /* 10 lines */ }
// After: 一行就能明白意图
response := buildStreamResponse(evt, requestID)
3. 一致性
所有 SSE 头部设置、消息创建、事件处理都使用统一的方法,降低出错风险。
4. 易于测试
辅助函数可以独立测试,提高单元测试的覆盖率。
5. 便于维护
如果需要修改 SSE 头部或事件格式,只需修改辅助函数,不需要搜索整个代码库。
✅ 验证结果
- ✅ 无 linter 错误
- ✅ 编译成功
- ✅ 保持原有功能不变
- ✅ 代码结构更清晰
🔮 未来建议
- 测试覆盖: 为
helpers.go中的辅助函数添加单元测试 - 文档完善: 为复杂的辅助函数添加使用示例
- 持续优化: 定期审查是否有新的重复代码可以提取
📝 总结
本次重构成功地消除了代码重复,提高了代码质量。虽然增加了一个新文件,但整体代码结构更加清晰,维护成本大幅降低。重构遵循了 DRY(Don't Repeat Yourself)原则,为未来的开发和维护打下了良好的基础。