test_delay_is_consumed_before_any_generation_then_retries_after_deadline (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_delay_is_consumed_before_any_generation_then_retries_after_deadline) ... ok test_error_and_late_success_never_bypass_manual_task (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_error_and_late_success_never_bypass_manual_task) ... ok test_explicit_retry_or_completed_task_can_run_normally (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_explicit_retry_or_completed_task_can_run_normally) ... ok test_foreign_draft_and_manual_handoff_also_never_regenerate (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_foreign_draft_and_manual_handoff_also_never_regenerate) ... ok test_manual_task_never_sends_cached_draft (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_manual_task_never_sends_cached_draft) ... ok test_pending_voice_yields_active_hold_and_keeps_precise_status (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_pending_voice_yields_active_hold_and_keeps_precise_status) ... ok test_voice_wait_does_not_prevent_resuming_another_queued_customer (test_voice_visual_scheduling.VisualVoiceSchedulingTests.test_voice_wait_does_not_prevent_resuming_another_queued_customer) ... ok test_animated_sticker_frames_keep_one_layout_signature (test_reply_safety.MediaReplyTest.test_animated_sticker_frames_keep_one_layout_signature) ... ok test_confirmed_unread_caption_without_placeholder_still_uses_vision (test_reply_safety.MediaReplyTest.test_confirmed_unread_caption_without_placeholder_still_uses_vision) ... [AI] 本次提取的新内容: 客户甲 10:00:00 帮我看看这个 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [编排] 未配置模型网关,本次使用本机 ai_config 里的单模型设置。后台的「角色编排」不会生效。 [AI] 回复内容: 我看到了,您想重点确认哪一处? ok test_confirmed_unread_empty_clipboard_uses_type_agnostic_safe_reply (test_reply_safety.MediaReplyTest.test_confirmed_unread_empty_clipboard_uses_type_agnostic_safe_reply) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 已确认未读但媒体类型未知,使用通用安全追问 [AI] 回复内容: 收到消息,请把重点打字说一下 ok test_dify_vision_query_contains_current_text_and_archive_history (test_reply_safety.MediaReplyTest.test_dify_vision_query_contains_current_text_and_archive_history) ... ok test_empty_clipboard_surface_change_enters_media_fallback (test_reply_safety.MediaReplyTest.test_empty_clipboard_surface_change_enters_media_fallback) ... [会话守护] 当前聊天页出现新内容,检查是否为客户未回复消息... [会话守护] 页面有变化但剪贴板为空,将按非文字消息检查。 [会话守护] 发现客户新消息,先合并连续消息再回复。 ok test_explicit_customer_block_proves_flat_avatar_is_real_chat (test_reply_safety.MediaReplyTest.test_explicit_customer_block_proves_flat_avatar_is_real_chat) ... [AI] 本次提取的新内容: 客户甲 7/29 10:00:00 请问今天下午能挂号吗 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复 [AI] 回复内容: 可以,我先帮您登记。 ok test_explicit_empty_media_set_does_not_rescan_old_history (test_reply_safety.MediaReplyTest.test_explicit_empty_media_set_does_not_rescan_old_history) ... ok test_explicit_image_uses_safe_reply_when_chat_capture_fails (test_reply_safety.MediaReplyTest.test_explicit_image_uses_safe_reply_when_chat_capture_fails) ... [AI] 本次提取的新内容: 客户甲 10:00:00 [图片] [AI] [!] 聊天消息区域截图失败: capture failed [AI] 视觉不可用,使用对应媒体类型的安全追问 [AI] 回复内容: 图片我收到了,这边暂时没看清具体内容,您想让我重点看哪一处? ok test_first_record_explicit_customer_text_is_still_visually_confirmed (test_reply_safety.MediaReplyTest.test_first_record_explicit_customer_text_is_still_visually_confirmed) ... [AI] 本次提取的新内容: 客户甲 7/29 10:00:00 请问今天下午能挂号吗 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 回复内容: 可以的,我先帮您登记需求。 ok test_first_record_visual_failure_never_answers_visible_old_text (test_reply_safety.MediaReplyTest.test_first_record_visual_failure_never_answers_visible_old_text) ... ok test_image_and_text_batch_automatically_uses_mixed_vision (test_reply_safety.MediaReplyTest.test_image_and_text_batch_automatically_uses_mixed_vision) ... [AI] 本次提取的新内容: 客户甲 10:00:00 [图片],这个处方天数改成15天吧 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 回复内容: 我看到了,先核对后再告诉您。 ok test_legacy_inflight_state_does_not_invent_an_empty_send_anchor (test_reply_safety.MediaReplyTest.test_legacy_inflight_state_does_not_invent_an_empty_send_anchor) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_media_markers_are_detected_but_unicode_emoji_stays_text (test_reply_safety.MediaReplyTest.test_media_markers_are_detected_but_unicode_emoji_stays_text) ... ok test_message_arriving_during_final_extraction_skips_model (test_reply_safety.MediaReplyTest.test_message_arriving_during_final_extraction_skips_model) ... [回复保护] 最终提取期间又出现新消息,重新开始消息合并等待。 ok test_message_arriving_during_model_call_cancels_stale_reply (test_reply_safety.MediaReplyTest.test_message_arriving_during_model_call_cancels_stale_reply) ... [AI] 本次提取的新内容: 客户甲 10:00:00 [图片],请看一下 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [回复保护] 模型处理期间又出现新消息,已取消旧回复并重新合并。 ok test_mixed_vision_without_contains_voice_is_rejected (test_reply_safety.MediaReplyTest.test_mixed_vision_without_contains_voice_is_rejected) ... ok test_nested_diagnostic_object_cannot_override_protocol_result (test_reply_safety.MediaReplyTest.test_nested_diagnostic_object_cannot_override_protocol_result) ... ok test_non_json_vision_text_is_never_treated_as_new_message_proof (test_reply_safety.MediaReplyTest.test_non_json_vision_text_is_never_treated_as_new_message_proof) ... ok test_openai_vision_receives_current_text_history_and_chat_screenshot (test_reply_safety.MediaReplyTest.test_openai_vision_receives_current_text_history_and_chat_screenshot) ... ok test_pending_text_is_restored_after_model_or_send_failure (test_reply_safety.MediaReplyTest.test_pending_text_is_restored_after_model_or_send_failure) ... [AI] 已恢复上次未成功发送的待回复内容 [AI] 本次提取的新内容: 客户甲 10:00:00 上一轮尚未成功发送的问题 [AI] 使用文本模式分析聊天记录... [AI] 回复内容: 这次继续回复。 ok test_pending_unread_task_survives_process_restart (test_reply_safety.MediaReplyTest.test_pending_unread_task_survives_process_restart) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_previous_16_byte_pending_key_is_loaded_instead_of_dropped (test_reply_safety.MediaReplyTest.test_previous_16_byte_pending_key_is_loaded_instead_of_dropped) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_pure_voice_never_asks_a_model_to_guess_audio (test_reply_safety.MediaReplyTest.test_pure_voice_never_asks_a_model_to_guess_audio) ... [AI] 本次提取的新内容: 客户甲 10:00:00 [语音] ok test_repeated_identical_media_blocks_remain_a_nonempty_delta (test_reply_safety.MediaReplyTest.test_repeated_identical_media_blocks_remain_a_nonempty_delta) ... ok test_screenshot_only_image_type_is_preserved_in_archive (test_reply_safety.MediaReplyTest.test_screenshot_only_image_type_is_preserved_in_archive) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 回复内容: 图片我看到了,您想重点确认哪一处? ok test_screenshot_only_voice_type_is_preserved_for_safe_archive (test_reply_safety.MediaReplyTest.test_screenshot_only_voice_type_is_preserved_for_safe_archive) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 回复内容: 这条语音我这边暂时没法准确听清,麻烦您把重点打成文字发我一下。 ok test_second_visual_no_incoming_clears_unconfirmed_unreliable_candidate (test_reply_safety.MediaReplyTest.test_second_visual_no_incoming_clears_unconfirmed_unreliable_candidate) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI 页面确认] 纯色头像候选不是客户消息页,已跳过且不会发送。 ok test_second_visual_no_incoming_keeps_confirmed_unread_and_uses_safe_media_reply (test_reply_safety.MediaReplyTest.test_second_visual_no_incoming_keeps_confirmed_unread_and_uses_safe_media_reply) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复 [AI] 回复内容: 收到消息,请把重点打字说一下。 ok test_second_visual_no_incoming_keeps_reliable_text_pending_and_uses_safe_text (test_reply_safety.MediaReplyTest.test_second_visual_no_incoming_keeps_reliable_text_pending_and_uses_safe_text) ... [AI] 本次提取的新内容: 客户甲 10:00:00 帮我看看这个 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复 [AI] 回复内容: 您想让我重点看哪一处? ok test_selected_caption_falls_back_to_safe_text_when_vision_fails (test_reply_safety.MediaReplyTest.test_selected_caption_falls_back_to_safe_text_when_vision_fails) ... [AI] 本次提取的新内容: 客户甲 10:00:00 帮我看看这个 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 视觉不可用,降级为同批可见文字回复 [AI] 回复内容: 您想让我重点看哪一处? ok test_selected_row_detection_flicker_reuses_same_session_cache (test_reply_safety.MediaReplyTest.test_selected_row_detection_flicker_reuses_same_session_cache) ... ok test_selected_row_preview_detects_same_layout_media_replacement (test_reply_safety.MediaReplyTest.test_selected_row_preview_detects_same_layout_media_replacement) ... ok test_selected_row_preview_is_stable_when_row_moves (test_reply_safety.MediaReplyTest.test_selected_row_preview_is_stable_when_row_moves) ... ok test_snapshot_is_committed_only_after_successful_send (test_reply_safety.MediaReplyTest.test_snapshot_is_committed_only_after_successful_send) ... [档案] 增量提取到 2 行新消息(历史上下文由会话档案提供) ok test_unchanged_clipboard_text_is_not_replied_to_again (test_reply_safety.MediaReplyTest.test_unchanged_clipboard_text_is_not_replied_to_again) ... [档案] 剪贴板没有新增文字,将检查是否为非文字消息 ok test_unconfirmed_empty_clipboard_never_sends_generic_media_reply (test_reply_safety.MediaReplyTest.test_unconfirmed_empty_clipboard_never_sends_generic_media_reply) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 无法确认本轮非文字内容,保留任务稍后重试 ok test_unfinished_merge_deadline_survives_process_restart (test_reply_safety.MediaReplyTest.test_unfinished_merge_deadline_survives_process_restart) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_unknown_flat_avatar_vision_failure_never_uses_generic_fallback (test_reply_safety.MediaReplyTest.test_unknown_flat_avatar_vision_failure_never_uses_generic_fallback) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI 页面确认] 尚未确认这是客户消息页,保留任务且不发送兜底话术。 ok test_unknown_visual_result_cannot_guess_untranscribed_voice (test_reply_safety.MediaReplyTest.test_unknown_visual_result_cannot_guess_untranscribed_voice) ... ok test_vision_parser_ignores_analysis_json_before_protocol_result (test_reply_safety.MediaReplyTest.test_vision_parser_ignores_analysis_json_before_protocol_result) ... ok test_vision_parser_uses_last_protocol_object (test_reply_safety.MediaReplyTest.test_vision_parser_uses_last_protocol_object) ... ok test_vision_protocol_conflicts_fail_closed (test_reply_safety.MediaReplyTest.test_vision_protocol_conflicts_fail_closed) ... ok test_visual_failure_does_not_reply_to_stale_clipboard_text (test_reply_safety.MediaReplyTest.test_visual_failure_does_not_reply_to_stale_clipboard_text) ... [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 视觉失败且剪贴板只有旧文字,保留任务稍后重试 ok test_visual_no_incoming_conflict_never_sends_caption_without_media_warning (test_reply_safety.MediaReplyTest.test_visual_no_incoming_conflict_never_sends_caption_without_media_warning) ... [AI] 本次提取的新内容: 客户甲 10:00:00 帮我看看这个 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 视觉结果与已确认未读冲突,改用可验证内容安全回复 [AI] 回复内容: 您想让我重点看哪一处? ok test_voice_control_labels_are_not_treated_as_transcription (test_reply_safety.MediaReplyTest.test_voice_control_labels_are_not_treated_as_transcription) ... ok test_voice_duration_is_not_mistaken_for_transcription (test_reply_safety.MediaReplyTest.test_voice_duration_is_not_mistaken_for_transcription) ... ok test_voice_plus_visible_text_answers_text_without_guessing_audio (test_reply_safety.MediaReplyTest.test_voice_plus_visible_text_answers_text_without_guessing_audio) ... [AI] 本次提取的新内容: 客户甲 10:00:00 [语音] 00:05 明天下午能挂号吗 [AI] 媒体/视觉模式,已截取完整聊天消息区域 (8 bytes) [AI] 回复内容: 明天下午可以,我先帮您登记。 ok test_voice_safety_result_preserves_other_mixed_media_types (test_reply_safety.MediaReplyTest.test_voice_safety_result_preserves_other_mixed_media_types) ... ok test_explicit_cancel_closes_shared_episode_without_native_io (test_visual_review_assistant.SharedVisualAssistantTests.test_explicit_cancel_closes_shared_episode_without_native_io) ... ok test_explicit_handoff_closes_shared_episode_without_approval (test_visual_review_assistant.SharedVisualAssistantTests.test_explicit_handoff_closes_shared_episode_without_approval) ... ok test_failed_queue_cancel_keeps_shared_episode (test_visual_review_assistant.SharedVisualAssistantTests.test_failed_queue_cancel_keeps_shared_episode) ... ok test_failed_reminder_cancel_is_reported_without_claiming_success (test_visual_review_assistant.SharedVisualAssistantTests.test_failed_reminder_cancel_is_reported_without_claiming_success) ... ok test_real_assistant_conversation_cannot_complete_customer_task (test_visual_review_assistant.SharedVisualAssistantTests.test_real_assistant_conversation_cannot_complete_customer_task) ... ok test_real_failed_send_and_local_persistence_failure_keep_task_until_durable (test_visual_review_assistant.SharedVisualAssistantTests.test_real_failed_send_and_local_persistence_failure_keep_task_until_durable) ... ok test_real_manual_task_without_draft_completes_after_human_reply (test_visual_review_assistant.SharedVisualAssistantTests.test_real_manual_task_without_draft_completes_after_human_reply) ... ok test_real_shared_automated_attempt_is_not_human_reply (test_visual_review_assistant.SharedVisualAssistantTests.test_real_shared_automated_attempt_is_not_human_reply) ... ok test_real_shared_completion_retries_original_episode_after_disk_failure (test_visual_review_assistant.SharedVisualAssistantTests.test_real_shared_completion_retries_original_episode_after_disk_failure) ... ok test_real_shared_human_completion_then_new_risk (test_visual_review_assistant.SharedVisualAssistantTests.test_real_shared_human_completion_then_new_risk) ... ok test_real_shared_local_approval_closes_reminder_without_resuming (test_visual_review_assistant.SharedVisualAssistantTests.test_real_shared_local_approval_closes_reminder_without_resuming) ... ok test_real_terminal_automated_reply_never_completes (test_visual_review_assistant.SharedVisualAssistantTests.test_real_terminal_automated_reply_never_completes) ... ok test_real_terminal_send_requires_distinct_human_and_keeps_original_evidence (test_visual_review_assistant.SharedVisualAssistantTests.test_real_terminal_send_requires_distinct_human_and_keeps_original_evidence) ... ok test_stopped_client_cancel_closes_reminder_in_queue_data_directory (test_visual_review_assistant.SharedVisualAssistantTests.test_stopped_client_cancel_closes_reminder_in_queue_data_directory) ... ok test_active_sending_cancel_or_unrecognized_send_state_cannot_complete (test_visual_review_assistant.VisualAssistantTests.test_active_sending_cancel_or_unrecognized_send_state_cannot_complete) ... ok test_all_ui_attention_states_register_and_notify (test_visual_review_assistant.VisualAssistantTests.test_all_ui_attention_states_register_and_notify) ... ok test_assistant_contact_is_filtered_by_exact_conversation (test_visual_review_assistant.VisualAssistantTests.test_assistant_contact_is_filtered_by_exact_conversation) ... ok test_completed_review_does_not_erase_a_concurrent_replacement (test_visual_review_assistant.VisualAssistantTests.test_completed_review_does_not_erase_a_concurrent_replacement) ... ok test_disabled_config_never_imports_native_or_starts_coordinator (test_visual_review_assistant.VisualAssistantTests.test_disabled_config_never_imports_native_or_starts_coordinator) ... ok test_discarded_draft_marker_is_consumed_once (test_visual_review_assistant.VisualAssistantTests.test_discarded_draft_marker_is_consumed_once) ... ok test_draft_marker_retirement_failure_retains_protection (test_visual_review_assistant.VisualAssistantTests.test_draft_marker_retirement_failure_retains_protection) ... ok test_failed_review_id_save_rolls_back_and_does_not_enqueue (test_visual_review_assistant.VisualAssistantTests.test_failed_review_id_save_rolls_back_and_does_not_enqueue) ... ok test_late_mobile_sync_does_not_hide_new_customer_message (test_visual_review_assistant.VisualAssistantTests.test_late_mobile_sync_does_not_hide_new_customer_message) ... ok test_missing_database_and_cross_account_context_cannot_complete (test_visual_review_assistant.VisualAssistantTests.test_missing_database_and_cross_account_context_cannot_complete) ... ok test_new_customer_message_after_human_reply_starts_fresh_task (test_visual_review_assistant.VisualAssistantTests.test_new_customer_message_after_human_reply_starts_fresh_task) ... ok test_new_database_event_arriving_during_read_is_retained (test_visual_review_assistant.VisualAssistantTests.test_new_database_event_arriving_during_read_is_retained) ... ok test_no_evidence_preserves_review_and_persists_review_id (test_visual_review_assistant.VisualAssistantTests.test_no_evidence_preserves_review_and_persists_review_id) ... ok test_notification_registration_requires_durable_state (test_visual_review_assistant.VisualAssistantTests.test_notification_registration_requires_durable_state) ... ok test_pending_review_is_not_bypassed_by_new_safe_message (test_visual_review_assistant.VisualAssistantTests.test_pending_review_is_not_bypassed_by_new_safe_message) ... ok test_persistence_failure_restores_review_and_old_exchange (test_visual_review_assistant.VisualAssistantTests.test_persistence_failure_restores_review_and_old_exchange) ... ok test_proven_human_reply_discards_old_task_without_approving_or_sending (test_visual_review_assistant.VisualAssistantTests.test_proven_human_reply_discards_old_task_without_approving_or_sending) ... ok test_resumed_skips_blanket_only_and_new_risk_still_requires_review (test_visual_review_assistant.VisualAssistantTests.test_resumed_skips_blanket_only_and_new_risk_still_requires_review) ... ok test_retired_draft_and_review_binding_survive_restart (test_visual_review_assistant.VisualAssistantTests.test_retired_draft_and_review_binding_survive_restart) ... [待回复恢复] 已从磁盘恢复 1 个未完成任务。 [待回复恢复] 已从磁盘恢复 1 个未完成任务。 ok test_retired_draft_only_matches_exact_original_and_verified_identity (test_visual_review_assistant.VisualAssistantTests.test_retired_draft_only_matches_exact_original_and_verified_identity) ... ok test_send_attempt_failure_prevents_dispatch_and_local_completion_keeps_approval (test_visual_review_assistant.VisualAssistantTests.test_send_attempt_failure_prevents_dispatch_and_local_completion_keeps_approval) ... [助理审核] 自动发送留痕失败(OSError),暂缓本次发送;保留人工审核,不猜测人工回复。 ok test_stop_suppresses_read_and_notification (test_visual_review_assistant.VisualAssistantTests.test_stop_suppresses_read_and_notification) ... ok test_terminal_states_require_explicit_human_completion_evidence (test_visual_review_assistant.VisualAssistantTests.test_terminal_states_require_explicit_human_completion_evidence) ... ok test_wrong_account_or_conversation_or_review_evidence_cannot_clear_task (test_visual_review_assistant.VisualAssistantTests.test_wrong_account_or_conversation_or_review_evidence_cannot_clear_task) ... ok ---------------------------------------------------------------------- Ran 93 tests in 2.971s OK