Files
liqiang b119135836
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

88 lines
3.1 KiB
Python

from pathlib import Path
import webrtc_app
from fastapi.testclient import TestClient
def direct_payload():
return {
"mode": "direct",
"callee_name": "Jane",
"goal": "Confirm a time and code",
"context": "Tuesday afternoon",
"instructions": "Ask for a time and confirmation code, then save both.",
}
def test_direct_record_starts_fail_closed_with_audio_provenance_slots():
webrtc_app.CALLS.clear()
client = TestClient(webrtc_app.app)
created = client.post("/api/calls", json=direct_payload())
assert created.status_code == 200
call_id = created.json()["call_id"]
record = client.get(f"/api/calls/{call_id}").json()
assert record["acceptance"]["passed"] is False
assert record["models"]["llm_receipts"] == []
assert record["models"]["asr_receipts"] == []
assert record["models"]["tts_receipts"] == []
assert record["transport"]["pstn_used"] is False
assert record["transport"]["e164_required"] is False
def test_session_endpoint_rejects_non_sdp_without_creating_a_peer():
webrtc_app.CALLS.clear()
client = TestClient(webrtc_app.app)
call_id = client.post("/api/calls", json=direct_payload()).json()["call_id"]
response = client.post(
f"/api/calls/{call_id}/session",
content="not sdp",
headers={"Content-Type": "text/plain"},
)
assert response.status_code == 415
assert call_id not in webrtc_app.PEERS
def test_react_rejects_an_empty_task_before_provider_call():
client = TestClient(webrtc_app.app)
response = client.post("/api/calls", json={"mode": "react", "task": ""})
assert response.status_code == 422
def test_browser_code_has_no_semantic_text_or_browser_speech_bypass():
script = (Path(__file__).parent / "static" / "app.js").read_text()
assert "getUserMedia" in script
assert "client.audio.commit" in script
assert "agent.caption" in script
assert "user.message" not in script
assert "speechSynthesis" not in script
assert "SpeechRecognition" not in script
def test_acceptance_gate_names_are_exact_and_fail_closed():
client = TestClient(webrtc_app.app)
call_id = client.post("/api/calls", json=direct_payload()).json()["call_id"]
checks = client.get(f"/api/calls/{call_id}").json()["acceptance"]["checks"]
assert set(checks) == {
"sdp_offer_answer_negotiated",
"ice_connected",
"data_channel_open",
"browser_microphone_track",
"server_downlink_audio_track",
"outbound_audio_rtp",
"inbound_audio_rtp",
"server_buffered_microphone_rtp",
"real_asr_consumed_microphone_audio",
"external_react_planner_or_fixed_direct_control",
"real_external_post_asr_dialogue",
"real_tts_assets_synthesized",
"tts_audio_transmitted_on_downlink",
"media_is_canonical_transcript_source",
"data_channel_is_control_and_caption_only",
"missing_fields_were_clarified_aloud",
"explicit_confirmation_observed",
"structured_completion_saved",
"no_mock_probe_or_fallback",
"privacy_boundary_preserved",
}
assert not all(checks.values())