Combining Antigravity agents with Vertex AI models and Firebase's real-time infrastructure unlocks powerful intelligent applications — but production deployments surface errors that never appear in local development: authentication failures, IAM permission gaps, Firestore security rule violations, Cloud Functions timeouts, and real-time sync disconnects.
Antigravity × Vertex AI Authentication Errors
Error Pattern 1: DefaultCredentialsError
google.auth.exceptions.DefaultCredentialsError:
Could not automatically determine credentials.
This appears when Google Cloud credentials aren't available in the current environment.
Production environments (Cloud Run, GKE, Compute Engine):
On managed Google Cloud infrastructure, attach a service account to the resource and Application Default Credentials (ADC) work automatically — no credential code needed.
import vertexai
from vertexai.generative_models import GenerativeModel
from antigravity import AgentBuilder # hypothetical SDK
# ✅ Works automatically on Cloud Run / GKE with an attached service account
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
class AntigravityVertexAgent:
def __init__(self):
self.vertex_model = GenerativeModel("gemini-2.0-flash-001")
self.agent = AgentBuilder().with_llm(self.vertex_model).build()
async def run(self, task: str) -> str:
return await self.agent.execute(task)Local development:
# Set up ADC with your personal credentials
gcloud auth application-default login
# Or impersonate a service account to test production permissions
gcloud auth application-default login \
--impersonate-service-account=antigravity-agent@YOUR_PROJECT_ID.iam.gserviceaccount.comError Pattern 2: Insufficient IAM Permissions
google.api_core.exceptions.PermissionDenied: 403
Permission 'aiplatform.endpoints.predict' denied on resource
The service account running your agent doesn't have the required Vertex AI role.
Grant the required roles:
# Required for inference requests to Vertex AI
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:antigravity-agent@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
# Required for custom model endpoints
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="serviceAccount:antigravity-agent@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/ml.developer"Minimum permissions for a custom IAM role:
custom_role_permissions = [
"aiplatform.endpoints.predict",
"aiplatform.models.get",
"storage.objects.get", # Only if reading from GCS
]Error Pattern 3: Region Mismatch for Vertex AI Endpoints
google.api_core.exceptions.NotFound: 404
Endpoint not found: projects/xxx/locations/us-east1/endpoints/yyy
Vertex AI custom endpoints are region-specific. Your vertexai.init() location must match the endpoint's region.
# ❌ Region mismatch — endpoint is in us-east1 but init uses us-central1
vertexai.init(project="YOUR_PROJECT_ID", location="us-central1")
# ✅ Match the endpoint's region exactly
VERTEX_AI_REGION = "us-east1"
vertexai.init(project="YOUR_PROJECT_ID", location=VERTEX_AI_REGION)Firebase Integration Errors
Firestore Access Errors
Security Rule Violations
FirebaseError: PERMISSION_DENIED: Missing or insufficient permissions.
Firestore's security rules are blocking the agent's request. In server-side agent code, use the Admin SDK, which bypasses security rules entirely.
import firebase_admin
from firebase_admin import credentials, firestore
import uuid
# ✅ Admin SDK bypasses security rules
cred = credentials.ApplicationDefault()
firebase_admin.initialize_app(cred, {'projectId': 'YOUR_PROJECT_ID'})
db = firestore.client()
async def save_agent_result(agent_id: str, result: dict) -> str:
"""Save agent execution results to Firestore"""
try:
doc_ref = db.collection('agent_results').document()
await doc_ref.set({
**result,
'agent_id': agent_id,
'created_at': firestore.SERVER_TIMESTAMP,
'status': 'completed'
})
return doc_ref.id
except Exception as e:
print(f"Firestore write error: {e}")
raiseSecurity rules for client-side access (web/mobile apps):
// firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Agent results — read only by the owning user
match /agent_results/{resultId} {
allow read: if request.auth != null && request.auth.uid == resource.data.user_id;
allow create: if false; // Only Admin SDK can write
allow update, delete: if false;
}
// Task queue — users can submit tasks for themselves
match /agent_tasks/{taskId} {
allow create: if request.auth != null
&& request.resource.data.user_id == request.auth.uid
&& request.resource.data.status == 'pending';
allow read: if request.auth != null && request.auth.uid == resource.data.user_id;
allow update, delete: if false; // Admin SDK only
}
}
}Field Type Errors on Write
ValueError: A document must have an even number of segments
google.api_core.exceptions.InvalidArgument: Document path must be a string
These occur when document IDs or field values have incorrect types.
from google.cloud.firestore_v1 import AsyncClient
import uuid
async def safe_firestore_write(db: AsyncClient, collection: str, data: dict) -> str:
"""Type-safe Firestore write with sanitization"""
sanitized = {}
for key, value in data.items():
str_key = str(key) # Keys must be strings
if value is None:
sanitized[str_key] = "" # No null values
elif isinstance(value, (dict, list)):
sanitized[str_key] = value
elif isinstance(value, (int, float, bool)):
sanitized[str_key] = value
else:
sanitized[str_key] = str(value)
doc_id = str(uuid.uuid4())
doc_ref = db.collection(collection).document(doc_id)
await doc_ref.set(sanitized)
return doc_idCloud Functions Integration Errors
Timeout Errors
Antigravity agent processing often exceeds Cloud Functions' default 60-second timeout.
# Use async task queuing instead of synchronous processing
from google.cloud import tasks_v2
import json
tasks_client = tasks_v2.CloudTasksClient()
def handle_agent_request(request):
"""Accept immediately, process asynchronously"""
task_data = request.get_json()
if not task_data:
return {'error': 'Invalid request'}, 400
parent = tasks_client.queue_path('YOUR_PROJECT_ID', 'us-central1', 'antigravity-tasks')
task = {
'http_request': {
'http_method': tasks_v2.HttpMethod.POST,
'url': 'https://REGION-PROJECT_ID.cloudfunctions.net/process_agent_task',
'body': json.dumps(task_data).encode(),
'headers': {'Content-Type': 'application/json'},
}
}
response = tasks_client.create_task(parent=parent, task=task)
return {'task_name': response.name, 'status': 'queued'}, 202Pub/Sub async pattern (recommended for high volume):
from google.cloud import pubsub_v1
import json, uuid
publisher = pubsub_v1.PublisherClient()
topic_path = publisher.topic_path('YOUR_PROJECT_ID', 'antigravity-agent-tasks')
async def submit_agent_task(task_data: dict) -> str:
message_data = json.dumps(task_data).encode('utf-8')
future = publisher.publish(
topic_path,
message_data,
task_id=task_data.get('task_id', str(uuid.uuid4())),
)
return future.result()
# Pub/Sub subscriber (in a separate Cloud Function)
import functions_framework
from cloudevents.http import CloudEvent
import base64
@functions_framework.cloud_event
def process_agent_task(cloud_event: CloudEvent):
data = base64.b64decode(cloud_event.data["message"]["data"])
task_data = json.loads(data.decode('utf-8'))
result = run_antigravity_agent(task_data)
save_to_firestore(task_data['task_id'], result)Real-Time Sync Error Handling
Firestore Listener Disconnections
Real-time listeners can disconnect due to network issues or Firestore maintenance.
from google.cloud.firestore_v1 import AsyncClient
import asyncio
class AgentStatusWatcher:
def __init__(self, db: AsyncClient, agent_id: str):
self.db = db
self.agent_id = agent_id
self._reconnect_delay = 1.0
self._max_reconnect_delay = 60.0
async def start_watching(self, on_status_change):
"""Start real-time listener with automatic reconnection"""
while True:
try:
await self._watch(on_status_change)
except Exception as e:
print(f"Listener disconnected: {e}. Reconnecting in {self._reconnect_delay}s")
await asyncio.sleep(self._reconnect_delay)
self._reconnect_delay = min(self._reconnect_delay * 2, self._max_reconnect_delay)
async def _watch(self, on_status_change):
query = (
self.db.collection('agent_results')
.where('agent_id', '==', self.agent_id)
.order_by('created_at', direction='DESCENDING')
.limit(1)
)
from google.cloud.firestore_v1.watch import DocumentChange
async for changes in query.watch():
self._reconnect_delay = 1.0 # Reset on successful connection
for change in changes:
if change.type in (DocumentChange.ADDED, DocumentChange.MODIFIED):
await on_status_change(change.document.to_dict())Cross-Database Consistency (Firestore + Realtime Database)
When using both databases, maintain consistency with careful error handling:
async def update_agent_status_atomic(firestore_db, rtdb_ref, agent_id: str, status: str, result: dict = None):
"""Best-effort atomic update across Firestore and Realtime Database"""
firestore_success = False
try:
await firestore_db.collection('agents').document(agent_id).update({
'status': status,
'updated_at': firestore.SERVER_TIMESTAMP,
'result': result
})
firestore_success = True
except Exception as e:
print(f"Firestore update failed: {e}")
try:
rtdb_ref.child(f'agent_status/{agent_id}').set({
'status': status,
'updated_at': {'.sv': 'timestamp'}
})
except Exception as e:
print(f"RTDB update failed: {e}")
if not firestore_success:
raise Exception("Both databases failed to update")
if not firestore_success:
# Roll back RTDB if Firestore failed
try:
rtdb_ref.child(f'agent_status/{agent_id}').delete()
except:
pass
raise Exception("Firestore update failed")End-to-End Error Monitoring
import google.cloud.error_reporting as error_reporting
import google.cloud.logging as cloud_logging
import logging, traceback
logging_client = cloud_logging.Client()
logging_client.setup_logging()
logger = logging.getLogger('antigravity-agent')
error_client = error_reporting.Client()
class MonitoredAntigravityAgent:
def __init__(self, agent_id: str):
self.agent_id = agent_id
async def execute_with_monitoring(self, task: dict) -> dict:
task_id = task.get('task_id', 'unknown')
logger.info(f"Task started: {task_id}", extra={
'agent_id': self.agent_id,
'task_type': task.get('type'),
})
try:
result = await self._execute(task)
logger.info(f"Task completed: {task_id}", extra={'agent_id': self.agent_id})
return result
except PermissionError as e:
logger.error(f"Permission error: {task_id} - {e}", extra={'error_type': 'permission_error'})
error_client.report_exception()
raise
except Exception as e:
logger.exception(f"Unexpected error: {task_id}", extra={'agent_id': self.agent_id})
error_client.report_exception()
return {'task_id': task_id, 'status': 'error', 'error': str(e)}
async def _execute(self, task: dict) -> dict:
raise NotImplementedErrorProduction Diagnosis Flow
When an Antigravity × Vertex AI / Firebase integration error occurs, follow this sequence.
Step 1: Authentication error? DefaultCredentialsError → verify ADC setup. PermissionDenied → check IAM roles (roles/aiplatform.user required).
Step 2: Firestore error? PERMISSION_DENIED → use Admin SDK or fix security rules. InvalidArgument → check field types and document path format.
Step 3: Cloud Functions error? Timeout → switch to async pattern (Pub/Sub or Cloud Tasks). Cold start delay → set minimum instance count.
Step 4: Real-time sync error? Listener disconnect → implement auto-reconnect with exponential backoff. Consistency failure → use best-effort updates with rollback on critical paths.
Working through these steps in order resolves the vast majority of production integration issues. We hope this guide helps you ship reliable Antigravity-powered applications with confidence.