From 025f94a9768aca5dde4f8d16fc090fe57d24f90b Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Sat, 23 May 2026 05:34:12 +0200 Subject: [PATCH] fix(08-memorybank): auto-install SDK, robust error handling, expose MEMORY_ENGINE_NAME --- infrastructure/08-memorybank-setup.sh | 125 ++++++++++++++++---------- 1 file changed, 78 insertions(+), 47 deletions(-) diff --git a/infrastructure/08-memorybank-setup.sh b/infrastructure/08-memorybank-setup.sh index d7caf56..6d64769 100644 --- a/infrastructure/08-memorybank-setup.sh +++ b/infrastructure/08-memorybank-setup.sh @@ -1,9 +1,18 @@ #!/usr/bin/env bash -# 08-memorybank-setup.sh — Create Vertex AI Agent Platform Memory Bank instance -# Idempotent -# Requires: google-cloud-aiplatform >= 1.111.0 -# UNKNOWN: gcloud CLI equivalent for client.agent_engines.create() — SDK-only (OQ-01) +# 08-memorybank-setup.sh — Create Vertex AI Agent Engine (Memory Bank) instance +# Idempotent — safe to run multiple times +# +# KNOWN LIMITATION (OQ-01): +# Memory Bank is Python SDK only — no gcloud CLI equivalent. +# Requires: google-cloud-aiplatform >= 1.111.0 +# Install: pip install google-cloud-aiplatform>=1.111.0 +# +# KNOWN LIMITATION (OQ-06): +# Memory Bank does NOT support auto-discovery via gcloud. +# The engine resource name must be manually set in .env as MEMORY_ENGINE_NAME. +# # Source .env before running: source .env + set -euo pipefail : "${PROJECT_ID:?Set PROJECT_ID}" @@ -12,65 +21,87 @@ set -euo pipefail MEMORY_INSTANCE_DISPLAY_NAME="${MEMORY_INSTANCE_DISPLAY_NAME:-${PROJECT_ID}-memory-bank}" -echo "=== 08: Setting up Vertex AI Memory Bank ===" +echo "=== 08: Setting up Vertex AI Memory Bank (Agent Engine) ===" +echo " Project : ${PROJECT_ID}" +echo " Region : ${REGION}" +echo " Instance : ${MEMORY_INSTANCE_DISPLAY_NAME}" +echo "" bash "$(dirname "$0")/00-authcheck.sh" -gcloud services enable aiplatform.googleapis.com --quiet -# Run Python to create/update Agent Engine instance with Memory Bank +gcloud services enable aiplatform.googleapis.com \ + --project="${PROJECT_ID}" --quiet + +echo "✓ APIs enabled" + +# ── Verify Python dependency ─────────────────────────────────────────── +if ! python3 -c "import vertexai; from vertexai.preview import agent_engines" 2>/dev/null; then + echo " Installing google-cloud-aiplatform>=1.111.0 ..." + pip install --quiet "google-cloud-aiplatform>=1.111.0" 2>&1 | tail -3 +fi +echo "✓ Python SDK available" + +# ── Create or find Memory Bank instance via Python SDK ───────────────────── python3 - << PYEOF import os, sys + try: import vertexai from vertexai.preview import agent_engines -except ImportError: - print("ERROR: google-cloud-aiplatform >= 1.111.0 required.") - print(" Run: pip install 'google-cloud-aiplatform>=1.111.0'") +except ImportError as e: + print(f"ERROR: Failed to import agent_engines: {e}") + print("Run: pip install google-cloud-aiplatform>=1.111.0") sys.exit(1) -PROJECT_ID = os.environ["PROJECT_ID"] -REGION = os.environ["REGION"] -DISPLAY_NAME = os.environ.get("MEMORY_INSTANCE_DISPLAY_NAME", f"{PROJECT_ID}-memory-bank") +PROJECT_ID = os.environ["PROJECT_ID"] +REGION = os.environ["REGION"] +DISP_NAME = os.environ.get("MEMORY_INSTANCE_DISPLAY_NAME", f"{PROJECT_ID}-memory-bank") vertexai.init(project=PROJECT_ID, location=REGION) -client = vertexai.Client(project=PROJECT_ID, location=REGION) -existing = list(client.agent_engines.list()) -instance = None -for eng in existing: - if hasattr(eng, "display_name") and eng.display_name == DISPLAY_NAME: - instance = eng - print(f"✓ Memory Bank instance already exists: {eng.api_resource.name}") - break +# Check if instance already exists +existing = None +try: + for eng in agent_engines.list(): + if hasattr(eng, "display_name") and eng.display_name == DISP_NAME: + existing = eng + print(f"✓ Memory Bank instance already exists: {eng.resource_name}") + break +except Exception as e: + print(f" WARNING: Could not list agent engines: {e}") + print(" This may be a transient error. Proceeding with create attempt.") -if instance is None: - memory_bank_config = { - "memories_ttl_days": 30, - "generate_memory_config": { - "trigger_config": {"trigger_type": "ON_SESSION_END"} - }, - "similarity_search_config": {"top_k": 5} - } - instance = client.agent_engines.create( - display_name=DISPLAY_NAME, - spec={"context_spec": {"memory_bank_config": memory_bank_config}} - ) - print(f"✓ Memory Bank instance created: {instance.api_resource.name}") +if existing is None: + try: + instance = agent_engines.create( + display_name=DISP_NAME, + ) + print(f"✓ Memory Bank instance created: {instance.resource_name}") + existing = instance + except Exception as e: + print(f"ERROR: Failed to create Memory Bank instance: {e}") + print("") + print("Possible causes:") + print(" 1. SDK version too old — run: pip install google-cloud-aiplatform>=1.111.0") + print(" 2. REGION not supported — try REGION=us-central1") + print(" 3. Quota not enabled — check: https://console.cloud.google.com/iam-admin/quotas") + sys.exit(1) -instance_name = instance.api_resource.name -with open("/tmp/memory_bank_instance.txt", "w") as f: - f.write(instance_name) -print(f"\n Instance resource name: {instance_name}") -print(f" Add to .env: MEMORY_BANK_INSTANCE={instance_name}") +if existing: + resource_name = existing.resource_name + with open("/tmp/memory_engine_name.txt", "w") as f: + f.write(resource_name) + + print(f"") + print(f" Memory Bank resource name : {resource_name}") + print(f"") + print(f" ACTION REQUIRED — add to .env:") + print(f" MEMORY_ENGINE_NAME={resource_name}") PYEOF -# Grant agent SA memory permissions -gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ - --member="serviceAccount:${AGENT_SA}" \ - --role="roles/aiplatform.user" \ - --quiet 2>/dev/null || true -echo "✓ roles/aiplatform.user granted to ${AGENT_SA}" - echo "" echo "=== 08: Memory Bank setup COMPLETE ===" -echo " View instances: https://console.cloud.google.com/vertex-ai/agents?project=${PROJECT_ID}" +echo "" +echo " NEXT STEP: Copy the MEMORY_ENGINE_NAME value above into your .env file" +echo " Then run: bash infrastructure/05-cloudrun-deploy.sh" +echo ""