Dev to main, 7th Sep, 2026 - #848
Merged
Merged
Conversation
…its checker A voice call is selected by six conditions at once, and a span that misses any one of them is absent from the Voice tab while remaining a perfectly healthy trace. The text recipe cannot cover it: its gate set opens on "at least one LLM span", which a pulled provider call never has. New page, same contract as instrument-and-verify.mdx section for section, plus public/fi_verify_voice.py: twelve gates, a conversation-shaped preflight, and a capture that wraps the exporter rather than a span processor, because traceai-livekit rewrites attributes inside export().
Both listings taught fi_span_kind="agent". The Voice tab lists a conversation-typed span with no parent, so the page's own example produced a call that appears in Traces and in no voice surface at all.
…e up the sidebar The page listed Vapi and Retell. The product also pulls ElevenLabs, Bland.ai and Twilio, each with its own parser, and the page itself was unreachable from the sidebar. Adds both sidebar entries: this page under Observability > Guides, and the new voice recipe beside Instrument and Verify.
All three are 3024x1890 full-window dark, taken off the same run as the printed gate output (call ID 1965f5ba, session call_355937e9c818), annotated to the same house spec as the text recipe's three. The list shot carries the point the page is really about: the row is the conversation span itself, so opening it after session.start() costs you the row. The detail shot says out loud why Duration, Latency, User / AI and Silence are blank on a text-mode run. The attributes shot is the Attributes tab filtered to transcript, which is the only place the three transcript keys are visible side by side. The old call-detail.png came off an earlier run and showed a different call ID and a different answer than the transcript printed above it. Replaced. The last line of the printed read-back is now the assistant's answer verbatim, punctuation included, so the block and the screenshot say the same thing.
Run end to end against api.futureagi.com by an agent with no context but the page URL and a key file. It reached GREEN on the first pass, and everything below is something it had to work out for itself on the way. - The Install listing never created `observability/__init__.py` or `observability/futureagi/__init__.py`, which the tree diagram lists but no command produced, so both track listings fail to import until you guess it. - No virtualenv anywhere, while every command says `python`. System python on macOS is 3.9 and a bare `pip install` is refused outright, so the first listing on the page cannot run as written. One venv line fixes both. - Step 6 ran `agent.py` with one ask and the result block below it reports the two-ask default: 4 turns, 16 spans, unreachable from the page's own command. - `LLM_API_KEY` existed only inside `agent.py`. The export block that sets up the run never named it, and the prose only said "one model key". - The example calls Groq by default through a variable named `OPENAI_BASE_URL`, which the page never said out loud. - Two step cross-references were wrong: the conversation span is opened in Step 3, not Step 5, and the checker is downloaded in Install, not Step 1. - `.fi_verify/` is relative to the working directory, so preflight and check run from different places fail with a reason that names neither. Now a troubleshooting row. - Said which track the end-to-end walkthrough is, since it is SDK only.
Providers: only Vapi, Retell and Bland.ai are selectable in Connect a provider. ElevenLabs is commented out of VOICE_CHAT_PROVIDERS and Twilio never reaches the dropdown, so both come out of the page, the feature page and its description. Also: the Colab and GitHub badge row with code-repo-url, the sidebar item matched to the page title, the card added to the platform hub with the count bumped to 9, one forward link instead of two, a heading rename, and the printed transcript trimmed before the dash.
The row read futureagi.preflight, which is not a span name that exists: the span is futureagi.voice.preflight, and the trace list drops the middle segment when it renders the name. Same project, same seven calls, probe trace excluded, so the shot now shows one row per call as its caption says.
…y-voice docs(cookbook): add the voice-agent instrument-and-verify recipe and its checker
The preflight span carried a hardcoded traceId and spanId, and fi_verify.py carries the same pair. The span store replaces on (project_id, observation_type, service_name, hour, trace_id, id), so two probes in one project and hour collapse to one row: run both checkers against the same project and only one preflight survives, which is exactly what the trace-list capture caught. Fresh ids per send.
…ue-ids fix(checker): give each voice preflight its own trace and span id
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Promotion PR. Everything in it is already reviewed and merged to
devin #844; this moves it tomainso it deploys to prod.devis 8 commits ahead ofmainand all 8 are that one page, so this ships exactly the voice cookbook and nothing else:cookbook/quickstart/instrument-and-verify-voiceand the three captures it embedspublic/fi_verify_voice.py, which the page's install block tells the reader tocurlWhy it needs its own PR
Merging to
devdoes not publish. Right nowdocs.futureagi.com/docs/cookbook/quickstart/instrument-and-verify-voiceanddocs.futureagi.com/fi_verify_voice.pyboth return404, so the page is live on dev and invisible in prod, and the checker the page tells you to download does not exist yet.That checker
404is the one thing #844 shipped knowing it could not fix from inside itself. This is the PR that fixes it.Note
The head of this PR is
dev, so it carries whateverdevholds when it merges. #847 is a two-line fix to the same checker; if it lands indevfirst, this promotion picks it up with no action needed here.