A telecom call center demo demonstrating end-to-end business process integration across multiple subsystems using the A2A (Agent-to-Agent) Protocol.
A customer calls in via WebRTC. CC-server receives the call event and orchestrates CRM and Billing subsystems via A2A (JSON-RPC 2.0 over HTTP) to complete a full business loop: customer lookup, bill inquiry, AI-powered NBO recommendation, identity verification, and order placement β all surfaced on the agent dashboard in real time.
ASCII version (click to expand)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CC (Call Center) β
β β
β ββββββββββββββββββββββββ WebSocket ββββββββββββββββββββββββββββββββββββββββββββ β
β β CC-client :5172 βββsignalingββββΆβ CC-server :8001 β β
β β (Customer Caller) β β β β
β β β β βββββββββββββββββββββββ β β
β β DialerView β β β WebSocket Signaling β /ws/signal β β
β β ββ DialPad β β β (offer/answer/ICE/ β β β
β β ββ CallStatus β β β call-start/end) β β β
β β ββ VideoStream β β βββββββββββββββββββββββ β β
β β β β βββββββββββββββββββββββ β β
β β useWebRTC composableβ β β A2A Orchestrator β β β
β β signaling.ts (WS) β β β (business flow β β β
β β callStore (Pinia) β β β sequencer) β β β
β ββββββββββββββββββββββββ β βββββββββββββββββββββββ β β
β β βββββββββββββββββββββββ β β
β ββββββββββββββββββββββββ β β Communication Agent β /communication β β
β β CC-gui :5173 ββββWS pushββββββ β skill: β β β
β β (Agent Dashboard) β β β send_notification β β β
β β β POST /order/ β βββββββββββββββββββββββ β β
β β CustomerInfo panel ββββcreateββββββΆβ βββββββββββββββββββββββ β β
β β BillSummary panel β β β REST: POST β β β
β β NBO list + fallback β β β /order/create β β β
β β OrderConfirmation β β βββββββββββββββββββββββ β β
β β NotificationStatus β β β β
β β β β a2a-python SDK client β β
β β useWebRTC composableβ β (all outbound A2A calls) β β
β β signaling.ts (WS) β βββββββββββββ¬βββββββββββ¬βββββββββββββββββββ β
β β callStore (Pinia) β β β β
β ββββββββββββββββββββββββ β β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββΌβββββββββββββββββββββββββ
β β
A2A (JSON-RPC 2.0 / HTTP) β β A2A (JSON-RPC 2.0)
βββββββββββββββββββββββββββββββββββ ββββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββββ
β CRM-server :8002 β β Billing-server :8003 β
β β β β
β ββββββββββββββββββββββββββββββββ β β ββββββββββββββββββββββββββββ β
β β Profiling Agent /profiling β β β β Usage Agent /usage β β
β β skills: β β β β skill: β β
β β query_customer (TMF629) β β β β query_bill (TMF677/678)β β
β β verify_identity (TMF720) β β β ββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββ β β β
β ββββββββββββββββββββββββββββββββ β β SQLite: bills β
β β Recommendation Agent β β β seed.py (auto-init) β
β β /recommendation β β β β
β β skill: β ββββββββββββββ β β a2a-python SDK server β
β β get_nbo (TMF701/620/637) βββΌββΆβ Ollama β β β (agent card + JSON-RPC) β
β β (LLM ranking + fallback) β β or else β β ββββββββββββββββββββββββββββββββββ
β ββββββββββββββββββββββββββββββββ ββββββββββββββ β
β ββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββββ
β β Order Agent /order β β β Billing-gui :5175 β
β β skill: β β β Bill details & β
β β create_order (TMF622) β β β consumption breakdown β
β ββββββββββββββββββββββββββββββββ β β (Vue 3 + Element Plus)β
β ββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββββ
β β AI Management Agent β β
β β /ai-management β β
β β skill: β β
β β get_ai_model_status (TMF915)β β
β ββββββββββββββββββββββββββββββββ β
β β
β SQLite: customers, product_offerings, β
β orders, identities, ai_models β
β seed.py (auto-init) β
β β
β a2a-python SDK server β
β (agent cards + JSON-RPC dispatch) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β CRM-gui :5174 β
β Customer 360 view β
β (profile + orders) β
β (Vue 3 + Element Plus)β
ββββββββββββββββββββββββββ
[CC-client] β WebRTC offer/answer + call-start event
β
βΌ
[CC-server] β Orchestrator + WebRTC signaling relay
β
βββ A2A: query_customer βββββββββββββββββββΊ [CRM-server / Profiling Agent]
β
βββ A2A: query_bill βββββββββββββββββββββββΊ [Billing-server / Usage Agent]
β
βββ A2A: get_ai_model_status (optional) βββΊ [CRM-server / AI Management Agent]
β
βββ A2A: get_nbo βββββββββββββββββββββββββΊ [CRM-server / Recommendation Agent]
β βββ Ollama (qwen2.5:7b)
βββ A2A: verify_identity βββββββββββββββββΊ [CRM-server / Profiling Agent]
β
βββ A2A: create_order ββββββββββββββββββββΊ [CRM-server / Order Agent]
β
βββ A2A: send_notification βββββββββββββββΊ [CC-server / Communication Agent]
β
βΌ
[CC-gui] β Agent dashboard
app/
βββ Billing/
β βββ Billing-server/ # FastAPI β Usage Agent (query_bill) [port 8003]
β βββ Billing-gui/ # Vue 3 β bill details view [port 5175]
βββ CC/
β βββ CC-server/ # FastAPI β orchestrator + WebRTC signaling + Communication Agent [port 8001]
β βββ CC-client/ # Vue 3 β customer WebRTC caller [port 5172]
β βββ CC-gui/ # Vue 3 β agent dashboard + WebRTC receiver [port 5173]
βββ CRM/
βββ CRM-server/ # FastAPI β Profiling, Recommendation, Order, AI Management agents [port 8002]
βββ CRM-gui/ # Vue 3 β customer 360 view [port 5174]
openspec/ # Spec-driven development artifacts
βββ project.md # Full project overview and architecture
βββ AGENTS.md # AI coding assistant instructions and conventions
βββ specs/ # Authoritative specs per subsystem
βββ changes/ # Change proposals and delta specs
| Tool | Version | Install |
|---|---|---|
| Python | 3.11+ | python.org |
| uv | latest | pip install uv |
| Node.js | 18+ | nodejs.org |
| npm | bundled with Node | β |
| Ollama | latest | ollama.com |
Pull the NBO model used by the Recommendation Agent:
ollama pull qwen2.5:7b| Service | Port | Role |
|---|---|---|
| CC-server | 8001 | Orchestrator, WebRTC signaling relay, Communication Agent |
| CC-client | 5172 | Customer-side WebRTC caller (Vue 3 GUI) |
| CC-gui | 5173 | Agent dashboard, WebRTC receiver (Vue 3 GUI) |
| CRM-server | 8002 | Profiling, Recommendation, Order, AI Management agents |
| CRM-gui | 5174 | Customer 360 view (Vue 3 GUI) |
| Billing-server | 8003 | Usage Agent |
| Billing-gui | 5175 | Bill details view (Vue 3 GUI) |
WebRTC signaling: ws://localhost:8001/ws/signal (served by CC-server)
ollama serveEach backend uses uv. Run from the respective server directory:
# CC-server
cd app/CC/CC-server
uv run uvicorn src.main:app --port 8001 --reload
# CRM-server
cd app/CRM/CRM-server
uv run uvicorn src.main:app --port 8002 --reload
# Billing-server
cd app/Billing/Billing-server
uv run uvicorn src.main:app --port 8003 --reloadSeed data is loaded automatically at startup via
seed.py.
Run from each GUI directory:
npm install
npm run dev| GUI | URL |
|---|---|
| CC-client | http://localhost:5172 |
| CC-gui | http://localhost:5173 |
| CRM-gui | http://localhost:5174 |
| Billing-gui | http://localhost:5175 |
- Open CC-gui at
http://localhost:5173β agent dashboard, waiting for a call - Open CC-client at
http://localhost:5172β customer caller - Enter a phone number (e.g.
13800000001) and click Call - CC-client sends a WebRTC offer β CC-server relays it β CC-gui answers β P2P audio/video established
- CC-client sends
call-start { phone }β CC-server runs the A2A business flow:- Looks up customer profile (CRM)
- Queries bill summary (Billing)
- Checks NBO AI model health (CRM)
- Fetches NBO recommendations via Ollama (CRM)
- CC-gui displays: customer info, bill summary, and ranked NBO recommendations
- Agent selects an offer β CC-gui sends
POST /order/createβ CC-server verifies identity, places order, and sends notification - CC-gui displays order confirmation and notification status
| Agent | Endpoint | Skill | TMF API |
|---|---|---|---|
| Profiling Agent | POST /profiling/a2a |
query_customer |
TMF629 / TMF637 |
| Profiling Agent | POST /profiling/a2a |
verify_identity |
TMF720 |
| Recommendation Agent | POST /recommendation/a2a |
get_nbo |
TMF701 / TMF620 |
| Order Agent | POST /order/a2a |
create_order |
TMF622 |
| AI Management Agent | POST /ai-management/a2a |
get_ai_model_status |
TMF915 |
| Usage Agent | POST /usage/a2a |
query_bill |
TMF677 / TMF678 |
| Communication Agent | POST /communication/a2a |
send_notification |
TMF681 |
Agent Cards are discoverable at GET /<agent-prefix>/.well-known/agent.json.
All A2A calls use JSON-RPC 2.0:
{
"jsonrpc": "2.0",
"method": "tasks/send",
"params": { "skill": "<skill_name>", "input": { ... } },
"id": "<uuid>"
}Skill interfaces align with TM Forum Open API data models (TMF620, TMF622, TMF629, TMF637, TMF677, TMF681, TMF701, TMF720, TMF915). Field names and status enumerations follow TMF conventions where practical. See openspec/project.md for the full TMForum field mapping table.
| Layer | Technology |
|---|---|
| Backend language | Python 3.11+ |
| Backend framework | FastAPI |
| A2A protocol | a2a-python SDK library (JSON-RPC 2.0 over HTTP) β agent card serving, skill registration, JSON-RPC dispatch, and A2A client calls |
| LLM backend | Ollama (qwen2.5:7b) |
| Data store | SQLite (per subsystem, demo only) |
| Async HTTP client | httpx (AsyncClient) |
| Backend dependency mgr | uv + pyproject.toml |
| Frontend framework | Vue 3 (Composition API, <script setup>) |
| Build tool | Vite |
| UI library | Element Plus |
| State management | Pinia |
| HTTP client (frontend) | Axios |
| WebRTC | Browser-native RTCPeerConnection (no STUN/TURN) |
| Frontend language | TypeScript |
| Frontend pkg manager | npm |
This project uses OpenSpec spec-driven development. All changes should go through the openspec/ workflow:
- Read
openspec/AGENTS.mdbefore making any changes β it contains critical architecture rules, directory conventions, and the A2A skills registry. - Read
openspec/project.mdfor the full system overview and TMForum alignment tables. - Use
/opsx:propose,/opsx:apply, and/opsx:archiveto manage changes (seeAGENTS.mdfor details).
Markdown files in openspec/ support inline annotation tags processed by Claude Code (see CLAUDE.md):
| Tag | Action |
|---|---|
@claude: <instruction> |
Execute the instruction at that location |
@revise: <requirement> |
Rewrite the adjacent paragraph to meet the requirement |
@expand: <direction> |
Expand and elaborate on the adjacent content |
@delete |
Remove the annotated content block entirely |
@todo |
Mark as incomplete β prompts for input before proceeding |
@discuss: <question> |
Pause for analysis and options before editing |
@keep |
Do not modify this content under any circumstance |
@note: <remark> |
Informational only β preserved, no modification triggered |
Each server seeds its SQLite database at startup with 3 test customers:
| Phone | Customer | Plan |
|---|---|---|
13800000001 |
Customer A | Plan-50G |
13800000002 |
Customer B | Plan-100G |
13800000003 |
Customer C | Plan-200G |
| CC-client (Mobile β Customer Caller) | CC-gui (Desktop β Agent Dashboard) |
|---|---|
![]() |
![]() |


