This repository contains two independent A2A reference implementations for protocol interoperability, tool-calling, streaming, trace propagation, sideband metadata, and Workbench integration demos.
They are not production travel assistants. The model may generate plausible destinations, schedules, budgets, prices, or availability, but those values are simulated text. There is no booking system, payment flow, airline inventory, hotel inventory, live flight search, weather API, city database, or external travel-data connector in this v2 copy.
| Project | Framework | Default port | A2A transport | Main capability |
|---|---|---|---|---|
adk-travel-agent |
Google ADK + native to_a2a() |
4201 | A2A JSON-RPC v1 | ADK-native agent, LiteLLM/NVIDIA model, MCP tools, ADK executor interception |
langgraph-travel-agent |
LangGraph + official A2A Python SDK | 4202 | A2A JSON-RPC v1 and HTTP+JSON v1 | ReAct graph, streamed updates, conditional trip-plan artifacts, MCP tools |
Each directory is a standalone Python project. Use separate virtual environments when developing both at the same time; both intentionally keep the source package name agent_lab because they are independent distributions.
Both projects expose:
GET /.well-known/agent-card.json
POST / A2A JSON-RPC 1.0 interface
The LangGraph project additionally exposes:
POST /rest A2A HTTP+JSON 1.0 interface
The cards advertise:
- streaming support;
- no push-notification support;
- no extended-card capability;
- JSON-RPC protocol version
1.0; - HTTP+JSON protocol version
1.0for LangGraph; - default
text/plain,text/markdown, andapplication/jsonmodes; - a non-required, provisional sideband extension:
urn:agent-observability:sideband-events:v1.
Sideband data is only included when the client negotiates the advertised extension. It is fixture-authored observability metadata, not A2A core vocabulary and not a replacement for standard A2A task/status/artifact events.
flowchart LR
C[Workbench or A2A client] -->|Agent Card and JSON-RPC v1| A[ADK fixture]
C -->|Agent Card, JSON-RPC v1, or HTTP+JSON v1| L[LangGraph fixture]
A --> M[LiteLLM]
L --> M
M --> N[NVIDIA NIM endpoint]
A --> T[Official MCP Time server]
A --> F[Official MCP Filesystem server]
L --> T
L --> F
A --> O[OTLP HTTP traces]
L --> O
The only tools enabled in these fixtures are intentionally narrow:
| MCP server | Allowed tools | Scope |
|---|---|---|
| Time | get_current_time, convert_time |
Current time and timezone conversion |
| Filesystem | list_allowed_directories, list_directory, read_text_file, get_file_info |
Read-only access to fixtures/mcp-workspace |
The filesystem server is the official MCP reference server launched locally through Node.js. The Python time server is launched over stdio. The agents filter the exposed tool names and do not expose write, delete, shell, booking, or network tools.
The model is instructed to use at most one MCP tool per request. A greeting should remain a greeting; an explicit travel-planning request can produce a simulated itinerary; time and filesystem prompts are routed to the relevant MCP capability.
The copied environment template defaults to:
NVIDIA_MODEL=nvidia_nim/nvidia/llama-3.3-nemotron-super-49b-v1.5
NVIDIA_NIM_API_BASE=https://integrate.api.nvidia.com/v1/Set NVIDIA_NIM_API_KEY in a local ignored .env file. Never commit the key, paste it into source, or copy the original lab's populated .env. The model is configurable through NVIDIA_MODEL, provided it uses LiteLLM's nvidia_nim/ prefix.
Both projects use the standard OpenTelemetry Python SDK and OTLP/HTTP exporter. Set OTEL_EXPORTER_OTLP_TRACES_ENDPOINT to the collector endpoint, with the local default:
http://127.0.0.1:6006/v1/traces
The ASGI middleware accepts incoming W3C trace context. The fixtures also create explicit agent/tool/graph spans and attach service metadata. LangGraph enables the standard OpenInference LangChain instrumentation so model/tool spans can be correlated with the graph. If no collector is running, the agents can still run, but trace exports will fail or be dropped according to exporter behavior; OTEL is not required for the card endpoint.
Run these commands from the repository root (a2a-travel-agent-reference). If your shell is elsewhere, first change directory to your cloned repository.
cd adk-travel-agent
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
(cd mcp-runtime && npm ci)
cp .env.example .env
# Edit .env and set NVIDIA_NIM_API_KEY
.venv/bin/adk-a2a-agentCard: http://127.0.0.1:4201/.well-known/agent-card.json
Probe it with the official A2A client:
.venv/bin/adk-a2a-probe --agent http://127.0.0.1:4201Run these commands from the repository root (a2a-travel-agent-reference). If your shell is elsewhere, first change directory to your cloned repository.
cd langgraph-travel-agent
python3 -m venv .venv
.venv/bin/python -m pip install -e '.[dev]'
(cd mcp-runtime && npm ci)
cp .env.example .env
# Edit .env and set NVIDIA_NIM_API_KEY
.venv/bin/langgraph-a2a-agentCards and interfaces:
- JSON representation
- JSON-RPC v1 at
http://127.0.0.1:4202/ - HTTP+JSON v1 at
http://127.0.0.1:4202/rest
Probe it:
.venv/bin/langgraph-a2a-probe --agent http://127.0.0.1:4202Hi
Plan four days in Kyoto for two travelers. Include a realistic local budget.
What time is it now in Tokyo? Use the Time MCP tool.
Read welcome.txt from the isolated test workspace using the Filesystem MCP tool.
The tests are offline surface tests: intent classification, card fields, route creation, parser behavior, sideband opt-in behavior, and fixture paths. They do not prove NVIDIA availability, model quality, live travel-data accuracy, production concurrency, authentication, authorization, persistence, or booking correctness.
Treat every itinerary, price, flight, hotel, weather, and availability statement as untrusted test output. Do not use these agents to make reservations or financial decisions. Add real provider APIs, secrets management, authentication, rate limiting, validation, and a booking backend before considering a production design.
Generated environments (.venv, mcp-runtime/node_modules, caches, and .env) are ignored and intentionally not included in the copied projects.