- 步骤0: 新增中文镜像模板 scripts/make_zh_template.py 与 samples/概要设计书模板_中文.docx(7章锚点原样保留) - 步骤1: config.WriterConfig.output_language→Settings.writer;GenerationContext.output_language + to_vars.language_instruction(zh/ja/auto);writer_agent【语言约束】改引变量;context_builder/orchestrator/run_trial 透传 --output-language - 步骤A: 新建 src/genesis/writer/language.py(detect_script/resolve_expected_language/find_language_violations);WriterAgent.generate_chapter 按期望语言强制、违规重试、耗尽硬失败;max_retries 默认 1→2 - 步骤B: _format_impact 影响调查标签按 output_language 本地化(zh 新建/变更/删除/警告) - 步骤C: eval scorer 第 11 维度 language_consistency(不可验证=满分,不拉低总分);ChapterArtifact.expected_language;QAValidator.validate_doc 透传;QALoop.run 透传 output_language - 测试: test_zh_template/test_language_plumbing/test_writer_language/test_scorer_language/test_language_coverage,并更新 test_phase5_e2e - 全量 pytest 424 passed / 99.15%(覆盖率门槛 99% 达标)
94 lines
3.8 KiB
Python
94 lines
3.8 KiB
Python
"""步骤 1:语言参数贯通测试(config → GenerationContext → to_vars → context_builder → run_trial)。"""
|
||
from __future__ import annotations
|
||
|
||
from genesis.data_models import (
|
||
CellValue, ExcelTable, ParsedTemplate, Provenance, SheetType, StructuredSource,
|
||
)
|
||
from genesis.writer.context_builder import build_contexts
|
||
from genesis.writer.models import ChapterSpec, GenerationContext
|
||
|
||
|
||
def _src() -> StructuredSource:
|
||
return StructuredSource(
|
||
tables=[],
|
||
template=ParsedTemplate("t.docx", [__import__("genesis.data_models", fromlist=["ChapterMarker"]).ChapterMarker("heading", "1. はじめに", 1)], {}, {"used": []}),
|
||
rule_docs=[], image_analyses=[], existing_system=None, comments=[],
|
||
)
|
||
|
||
|
||
def test_generation_context_default_output_language_is_auto():
|
||
ctx = GenerationContext(
|
||
chapter_id="db_design", title="DB 設計",
|
||
template_marker=ChapterSpec(chapter_id="db_design", title="DB 設計"),
|
||
structured_source=None, write_rules=[], design_rules=[], template_styles=set(),
|
||
)
|
||
assert ctx.output_language == "auto"
|
||
|
||
|
||
def test_to_vars_language_instruction_explicit_zh():
|
||
ctx = GenerationContext(
|
||
chapter_id="db_design", title="DB 设計",
|
||
template_marker=ChapterSpec(chapter_id="db_design", title="DB 设計"),
|
||
structured_source=None, write_rules=[], design_rules=[], template_styles=set(),
|
||
output_language="zh",
|
||
)
|
||
v = ctx.to_vars()
|
||
assert "language_instruction" in v
|
||
assert "简体中文" in v["language_instruction"]
|
||
|
||
|
||
def test_to_vars_language_instruction_explicit_ja():
|
||
ctx = GenerationContext(
|
||
chapter_id="db_design", title="DB 設計",
|
||
template_marker=ChapterSpec(chapter_id="db_design", title="DB 設計"),
|
||
structured_source=None, write_rules=[], design_rules=[], template_styles=set(),
|
||
output_language="ja",
|
||
)
|
||
v = ctx.to_vars()
|
||
assert "日本語" in v["language_instruction"]
|
||
|
||
|
||
def test_to_vars_language_instruction_auto_follows_title():
|
||
ctx = GenerationContext(
|
||
chapter_id="db_design", title="DB 設計",
|
||
template_marker=ChapterSpec(chapter_id="db_design", title="DB 設計"),
|
||
structured_source=None, write_rules=[], design_rules=[], template_styles=set(),
|
||
output_language="auto",
|
||
)
|
||
v = ctx.to_vars()
|
||
assert "标题" in v["language_instruction"] and "一致" in v["language_instruction"]
|
||
|
||
|
||
def test_context_builder_passes_output_language():
|
||
src = _src()
|
||
ctxs = build_contexts(src, output_language="zh")
|
||
assert all(c.output_language == "zh" for c in ctxs)
|
||
# 回归:默认仍为 auto
|
||
ctxs2 = build_contexts(src)
|
||
assert all(c.output_language == "auto" for c in ctxs2)
|
||
|
||
|
||
def test_format_impact_zh_labels_localized():
|
||
"""步骤 B:output_language=zh 时影响调查标签本地化为中文,且不影响 ja 默认。"""
|
||
from genesis.data_models import (
|
||
ChangeAnalysis, ChangeElement, ChangeType, ImpactReport, ImpactWarning,
|
||
)
|
||
from genesis.writer.models import _format_impact
|
||
|
||
ca = ChangeAnalysis(
|
||
project_type="enhancement",
|
||
new_elements=[ChangeElement("F001", "機能", "止损风控", ChangeType.NEW)],
|
||
modified_elements=[ChangeElement("F002", "機能", "下单流程", ChangeType.MODIFIED)],
|
||
deleted_elements=[ChangeElement("F030", "機能", "旧功能", ChangeType.DELETED)],
|
||
unchanged_elements=[],
|
||
warnings=[ImpactWarning("F030", "缺少既存対応")],
|
||
)
|
||
report = ImpactReport(metadata={}, change_analysis=ca, summary={})
|
||
|
||
zh = _format_impact(report, None, "zh")
|
||
assert "[新建]" in zh and "[变更]" in zh and "[删除]" in zh and "[警告]" in zh
|
||
assert "受影响" in zh
|
||
# ja / auto 回落仍用日文标签
|
||
ja = _format_impact(report, None, "ja")
|
||
assert "[新規]" in ja and "[削除]" in ja
|