81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
if str(REPO_ROOT) not in sys.path:
|
|
sys.path.insert(0, str(REPO_ROOT))
|
|
|
|
from scripts.runtime.review import (
|
|
build_phase3_model_review_context,
|
|
build_phase3_model_critique,
|
|
phase3_model_review_system_prompt,
|
|
)
|
|
|
|
|
|
class FakeClient:
|
|
def __init__(self) -> None:
|
|
self.calls: list[dict[str, object]] = []
|
|
|
|
def chat_complete(self, **kwargs) -> str:
|
|
self.calls.append(kwargs)
|
|
return "# Phase 3 Opus 4.7 独立审校\n\n## 总体判定\n\n回炉 Phase2。\n"
|
|
|
|
|
|
def make_project(tmp_path: Path) -> Path:
|
|
project = tmp_path / "project"
|
|
(project / "phase1").mkdir(parents=True)
|
|
(project / "phase2/drafts").mkdir(parents=True)
|
|
(project / "phase2/compressed_findings").mkdir(parents=True)
|
|
(project / "manifest.json").write_text(
|
|
json.dumps({"topic": "白帆测试项目", "phase3": {}}, ensure_ascii=False),
|
|
encoding="utf-8",
|
|
)
|
|
(project / "phase1/framework.md").write_text("## 第1章 质量体系判断\n", encoding="utf-8")
|
|
(project / "phase2/drafts/ch01.md").write_text("## 质量体系判断\n\n正文。[src_001]\n", encoding="utf-8")
|
|
(project / "phase2/sources.jsonl").write_text('{"id":"src_001","title":"来源","url":"https://www.fda.gov/example"}\n', encoding="utf-8")
|
|
(project / "phase2/compressed_findings/ch01.json").write_text(
|
|
json.dumps(
|
|
{
|
|
"chapter_id": "ch01",
|
|
"chapter_title": "质量体系判断",
|
|
"packet_ids": ["ch01-a"],
|
|
"chapter_thesis": "质量体系需要补证据",
|
|
"key_findings": [],
|
|
"evidence_landings": [],
|
|
"counter_evidence": [],
|
|
"source_ids": ["src_001"],
|
|
"open_questions": [],
|
|
"writing_plan": [],
|
|
},
|
|
ensure_ascii=False,
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
return project
|
|
|
|
|
|
def test_phase3_model_context_contains_structured_inputs(tmp_path: Path) -> None:
|
|
project = make_project(tmp_path)
|
|
|
|
context = build_phase3_model_review_context(project)
|
|
|
|
assert "Deterministic Review Baseline" in context
|
|
assert "Compressed Findings" in context
|
|
assert "Chapter Drafts" in context
|
|
assert "src_001" in context
|
|
|
|
|
|
def test_phase3_model_review_calls_requested_model_and_writes_critique(tmp_path: Path) -> None:
|
|
project = make_project(tmp_path)
|
|
fake = FakeClient()
|
|
|
|
out = build_phase3_model_critique(project, client=fake, model="zenmux-anthropic/claude-opus-4-7")
|
|
|
|
assert out.exists()
|
|
assert fake.calls[0]["model"] == "zenmux-anthropic/claude-opus-4-7"
|
|
assert "独立总编审校" in fake.calls[0]["system"]
|
|
assert "FDA/NMPA/EMA/ICH/WHO" in phase3_model_review_system_prompt()
|