From 25529949d4637619782ec036071164e96a5f915d Mon Sep 17 00:00:00 2001 From: iLoveChicken Date: Wed, 29 Apr 2026 17:24:32 +0100 Subject: [PATCH 1/3] feat: add run.sh for human-present x402 scenario The human-present/x402 scenario directory was the only scenario in v0.2 missing a run.sh. The README worked around this by pointing users at cards/run.sh --payment-method x402, but the dedicated script makes the scenario consistent with all other scenario directories. Update the README execution command to point at the new script. --- .../a2a/human-present/x402/README.md | 2 +- .../scenarios/a2a/human-present/x402/run.sh | 125 ++++++++++++++++++ 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 code/samples/python/scenarios/a2a/human-present/x402/run.sh diff --git a/code/samples/python/scenarios/a2a/human-present/x402/README.md b/code/samples/python/scenarios/a2a/human-present/x402/README.md index 5e11ff17..ae13a2f9 100644 --- a/code/samples/python/scenarios/a2a/human-present/x402/README.md +++ b/code/samples/python/scenarios/a2a/human-present/x402/README.md @@ -66,7 +66,7 @@ GOOGLE_API_KEY variable in one of two ways. You can execute the following command to run all of the steps in one terminal: ```sh -code/samples/python/scenarios/a2a/human-present/cards/run.sh --payment-method x402 +code/samples/python/scenarios/a2a/human-present/x402/run.sh ``` Or you can run each server in its own terminal (ensure `PAYMENT_METHOD=x402` is set for all processes): diff --git a/code/samples/python/scenarios/a2a/human-present/x402/run.sh b/code/samples/python/scenarios/a2a/human-present/x402/run.sh new file mode 100644 index 00000000..1abc2461 --- /dev/null +++ b/code/samples/python/scenarios/a2a/human-present/x402/run.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +# A script to automate the execution of the x402 (human-present) example. +# It starts all necessary servers and agents in the background. + +# Exit immediately if any command exits with a non-zero status. +set -e + +export PAYMENT_METHOD="x402" + +# The directory containing the agents. +AGENTS_DIR="code/samples/python/src/roles" +# A directory to store logs. +LOG_DIR=".logs" + +if [ ! -d "$AGENTS_DIR" ]; then + echo "Error: Directory '$AGENTS_DIR' not found." + echo "Please run this script from the root of the repository." + exit 1 +fi + +if [ -f .env ]; then + set -a + source .env + set +a +fi + +USE_VERTEXAI=$(printf "%s" "${GOOGLE_GENAI_USE_VERTEXAI}" | tr '[:upper:]' '[:lower:]') +if [ -z "${GOOGLE_API_KEY}" ] && [ "${USE_VERTEXAI}" != "true" ]; then + echo "Please set your GOOGLE_API_KEY environment variable before running." + echo "Alternatively, set GOOGLE_GENAI_USE_VERTEXAI=true to use Vertex AI with ADC." + exit 1 +fi + +# Set up and activate a virtual environment. +echo "Setting up the Python virtual environment..." + +if [ ! -d ".venv" ]; then + uv venv +fi + +# Detect the correct activation script path based on the operating system +case "$OSTYPE" in + msys* | cygwin*) + # Windows (Git Bash, MSYS2, or Cygwin) + source .venv/Scripts/activate + ;; + *) + # Unix/Linux/macOS + source .venv/bin/activate + ;; +esac +echo "Virtual environment activated." + +# Create a directory for log files. +mkdir -p "$LOG_DIR" + +# This function is called automatically when the script exits (for any reason) +# to ensure all background processes are terminated. +cleanup() { + echo "" + echo "Shutting down background processes..." + if [ ${#pids[@]} -ne 0 ]; then + kill "${pids[@]}" 2>/dev/null + wait "${pids[@]}" 2>/dev/null + fi + echo "Cleanup complete." +} + +# Trap the EXIT signal to call the cleanup function. +trap cleanup EXIT + +# Explicitly sync to ensure the virtual environment is up to date. +echo "Syncing virtual environment with uv sync..." +if uv sync --package ap2-samples; then + echo "Virtual environment synced successfully." +else + echo "Error: uv sync failed. Aborting." + exit 1 +fi + +# Clear old logs. +echo "Clearing the logs directory..." +if [ -d "$LOG_DIR" ]; then + rm -f "$LOG_DIR"/* +fi + +# Shared temp directory for keys and state across all agents. +export TEMP_DB_DIR="${TEMP_DB_DIR:-$(pwd)/.temp-db}" +echo "Clearing temp-db directory..." +rm -rf "$TEMP_DB_DIR" +mkdir -p "$TEMP_DB_DIR" +export AGENT_PROVIDER_PUBLIC_KEY_PATH="$TEMP_DB_DIR/agent_provider_signing_key.pub" + +# Start all the remote agents & servers. +pids=() + +echo "" +echo "Starting remote servers and agents as background processes..." + +# uv sync is explicitly run before starting any agents. +# Prevent servers starting in parallel from colliding by trying to sync again. +UV_RUN_CMD="uv run --no-sync" + +if [ -f ".env" ]; then + UV_RUN_CMD="$UV_RUN_CMD --env-file .env" +fi + +echo "-> Starting the Merchant Agent (port:8001 log:$LOG_DIR/merchant_agent.log)..." +$UV_RUN_CMD --package ap2-samples python -m roles.merchant_agent >"$LOG_DIR/merchant_agent.log" 2>&1 & +pids+=($!) + +echo "-> Starting the Credentials Provider (port:8002 log:$LOG_DIR/credentials_provider_agent.log)..." +$UV_RUN_CMD --package ap2-samples python -m roles.credentials_provider_agent >"$LOG_DIR/credentials_provider_agent.log" 2>&1 & +pids+=($!) + +echo "-> Starting the Merchant Payment Processor Agent (port:8003 log:$LOG_DIR/mpp_agent.log)..." +$UV_RUN_CMD --package ap2-samples python -m roles.merchant_payment_processor_agent >"$LOG_DIR/mpp_agent.log" 2>&1 & +pids+=($!) + +echo "" +echo "All remote servers are starting." + +echo "Starting the Shopping Agent..." +$UV_RUN_CMD --package ap2-samples adk web --host 0.0.0.0 $AGENTS_DIR From 6d07838d69b9e697786cea5a38315c37dad2a05f Mon Sep 17 00:00:00 2001 From: iLoveChicken Date: Wed, 29 Apr 2026 17:29:15 +0100 Subject: [PATCH 2/3] fix: set executable bit on run.sh --- code/samples/python/scenarios/a2a/human-present/x402/run.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 code/samples/python/scenarios/a2a/human-present/x402/run.sh diff --git a/code/samples/python/scenarios/a2a/human-present/x402/run.sh b/code/samples/python/scenarios/a2a/human-present/x402/run.sh old mode 100644 new mode 100755 From c46a19f86059f903e206db31e82f0472f5545aa3 Mon Sep 17 00:00:00 2001 From: iLoveChicken Date: Wed, 29 Apr 2026 20:28:40 +0100 Subject: [PATCH 3/3] fix(x402-run): use rm -rf + mkdir for robust log directory cleanup Replacing `rm -f "$LOG_DIR"/*` with `rm -rf "$LOG_DIR" && mkdir -p "$LOG_DIR"` avoids a glob-expansion failure when the directory is empty (some shells pass a literal `*` to rm if no files match). Addresses Gemini code-review feedback on PR #244. --- code/samples/python/scenarios/a2a/human-present/x402/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/samples/python/scenarios/a2a/human-present/x402/run.sh b/code/samples/python/scenarios/a2a/human-present/x402/run.sh index 1abc2461..886e6af7 100755 --- a/code/samples/python/scenarios/a2a/human-present/x402/run.sh +++ b/code/samples/python/scenarios/a2a/human-present/x402/run.sh @@ -82,7 +82,7 @@ fi # Clear old logs. echo "Clearing the logs directory..." if [ -d "$LOG_DIR" ]; then - rm -f "$LOG_DIR"/* + rm -rf "$LOG_DIR" && mkdir -p "$LOG_DIR" fi # Shared temp directory for keys and state across all agents.