"""T6 创作工具箱 · 7 个文本生成器的 spec 契约测试。 契约测试——校验每个 spec 的 name/tier/reads/writes/output_schema/scope/input_schema, 对齐不变量 #2(只声明 tier)/ #3(writes 经验收才生效)。不联网、无 DB。 """ from __future__ import annotations import pytest from ww_agents import ( AgentSpec, BlurbResult, DetailedOutlineResult, GlossaryResult, GoldenFingerResult, NameListResult, OpeningResult, TitleListResult, blurb_spec, book_title_spec, fine_outline_spec, glossary_spec, golden_finger_spec, name_spec, opening_spec, ) # (spec, name, tier, reads, writes, output_schema) _TOOLBOX_SPECS = [ (book_title_spec, "book-title", "light", ["projects"], [], TitleListResult), (blurb_spec, "blurb", "analyst", ["projects"], [], BlurbResult), (name_spec, "name", "light", ["projects", "world_entities", "characters"], [], NameListResult), ( golden_finger_spec, "golden-finger", "writer", ["projects", "world_entities"], ["world_entities"], GoldenFingerResult, ), ( glossary_spec, "glossary", "analyst", ["projects", "world_entities"], ["world_entities"], GlossaryResult, ), (opening_spec, "opening", "writer", ["projects", "outline"], [], OpeningResult), ( fine_outline_spec, "fine-outline", "analyst", ["projects", "outline"], ["outline"], DetailedOutlineResult, ), ] @pytest.mark.parametrize( ("spec", "name", "tier", "reads", "writes", "output_schema"), _TOOLBOX_SPECS, ) def test_toolbox_spec_declares_expected_contract( spec: AgentSpec, name: str, tier: str, reads: list[str], writes: list[str], output_schema: type, ) -> None: assert spec.name == name assert spec.tier == tier assert spec.reads == reads assert spec.writes == writes assert spec.output_schema is output_schema assert spec.scope == "builtin" assert spec.input_schema is None # 注入材料为序列化文本,非结构化入参 @pytest.mark.parametrize("spec", [row[0] for row in _TOOLBOX_SPECS]) def test_toolbox_spec_has_nonempty_system_prompt(spec: AgentSpec) -> None: assert spec.system_prompt.strip()