chore: import upstream snapshot with attribution
Continuous Integration / Pre-commit Linter (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.10) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.11) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.12) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.12) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Has been cancelled
Copybara PR Handler / close-imported-pr (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 13:25:13 +08:00
commit ec2b666284
2231 changed files with 491535 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# Antigravity SDK Integration
The ADK Antigravity integration provides `AntigravityAgent`, which runs a
[Google Antigravity SDK](https://pypi.org/project/google-antigravity/) agent —
described by an `AgentConfig` — as a native ADK `BaseAgent`. Each turn is
delegated to the Antigravity runner, and its trajectory steps (model text, tool
calls, and tool responses) are streamed back as standard ADK events recorded in
the session.
## Prerequisites
Install the ADK with Antigravity support:
```bash
pip install "google-adk[antigravity]"
```
Set a Gemini API key (used by the SDK agent):
```bash
export GEMINI_API_KEY="your-api-key"
```
Set `save_dir` on the config — it is the folder where conversation trajectories
are persisted so sessions resume across turns (see
[Session Resumption](#session-resumption)).
## Limitations
The Antigravity SDK currently only supports its **local mode** (an in-process
Go harness that owns its own session lifecycle). Because of this, an
`AntigravityAgent` must be used as a **standalone root agent**:
- It cannot be given `sub_agents`.
- It cannot be nested under a parent agent.
Both are rejected at construction time. This restriction is temporary and will
be lifted once the SDK supports remote connection modes.
## Usage
```python
from google.adk.labs.antigravity import AntigravityAgent
from google.antigravity import LocalAgentConfig
from google.antigravity.hooks import policy
# 1. Configure the Antigravity SDK agent. ``save_dir`` is the folder where
# conversation trajectories are persisted for resumption.
sdk_config = LocalAgentConfig(
system_instructions="You are a helpful local environment assistant.",
workspaces=["./sandbox"],
policies=[*policy.workspace_only(["./sandbox"])],
save_dir="./trajectories",
)
# 2. Wrap the config as a standalone ADK root agent.
root_agent = AntigravityAgent(
name="antigravity_assistant",
description="Runs an Antigravity SDK agent inside ADK.",
config=sdk_config,
)
```
For a runnable end-to-end example, see
`contributing/samples/integrations/antigravity_agent/`.
## How It Works
`AntigravityAgent._run_async_impl` deep-copies `config` on every turn (the SDK
`Agent`'s `AsyncExitStack` is single-use, so a fresh instance is needed for each
of the stateless turns of a long-lived server), enters a fresh SDK `Agent`, sends
the latest user prompt, and converts each streamed Step into ADK events.
Step-to-event mapping covers model text responses, function calls, and function
responses. In SSE streaming mode (`RunConfig(streaming_mode=StreamingMode.SSE)`),
incremental thinking and text deltas are additionally emitted as `partial=True`
events as they arrive, followed by the final aggregated response event — matching
ADK's standard streaming behavior. In the default non-streaming mode, only final
events are emitted.
## Session Resumption
The SDK's local harness persists conversation state to a `traj-*` file in
`config.save_dir` and rehydrates it when a matching `conversation_id` is passed
on a later turn. The wrapper keys this on the ADK session:
- **Fresh turn**: no `conversation_id` is passed, so the harness writes a
randomly-named `traj-<random>` file. After the turn, the wrapper renames it to
`traj-<session_id>_<agent_name>` so later turns can find it.
- **Resume turn**: when `traj-<session_id>_<agent_name>` already exists, the
wrapper passes that `conversation_id` so the harness rehydrates the
conversation.
On resume, the harness replays the entire rehydrated trajectory through its step
stream before producing new steps. To avoid re-emitting prior turns into the ADK
session, the **resume step index** (the highest harness `step_index` already
emitted) is persisted in a `traj-<...>.resume` file alongside the trajectory;
steps at or below it are skipped.
`config.save_dir` is required, and because the trajectory lives on disk there,
conversations survive server restarts as long as the folder persists.