diff --git a/src/youtube_extension/services/agents/antigravity_backend.py b/src/youtube_extension/services/agents/antigravity_backend.py index f2e245a6f..84ae445c0 100644 --- a/src/youtube_extension/services/agents/antigravity_backend.py +++ b/src/youtube_extension/services/agents/antigravity_backend.py @@ -20,7 +20,7 @@ ANTIGRAVITY_AGENT = "antigravity-preview-05-2026" -_MCP_NAME = re.compile(r"^[a-z0-9_-]+$") +_MCP_NAME = re.compile(r"^[a-z0-9]+$") class AntigravityConfigurationError(ValueError): @@ -51,7 +51,7 @@ class AntigravityMCPServer: def validate(self, read_only_tools: frozenset[str]) -> None: if not _MCP_NAME.fullmatch(self.name): raise AntigravityConfigurationError( - "MCP server name must match ^[a-z0-9_-]+$" + "MCP server name must contain lowercase ASCII letters and digits only" ) parsed = urlparse(self.url) if parsed.scheme != "https" or not parsed.netloc: @@ -171,12 +171,17 @@ def build_payload( "video_uri", "audio", "audio_file", + "image", + "images", + "image_bytes", + "image_file", + "image_uri", "document", } present = sorted(forbidden.intersection(context)) if present: raise AntigravityConfigurationError( - "Antigravity accepts normalized text/image context, not direct media: " + "This adapter accepts normalized text context, not direct media: " + ", ".join(present) ) diff --git a/tests/unit/test_antigravity_backend.py b/tests/unit/test_antigravity_backend.py index 2286bde84..60bb3dee0 100644 --- a/tests/unit/test_antigravity_backend.py +++ b/tests/unit/test_antigravity_backend.py @@ -107,17 +107,18 @@ async def test_live_transport_requires_two_explicit_gates() -> None: await backend.execute("do work") +@pytest.mark.parametrize("media_key", ["video_uri", "image_uri"]) @pytest.mark.asyncio -async def test_direct_media_is_rejected_before_transport() -> None: +async def test_direct_media_is_rejected_before_transport(media_key: str) -> None: transport = FakeTransport() backend = AntigravityBackend(config(), transport) with pytest.raises(AntigravityConfigurationError, match="direct media"): - await backend.execute("analyze", {"video_uri": "gs://bucket/video.mp4"}) + await backend.execute("analyze", {media_key: "gs://bucket/media"}) assert transport.payloads == [] -@pytest.mark.parametrize("name", ["EventRelay", "event relay", "eventrelay!"]) +@pytest.mark.parametrize("name", ["EventRelay", "event relay", "eventrelay!", "event-relay", "event_relay"]) def test_mcp_name_must_match_provider_contract(name: str) -> None: invalid = config( mcp_servers=(