docs: 回写 CHANGELOG、GovDoc 迁移,以及压测那条过期注释

CHANGELOG 落在「未发布」段,按那一段自己的规矩不提前写版本号。写清了四条会抛 ValueError 的
情形与迁移写法,因为这是一次破坏性变更。

migrations/govdoc-saas.md 加一节讲租户命名空间怎么传,含迁完算不算数的四条判据,最终判据是
「同一段文本由两个租户各提交一次,各自拿到自己的那份输出」。参数一律指向 0017 不复述。这份
文档原来说 GovDoc 侧「还没有可迁移的东西」,现在有了第一条能逐条验的接入动作,文件头那句
状态说明跟着补了一句例外。

tools/soak/run_soak.py 那份空绑定上方的注释在复述旧转发规则,顺手改对。它给的理由本来就不准
——让绑定留空的真正原因是绑定的全部键值都进参数快照,每批都不同的值会让故障注入那一步续跑时
报一次假的参数漂移,和转发哪些键无关。三份压测绑定常量里都没有裸键,所以这次变更打不到压测。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-29 11:53:20 -04:00
parent fd9cae7da5
commit c0d9d7b66e
3 changed files with 91 additions and 4 deletions
+33
View File
@@ -14,6 +14,39 @@
长期停在 1.0.5,下游 `pip install` 拿不到任何修复且无人发现。提前把号写进这一段就是在重演
那个形态——读到号的人会以为那一版已经在 registry 上,而它不在。
### 网关适配器改按保留前缀转发绑定,而不是按键名撞
**这是一次破坏性的行为变更。** 绑定里不带前缀的 `session_id``parent_call_id` 从「静默转发
给网关」变成「抛 `ValueError` 并给出改法」,改法是把键名写成 `gateway.session_id`
```python
model_binding={
"book": "b7", # 项目自己的坐标,不传
"gateway.cache_namespace": "acme:v1:tenant:x7", # 传成 chat(cache_namespace=...)
"gateway.tenant_id": "x7",
}
```
绑定里键名以 `gateway.` 开头的,前缀之后那一段当作网关 `chat()` 的关键字参数名,值原样传下去;
其余的键照旧不传、也不报错。**本库不再持有一份网关参数名单**——上游哪天再加一个字符串维度,
下游当天就能用,本库不发版,声明的依赖下界也不用跟着抬。
原来那份写死的白名单只认两个键,把 `cache_namespace` 挡在外面,而那是 PolyGateway 指定的租户
隔离手段:挡掉之后,两个租户提交内容相同的一段文字,第二个会读到第一个那次的模型输出。给出
那份白名单的理由是「网关只有两个槽位放得下这类东西」,而这句话在写下的那天就已经不成立——
当时装得到的最低版本上已经有四个。
四条会抛 `ValueError` 的情形:带前缀的键名指向 `messages``stream``structured``overlay`
之一(这些改变请求本身,另有权威);带前缀的键取值是空串或纯空白(在网关那边和「没传」分不
开,或者不带任何信息,而一个看着配了、实际没配的隔离比没配更糟);键恰好是 `gateway.`、前缀
后面没跟参数名;以及不带前缀的那两个历史裸键。
判断发生在把请求交给网关之前,所以出错的那次调用不会真的发出去。
转发的键照旧全部进参数快照,键名不变(`request.binding.gateway.cache_namespace`),所以换一个
命名空间续跑会照常撞参数漂移。
方案与被否掉的三条路见 `research-wiki/design/0017-gateway-forwarding.md`
## 1.0.22026-08-27
回应下游项目在 PolyLoop 仓库上提的五个 issue。