-
v1.0.3 Stable
released this
2026-08-30 02:20:51 +08:00 | 0 commits to main since this release回应 GovDoc-SaaS 提的 issue #6:网关适配器的转发白名单把
cache_namespace挡在外面,而那是
PolyGateway 指定的租户隔离手段。这一版发出去之前跑了一轮完整压测,与 1.0.2 那次验收逐项可比:正常负载 400 次运行、3501 次
真实模型调用,十一条不变量全部通过、零击穿、零无法判定;九类故障注入 58 条判据全部通过、零
击穿,剩下那一条无法判定与 1.0.2 那次是同一条(cancel_env那次运行一条事件都没发出过,
事件文件的完整性无从判起)。库本身没有被压出 bug。产物在tools/soak/runs/v1.0.3/
(该目录在 gitignore 里)。第一次开跑那轮作废了,原因不在库:模型中转连返 20 次 503 打开了网关的熔断,其后每次调用都
快速失败,400 次运行全部以llm_error收尾。正常负载那一轮的记分板不开「允许无法判定」,
于是它当场拦下、退出码非零——一次什么都没验到的跑没有冒充通过。那批产物留在
tools/soak/runs/v1.0.3-aborted-503/。网关适配器改按保留前缀转发绑定,而不是按键名撞
这是一次破坏性的行为变更。 绑定里不带前缀的
session_id与parent_call_id从「静默转发
给网关」变成「抛ValueError并给出改法」,改法是把键名写成gateway.session_id。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。Downloads