from __future__ import annotations from agent import get_preset from script_build_host.agents.presets import register_script_presets from script_build_host.agents.prompts import ( COMPARISON_WORKER_PROMPT, COMPOSE_WORKER_PROMPT, DECODE_RETRIEVAL_WORKER_PROMPT, DIRECTION_WORKER_PROMPT, ELEMENT_SET_WORKER_PROMPT, EXTERNAL_RETRIEVAL_WORKER_PROMPT, KNOWLEDGE_RETRIEVAL_WORKER_PROMPT, PARAGRAPH_WORKER_PROMPT, PATTERN_RETRIEVAL_WORKER_PROMPT, PLANNER_PROMPT, ROOT_VALIDATOR_PROMPT, SCRIPT_CANDIDATE_VALIDATOR_PROMPT, STRUCTURE_WORKER_PROMPT, script_build_prompt_manifest, ) def test_retrieval_roles_freeze_distinct_source_specific_prompts() -> None: retrieval_presets = { "script_pattern_retrieval_worker": ( "pattern_retrieval_worker.md", PATTERN_RETRIEVAL_WORKER_PROMPT, "query_pattern_qa", ), "script_decode_retrieval_worker": ( "decode_retrieval_worker.md", DECODE_RETRIEVAL_WORKER_PROMPT, "search_script_decode_case", ), "script_external_retrieval_worker": ( "external_retrieval_worker.md", EXTERNAL_RETRIEVAL_WORKER_PROMPT, "external_search_case", ), "script_knowledge_retrieval_worker": ( "knowledge_retrieval_worker.md", KNOWLEDGE_RETRIEVAL_WORKER_PROMPT, "search_knowledge", ), } manifest = {str(item["preset"]): item for item in script_build_prompt_manifest()} assert len({content for _, content, _ in retrieval_presets.values()}) == 4 for preset, (filename, content, tool_name) in retrieval_presets.items(): assert manifest[preset]["source_id"] == filename assert manifest[preset]["content"] == content assert tool_name in content assert "且仅再调用一次" in content def test_registered_retrieval_presets_use_their_own_prompt() -> None: register_script_presets() expected = { "script_pattern_retrieval_worker": PATTERN_RETRIEVAL_WORKER_PROMPT, "script_decode_retrieval_worker": DECODE_RETRIEVAL_WORKER_PROMPT, "script_external_retrieval_worker": EXTERNAL_RETRIEVAL_WORKER_PROMPT, "script_knowledge_retrieval_worker": KNOWLEDGE_RETRIEVAL_WORKER_PROMPT, } for preset, prompt in expected.items(): assert get_preset(preset).system_prompt == prompt def test_creative_prompts_preserve_quality_and_convergence_contracts() -> None: assert "前期可探索不同的真实路径" in PLANNER_PROMPT assert "一个最主要的缺陷簇" in PLANNER_PROMPT assert "受众可感知结果" in DIRECTION_WORKER_PROMPT assert "不预写 Phase 2" in DIRECTION_WORKER_PROMPT assert "段落方案" in DIRECTION_WORKER_PROMPT assert "不是完成的正文" in STRUCTURE_WORKER_PROMPT assert "不可随意互换" in STRUCTURE_WORKER_PROMPT assert "受众最终能直接看到" in PARAGRAPH_WORKER_PROMPT assert "不是提纲、创作说明" in PARAGRAPH_WORKER_PROMPT assert "只是抽象评价" in ELEMENT_SET_WORKER_PROMPT assert "先按完全相同的 criteria 独立评价" in COMPARISON_WORKER_PROMPT assert "不在 Compose 阶段补写或润色" in COMPOSE_WORKER_PROMPT def test_validator_prompts_require_audience_visible_semantic_evidence() -> None: dimensions = ( "D1 Goal 实现", "D2 具体可执行", "D3 结构叙事", "D4 元素一致", "D5 主题与 persona", "D6 信息与事实", ) for dimension in dimensions: assert dimension in SCRIPT_CANDIDATE_VALIDATOR_PROMPT assert "标签、自述和 Artifact URI 本身都不能证明内容质量" in ( SCRIPT_CANDIDATE_VALIDATOR_PROMPT ) assert "真实受众的阅读顺序" in ROOT_VALIDATOR_PROMPT assert "空 evidence、空正文、零独立 Element 或零 Link" in ROOT_VALIDATOR_PROMPT