muse-agent-example/tests/契约/test_工具范围.py
zizi d909d1bd1b 后端实现与用例身份:19 包集成落地并修复收尾缺陷
实现侧:
- 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。
- 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。
- 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。
- 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。
- 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。
- 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。
- 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。
- 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。

用例侧:
- 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存;
- 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
2026-09-18 01:15:00 +08:00

81 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""工具范围的独立协议测试;合成读取器不代表B09真实数据库权限。"""
import pytest
from muse.任务运行.接口 import (
只读工具集,
工具定义,
工具来源,
工具结果,
工具范围,
工具请求,
模型协议错误,
)
@pytest.mark.case_id(
"NC-tool-frozen-scope",
environment="离线协议,显式合成读取器",
given="冻结任务作品、截止位置和来源",
when="实际工具网关转交合成只读查询",
then=["调用方不能传work_id覆盖范围,未授权工具拒绝", "有效结果保留数据、结构和投影版本回执"],
contract="docs/系统架构/新版设计/接口契约/任务工具与事件.md",
)
def test_工具只能消费冻结范围且返回可追溯版本__a65001() -> None:
记录 = []
def 读取(范围, 条件):
assert 范围.作品ID == "work-a" and 范围.截止位置 == 3
assert 条件 == {"query": "桥"}
return 工具结果("第三章的桥", (工具来源("source-a", "3", "schema1", "projection1"),))
定义 = 工具定义(
"read",
"读取指定来源",
{
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"],
"additionalProperties": False,
},
读取,
)
集合 = 只读工具集(
(定义,),
("read",),
工具范围("task", "work-a", ("source-a",), 3, "production", "generation"),
记录.append,
)
assert 集合.调用(工具请求("call1", "read", {"query": "桥"})).内容 == "第三章的桥"
assert 记录[0]["source_refs"][0]["revision"] == "3"
with pytest.raises(模型协议错误):
集合.调用(工具请求("call2", "read", {"query": "桥", "work_id": "work-b"}))
with pytest.raises(模型协议错误):
集合.调用(工具请求("call3", "write", {"query": "桥"}))
assert len(记录) == 1
@pytest.mark.case_id(
"NC-tool-load-and-source",
environment="离线协议,显式合成读取器",
given="缺失工具或返回其他来源",
when="装配与调用工具网关",
then=["加载失败和越界来源拒绝,不向模型返回结果"],
contract="docs/系统架构/新版设计/接口契约/任务工具与事件.md",
)
def test_所需工具未加载和越界来源均拒绝__a65002() -> None:
范围 = 工具范围("task", "work-a", ("source-a",), 3, "production", "generation")
with pytest.raises(模型协议错误):
只读工具集((), ("read",), 范围, lambda _: None)
工具 = 工具定义(
"read",
"读取",
{"type": "object"},
lambda *_: 工具结果("不应送入模型", (工具来源("source-b", "1", "s", "p"),)),
)
记录 = []
集合 = 只读工具集((工具,), ("read",), 范围, 记录.append)
with pytest.raises(模型协议错误):
集合.调用(工具请求("call", "read", {}))
assert not 记录