Gemini Antigravity Agent Migration: Update Tool Calls Without Silent Breakage Google's September Antigravity Agent preview update introduces a new Gemini agent identifier and changes built-in local-tool shapes, moving file operations toward explicit PascalCase parameters and line-range replacement instead of broad full-file writes, according to the Gemini API notes. Applications that inspect tool steps, proxy them to a local environment, or maintain their own audit layer must treat the update as an interface migration rather than a prompt tweak, since an agent can report a completed reasoning loop while the integration silently mishandles the action. The guidance recommends classifying integrations by blast radius, building compatibility adapters and contract tests, and keeping "completed" agent status separate from delivery status where the intended change exists and tests pass. A model-string change can be easy. A tool-contract change is a production migration. Here is how to move safely when an agent client reads, edits, or dispatches work locally. The dangerous kind of AI-agent upgrade is the one that looks boring in a release note. A team sees a new preview identifier, changes one configuration value, and deploys. The agent still returns a polished final message. Everyone relaxes. Then the first local run either ignores a file edit, sends malformed arguments to an internal executor, or records a successful job with no usable artifact. That is not a model-quality problem. It is a contract problem. Google’s September Antigravity Agent preview update is a useful reminder. The current Gemini API notes describe a new agent identifier and changes to built-in local-tool shapes: file operations move toward explicit, PascalCase parameters and line-range replacement rather than a broad full-file write. The managed agent itself can reason, run code, manage files, browse, and keep context in a hosted sandbox. But any application that inspects tool steps, proxies them to a local environment, or has its own audit layer must treat the update as an interface migration, not a prompt tweak. This guide is for the developer who owns that client. It shows how to find the risky boundary, build a compatibility adapter, write contract tests, and roll the change out without trusting a friendly completion message. Traditional API migrations usually fail loudly. A missing field produces a 400 response. A renamed method will not compile. Agent runtimes add a deceptive third option: the agent may complete its reasoning loop while your integration mishandles the action it asked to take. Suppose an old runtime emits a conceptual request like this: { "type": "write file", "args": { "path": "src/auth.ts", "content": "...entire file..." }} A newer runtime can instead express an edit as a line-scoped replacement with a richer argument set. If your dispatcher only accepts the old tool name or expects path and content, it has choices—and none should be silent: The agent may believe it edited the file. Your observability dashboard may call the interaction complete. The repository will tell a different story. “Completed” is an agent status. “The intended change exists, tests pass, and the audit record is complete” is a delivery status. Keep those states separate. Do not start by rewriting code. Start by classifying your integration. The official Antigravity Agent guide https://ai.google.dev/gemini-api/docs/antigravity-agent shows both a hosted remote environment and customization points such as tools, local environments, and function handling. Those choices determine the blast radius. If you submit work to a Google-hosted environment and consume only a final result such as output text, your change may be modest: update the agent identifier, run representative tasks, and check the response and artifacts. You still need acceptance tests, but you are not responsible for translating built-in filesystem actions. If you read function call steps, replay built-in actions locally, enforce a custom allowlist, or store tool arguments for compliance, assume a breaking contract. Your code must recognize new operation names and argument casing. More importantly, it must understand the different safety meaning of line-range replacement. Custom functions create a second boundary. Your own tool names may remain stable, while the envelope, ordering, or lifecycle around them changes. Test your custom-tool dispatcher independently from the built-in filesystem adapter. A green test for one does not prove the other. Practical rule: inventory every place a tool step crosses a trust boundary: logging, policy checks, queues, local executors, audit storage, and UI rendering. A contract is more than the one switch statement that invokes a command. Version checks scattered across a codebase age badly. They force product code to know the exact vocabulary of each provider preview. A narrow adapter gives you one place to map provider events into the stable actions your application understands. Define an internal action vocabulary around intent, not provider spelling: type FileAction = | { kind: "read"; path: string; startLine?: number; endLine?: number } | { kind: "replace"; path: string; startLine: number; endLine: number; expected: string; replacement: string } | { kind: "list"; path: string } | { kind: "search"; path: string; query: string; isRegex: boolean }; type NormalizedStep = | { kind: "file"; action: FileAction; raw: unknown } | { kind: "command"; command: string; raw: unknown } | { kind: "web"; queries: string ; raw: unknown }; The adapter should perform four jobs: That last point matters. Do not transform a line-range edit into a whole-file write just because it is convenient. Fetch the target, verify the expected text where available, apply the smallest replacement, then record the resulting file digest. function normalizeToolCall call: { name: string; args: unknown } : NormalizedStep { const a = call.args as Record