diff --git a/app/services/documentary/frame_analysis_service.py b/app/services/documentary/frame_analysis_service.py index 9cefda9..2813e9b 100644 --- a/app/services/documentary/frame_analysis_service.py +++ b/app/services/documentary/frame_analysis_service.py @@ -135,7 +135,13 @@ JSON 必须包含以下键: } ) - summary = payload["overall_activity_summary"] + raw_summary = payload.get("overall_activity_summary", "") + if isinstance(raw_summary, str): + summary = raw_summary + elif raw_summary is None: + summary = "" + else: + summary = str(raw_summary) return FrameBatchResult( batch_index=batch_index, @@ -160,10 +166,4 @@ JSON 必须包含以下键: f"{len(payload['frame_observations'])} < {expected_frame_count}" ) - if "overall_activity_summary" not in payload: - return "Batch response must include overall_activity_summary" - - if not isinstance(payload["overall_activity_summary"], str): - return "Batch response overall_activity_summary must be a string" - return "" diff --git a/tests/test_documentary_frame_analysis_service.py b/tests/test_documentary_frame_analysis_service.py index edf585c..a444068 100644 --- a/tests/test_documentary_frame_analysis_service.py +++ b/tests/test_documentary_frame_analysis_service.py @@ -162,6 +162,31 @@ class DocumentaryFrameAnalysisServiceTests(unittest.TestCase): self.assertEqual("人物从房间走到街道", batch.overall_activity_summary) self.assertEqual("", batch.fallback_summary) + def test_parse_batch_preserves_frames_when_summary_is_missing(self): + service = DocumentaryFrameAnalysisService() + raw_response = """ +{ + "frame_observations": [ + {"observation": "第一帧画面"}, + {"observation": "第二帧画面"} + ] +} +""".strip() + + batch = service._parse_batch_response( + batch_index=2, + raw_response=raw_response, + frame_paths=[ + "/tmp/keyframe_000000_000000000.jpg", + "/tmp/keyframe_000075_000003000.jpg", + ], + time_range="00:00:00,000-00:00:06,000", + ) + + self.assertEqual("success", batch.status) + self.assertEqual(2, len(batch.frame_observations)) + self.assertEqual("", batch.overall_activity_summary) + def test_cache_key_changes_when_interval_changes(self): service = DocumentaryFrameAnalysisService()