Cloned voices on agents; GET /v1/agents/voices paginates; response_delay_seconds on every stack; per-subagent KB scope
Cloned voices on agents; GET /v1/agents/voices paginates; response_delay_seconds on every stack; per-subagent KB scope
Your workspace’s cloned voices can now be assigned to voice agents
A voice agent can now use any voice your workspace cloned. The voice picker lists them alongside the curated shared catalogue, marked type: "personal", and POST/PATCH /v1/agents accepts their slugs.
Only workspace-owned clones are selectable — a personal voice scoped to an individual stays invisible to agents, which are workspace-shared resources. The same ownership gate applies here as on GET /v1/voices: a clone is usable on an agent exactly when it appears in your TTS voice catalogue.
GET /v1/agents/voices now returns:
Both can be assigned to an agent. The AgentVoiceType enum is documented as an open set — new values may be added, so branch on the ones you know and fall through for the rest.
GET /v1/agents/voices is now cursor-paginated
The endpoint now supports cursor and limit parameters. Walk pages while has_more is true. The shared catalogue is served first, then your cloned voices.
Version gate: From API version 2026-08-07 an omitted limit returns the first page (default 50, max 200). Callers pinned before that date keep the historical whole-catalogue response until they pass an explicit limit or cursor.
Pass cursor or limit to paginate regardless of your pinned version. The version only controls what an omitted limit means.
Pagination parameters:
Response carries next_cursor and has_more via the standard PaginationMeta shape.
Workspaces with a very large cloned library benefit most. The shared catalogue is bounded, but your cloned scope can grow arbitrarily — pagination ensures the full set is walkable.
response_delay_seconds now applies on every STT stack
response_delay_seconds on an agent is now a minimum-silence floor before the agent replies, honoured on every turn of every STT stack. Previously only stacks using voice-activity endpointing read it; stacks using semantic turn detection ignored it silently. Raise it to stop the agent talking over a caller who pauses mid-sentence, or over an IVR menu that breaks between options — it is a floor on listening, not a pause before speaking, so it adds to how long every reply takes to arrive.
null now means turn detection decides the wait: about 0.3s when it is confident the caller finished, up to ~1.2s when it is not.
This is a behaviour change for any agent that already set the field. A semantic-stack agent carrying a response_delay_seconds value was ignoring it and will now honour it on every turn. Set the field back to null to restore turn-detector-decides behaviour. The conversation agent_snapshot field is redescribed to match: it now records the minimum silence the agent actually waited for, null meaning turn detection decided.
Scope knowledge-base search per subagent node
A subagent flow node now takes an optional knowledge_base_filter: an array of attached knowledge-base ids (kb_…) that restricts which of the agent’s attached KBs a search_knowledge call may consult while that node is active. Empty or absent means the full attached set, so an existing flow is unchanged. Enforcement is server-side — the control plane intersects the filter with the KBs actually attached to the conversation’s agent, so a filter can only ever narrow, never reach a KB the agent is not attached to. Referenced ids are validated at PutFlow and Publish.
Wire-shape change on the retrieval log. GET /v1/agents/conversations/{conversation_id}/retrieval-log rows gain two fields, both now required:
A client that decodes the retrieval-log response against a strict schema must add both fields.