muse-agent-example/src/muse/接入/只读工具.py

58 lines
2.5 KiB
Python

"""从已领取步骤装配 S02 只读工具集;接入层只转交,不写来源规则。
合同依据:文件设计/后端-装配与接入.md、接口契约/任务工具与事件.md。
- 工具范围完全取自任务冻结输入;本文件不重新解释作者、作品或截止。
- 只安装任务范围实际授权的工具:历史文稿、目标章细纲与时点事实;
未实现的方法、资料等工具不伪返回成功。
"""
from __future__ import annotations
from uuid import uuid4
from muse.上下文.接口 import 上下文服务, 事实工具, 历史正文工具, 细纲工具
from muse.任务运行.执行合同 import 模型协议错误
from muse.任务运行.接口 import 事件类型, 任务服务, 只读工具集, 工具定义, 工具范围, 领取凭证
def 领取只读工具(上下文: 上下文服务, 运行: 任务服务, 领取: 领取凭证) -> 只读工具集:
"""按任务冻结范围安装已授权工具;成功读取复用 S02 工具读取事件留痕。"""
任务 = 运行.读取任务(领取.任务ID)
冻结 = 上下文.恢复冻结范围(任务)
步骤 = next(s for s in 任务.流程.步骤 if s.步骤ID == 领取.步骤ID)
固定 = 任务.冻结输入
登记: tuple[工具定义, ...] = ()
if 冻结["documents"]:
登记 += (历史正文工具(上下文.数据库, 冻结),)
if isinstance(冻结.get("target_plan"), dict):
登记 += (细纲工具(上下文.数据库, 冻结, 上下文.规划引用解析),)
if isinstance(冻结.get("facts"), dict):
登记 += (事实工具(上下文.数据库, 冻结),)
def 记录(载荷: dict) -> None:
运行.追加事件(领取, 事件类型.工具读取, 载荷, 事件ID=str(uuid4()))
# 声明的工具与冻结范围实际安装的交集才可用:没有历史文稿时读取工具
# 合法缺席,不应让整个探索步骤失败;全部缺席仍视为流程配置错误。
已登记 = {定义.名称 for 定义 in 登记}
可用 = tuple(名 for 名 in 步骤.工具 if 名 in 已登记)
if 步骤.工具 and not 可用:
raise 模型协议错误("工具未登记、重复或所需工具加载失败")
return 只读工具集(
登记,
可用,
工具范围(
任务.任务ID,
冻结["work_id"],
tuple(冻结["source_ids"]),
冻结["as_of"],
固定["执行用途"],
固定["内容用途"],
),
记录,
)
__all__ = ["领取只读工具"]