实现侧: - 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。 - 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。 - 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。 - 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。 - 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。 - 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。 - 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。 - 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。 用例侧: - 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存; - 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
96 lines
3.9 KiB
Python
96 lines
3.9 KiB
Python
"""写路径完整运行事件、修订与重跑差异:完成回执、事件链与幂等重放。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import uuid
|
||
|
||
import pytest
|
||
import test_任务租约与恢复 as 租约测试
|
||
|
||
from muse.任务运行.接口 import (
|
||
事件类型,
|
||
任务服务,
|
||
任务状态,
|
||
步骤处理器,
|
||
步骤结果,
|
||
步骤计划,
|
||
)
|
||
from muse.共享.调用身份 import 用途
|
||
from muse.编排.接口 import 流程定义, 流程服务, 流程登记
|
||
|
||
pytestmark = pytest.mark.数据库
|
||
任务库 = 租约测试.任务库
|
||
请求 = 租约测试.请求
|
||
|
||
|
||
def _构造写路径服务(池):
|
||
"""collect 处理器追加真实模型调用事件;finish 完成;同命令重放幂等。"""
|
||
登记 = 流程登记()
|
||
|
||
def 提取(context):
|
||
运行.追加事件(
|
||
context.领取,
|
||
事件类型.候选保存,
|
||
{"candidate_id": "cand-1", "content_hash": "a" * 64},
|
||
事件ID=str(uuid.uuid4()),
|
||
)
|
||
return 步骤结果({"output_text": "重启之后的正文。", "saved": True})
|
||
|
||
登记.登记处理器(步骤处理器("collect", "1", 提取, "v1", "v1", 保护职责="输入校验"))
|
||
登记.登记处理器(步骤处理器("finish", "1", lambda _: 步骤结果({"done": True}), "v1", "v1"))
|
||
登记.登记类型("example", 必需保护=("输入校验",))
|
||
登记.登记恢复检查("example", "1", lambda _: None)
|
||
运行 = 任务服务(池, 登记)
|
||
流程服务(运行, 登记).发布(
|
||
流程定义(
|
||
"example",
|
||
"1",
|
||
(
|
||
步骤计划("collect", "collect", "1"),
|
||
步骤计划("finish", "finish", "1", ("collect",)),
|
||
),
|
||
)
|
||
)
|
||
return 运行
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"TC-4f15076697e5",
|
||
environment="隔离 PostgreSQL,模型与宿主为有标记替身",
|
||
when="领取、执行、取消或重试任务并注入步骤故障。",
|
||
contract="docs/系统架构/新版设计/接口契约/任务工具与事件.md",
|
||
)
|
||
def test_写路径运行事件可修订重跑且幂等__4f1507(任务库, tmp_path) -> None:
|
||
"""旧 sqlite run.started/completed 与 WAL:新版任务事件链与重放等价承接。"""
|
||
运行 = _构造写路径服务(任务库[用途.生产])
|
||
身份 = 运行.创建任务(请求("p03-write-1"), "example", "1")
|
||
# 同命令重放返回同一任务身份(幂等,不产生第二任务)。
|
||
assert 运行.创建任务(请求("p03-write-1"), "example", "1") == 身份
|
||
|
||
领取 = 运行.领取步骤("old", ["collect", "finish"], 任务ID=身份, 作者="author")
|
||
assert 领取 is not None
|
||
运行.执行一步(领取)
|
||
领取2 = 运行.领取步骤("old", ["finish"], 任务ID=身份, 作者="author")
|
||
assert 领取2 is not None
|
||
运行.执行一步(领取2)
|
||
|
||
快照 = 运行.读取任务(身份)
|
||
assert 快照.状态 is 任务状态.已完成
|
||
assert all(步骤["result"] is not None for 步骤 in 快照.步骤)
|
||
输出 = next(s["result"] for s in 快照.步骤 if s["result"] and "output_text" in s["result"])
|
||
assert "重启之后的正文。" in 输出["output_text"]
|
||
|
||
# 事件链:任务创建/步骤开始/步骤完成/任务完成 + 处理器内的模型调用事件。
|
||
续接 = 运行.续接事件(身份)
|
||
类型 = [e.类型 for e in 续接.事件]
|
||
assert 事件类型.任务创建 in 类型
|
||
assert 事件类型.步骤开始 in 类型 and 事件类型.步骤完成 in 类型
|
||
assert 事件类型.任务结束 in 类型
|
||
assert 事件类型.候选保存 in 类型
|
||
assert [e.序号 for e in 续接.事件] == list(range(1, 续接.最后序号 + 1))
|
||
|
||
# 修订与重跑差异:完成后重放事件不增长、已完成结果不被改写。
|
||
再续 = 运行.续接事件(身份)
|
||
assert 再续.最后序号 == 续接.最后序号
|
||
assert 运行.读取任务(身份).状态 is 任务状态.已完成
|