[项目边界]:完成全双工Agent入口和配置冻结,包含run-agent-live入口、配置校验和迁移文档

This commit is contained in:
mkbk
2026-06-18 21:40:23 +08:00
parent 696ed2c30e
commit 9fd8eaf7eb
8 changed files with 448 additions and 5 deletions
+41
View File
@@ -42,6 +42,7 @@ class CliAcceptanceTests(unittest.TestCase):
self.assertEqual(code, 0)
self.assertTrue(data["llm_api_key_present"])
self.assertEqual(data["llm_model"], "file-model")
self.assertEqual(data["assistant_mode"], "turn_based_voice_pet")
self.assertEqual(data["pipeline_mode"], "live_turn_based")
self.assertEqual(data["endpoint_mode"], "primary_speaker")
self.assertEqual(data["realtime_transcript_idle_timeout_ms"], 1500)
@@ -49,8 +50,48 @@ class CliAcceptanceTests(unittest.TestCase):
self.assertTrue(data["end_chime_enabled"])
self.assertEqual(data["end_chime_file"], "assets/sounds/codex-notification.wav")
self.assertEqual(data["end_chime_duration_ms"], 140)
self.assertEqual(data["audio_apm_provider"], "webrtc")
self.assertTrue(data["audio_aec_enabled"])
self.assertTrue(data["audio_ns_enabled"])
self.assertTrue(data["audio_agc_enabled"])
self.assertEqual(data["audio_frame_ms"], 20)
self.assertEqual(data["audio_ring_buffer_ms"], 3000)
self.assertTrue(data["interrupt_enabled"])
self.assertEqual(data["interrupt_target_latency_ms"], 200)
self.assertEqual(data["streaming_stt_provider"], "faster_whisper")
self.assertEqual(data["streaming_stt_product_candidate"], "sensevoice")
self.assertEqual(data["streaming_tts_provider"], "cosyvoice")
self.assertFalse(data["memory_enabled"])
self.assertEqual(data["memory_provider"], "faiss_sqlite")
self.assertFalse(data["tool_router_enabled"])
self.assertFalse(data["openinterpreter_enabled"])
self.assertFalse(data["browser_playwright_enabled"])
self.assertFalse(data["computer_control_enabled"])
self.assertNotIn("secret-value", str(data))
def test_help_lists_full_duplex_agent_entrypoint(self) -> None:
buffer = io.StringIO()
with redirect_stdout(buffer), self.assertRaises(SystemExit) as raised:
main(["--help"])
self.assertEqual(raised.exception.code, 0)
self.assertIn("run-agent-live", buffer.getvalue())
def test_run_agent_live_check_config_reports_reserved_entrypoint(self) -> None:
code, data = self.call("run-agent-live", "--check-config")
self.assertEqual(code, 0)
self.assertTrue(data["success"])
self.assertEqual(data["command"], "run-agent-live")
self.assertEqual(data["assistant_mode"], "full_duplex_agent")
self.assertFalse(data["full_duplex_runtime_ready"])
self.assertEqual(data["turn_based_entry"], "run-live")
def test_run_agent_live_without_runtime_returns_explicit_not_implemented(self) -> None:
code, data = self.call("run-agent-live")
self.assertEqual(code, 1)
self.assertFalse(data["success"])
self.assertEqual(data["code"], "FULL_DUPLEX_RUNTIME_NOT_IMPLEMENTED")
def test_security_check_command_has_no_leaks(self) -> None:
code, data = self.call("security-check")
self.assertEqual(code, 0)