• v1.0.1 855d9c376a

    iomgaa released this 2026-08-11 12:15:05 +08:00 | 31 commits to main since this release

    首个发布版本。十个模块全部落地,四层测试都在跑。

    为什么首个版本是 1.0.1 而不是 0.xCLAUDE.md §1.3 那条「公共类型的字段只增不删不改名」
    从第一个下游装上它的那天起就生效,而 0.x 在语义化版本里意味着「随时可以破坏兼容」——两者
    对不上。用 1.x 开头是在声明那条承诺现在就算数。

    公共 API

    • polyloop.types:消息与内容块、上下文与注入、动作结果、预算、停止原因、逐步轨迹的
      一行(StepRecord)、一次运行的结果(RunResult),以及五种持久化日志记录。持久化结构带
      独立的 schema 版本,读到不认得的版本直接失败,不靠默认值补齐(CLAUDE.md §1.4)。
    • polyloop.ports:五个接缝的 Protocol——模型调用、决策解释、动作执行、存储、事件出口。
      每个都带一个同步的 parameters(),装配时聚合成参数快照写进运行开始记录,续跑时逐字段比对。
    • polyloop.sessionrunresume 两个入口,以及它们收的两个装配对象
      AgentDefinition 跨运行不变、RunRequest 每次运行一份)。
    • polyloop.tools:工具注册表。注册、模型可见的 schema 生成、存在性与参数校验、分发,
      四件事由同一个注册表实例驱动,所以「模型看得见但调不到」这种状态构造不出来。
    • polyloop.serialization:持久化记录的编解码。读到没有版本字段的载荷直接失败。
    • polyloop.stores:逐行追加的 jsonl 存储。必须显式 import,不进顶层。
    • polyloop.adapters:PolyGateway 的模型调用适配器,装它要 polyloop[gateway]
      必须显式 import——顺手导出会让每个进程在 import 本库时把网关连同它的 provider 目录一起拉起来。

    这一版保证了什么

    • 一次运行是有界的:步数、动作数、连续解析失败次数、提示词规模四个预算,停止判定的顺序
      写死在主循环里,判定结果随每一步落盘——崩在中间也不会把「恰好用满预算完成」记成「预算耗尽」。
    • 崩溃之后能从断点续跑:一步之内四次写,其中两次是耐久屏障;恢复读意图日志判断上一步
      处在哪一档(还没开始 / 执行完了 / 状态未知 / 日志损坏),按工具声明的重放策略处置。
      十个写入边界逐个崩过一遍,续跑结果与不中断跑完逐字段相等。
    • 取消能穿透asyncio.CancelledError 不被捕获吞没,取消进来之后在宽限期内写下结束记录
      ——不写的话恢复会把一次被主动叫停的运行当成可以续跑。
    • 并发跑同一份定义互不干扰:装配对象不持有任何一次运行的状态。

    已知欠账

    • stores 只有 jsonl 一种形态,关系数据库那种由下游自己实现,tests/contract/ 是它的准入标准。
    • 契约套件里解释器、执行器、模型客户端那几条等下游把实现接进来才跑得到。
    • 原子写的「崩在中间时两者都不可见」与前缀持久性这两条承诺没有机器兜底,标成 xfail
    Downloads