feat(session): 参数快照补上配方指纹与注入通道,并写定执行器抛异常的契约
四件事,都来自第一个下游的 issue。 **RunRequest 新增 fingerprints。** 上下文与注入内容刻意不进快照(它们是数据不是参数), 而这条规则把生成它们的提示词模板也一起挡在外面了。具体的失败场景:换一份模板续跑不报错, 前几步用 A 模板、后几步用 B,那次运行的数据已经废了却没有任何提示。键形状 request.fingerprint.<name>,和 model_binding 那个坐标分开——一个是「这次运行属于哪一格」, 一个是「用的配方是哪一版」,混在一个字段里事后分不开。默认空映射时一个键都不写,所以已有 配置算出来的快照逐字节不变。 **注入的通道维度不再拍平。** 一通道一键,于是「声明了通道但一条都没选中」和「压根没有这个 通道」分得开:前者是值为空串的键,后者是键不存在。有一档实验要比较的正是这两种情形。 **ActionExecutor 的 docstring 写定抛异常时会怎样**:环境故障走 ENV_ERROR 返回值,实现方真 抛了库不接管、异常原样穿出。理由在 design 0016;简言之库替它编一个结算结果就是在编造,而 副作用状态在那一刻是未知的。 **三个映射字段在构造期冻成只读。** 对抗审查发现 frozen=True 不禁止改字段里那个 dict,于是 构造期那道「快照取值必须是字符串」的校验能被绕过去:构造完往 fingerprints 里塞一个整数, 它一路进日志,要到续跑读日志时才炸——而那时这次运行已经完整跑过一遍。复用 tools 里已有的 _frozen,没另写一套。
This commit is contained in:
@@ -69,7 +69,10 @@ class ToolHandler(Protocol):
|
||||
|
||||
|
||||
def _frozen(value: object) -> object:
|
||||
"""把一份 JSON Schema 逐层变成改不动的形状:映射变只读视图,列表变元组。
|
||||
"""把一份嵌套结构逐层变成改不动的形状:映射变只读视图,列表变元组。
|
||||
|
||||
工具的参数 schema 是第一个用它的地方,`polyloop.session` 的请求也用它冻自己那几个映射
|
||||
字段——两处要防的是同一件事,所以共用这一个函数而不是各写一份。
|
||||
|
||||
只冻最外面一层不够。真正会发生的改法是从注册表里把规格取出来、往里伸一层去改
|
||||
(`spec_for("read").parameters["properties"]["path"]["type"] = ...`),那一下同时改掉了
|
||||
|
||||
Reference in New Issue
Block a user