Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .trae/specs/qqofficial-fixes/checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
- [x] 检查点 1: 验证 chunk_text 函数是否正确修复,无死循环和重复块
- [x] 检查点 2: 验证流式 C2C 降级条件是否覆盖所有富媒体类型
- [x] 检查点 3: 验证频道消息是否支持 URL 图片发送
- [x] 检查点 4: 验证 MessageReplyLimiter 是否使用 logger 进行日志记录
- [x] 检查点 5: 验证 MessageReplyLimiter 的并发安全性
- [x] 检查点 6: 验证未使用的上传辅助函数和缓存是否已清理
- [x] 检查点 7: 运行项目的测试和 lint 检查,确保代码质量
- [x] 检查点 8: 验证修复后的代码与现有代码风格和架构保持一致
84 changes: 84 additions & 0 deletions .trae/specs/qqofficial-fixes/spec.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# QQOfficial 模块修复 - 产品需求文档

## Overview
- **Summary**: 修复 QQOfficial 模块中的多个 bug,包括文本分块逻辑、流式消息降级条件、频道消息图片发送和消息回复限流器等问题
- **Purpose**: 解决 PR #7176 中提出的代码审查问题,确保 QQOfficial 模块的稳定性和可靠性
- **Target Users**: 开发团队和使用 QQOfficial 模块的用户

## Goals
- 修复 chunk_text 函数的游标更新逻辑,避免死循环和重复块风险
- 完善流式 C2C 降级条件,覆盖所有富媒体类型
- 修复频道消息图片发送问题,支持 URL 图片
- 改进 MessageReplyLimiter 的日志记录和并发安全性
- 清理未使用的上传辅助函数和缓存

## Non-Goals (Out of Scope)
- 重构整个 QQOfficial 模块
- 添加新功能或特性
- 修改其他平台适配器的代码

## Background & Context
- PR #7176 提出了多个代码审查问题,需要修复
- 参考 OpenClaw 项目的实现方式进行修复
- 确保修复后的代码与现有代码风格和架构保持一致

## Functional Requirements
- **FR-1**: 修复 chunk_text 函数的游标更新逻辑,确保每次循环 start 都单调前进
- **FR-2**: 完善流式 C2C 降级条件,当检测到任何富媒体时都降级为非流式发送
- **FR-3**: 修复频道消息图片发送问题,支持 URL 图片
- **FR-4**: 改进 MessageReplyLimiter,使用 logger 进行日志记录,避免使用模块级全局变量
- **FR-5**: 清理未使用的上传辅助函数和缓存

## Non-Functional Requirements
- **NFR-1**: 代码质量:修复后的代码应符合项目的代码风格和最佳实践
- **NFR-2**: 安全性:确保 MessageReplyLimiter 的并发安全性
- **NFR-3**: 可维护性:清理未使用的代码,提高代码可读性

## Constraints
- **Technical**: 保持与现有代码架构的一致性
- **Dependencies**: 参考 OpenClaw 项目的实现方式

## Assumptions
- OpenClaw 项目的实现方式是可靠的参考
- 修复后的代码应通过项目的测试和 lint 检查

## Acceptance Criteria

### AC-1: 修复 chunk_text 函数
- **Given**: 长文本需要分块
- **When**: 调用 chunk_text 函数
- **Then**: 函数应正确分块,无死循环,无重复块
- **Verification**: `programmatic`
- **Notes**: 确保每次循环 start 都单调前进

### AC-2: 完善流式 C2C 降级条件
- **Given**: 发送包含语音、视频或文件的流式 C2C 消息
- **When**: 触发流式消息发送
- **Then**: 应降级为非流式发送
- **Verification**: `programmatic`
- **Notes**: 确保所有富媒体类型都被覆盖

### AC-3: 修复频道消息图片发送
- **Given**: 发送包含 URL 图片的频道消息
- **When**: 调用频道消息发送接口
- **Then**: 应正确发送 URL 图片
- **Verification**: `programmatic`
- **Notes**: 区分本地路径和 URL 图片的处理

