The conversation analytics guide (/docs/platform/ai/analytics) teaches readers to read eleven per-turn fields that the generated AI webhook reference does not document:
eos_to_push_latency speaking_to_turn_detection merge_count
stamps_us turn_detection_to_final_event execution_latency
first_audio text_spoken_total function_latency
last_word_end text_heard_approx
All eleven are real and were verified against the engine source. They arrive on a metadata object attached to each conversation log entry, where stamps_us is itself a nested object holding first_audio and last_word_end. Which fields are present depends on the entry: merge_count appears on merged caller turns, text_spoken_total and text_heard_approx on interrupted responses, and execution_latency / function_latency on tool entries.
AICallLogEntry in specs/signalwire-rest/webhooks/ai/models/common.tsp:127 models only role, content, timestamp, and tool_calls. It has no metadata member at all. Because the model is declared is Record<unknown>, the undocumented fields pass validation silently rather than failing the build, which is why the gap went unnoticed.
The practical effect: a reader following the analytics guide's link to look one of these up does not find it.
What to do
- Add a
metadata model to AICallLogEntry, covering these fields and noting which apply to caller turns, agent responses, and tool entries.
- Run
yarn build:specs and commit the regenerated fern/apis/signalwire-rest/openapi.yaml alongside the TypeSpec source.
- Once it lands, the analytics guide's "documents the callback's core fields" can go back to promising the complete payload.
Precise engine source references are available on request rather than in a public issue.
The conversation analytics guide (
/docs/platform/ai/analytics) teaches readers to read eleven per-turn fields that the generated AI webhook reference does not document:All eleven are real and were verified against the engine source. They arrive on a
metadataobject attached to each conversation log entry, wherestamps_usis itself a nested object holdingfirst_audioandlast_word_end. Which fields are present depends on the entry:merge_countappears on merged caller turns,text_spoken_totalandtext_heard_approxon interrupted responses, andexecution_latency/function_latencyon tool entries.AICallLogEntryinspecs/signalwire-rest/webhooks/ai/models/common.tsp:127models onlyrole,content,timestamp, andtool_calls. It has nometadatamember at all. Because the model is declaredis Record<unknown>, the undocumented fields pass validation silently rather than failing the build, which is why the gap went unnoticed.The practical effect: a reader following the analytics guide's link to look one of these up does not find it.
What to do
metadatamodel toAICallLogEntry, covering these fields and noting which apply to caller turns, agent responses, and tool entries.yarn build:specsand commit the regeneratedfern/apis/signalwire-rest/openapi.yamlalongside the TypeSpec source.Precise engine source references are available on request rather than in a public issue.