diff --git a/src/video_transcript_api/api/services/llm_ops.py b/src/video_transcript_api/api/services/llm_ops.py index c2283e8b..b5d4ad9e 100644 --- a/src/video_transcript_api/api/services/llm_ops.py +++ b/src/video_transcript_api/api/services/llm_ops.py @@ -1178,6 +1178,9 @@ def _build_result_dict(coordinator_result: dict) -> dict: result_dict["structured_data"] = coordinator_result["structured_data"] if "artifact_sources" in coordinator_result: result_dict["artifact_sources"] = coordinator_result["artifact_sources"] + if "share_card" in coordinator_result: + result_dict["share_card"] = coordinator_result["share_card"] + result_dict["share_card_error"] = coordinator_result.get("share_card_error") return result_dict diff --git a/tests/unit/test_share_card_pipeline_wiring.py b/tests/unit/test_share_card_pipeline_wiring.py index ee037d69..99ad4b84 100644 --- a/tests/unit/test_share_card_pipeline_wiring.py +++ b/tests/unit/test_share_card_pipeline_wiring.py @@ -44,6 +44,23 @@ def _patch_cm(monkeypatch, tmp_path: Path, *, snapshot=None): return mock_cm +def _coordinator_result(**overrides): + """Coordinator return shape for _build_result_dict (not a result_dict).""" + d = { + "calibrated_text": "calibrated body", + "summary_text": "summary body", + "stats": { + "calibration_status": "full", + "summary_status": SummaryStatus.GENERATED, + }, + "models_used": {}, + "share_card": dict(VALID_CARD), + "share_card_error": None, + } + d.update(overrides) + return d + + def _base_result(**overrides): d = { "校对文本": "calibrated body", @@ -332,3 +349,34 @@ def test_not_requested_preserves_card(self, monkeypatch, tmp_path): (tmp_path / "llm_share_card.json").read_bytes().decode("utf-8") ) assert card["headline"] == "untouched" + + +class TestShareCardBuildResultDictPassthrough: + """Coordinator shape -> _build_result_dict -> _save_llm_results.""" + + def test_build_result_dict_copies_share_card_and_error(self): + coordinator = _coordinator_result( + share_card=dict(VALID_CARD), + share_card_error="RuntimeError: boom", + ) + result = llm_ops._build_result_dict(coordinator) + assert result.get("share_card") == VALID_CARD + assert result.get("share_card_error") == "RuntimeError: boom" + + omitted = dict(coordinator) + omitted.pop("share_card") + omitted.pop("share_card_error") + without = llm_ops._build_result_dict(omitted) + assert "share_card" not in without + assert "share_card_error" not in without + + def test_build_then_save_writes_share_card_file(self, monkeypatch, tmp_path): + coordinator = _coordinator_result(share_card=dict(VALID_CARD)) + result_dict = llm_ops._build_result_dict(coordinator) + _run_save(monkeypatch, tmp_path, result_dict) + + card_file = tmp_path / "llm_share_card.json" + assert card_file.exists() + card = json.loads(card_file.read_bytes().decode("utf-8")) + assert card["headline"] == VALID_CARD["headline"] + assert card["points"] == VALID_CARD["points"]