This guide shows the quickest way to make Yova work with n8n using a streaming webhook flow.
It describes the n8n setup used by the example connector bundled with Yova (yova-api-n8n), but you can implement your own connector as long as it sends compatible payloads and handles streamed responses.
It focuses on:
- what to put in
yova.config.json - which n8n nodes to use
- how to configure node options for low-latency streaming
- how to connect nodes correctly
Official n8n docs: https://docs.n8n.io/
Set the n8n section first:
{
"n8n": {
"webhook_url": "https://<your-n8n-host>/webhook/<webhook-id>",
"auth_header_name": "Authorization",
"auth_header_value": "<same value as n8n Header Auth>",
"timeout_seconds": 120,
"stream": true,
"session_switch_threshold_seconds": 30,
"include_hmmm_chunk": true,
"thinking_delay_seconds": 2.0,
"extra_payload": {}
}
}Important:
webhook_urlmust be the production webhook URL from n8n (workflow is Active).auth_header_nameandauth_header_valuemust exactly match the Webhook Header Auth credential in n8n (if enabled).streamshould staytrueto let Yova consume streamed chunks.
Use this minimal node set:
WebhookSet(rename it toEdit Fields)AI AgentRespond to Webhook
flowchart LR
A[Webhook] --> B[Set / Edit Fields]
B --> C[AI Agent]
C --> D[Respond to Webhook]
- HTTP Method:
POST - Authentication:
Header Auth(recommended) - Response Mode:
Streaming - Webhook path: any unique path/id
If you use Respond to Webhook, ensure webhook response behavior is set to use that node (not "last node finishes").
Yova sends data in body, so map fields to root:
sessionId={{ $json.body.sessionId }}chatInput={{ $json.body.chatInput }}
Enable Include Other Fields if you want headers/query kept for debugging.
- Enable streaming in node options.
- Configure the LLM in the node according to your n8n setup.
- Respond With: all incoming items
- Enable Streaming:
true
This keeps the HTTP connection open and pushes chunks as they are generated.
Main chain:
Webhook->Set (Edit Fields)->AI Agent->Respond to Webhook
For best responsiveness, enable streaming in all three places:
Webhookresponse mode = streamingAI Agentstreaming enabledRespond to Webhookstreaming enabled
Also check infrastructure:
- Reverse proxy/CDN must not buffer streaming responses.
- Keep request timeout high enough (
n8n.timeout_secondsin Yova). - Use a stable network path between Yova host and n8n.
With streaming enabled, n8n does not wait for the full AI response before replying.
Instead, it keeps the webhook HTTP connection open and sends partial output chunks as they are produced by the AI Agent.
Respond to Webhook forwards those chunks immediately, and closes the response when generation is complete.
Yova reads these chunks progressively, so TTS can start speaking earlier and perceived latency is lower.
Yova sends:
{
"chatInput": "hello",
"sessionId": "user-or-anonymous"
}extra_payload values from Yova config are merged into the same body.
After activating the workflow:
- Copy the production webhook URL.
- Put it into
n8n.webhook_urlinyova.config.json. - Restart
yova-api-n8n. - Send speech input to Yova and confirm chunks are returned progressively.
403 authorization-> header name/value mismatch between Yova and n8n Header Auth.No streaming-> one of the three streaming toggles is off (Webhook, AI Agent, Respond).Agent gets empty input-> missingSetmapping frombody.chatInputandbody.sessionId.