尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Live demo: voiceops-1ayi.onrender.com. It runs the offline scripted model with a mocked legacy system, and it is on Render's free plan, so the first load can take about a minute while it wakes up. Use Chrome for the voice mic.
VoiceOps is a working voice and messaging agent for a property manager. It handles resident and prospect conversations over phone, SMS, web chat and email, and completes real operational workflows against a legacy system of record: collections and payment plans, payment links, lease renewals, tour booking and lead follow-up.
The interesting part is everything around the model:
flowchart LR
U[Residents and prospects<br/>phone, SMS, web chat, email] <--> TW[Twilio / browser console]
TW <--> API[VoiceOps agent platform<br/>FastAPI]
API <--> LLM[Claude<br/>or offline scripted model]
API --> PMS[(Legacy property system<br/>system of record)]
API --> DB[(Store: cases, audit log,<br/>outbox, consent, traces)]
API --> HQ[Human escalation queue]
It runs fully offline with no API keys. A deterministic scripted model stands in for the LLM, and the legacy PMS is mocked, so you can demo it anywhere. Set ANTHROPIC_API_KEY to run the same agent on Claude, and add Twilio credentials to take real phone calls.
The original single-file insurance call simulator (v1), with its screenshot and demo video, is in
v1/.
pip install -r requirements.txt
python -m voiceops # console at http://localhost:8000 (mock PMS on :8001)
Open the console in Chrome, pick Maria Lopez · Unit 4B, press Start conversation, click the mic and say "This is Maria Lopez in unit 4B. Can I split my balance into three payments?"
| Run with | How |
|---|---|
| Offline (default) | nothing to configure; the scripted model drives the same tools and guardrails |
| Claude | export ANTHROPIC_API_KEY=... (optional: VOICEOPS_MODEL=claude-sonnet-5-5, VOICEOPS_EFFORT=low|medium) |
| Real phone + SMS | Point a Twilio number's voice webhook at POST {PUBLIC_BASE_URL}/twilio/voice and SMS at /twilio/sms; set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER, PUBLIC_BASE_URL (e.g. an ngrok URL). Signatures are validated when the auth token is set. |
| Frozen clock for demos | VOICEOPS_NOW=2026-10-27T10:00:00-07:00 (quiet hours and dates become reproducible) |
python -m pytest -q # 40 unit tests
python -m voiceops.evals # 17 eval scenarios, offline
python -m voiceops.evals --provider claude --trials 3 # the real agent, pass^k over 3 trials
python -m voiceops.evals --compare evals/baseline.scripted.json # regression gate (CI)
The interview walkthrough is in docs/DEMO.md. Design notes are in docs/ARCHITECTURE.md.
render.yaml is a Render Blueprint for one web service that runs both the agent platform and the mock legacy PMS. In Render, choose New > Blueprint, pick this repo, and fill in the secrets it asks for:
DEMO_PASSWORD (recommended): puts the console and API behind basic auth, with any username. Twilio webhooks stay open and are checked by signature instead.ANTHROPIC_API_KEY (optional): without it the offline scripted model runs.PUBLIC_BASE_URL, TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER (optional): for real calls and texts. Set PUBLIC_BASE_URL to the service's https://….onrender.com URL, then point the Twilio number's voice webhook at /twilio/voice and its messaging webhook at /twilio/sms.Demo data lives in SQLite on the instance's disk, so it resets on each deploy or restart. That suits a demo. The free plan also sleeps when idle, so open the URL a minute before you share your screen.
flowchart LR
subgraph Channels
V[Voice: browser mic / Twilio] --> R
S[SMS: Twilio / simulator] --> R
W[Web chat] --> R
E[Email inbound] --> R
end
R[Resolve contact to open case<br/>shared across channels] --> P[Redact card numbers / SSNs]
P --> H{Hard triggers<br/>emergency, opt-out, legal,<br/>dispute, human request}
H -- yes --> X[Escalate / reply<br/>no model call]
H -- no --> L[Model + tools loop<br/>budgets, traced]
L --> T[Tool layer<br/>verification, scope, policy,<br/>confirmation check]
T --> C[PMS client<br/>auth, retries, breaker,<br/>validation, outbox]
C --> PMS[(Legacy PMS<br/>system of record)]
T --> A[(Audit log<br/>hash-chained)]
L --> G[Output guard<br/>no account data before verification]
G --> O[Reply on the same channel]
| What the role needs | Where it lives |
|---|---|
| Agents that complete workflows and write to a system of record with an audit trail | agent/tools.py (prepare/commit writes), store.py (hash-chained audit log) |
| Shared state across voice, SMS, web chat and email | agent/runtime.py conversation_for + contact index, history rebuilt per turn in agent/prompts.py |
| Compliant outbound for collections, abandoned applications, leads and renewals | campaigns.py |
| Guardrails for payments and tenant records (confirmation, idempotency, scope, escalation) | agent/guardrails.py, agent/tools.py, tests in tests/test_guardrails.py |
| Legacy API integration (auth, retries, timeouts, validation, durable writes) | integrations/pms_client.py against |
voiceops/
agent/ runtime loop, tools, guardrails, prompts, retrieval, Claude + scripted models
integrations/ legacy PMS client, Twilio helpers
legacy_pms/ mock vendor API with fault injection (the system of record)
campaigns.py outbound workflows + compliance gate
store.py agent-side state: conversations, audit log, outbox, consent, traces
server.py channel webhooks + console API
evals.py eval runner and regression gate
config/ per-org policy and handbook
evals/ scenarios, baseline, reports
web/console.html operator console (voice via Web Speech API)
tests/ unit tests, including a misbehaving-model suite
docs/ interview demo script and design notes
render.yaml one-click Render deployment
v1/ the original single-file insurance call simulator
verify_identity, and an output guard blocks account figures in replies to unverified callers.TWILIO_AUTH_TOKEN is set. The console API has no auth: it is a local demo tool and must not be exposed publicly as-is.legacy_pms/app.py| Evaluation sets, regression runs, tracing, operational metrics | evals/scenarios.yaml, evals.py, tracing.py, metrics.py, CI |
| Tool calling, RAG, structured outputs, context management | strict JSON-schema tools, agent/knowledge.py (policy retrieval), prompt caching + compacted history in agent/prompts.py |
| Telephony, messaging providers, PCI-scoped payments, consent | integrations/twilio.py, payment links instead of card capture, consent table and STOP handling |
| Tenant-specific configuration | config/orgs/harborview.json and config/knowledge/harborview.md |