### AC-4: 改进 MessageReplyLimiter
- **Given**: 使用 MessageReplyLimiter 进行消息回复限流
- **When**: 记录消息回复或检查限流
- **Then**: 应使用 logger 进行日志记录,且线程安全
- **Verification**: `programmatic`
- **Notes**: 避免使用模块级全局变量

### AC-5: 清理未使用的代码
- **Given**: 检查上传相关代码
- **When**: 分析代码使用情况
- **Then**: 移除或标记未使用的上传辅助函数和缓存
- **Verification**: `human-judgment`
- **Notes**: 保持代码整洁

## Open Questions
- [ ] 是否需要添加单元测试来验证修复效果?
- [ ] 清理未使用代码时是否需要保留某些接口以保持向后兼容?
66 changes: 66 additions & 0 deletions .trae/specs/qqofficial-fixes/tasks.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# QQOfficial 模块修复 - 实现计划

## [x] 任务 1: 修复 chunk_text 函数的游标更新逻辑
- **优先级**: P0
- **依赖**: 无
- **描述**:
- 修改 qqofficial_message_event.py 中的 chunk_text 函数
- 简化游标更新逻辑,确保每次循环 start 都单调前进
- 避免使用复杂的 overlap 逻辑和 find 方法
- **接受标准**: AC-1
- **测试需求**:
- `programmatic` TR-1.1: 测试长文本分块功能,确保无死循环和重复块
- `programmatic` TR-1.2: 测试边界条件,如文本长度正好等于限制、小于限制等
- **注意**: 参考 PR 中的建议,使用 `start = max(breakpoint - overlap, start + 1)` 或类似逻辑

## [x] 任务 2: 完善流式 C2C 降级条件
- **优先级**: P0
- **依赖**: 无
- **描述**:
- 修改 qqofficial_message_event.py 中的流式消息降级逻辑
- 确保当检测到任何富媒体时都降级为非流式发送
- 覆盖图片、语音、视频和文件等所有富媒体类型
- **接受标准**: AC-2
- **测试需求**:
- `programmatic` TR-2.1: 测试包含语音的流式 C2C 消息,应降级为非流式
- `programmatic` TR-2.2: 测试包含视频的流式 C2C 消息,应降级为非流式
- `programmatic` TR-2.3: 测试包含文件的流式 C2C 消息,应降级为非流式
- **注意**: 参考 PR 中的建议,使用 `if stream and (image_source or record_file_path or video_file_source or file_source):`

## [x] 任务 3: 修复频道消息图片发送问题
- **优先级**: P0
- **依赖**: 无
- **描述**:
- 修改 qqofficial_platform_adapter.py 中的频道消息发送逻辑
- 支持 URL 图片的发送
- 区分本地路径和 URL 图片的处理
- **接受标准**: AC-3
- **测试需求**:
- `programmatic` TR-3.1: 测试发送包含 URL 图片的频道消息
- `programmatic` TR-3.2: 测试发送包含本地路径图片的频道消息
- **注意**: 参考 PR 中的建议,添加对 URL 图片的特殊处理

## [x] 任务 4: 改进 MessageReplyLimiter
- **优先级**: P1
- **依赖**: 无
- **描述**:
- 修改 rate_limiter.py 中的 MessageReplyLimiter 类
- 使用 logger 进行日志记录,替代 print
- 改进并发安全性,避免使用模块级全局变量
- **接受标准**: AC-4
- **测试需求**:
- `programmatic` TR-4.1: 测试消息回复限流功能
- `programmatic` TR-4.2: 测试并发场景下的限流器行为
- **注意**: 参考 OpenClaw 项目的实现方式

## [x] 任务 5: 清理未使用的上传辅助函数和缓存
- **优先级**: P2
- **依赖**: 无
- **描述**:
- 检查 chunked_upload.py 中的上传相关代码
- 移除或标记未使用的上传辅助函数和缓存
- 保持代码整洁
- **接受标准**: AC-5
- **测试需求**:
- `human-judgment` TR-5.1: 检查代码是否整洁,无未使用的函数和缓存
- **注意**: 确保不影响现有功能
Empty file.
Loading