ETAP · Feasibility Investigation

Adding Google ADK as a second agent framework
— alongside Anthropic Managed Agents, chosen per workspace

Is it possible to let a workspace pick Anthropic Managed Agents or Google ADK as its build-and-run backend, keep the same menu structure, and align each screen to the chosen framework? Short answer: yes — but the two backends are not the symmetric pair the framing assumes, and one piece of the idea (“build & upload via agents-cli”) is by far the heaviest and most divergent. This is investigation-only; implementation is a separate decision.

Date 2026-06-17 Status Investigation — no code written Sources adk.dev · google/agents-cli · ETAP codebase

Verdict: technically feasible, strategically a fork in the road.

The platform-services half of ETAP (workspaces, members, credentials, run-index, triggers/cron, Knowledge-Graph/MCP, analytics) is already a clean seam and would absorb a second framework with modest work. The session / streaming / event-rendering half is deeply Anthropic-shaped and is the real cost. And the specific phrase “build & upload agents via agents-cli” imports an agent CI/CD pipeline ETAP does not have today and which collides with two of its DNA principles. Recommendation below: if you want ADK, do the bind-and-drive variant (Option B), not the in-platform build pipeline.

1 · The reframe that changes the whole decision

The mental model is “pick Anthropic or Google when creating a workspace.” But those two are not mirror images of the same thing. They differ on two independent axes, and the proposal silently couples them.

Backend A — todayAnthropic Managed Agents

  • Authored in the Anthropic Console — ETAP does not build them
  • Hosted by Anthropic, on Anthropic infra
  • Content (events, artifacts, outputs) lives only at Anthropic; ETAP indexes relationships
  • Deploy step: none — ETAP just binds a Console agent & opens sessions
  • Model: Claude only

Backend B — proposedGoogle ADK

  • Authored in code (Python LlmAgent), or a declarative Agent-Config YAML
  • Hosted in your own GCP project (Vertex Agent Engine / Cloud Run / GKE)
  • Content (sessions, events, memory) lives in your project — you own & query it
  • Deploy step: a real build — tarball/container → Cloud Build → Artifact Registry → runtime
  • Model: model-agnostic — Gemini native, Claude via Vertex Model Garden / LiteLLM, OpenAI, local

Three consequences fall out of this table:

2 · What Google ADK actually is

DimensionFinding
What it isOpen-source (Apache-2.0), code-first agent SDK — not a managed runtime itself. Python & Java are the mature SDKs; TS/Go/Kotlin newer. Released Apr 2025; runs two tracks today — v1.x (1.35) and v2.x GA (2.0 on 2026-05-19, graph workflows).
Agent definitionPrimarily in codeLlmAgent/Agent (model + instructions + tools), composed via sub_agents, workflow agents (Sequential/Parallel/Loop), or v2 graphs. A declarative “Agent Config” YAML path also exists.
ModelsModel-agnostic. Gemini native; Claude via a native Vertex Model-Garden class or LiteLlm("anthropic/…"); OpenAI/Cohere/local via LiteLLM/Ollama.
RuntimeRunner + cooperative event loop: agent yields Events, the SessionService appends them to history. Streaming via async generators (run_async / run_live). adk api_server exposes a self-hostable FastAPI surface (/run, /run_sse).
Sessions/artifactsPersisted server-side when backed by a durable SessionServiceInMemory, your own SQL (DatabaseSessionService), or managed VertexAiSessionService. Managed sessions/events are queryable over REST: …/reasoningEngines/{id}/sessions/{sid}/events. Separate MemoryService (incl. managed Vertex Memory Bank) for cross-session memory.
Deployment targetsVertex AI Agent Engine (“Agent Runtime”; fully managed, in your GCP project — the close analogue to Anthropic Managed Agents), Cloud Run (container), GKE, or self-hosted container. Agent Engine deploy = source tarball → managed ReasoningEngine resource.
MCPBoth directions ADK agents are MCP clients (McpToolset over Streamable-HTTP/SSE/stdio) and can expose tools as an MCP server. → An ADK agent can consume ETAP’s existing KG MCP endpoint unchanged.
SchedulingNo native scheduler. Triggers come from Cloud Scheduler / Application Integration / Eventarc — i.e. external infra, exactly like ETAP’s “trigger = config on a binding” model.
AuthProduction path: GOOGLE_GENAI_USE_VERTEXAI=TRUEADC / service-account, no key material (identical pattern to ETAP’s KG Vertex setup). API-key mode for local dev only.

3 · What agents-cli actually is

google/agents-cli is a lifecycle toolchain that wraps ADK (distinct from ADK’s own lower-level adk CLI). Apache-2.0, v0.5.0, pre-GA. Its tagline: “the CLI and skills … to create, evaluate, and deploy AI agents on Google Cloud.”

DimensionFinding
What it buildscreate/scaffold a Python ADK project; deploy dispatches on a manifest deployment_target = agent_runtime (tarball → managed runtime) · cloud_run (container) · gke (container + Terraform).
Configagents-cli-manifest.yaml (name, agent_directory, create_params) + pyproject.toml (depends on google-adk[gcp]≥2.0) + .env. Model / tools / instructions live in code (app/agent.py) — not in YAML.
Stack it pulls inPython 3.11+, uv, Node.js, and for deploy: gcloud, Cloud Build, Artifact Registry, Terraform, Vertex AI / Agent Engine APIs, optionally Secret Manager.
Headless?Mostly yes --auto-approve, --no-confirm-project, --no-wait, --dry-run (prints the underlying gcloud), --json. Caveat: login is interactive → a server would supply ADC out-of-band (standard GCP pattern).
Bonus ideaA deep eval suite (eval generate/grade/optimize, GEPA prompt optimization) — conceptually adjacent to ETAP’s own Model-Fit Evals epic, though it operates on ADK/Gemini agents.

