Skip to content

v1.0.0

Choose a tag to compare

@virtualman333 virtualman333 released this 16 Sep 00:57
· 25 commits to master since this release

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 通过;未做真实上游联调(需要可用的上游账号)