"""Deep Agents 固定提交的教学扩展，本轮未运行。

使用独立源码环境，见 SOURCES.md。运行会调用真实模型，有费用。
默认 StateBackend 不是宿主目录；提交结果保存在当前进程内存中。
"""
import json
import os
from deepagents import create_deep_agent
from langchain.agents.middleware import TodoListMiddleware
from langchain_core.tools import tool
from contracts import ORDER, POLICY
from verifier import verify


def main():
    source = {"order": ORDER, "policy": POLICY}
    accepted = {}

    @tool
    def read_teaching_source() -> dict:
        """读取虚构订单 A1042 和政策 P7-v2；不访问真实业务系统。"""
        return source

    @tool
    def submit_report(report: dict) -> dict:
        """核验候选报告，只有通过才记录本进程的提交结果。"""
        checked = verify(report, source)
        if checked["passed"]:
            # 保存经过校验的 JSON 副本，避免外部引用随后修改同一对象。
            accepted["report"] = json.loads(json.dumps(report))
        return checked

    # 显式选择当前账户可访问的 provider:model；认证由对应模型集成读取。
    # 不使用弃用的隐式默认模型，也不假设每个 Profile 都自带 TODO 工具。
    agent = create_deep_agent(
        model=os.environ["DEEPAGENTS_MODEL"],
        tools=[read_teaching_source, submit_report],
        middleware=[TodoListMiddleware()],
        system_prompt=(
            "只处理教学报告。先读取来源，报告字段为 order_id, status, "
            "days_since_delivery, quality_verified, policy_id, freight_decision。"
            "未核验时 freight_decision 为 pending_verification；确认质量问题时为 merchant。"
            "调用 submit_report 并通过才算完成。"
        ),
    )
    # 递归上限限制图推进，不等于精确费用、工具次数或硬墙钟时间预算。
    agent.invoke({"messages": [{"role": "user", "content": "生成 A1042 售后报告。"}]},
                 config={"recursion_limit": 30})
    if "report" not in accepted:
        raise RuntimeError("没有通过独立提交校验，不能根据最终文本报完成")
    print(json.dumps(accepted["report"], ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()