4 · Alignment matrix — “keep the menu, align each screen”

Your instinct that most screens stay shared is largely right. Roughly 70% of the surface is framework-neutral; the divergence concentrates in two screens.

Screen / surfaceDispositionWhy
Members roster · workspace listSharedPure ETAP domain — no framework content.
Cron / trigger schedule UISharedPOSIX cron + prompt template; the firing path already calls a framework-neutral run-driver, not Anthropic. Your “cron on GCP works for both” is correct.
Knowledge Graphs (create/ingest/attach)SharedMCP is a standard; an ADK agent consumes the same KG endpoint. Zero rework.
Analytics / cost dashboardsSharedMetrics are generic (tokens, duration). Only a per-framework price table is new.
Agents list (per workspace)SharedReads the run-index; displays name/model/last-run.
Workspace credential adminVariantAdd a parallel “Google ADK / GCP project” credential block beside the Anthropic key — reuses the KMS envelope pattern.
Agent / binding editorVariantAnthropic = Console agent + environment_id + versions. ADK = model + instructions + tools (+ optional build/deploy). Genuinely different forms.
Session detail (event timeline)Per-frameworkThe hardest screen. Event types, stop_reason, tool inspection, usage are Anthropic-shaped; ADK’s event model differs. Needs a framework-aware renderer.

5 · Coupling map — where the cost actually is

Clean seams  ≈ 8 person-days

  • Credentials — add a parallel lib/google-adk-secrets.ts mirroring the KMS envelope; workspace doc carries both creds’ display fields.
  • Run-index — nearly generic already; rename the sessionId doc-key concept to runId + add a frameworkSessionId. Backward-compatible.
  • Triggers / cron — firing is framework-neutral; only the run-driver needs to dispatch per framework.
  • Binding schema — one framework discriminator on agentBindings (+ workspace default).
  • KG / MCP — zero change.
  • Analytics — per-framework price lookup only.

Hard seams  ≈ 18–30 person-days

  • Session creationclient.beta.sessions.create() is Anthropic-shaped (agent/environment/vaults). ADK create is unrelated.
  • Streaming & events — the SSE proxy + reconnect-and-replay is keyed on Anthropic event ids & status enum.
  • Run-driver — poll / define_outcome / usage normalization / outcome_evaluations are all Anthropic.
  • Session-detail UI — framework-aware event rendering (the single biggest UI item).

Keystone: a FrameworkAdapter interface (createSession · streamEvents · sendMessage · retrieve · normalizeUsage) with two implementations. Build the seam first; a 3rd framework then costs ~half.

Total estimate for a full second framework: ~25–40 person-days (best case clean ADK contract; worst case the event model diverges sharply). The in-platform build pipeline (agents-cli inside ETAP) is on top of that, and is the least-leverage piece.

6 · DNA tensions to put in front of the owner

§0.3 “Anthropic owns content; we own relationships.” ADK/Agent Engine stores session content in our GCP project. This is a principle change (defensible — better EU residency — but explicit).
§0.2 “Firebase-standard-first.” Agent Engine / Cloud Run / GKE / Terraform / Artifact Registry is a sizeable non-Firebase surface. There’s precedent (KG already uses Vertex + Cloud SQL), but the build pipeline is a step further.
§0.1 “Three nouns only.” A framework is fine as a facet of Agent (like triggers/skills/KG). The new capability — building & deploying agent code — is the genuinely novel thing, not a new noun.

7 · The options on the table

Full dual-framework with in-platform build heaviest

The literal vision: per-workspace choice, and ETAP builds & uploads ADK agents via agents-cli. Adds Agent Engine + Cloud Run/GKE + Terraform + Cloud Build + a packaging pipeline, plus the session/streaming/UI adapters. ~40+ days and ongoing ops. Flips the content-ownership principle. Not recommended as a first move.

Recommended ADK agents, bind-and-drive (no in-platform build)

ADK agents are deployed to Agent Engine out-of-band (an operator or CI runs agents-cli deploy once), and ETAP simply binds them and drives sessions via the Agent-Engine reasoningEngines/…/sessions REST API — structurally symmetric to how it binds Console agents today. Keeps ETAP a control plane, reuses every clean seam, and still gets you Gemini/other models + EU-owned session data. You build only the FrameworkAdapter + credential + session-detail variant. This is the sweet spot if you want ADK at all.

Model expansion only

If the underlying want is “run Gemini / non-Claude,” note Anthropic Managed Agents are Claude-only — so the path to other models is ADK-bind-only (Option B), just framed by motive rather than by “framework choice.”

Don’t add now — harvest the ideas

Keep one framework; adopt agents-cli’s eval ideas into the Model-Fit Evals epic, and bank the confirmation that the KG MCP endpoint already serves any future ADK agent. Revisit when a concrete Gemini/residency requirement lands.

8 · Recommended next step

Before committing to any build, de-risk the single hard seam with a one-agent spike on staging:

That spike answers the only question with real uncertainty (can we render & drive ADK sessions cleanly?) for a day of effort, and everything else in this doc is already well-understood.

Investigation only — no production code changed. Confidence notes: agents-cli is pre-GA (v0.5.0) so its surface may shift; exact Vertex Agent-Engine IAM service-agent roles should be read from the live quickstart before provisioning; ADK v1.x-vs-v2.x track choice is deliberate. Sources: adk.dev & adk-docs, github.com/google/agents-cli + its docs site, Google Cloud Agent-Platform/Agent-Runtime docs, and a full coupling sweep of the ETAP codebase (sessions, run-index, secrets, triggers, MCP/KG, UI).