All skills
google avatar

/google-agents-cli-deploy

@2c39459
by googlegoogle/agents-cli6k stars
686

This skill should be used when the user wants to "deploy an agent", "deploy my ADK agent", "set up CI/CD", "configure secrets", "troubleshoot a deployment", or needs guidance on Agent Runtime, Cloud Run, or GKE deployment targets, or binding an agent to an Agent Gateway. Covers deployment workflows, service accounts, rollback, and production infrastructure. Applies to any framework agents-cli deploys (ADK, LangChain, ...). Part of the agents-cli skills suite. Do NOT use for agent API code patterns (ADK: use google-agents-cli-adk-code), evaluation (use google-agents-cli-eval), or project scaffolding (use google-agents-cli-scaffold).

Use this Skill: https://skilld.dev/gh/google/agents-cli/google-agents-cli-deploy

This session only. Nothing lands on disk.

referencesbatch-inference.md

≈1.2k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Batch Inference (Cloud Run)

Invoke your agent as a BigQuery Remote Function for batch inference over table rows. This requires a custom POST / endpoint since BQ cannot use URL paths.

ADK projects. The BigQuery request/response contract and the Terraform below apply to any framework; both handlers invoke the agent through the ADK Runner, so swap in your framework's invocation. For the Runner API, see /google-agents-cli-adk-code.

For event-driven triggers (Pub/Sub, Eventarc): ADK Python has native trigger_sources. ADK Go has pubsub and eventarc sub-launchers, which the scaffolded entrypoint does not start. See: /google-agents-cli-adk-code

BigQuery Remote Function

Python handler

BQ sends {"calls": [["row1"], ...], "caller": "..."}, expects {"replies": ["...", ...]} in same order. BQ cannot use URL paths — register at POST /.

import asyncio, json, uuid
from fastapi import Request
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.genai import types
from my_agent.agent import root_agent

APP_NAME = "my_agent"
_trigger_session_service = InMemorySessionService()
_trigger_runner = Runner(
    agent=root_agent, app_name=APP_NAME, session_service=_trigger_session_service,
)

async def _run_agent(message_text: str, user_id: str = "trigger") -> list:
    session = await _trigger_session_service.create_session(
        app_name=APP_NAME, user_id=user_id, session_id=str(uuid.uuid4())
    )
    events = []
    async for event in _trigger_runner.run_async(
        user_id=user_id, session_id=session.id,
        new_message=types.Content(role="user", parts=[types.Part(text=message_text)]),
    ):
        events.append(event)
    return events

@app.post("/")
async def trigger_bq(request: Request):
    body = await request.json()
    calls: list = body.get("calls", [])
    user_id = body.get("caller") or body.get("sessionUser") or "bq"

    async def _process_row(row_args: list) -> str:
        text = row_args[0] if (len(row_args) == 1 and isinstance(row_args[0], str)) \
               else json.dumps(row_args)
        try:
            events = await _run_agent(text, user_id=user_id)
            return json.dumps([e.model_dump(mode="json") for e in events])
        except Exception as e:
            return f"Error: {e}"

    replies = await asyncio.gather(*[_process_row(row) for row in calls])
    return {"replies": list(replies)}

Go handler

A Go project has no FastAPI app to hang a route on. Serve the BigQuery endpoint from your own mux with adkrest.Server mounted beside it — the composition upstream's examples/rest uses, and the one /google-agents-cli-adk-code (references/adk-go.md) covers in full.

restServer, _ := adkrest.NewServer(adkrest.ServerConfig{
	AgentLoader:     agent.NewSingleLoader(rootAgent),
	SessionService:  session.InMemoryService(),
	SSEWriteTimeout: 120 * time.Second,
})

mux := http.NewServeMux()

// "POST /{$}" matches the root path exactly, so it does not shadow the ADK
// routes mounted at "/" below, and registration order does not matter.
mux.HandleFunc("POST /{$}", func(w http.ResponseWriter, r *http.Request) {
	var req struct {
		Calls [][]any `json:"calls"`
	}
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}
	replies := make([]string, 0, len(req.Calls))
	for _, call := range req.Calls {
		prompt := ""
		if len(call) > 0 {
			prompt = fmt.Sprint(call[0])
		}
		// Invoke the agent here via runner.Runner; see /google-agents-cli-adk-code.
		replies = append(replies, prompt)
	}
	w.Header().Set("Content-Type", "application/json")
	_ = json.NewEncoder(w).Encode(map[string]any{"replies": replies})
})

mux.Handle("/", restServer)
http.ListenAndServe(addr, mux)

This replaces the launcher, so webui and the keyword CLI go away; mount server/adka2a and server/agentengine on the same mux if you need them.

Add the package to the image too — the generated Dockerfile copies named directories, so a new one is absent from the build context and the build fails with package <mod>/<pkg> is not in std:

COPY bqremote/ ./bqremote/

BQ remote function Terraform:

resource "google_bigquery_routine" "my_fn" {
  routine_type    = "SCALAR_FUNCTION"
  language        = "SQL"
  definition_body = ""
  arguments {
    name          = "message"
    argument_kind = "FIXED_TYPE"
    data_type     = jsonencode({ typeKind = "STRING" })
  }
  return_type = jsonencode({ typeKind = "STRING" })
  remote_function_options {
    endpoint   = google_cloud_run_v2_service.app.uri  # root URL only
    connection = google_bigquery_connection.my_conn.name
  }
}

Source: SKILL.md on GitHub

No alertstoday3 checks · Risk SAFE
  • Gen Agent Trust Hubtoday

    This skill provides guidance and automation for deploying AI agents to Google Cloud platforms like Agent Runtime, Cloud Run, and GKE. It utilizes the `agents-cli` tool for managing infrastructure via Terraform and handles sensitive information using Google Cloud Secret Manager. While the skill facilitates the creation of event-driven trigger endpoints which represent a potential data ingestion surface, these are implemented following standard architectural patterns for agent deployment.

  • Sockettoday

    No alerts

  • Snyktoday

    Risk: LOW · No issues

Signed by skilld at 2c39459. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 days ago.

Activeupdated 2 days ago
Other metadata
metadata
{
  "author": "Google",
  "license": "Apache-2.0",
  "version": "1.8.0",
  "requires": {
    "bins": [
      "agents-cli"
    ],
    "install": "uv tool install google-agents-cli"
  }
}

README badge

README badge for google/agents-cli/google-agents-cli-deploy