Skip to content

Commit ee3ebee

Browse files
Merge branch 'main' into docs/assemblyai-universal-3-6-pro
2 parents ff2d035 + b66e4f2 commit ee3ebee

9 files changed

Lines changed: 64 additions & 64 deletions

File tree

‎fern/changelog/2026-09-28.mdx‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# What's New: Week of September 28, 2026
2+
3+
1. **Composer Per-Conversation Approval Modes**: [Composer](/composer) now lets you choose when each conversation pauses for approval: ask before all changes, allow creates but ask before updates, deletes, runs, or publishing, bypass approvals entirely, or set custom permissions by resource and action.
4+
5+
2. **Eval Run History**: You can now browse your complete [Eval run history](/observability/evals-quickstart#view-run-history) with search and pagination, and share a specific run result by URL.
6+
7+
3. **Fixes and Improvements**:
8+
- **Call logs**: The logs table now shows clearer, deterministic error messages for 4xx responses instead of retrying unnecessarily, and the date picker now lets you select the full retention window.
9+
- **Voice fallback**: xAI terminal voice failures raised before a call starts are now delivered, the fallback voice no longer greets out of turn, and replacing a voice no longer consumes a second fallback.

‎fern/composer.mdx‎

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -173,49 +173,42 @@ Composer understands voice agent architecture and Vapi's capabilities. It can cr
173173

174174
## Safety features
175175

176-
Composer includes safeguards to prevent accidental or irreversible changes to your account.
176+
Composer includes safeguards to prevent accidental or irreversible changes to your account. You control how much Composer can do on its own with per-conversation approval modes.
177177

178-
### No deletion capability
178+
### Approval modes
179179

180-
Composer **cannot delete any resources** — assistants, tools, phone numbers, squads, files, or anything else. This is a deliberate safety measure, not a limitation.
180+
You choose when Composer pauses for your approval, and the setting persists for that conversation:
181181

182-
If you ask Composer to delete something, it directs you to do it yourself:
182+
- **Ask before every change**: Composer requests approval for all creates, updates, deletes, runs, and publishes.
183+
- **Ask before updates, deletes, runs, and publishing**: Composer creates new resources on its own, but asks before changing, deleting, running, or publishing anything that already exists.
184+
- **Bypass approvals**: Composer applies changes without pausing.
185+
- **Custom**: set permissions for each resource and action individually.
183186

184-
```txt title="Deletion request example"
185-
You: "Delete my old test assistant"
187+
Approval enforcement always happens on the server, and read operations never require approval.
186188

187-
Composer: "I'm not able to delete resources to prevent accidental data loss.
188-
You can delete it yourself from the dashboard — use the sidebar on the left,
189-
go to Assistants, select the one you want to remove, and delete it from there."
190-
```
191-
192-
<Note>
193-
Unlike creating or updating a resource (which can be undone or re-done), deletion is permanent. Requiring manual confirmation through the dashboard UI prevents accidental loss of important configurations.
194-
</Note>
195-
196-
### Approval required for updates
189+
### Deletion
197190

198-
When Composer modifies an existing resource (like updating an assistant's prompt, changing a voice setting, or editing a tool configuration), it pauses and asks for your explicit approval first.
191+
Composer can delete resources such as assistants, tools, phone numbers, squads, and files. Deletion follows your approval mode: unless you have selected Bypass, Composer asks for your explicit approval before it deletes anything. Because deletion is permanent, keep an approval mode on if you want a confirmation step before a resource is removed.
199192

200-
**How the approval flow works:**
193+
### How the approval flow works
201194

202195
<Steps>
203196
<Step title="Composer proposes a change">
204-
Composer shows you a summary of the update it wants to make.
197+
Composer shows you a summary of the change it wants to make.
205198
</Step>
206199
<Step title="You review and respond">
207200
The chat interface displays **Approve** and **Deny** buttons. Click **Approve** to proceed or **Deny** to cancel.
208201
</Step>
209202
<Step title="Composer applies the change (if approved)">
210-
If approved, Composer makes the update and confirms. If denied, no changes are made.
203+
If approved, Composer makes the change and confirms. If denied, no changes are made.
211204
</Step>
212205
</Steps>
213206

214207
```txt title="Approval flow example"
215208
You: "Change my agent's voice to sound more energetic"
216209
217210
Composer: [Proposes update]
218-
→ UI shows: "Update Resource — Updating voice settings on assistant xyz"
211+
UI shows: "Update Resource, updating voice settings on assistant xyz"
219212
[Approve] [Deny]
220213
221214
You: [Clicks Approve]
@@ -226,10 +219,9 @@ know if you'd like to adjust further."
226219

227220
**Key details about approvals:**
228221

229-
- **Tokens expire after 10 minutes** — if you don't respond in time, Composer needs to re-propose the change
230-
- **Each approval is specific** — approval tokens are cryptographically bound to the exact change being made; multiple updates each require individual approval
231-
- **Read operations don't require approval** — Composer can freely read and list your resources without permission
232-
- **Creating new resources doesn't require approval** — new assistants, tools, and other resources are additive and non-destructive
222+
- **Tokens expire after 10 minutes**: if you don't respond in time, Composer re-proposes the change.
223+
- **Each approval is specific**: approval tokens are cryptographically bound to the exact change being made, so multiple changes each require individual approval.
224+
- **Read operations don't require approval**: Composer can freely read and list your resources.
233225

234226
## Tips for best results
235227

‎fern/observability/evals-quickstart.mdx‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,12 @@ For API details, see [Delete Eval](/api-reference/eval/delete).
11361136
- Target (assistant/squad)
11371137
- Status (pass/fail)
11381138
- Duration
1139-
4. Click any run to view detailed results
1139+
4. Search and paginate through your complete run history to find older runs
1140+
5. Click any run to view detailed results
1141+
1142+
<Tip>
1143+
To share a result, open a run and copy its URL. Anyone with access to your organization can open the link to view that same result, including older runs outside the current page.
1144+
</Tip>
11401145
</Tab>
11411146

11421147
<Tab title="cURL">

‎fern/observability/logs/call-logs.mdx‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,19 @@ This tab shows the stored conversation-message objects for the call, in order. A
9797

9898
Use this tab to inspect the message data retained for the call. The objects are not necessarily the exact payloads sent to or returned by the model provider. The stored history depends on your artifact configuration.
9999

100+
### Function and API Request tools
101+
102+
Use **Messages** to inspect a tool call and its result. Use the call's **Logs** tab to inspect request and response details when the assistant's **Logging** setting is enabled.
103+
104+
| Tool type | Where to inspect | Correlation details |
105+
| --- | --- | --- |
106+
| Function | Open **Logs → Webhooks** and find the `tool-calls` entry. Use the call's **Messages** tab to inspect the tool call and result. | The webhook includes the call and tool-call IDs. Vapi also sends the call ID in the `X-Call-Id` header. |
107+
| API Request | Open the call's **Logs** tab for the resolved request and response. Use **Messages** to inspect the tool call and result. | Vapi sends the call ID in the `X-Call-Id` header. Your destination can return its own `requestId` for its server logs. Vapi does not add `toolCallId` to the destination request by default. |
108+
109+
The **Logs → API** tab records requests made to the Vapi API. It does not show requests that an API Request tool sends to your destination.
110+
111+
For an async Function tool, Vapi returns an immediate `Success.` result to the assistant and ignores the webhook's later result. Open **Logs → Webhooks** to inspect the webhook response after it finishes. Detailed entries in the call's **Logs** tab depend on the assistant's **Logging** setting. See [Logs overview](/observability/logs/overview#retention-and-logging-configuration) for retention and compliance limits.
112+
100113
### Call Cost
101114

102115
When available, the **Call Cost** tab shows the call's total cost, duration, and per-category breakdown. The tab may be hidden for organizations with invoiced billing. Contact your account team for cost details that reflect your agreement.

‎fern/openai-realtime.mdx‎

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ OpenAI’s Realtime API enables developers to use a native speech-to-speech mode
1717

1818
## Available models
1919

20-
OpenAI offers three realtime models, each with different capabilities and cost/performance trade-offs:
20+
The model picker offers three OpenAI realtime options:
2121

22-
| Model | Status | Best For | Key Features |
23-
|-------|---------|----------|--------------|
24-
| `gpt-realtime-2025-08-28` | **Production** | Production workloads | Production Ready |
25-
| `gpt-4o-realtime-preview-2024-12-17` | Preview | Development & testing | Balanced performance/cost |
26-
| `gpt-4o-mini-realtime-preview-2024-12-17` | Preview | Cost-sensitive apps | Lower latency, reduced cost |
22+
| Dashboard option | Model ID | Guidance |
23+
|------------------|----------|----------|
24+
| GPT Realtime Cluster | `gpt-realtime-2025-08-28` | Existing assistants |
25+
| GPT Realtime Mini | `gpt-realtime-mini-2025-12-15` | Cost-sensitive assistants |
26+
| GPT Realtime 2 | `gpt-realtime-2` | Recommended for new assistants |
2727

2828
## Voice options
2929

@@ -66,7 +66,7 @@ The tool's `body` schema defines the `location` argument the model supplies. For
6666
{
6767
"model": {
6868
"provider": "openai",
69-
"model": "gpt-realtime-2025-08-28",
69+
"model": "gpt-realtime-2",
7070
"messages": [
7171
{
7272
"role": "system",
@@ -112,7 +112,7 @@ const vapi = new VapiClient({ token: apiKey });
112112
const assistant = await vapi.assistants.create({
113113
model: {
114114
provider: "openai",
115-
model: "gpt-realtime-2025-08-28",
115+
model: "gpt-realtime-2",
116116
messages: [{
117117
role: "system",
118118
content: "You are a concise, friendly weather assistant. If the caller has not provided a location, ask for one. If the city is ambiguous, ask for the missing region or country before using getWeather. Call getWeather for each new current-weather request, including a request for another city. Pass the complete location, preserving any region/state and country the caller supplied. Use only the latest successful result for the requested location and report the returned location with the weather. If the returned city, region, or country conflicts with the request, clarify before reporting weather. Differences in spelling or formatting alone are not a location mismatch. If the lookup fails or current-weather data is missing, explain that current weather is unavailable. Do not invent weather or reuse an earlier result after a failed lookup."
@@ -154,7 +154,7 @@ vapi = Vapi(token=os.getenv("VAPI_API_KEY"))
154154
assistant = vapi.assistants.create(
155155
model={
156156
"provider": "openai",
157-
"model": "gpt-realtime-2025-08-28",
157+
"model": "gpt-realtime-2",
158158
"messages": [{
159159
"role": "system",
160160
"content": "You are a concise, friendly weather assistant. If the caller has not provided a location, ask for one. If the city is ambiguous, ask for the missing region or country before using getWeather. Call getWeather for each new current-weather request, including a request for another city. Pass the complete location, preserving any region/state and country the caller supplied. Use only the latest successful result for the requested location and report the returned location with the weather. If the returned city, region, or country conflicts with the request, clarify before reporting weather. Differences in spelling or formatting alone are not a location mismatch. If the lookup fails or current-weather data is missing, explain that current weather is unavailable. Do not invent weather or reuse an earlier result after a failed lookup."
@@ -311,7 +311,7 @@ Transitioning from standard STT/TTS to realtime models:
311311
{
312312
"model": {
313313
"provider": "openai",
314-
"model": "gpt-realtime-2025-08-28" // Changed from gpt-4
314+
"model": "gpt-realtime-2"
315315
}
316316
}
317317
```
@@ -336,32 +336,6 @@ Transitioning from standard STT/TTS to realtime models:
336336

337337
## Best practices
338338

339-
### Model selection strategy
340-
341-
<AccordionGroup>
342-
<Accordion title="When to use gpt-realtime-2025-08-28">
343-
**Best for production workloads requiring:**
344-
- Structured outputs for form filling or data collection
345-
- Complex function orchestration
346-
- Highest quality voice interactions
347-
- Responses API integration
348-
</Accordion>
349-
350-
<Accordion title="When to use gpt-4o-realtime-preview">
351-
**Best for development and testing:**
352-
- Prototyping voice applications
353-
- Balanced cost/performance during development
354-
- Testing conversation flows before production
355-
</Accordion>
356-
357-
<Accordion title="When to use gpt-4o-mini-realtime-preview">
358-
**Best for cost-sensitive applications:**
359-
- High-volume voice interactions
360-
- Simple Q&A or routing scenarios
361-
- Applications where latency is critical
362-
</Accordion>
363-
</AccordionGroup>
364-
365339
### Performance optimization
366340

367341
- **Temperature settings**: Use 0.5-0.7 for consistent yet natural responses

‎fern/providers/model/openai.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ For additional API configuration options, review the [`OpenAIModel` fields](/api
4848
| GPT 4.1 | `gpt-4.1` |
4949
| GPT 4.1 Mini | `gpt-4.1-mini` |
5050
| GPT 4o Mini | `gpt-4o-mini` |
51+
| GPT Realtime Cluster | `gpt-realtime-2025-08-28` |
52+
| GPT Realtime Mini | `gpt-realtime-mini-2025-12-15` |
5153
| GPT Realtime 2 | `gpt-realtime-2` |
5254
| o3 | `o3` |
5355

‎fern/tools/api-request/response-handling.mdx‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,13 @@ After a test call, inspect the tool arguments and result before changing the sch
150150

151151
<Tabs>
152152
<Tab title="Dashboard">
153-
Open [Logs](https://dashboard.vapi.ai/logs), select the call, and inspect its messages and tool-call entries. Confirm:
153+
Open [Logs → Calls](https://dashboard.vapi.ai/logs), select the call, and inspect its **Messages** and **Logs** tabs. Confirm:
154154

155155
- The assistant called the expected tool.
156156
- The model-generated arguments contain the confirmed customer name, product ID, and quantity.
157157
- The tool result contains either the accepted order or the structured error.
158158
- The assistant did not claim success after a failed request.
159+
- The **Logs** tab shows the API Request destination's resolved request and response when detailed logging is available.
159160
</Tab>
160161

161162
<Tab title="cURL">
@@ -174,7 +175,7 @@ After a test call, inspect the tool arguments and result before changing the sch
174175
</Tab>
175176
</Tabs>
176177

177-
The call artifact does not show the final HTTP request after Vapi resolves Liquid values and merges static fields. Use logs from the destination API to inspect final headers and body values. Correlate the coffee endpoint's `requestId` with its `X-Request-Id` response header and server logs when investigating a specific request.
178+
When the assistant's **Logging** setting is enabled, the call's **Logs** tab records the resolved API Request URL, method, request data, and response details. Vapi sends the call ID in the `X-Call-Id` request header. The destination does not receive `toolCallId` by default, so use the call ID and a destination-generated `requestId` to correlate with your server logs. Sensitive values can be redacted or omitted based on logging and compliance settings. The **Logs → API** tab records requests made to Vapi's API, not requests sent by an API Request tool. For Function and API Request tool log locations, see [Call logs](/observability/logs/call-logs#function-and-api-request-tools).
178179

179180
## Diagnose common failures
180181

‎fern/tools/custom-tools-troubleshooting.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,8 @@ Tool behavior doesn't match your expectations.
325325
processing for long-running operations.
326326
</Tip>
327327

328+
For an async Function tool, Vapi returns an immediate `Success.` result to the assistant and does not use the webhook's eventual response as the tool result. Inspect the later webhook response in [Logs → Webhooks](/observability/logs/webhook-logs) and check your server logs for the completed action. See [Call logs](/observability/logs/call-logs#function-and-api-request-tools) for the Function and API Request log locations.
329+
328330
## Reference: Required formats
329331

330332
### Response format template

‎fern/tools/custom-tools.mdx‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ If the location can't be found, report the failure through `error` instead of `r
312312

313313
For multiple tool calls in one request, return a result for every call in the `results` array and match each result to its call with `toolCallId`. Results can appear in any order. Use `result` for success and `error` for failure.
314314

315+
To inspect a Function tool call, open its [call log](/observability/logs/call-logs#function-and-api-request-tools). The call's **Messages** tab shows the tool call and result. **Logs → Webhooks** shows the Function webhook request and response.
316+
315317
**Some Key Points:**
316318

317319
- Pay attention to the required parameters and response format of your functions.

0 commit comments

Comments
 (0)