Document call data capture, date validation, and hang-up grace pause
- New "Call Data Capture & Date Validation" section: the six captured fields (full name, phone confirm/alternate, office, reason, insurance log-only, validated preferred date/time), how each is logged, and the per-call calendar injection that drives date pushback. - EndCallProcessor note: HANGUP_DELAY_SECS grace pause; Phase 1 gate result. - .env reference: add HANGUP_DELAY_SECS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
41
CLAUDE.md
41
CLAUDE.md
@@ -36,8 +36,9 @@ The previous build at `/home/tocmo0nlord/avc-phone/` is a working foundation.
|
|||||||
|
|
||||||
**`EndCallProcessor` in `bot.py`** — AVC-side call termination is fully implemented.
|
**`EndCallProcessor` in `bot.py`** — AVC-side call termination is fully implemented.
|
||||||
Watches LLM text stream for closing keywords ("goodbye"), waits for TTS to finish via
|
Watches LLM text stream for closing keywords ("goodbye"), waits for TTS to finish via
|
||||||
`BotStoppedSpeakingFrame`, then pushes `EndTaskFrame` upstream. `TwilioFrameSerializer`
|
`BotStoppedSpeakingFrame`, pauses `HANGUP_DELAY_SECS` (default 4s) so the caller isn't
|
||||||
with `auto_hang_up` drops the carrier leg. This is correct. Zero changes.
|
clipped, then pushes `EndTaskFrame` upstream. `TwilioFrameSerializer` with `auto_hang_up`
|
||||||
|
drops the carrier leg. Verified working in the Phase 1 gate (4/4 clean hang-ups).
|
||||||
|
|
||||||
**Mulaw 8kHz ↔ 16kHz conversion** — handled internally by `TwilioFrameSerializer`.
|
**Mulaw 8kHz ↔ 16kHz conversion** — handled internally by `TwilioFrameSerializer`.
|
||||||
`PIPELINE_SAMPLE_RATE = 16000`, `WIRE_SAMPLE_RATE = 8000` are already set correctly.
|
`PIPELINE_SAMPLE_RATE = 16000`, `WIRE_SAMPLE_RATE = 8000` are already set correctly.
|
||||||
@@ -206,6 +207,7 @@ STREAM_TOKEN=
|
|||||||
|
|
||||||
# Call behaviour
|
# Call behaviour
|
||||||
AGENT_NAME=AVA
|
AGENT_NAME=AVA
|
||||||
|
HANGUP_DELAY_SECS=4.0 # grace pause after the goodbye before dropping the carrier leg
|
||||||
ENABLE_TOOLS=
|
ENABLE_TOOLS=
|
||||||
VAD_CONFIDENCE=0.5
|
VAD_CONFIDENCE=0.5
|
||||||
VAD_MIN_VOLUME=0.3
|
VAD_MIN_VOLUME=0.3
|
||||||
@@ -223,6 +225,41 @@ AB_MODEL_B=
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Call Data Capture & Date Validation
|
||||||
|
|
||||||
|
What AVA collects on a booking call and how it's logged. Driven by the system prompt
|
||||||
|
(`bot.py`) plus a per-call calendar injection; persisted by the post-call extractor
|
||||||
|
(`extract.py` → `practice.py` → Odoo lead).
|
||||||
|
|
||||||
|
### The six captured fields
|
||||||
|
|
||||||
|
| Field | In-call behavior | Logged as |
|
||||||
|
|-------|------------------|-----------|
|
||||||
|
| Full name | Asks for last name if only a first is given | `patient_name` / lead `contact_name` |
|
||||||
|
| Phone | Reads back the caller-ID number; if the caller declines, uses the number they give | `callback_number` (+ `phone_confirmed`) |
|
||||||
|
| Office / city | Asks city/area; never names an office unprompted | folded into `reason` prefix |
|
||||||
|
| Reason | Captured from the conversation | `reason` |
|
||||||
|
| Insurance | **Log only** — asks the plan, never promises/confirms/denies coverage or treatment (even a listed plan); staff verify on callback | `insurance` (note: "log only — staff to verify") |
|
||||||
|
| Preferred date & time | Validated against the calendar (below); confirmed before booking | `preferred_time` + resolved `YYYY-MM-DD` |
|
||||||
|
|
||||||
|
### Date validation
|
||||||
|
|
||||||
|
Each call's system message is injected with an **authoritative 45-day calendar** (today +
|
||||||
|
each upcoming date with its weekday), recomputed per call since the server is long-running
|
||||||
|
(`_date_context()` in `bot.py`). AVA must check any date the caller names against it. On an
|
||||||
|
impossible or weekday/number-mismatched date it pushes back and offers the correct one, e.g.
|
||||||
|
> "Next month, Monday lands on the sixth — would you like to schedule that date?"
|
||||||
|
|
||||||
|
The extractor is also given today's date so it can resolve relative phrasing
|
||||||
|
("next month, Monday") to a concrete `YYYY-MM-DD`; the caller's own words are always kept too.
|
||||||
|
|
||||||
|
**Reliability note:** this is the local 8B model reasoning over injected facts — accurate in
|
||||||
|
testing but not guaranteed turn-to-turn. A deterministic date-resolver tool would harden it,
|
||||||
|
but in-call tools stay off for this model (it leaks JSON). Treat the resolved date as
|
||||||
|
staff-verifiable, not authoritative. Overlaps Phase 2 validation work.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Model Configuration
|
## Model Configuration
|
||||||
|
|
||||||
### Current production model: `activeblue-avc:latest`
|
### Current production model: `activeblue-avc:latest`
|
||||||
|
|||||||
Reference in New Issue
Block a user