Repository navigation
v1.0.0
aiUniTokenHub 后端首个 tag,标记「协议适配层与流式转换层都有回归测试」这一节点。
修了什么
1. 多字节 UTF-8 被 chunk 边界切坏(中文变 �)— 用户可见
TCP/HTTP 分片与字符边界无关,一个汉字(3 字节)或 emoji(4 字节)会被切在两个 chunk 中间。
直接 chunk.decode('utf-8', errors='replace') 会把这段不完整序列判为非法并替换成 U+FFFD:
实测一个「你」变成三个 �,且不可恢复——上游数据本身是好的。
命中 4 处:两个流式转换器的 feed(),以及 views_openai / views_responses 里解析 usage
的缓冲(那里损坏会让事件 JSON 解析失败、usage 丢失,即漏计费)。
现改为增量解码 IncrementalUtf8Decoder,不完整的尾巴留到下一个 chunk 补齐。
2. response.completed.output 顺序与公布的 output_index 不一致
工具调用先于正文出现时,function_call 拿到 index=0、message 拿到 index=1,
而数组固定「先 message 后 tool」,客户端按 index 取条目会拿错内容。改为按 output_index 排序。
3. 标准流下工具调用的收尾事件重复发送
标准流是「带 finish_reason 的 chunk」+「[DONE]」,两者都会触发收尾;原实现只守住了 message
一侧,function_call_arguments.done / output_item.done 各发两遍,客户端按 done 累加条目会出现重复项。
测试
backend/apps/api_proxy/tests/共 82 例,纯 Python、零数据库依赖:
python -m unittest discover -s apps/api_proxy/tests -t . -v- 三处缺陷均有回归锁,并逐条做了负向验证(把旧行为注入回去,确认报警精确到对应用例)
- 已跑
python manage.py check通过;未做真实上游联调(需要可用的上游账号)