Files
lhl d01e1b720f feat(writer): 输出语言一致性保障 + 用户可选输出语言
- 步骤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% 达标)
2026-08-25 23:30:24 +08:00

94 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""步骤 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():
"""步骤 Boutput_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