Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/youtube_extension/services/agents/antigravity_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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)
)

Expand Down
7 changes: 4 additions & 3 deletions tests/unit/test_antigravity_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=(
Expand Down
Loading