dograh/docs/voice-agent/qa.mdx
Rushil 96cde1b767
docs: flesh out all 5 voice agent node pages (#556)
* docs: flesh out stub node pages for Global, Start Call, Agent, End Call, QA

Each page was previously a stub (1 sentence or a single <Note>). Now contains:
- Plain-English explanation of what the node does and when it runs
- Fields/configuration reference
- Common mistakes section
- Next Steps with CardGroup links

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: fix heading structure, Warning placement, variable formatting in node pages

- qa.mdx: promote Viewing QA Results from h3 to h2 (was incorrectly nested under Where it sits on the canvas)
- end-call.mdx: move Warning inside Common Mistakes, directly after the bullet it relates to
- start-call/agent/end-call/qa.mdx: wrap bare gathered_context and initial_context in backticks in Card descriptions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: correct node page errors found by cross-checking against live API + DTO

start-call:
- Fix Node Name description (canvas label, not agent spoken name)
- Split Greeting Text and Prompt into separate documented fields (were conflated)
- Add Delayed Start field (real config option, was missing entirely)
- Fix Common Mistakes (remove wrong Agent Name claim)
- Add Pre-recorded Audio note with link

end-call:
- Remove incorrect <Note> claiming one End Call per workflow
- DTO has no max_instances constraint; llm_hint explicitly says multiple are supported
- Fix Common Mistakes to reflect correct guidance (multiple allowed)

agent:
- Add Extracting variables section documenting extraction_enabled, extraction_prompt,
  extraction_variables fields with a concrete example

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: fix field names and QA model against live platform schemas

- qa.mdx: replace fictional criteria-list concept with accurate
  qa_system_prompt field; document default output format (tags, score,
  sentiment, summary); add sampling/duration/voicemail filter settings
- global.mdx: correct prompt-merge order (global prepended, not appended)
- start-call.mdx: update stale "Greeting Prompt" reference in common
  mistakes to match renamed field "Greeting Text"

Verified against live node schemas via Dograh MCP get_node_type.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: fix em dash violations and appended/prepended contradiction

- global.mdx: "silently appended" contradicted "global content first";
  changed to "prepended" for internal consistency and schema accuracy
- qa.mdx: remove two em dashes (hard no per style rules)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: correct node docs against live workflow SDK evidence

- start-call: replace invented fixed edge labels with accurate explanation
  that edge labels and conditions are user-defined; add real examples
- end-call: rename "Final Message" to "Prompt" to match SDK field name
  used in all real workflows; update all references
- global: add Start Call to Add Global Prompt toggle coverage
  (startCall has add_global_prompt: true by default per schema)
- qa: replace informal tag descriptions with actual default tag names
  from the qa_system_prompt schema

All changes verified against live Dograh MCP node schemas and
real workflow SDK code (workflow IDs 7764, 8291).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: flesh out all 5 voice agent node pages with accurate UI fields

Complete rewrite of stub docs for global, start-call, agent, end-call,
and qa nodes. Field names, toggle labels, and section headings now match
the actual Dograh UI exactly. Covers all fields visible in each node
edit panel including Allow Interruption, Add Global Prompt, Delayed Start,
Enable Variable Extraction, Pre-Call Data Fetch, and QA settings table.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: remove Allow Interruption from End Call node

End Call does not expose an Allow Interruption toggle in the UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: address cubic and greptile review comments on node pages

- agent.mdx, end-call.mdx: remove/correct gathered_context claims -
  it is not available in any node's Prompt, only in Webhook payloads
  and the run record (confirmed against context-and-variables.mdx)
- global.mdx: fix appended -> prepended in frontmatter description
  and Common Mistakes (contradicted How It Works section)
- introduction.mdx: update End Call node-type table - multiple End
  Call nodes are supported, not just one
- agent.mdx, end-call.mdx, qa.mdx, start-call.mdx: tag bare code
  fences as text for Mintlify syntax highlighting
- global.mdx, start-call.mdx, agent.mdx, end-call.mdx, qa.mdx:
  convert absolute internal links to relative paths per style guide

* docs: embed video tutorials on all 5 node pages, fix cubic grammar comment

- Add Video Tutorial section (iframe embed) to global, start-call,
  agent, end-call, and qa node pages, matching the pattern already
  used in webhook.mdx
- global.mdx: fix "Global Node contain" -> "Global Node contains" in
  frontmatter description, per cubic review on 09c5ff31

* docs: fix appended/prepended in introduction.mdx node table

Global node's node-type summary still said the prompt is "appended"
after Add Global Prompt is enabled, contradicting the corrected
"prepended" behavior documented everywhere else. Caught by greptile
P1 review on commit b7fe2d0d.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 12:27:17 +05:30

101 lines
5 KiB
Text

---
title: "QA"
description: "QA node allows you to run post-call quality analysis on your Voice Agent runs"
---
## Video Tutorial
<iframe
width="560"
height="315"
src="https://www.youtube.com/embed/-_almqt7uBw"
title="QA Node Tutorial"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerPolicy="strict-origin-when-cross-origin"
allowFullScreen
></iframe>
The QA node runs an LLM quality review on the call transcript after each conversation ends. Use it to score agent performance, flag compliance issues, and surface patterns across calls, without listening to recordings manually.
## When it runs
QA Node runs post-call only. It is not part of the live call flow - it reads the completed transcript after the conversation ends. It has no edges and cannot connect to any other node in the workflow.
This means QA does not affect call behavior. It only measures it.
## Where it sits on the canvas
Add QA Node anywhere on the canvas. It does not need to connect to other nodes - most builders place it off to the side to make clear it is a standalone evaluator. The node runs automatically for every eligible call once the workflow is published.
## Configuring the System Prompt
The core configuration is a single **System Prompt**: instructions to the reviewer LLM that describe how to evaluate each call. The LLM reads the transcript and returns a structured JSON result.
The default prompt already covers common quality dimensions out of the box:
- **Tags**: named issues detected in the transcript. The default tag set includes `DEAD_AIR`, `USER_FRUSTRATED`, `ASSISTANT_IN_LOOP`, `ASSISTANT_REPLY_IMPROPER`, `USER_NOT_UNDERSTANDING`, `HEARING_ISSUES`, `UNCLEAR_CONVERSATION`, `USER_REQUESTING_FEATURE`, `ASSISTANT_LACKS_EMPATHY`, and `USER_DETECTS_AI`
- **Call quality score**: 1-10 rating
- **Overall sentiment**: positive, neutral, or negative
- **Summary**: 1-2 sentence description of the call segment
You can replace the default System Prompt with your own instructions when you need domain-specific evaluation. Write the prompt as instructions to the QA reviewer LLM, and specify the JSON structure you want it to return.
For compliance use cases, for example:
```text
You are a compliance reviewer for a debt collection workflow.
Review the transcript and return a JSON object with the following fields:
- "identity_verified": true or false — did the agent confirm the caller's identity before discussing the account?
- "options_presented": true or false — did the agent offer all three payment options before accepting a decision?
- "tone_score": 1-5 — how calm and professional was the agent throughout?
- "summary": one sentence describing the call outcome.
```
<Tip>
Be specific about what counts as a pass or a valid score. Include the exact behaviors you want the LLM to look for. Vague instructions produce inconsistent results across calls.
</Tip>
## Additional settings
| Setting | Default | What it does |
|---------|---------|--------------|
| Enabled | On | Toggle to disable QA without removing the node |
| Use Workflow's LLM | Off | When on, uses the same LLM configured for the workflow instead of the default QA model |
| Minimum Call Duration (seconds) | 15 | Calls shorter than this are skipped |
| Include Voicemail Calls | Off | When off, voicemail calls are skipped |
| Sample Rate (%) | 100 | Run QA on a percentage of calls rather than all of them |
## Viewing QA Results
After a call completes, the QA analysis runs automatically. You can view the results on the **Run Detail** page for each individual run.
Open a run and scroll to the **QA Analysis** section. The result shows the full JSON output your QA System Prompt requested - tags, scores, sentiment, and summary for the default prompt, or whatever structure you defined.
## Common mistakes
**Expecting QA to affect the live call.** QA Node is read-only at runtime. It evaluates what happened; it does not change what happens.
**Connecting QA Node to other nodes.** QA has no edges. Drawing a connection from QA to another node is not possible - edges will snap back when you try.
**Writing a vague System Prompt.** "Was the agent good?" produces unhelpful scores. Define specific, observable behaviors and the exact JSON fields you want back.
**Not specifying output format.** The LLM follows your instructions, but if you do not specify a return format, the output may be inconsistent across calls. Always describe the exact JSON structure in the System Prompt.
## Next Steps
<CardGroup cols={2}>
<Card title="Agent Node" href="./agent">
Configure the conversation logic that QA evaluates.
</Card>
<Card title="Webhook Node" href="./webhook">
Send call outcomes to external systems after the call ends.
</Card>
<Card title="Context and Variables" href="../core-concepts/context-and-variables">
Learn how `gathered_context` is built during the call.
</Card>
<Card title="End Call Node" href="./end-call">
Configure the final message before the call drops.
</Card>
</CardGroup>