AassemD/acme-bank-concierge
Acme Bank Concierge — demo agent for Vidimus
A multi-agent banking customer-service assistant, built on Google ADK with MCP tools and DeepSeek-V3.1 (open-source, via OpenRouter's free tier) as the underlying LLM. Designed as the target for Vidimus's end-to-end test harness — every "planted weakness" below is something Vidimus's probes or evidence flow is expected to catch.
The LLM is swappable via the LLM_MODEL env var — see agents/llm.py for free-tier alternatives (Qwen3, Llama 3.3, DeepSeek-R1).
Architecture
┌─────────────────────────────┐
│ POST /chat (FastAPI) │
└───────────────┬─────────────┘
│
┌─────────▼─────────┐
│ account_concierge │ root LlmAgent
│ (routes intent) │
└─────┬───┬───┬───┬─┘
│ │ │ │
┌────────────────┘ │ │ └──────────────────┐
│ ┌─────┘ └─────┐ │
▼ ▼ ▼ ▼
balance_ disputes_ refunds_ escalation_
specialist specialist specialist specialist
│ │ │ │
└──── MCP toolset (stdio) ─────┴────────────────┘
│
┌───────────▼────────────┐
│ mcp_server/server.py │
│ banking tool surface │
└─────────────────────────┘- Root (
account_concierge) — greets, identifies intent, delegates. - Sub-agents — each owns one workflow and only the tools it needs.
- MCP server — single stdio process exposing the bank's tools. Spawned by ADK's
MCPToolseton first call; lives for the container's lifetime.
Local dev
cd demo-agent
python -m venv .venv
. .venv/Scripts/activate # PowerShell: .\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
cp .env.example .env # then fill in OPENROUTER_API_KEY
python app.pyThen in another shell:
curl -s -X POST http://localhost:8080/chat \
-H "content-type: application/json" \
-d '{"messages":[{"role":"user","content":"hi, what is my balance? my account is AC-100001"}]}' | jqDeploy to Cloud Run (Paris / Brussels)
export OPENROUTER_API_KEY=... # from https://openrouter.ai/keys (free)
export DEMO_AGENT_TOKEN=$(openssl rand -hex 16)
gcloud config set project <your-gcp-project>
./deploy_cloud_run.shThe script prints the public Cloud Run URL on success. Region defaults to europe-west1 (Belgium); override with REGION=europe-west9 for Paris.
Vidimus agent-intake config
After deploy, paste the following into Vidimus's New Agent form so its test harness can call this service:
Vidimus's classifier should mark this customer-facing + financial-impact
- critical, which will pull in Art 5, 9, 12, 13, 14, 15, 16 obligations.
Planted weaknesses (Vidimus is expected to find these)
The risk_management and documentation gaps are evidence_required in Vidimus — they can't be verified by chat probes alone. To clear those, upload a (fake) risk-management policy document via Vidimus's evidence-upload flow; the document verifier will grade it and the proof report should flip the obligations from needs-action to document-verified.
Updating the demo
- New planted weakness → edit the sub-agent's
instructionstring + add a row to the table above. - New tool → add it to
mcp_server/server.py, wire it into the agent that should own it viatools=[toolset_for(...)]. - Swap the LLM → set
LLM_MODELenv var to any LiteLLM-supported model id (e.g.openrouter/qwen/qwen3-235b-a22b:free,openrouter/meta-llama/llama-3.3-70b-instruct:free). No code change.
