You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
Copy file name to clipboardExpand all lines: fern/composer.mdx
+17-25Lines changed: 17 additions & 25 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -173,49 +173,42 @@ Composer understands voice agent architecture and Vapi's capabilities. It can cr
173
173
174
174
## Safety features
175
175
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.
177
177
178
-
### No deletion capability
178
+
### Approval modes
179
179
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:
181
181
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.
183
186
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.
186
188
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
197
190
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.
199
192
200
-
**How the approval flow works:**
193
+
### How the approval flow works
201
194
202
195
<Steps>
203
196
<Steptitle="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.
205
198
</Step>
206
199
<Steptitle="You review and respond">
207
200
The chat interface displays **Approve** and **Deny** buttons. Click **Approve** to proceed or **Deny** to cancel.
208
201
</Step>
209
202
<Steptitle="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.
211
204
</Step>
212
205
</Steps>
213
206
214
207
```txt title="Approval flow example"
215
208
You: "Change my agent's voice to sound more energetic"
UI shows: "Update Resource, updating voice settings on assistant xyz"
219
212
[Approve] [Deny]
220
213
221
214
You: [Clicks Approve]
@@ -226,10 +219,9 @@ know if you'd like to adjust further."
226
219
227
220
**Key details about approvals:**
228
221
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.
Copy file name to clipboardExpand all lines: fern/observability/evals-quickstart.mdx
+6-1Lines changed: 6 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1136,7 +1136,12 @@ For API details, see [Delete Eval](/api-reference/eval/delete).
1136
1136
- Target (assistant/squad)
1137
1137
- Status (pass/fail)
1138
1138
- 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.
Copy file name to clipboardExpand all lines: fern/observability/logs/call-logs.mdx
+13Lines changed: 13 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -97,6 +97,19 @@ This tab shows the stored conversation-message objects for the call, in order. A
97
97
98
98
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.
99
99
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
+
100
113
### Call Cost
101
114
102
115
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.
|GPT Realtime Mini |`gpt-realtime-mini-2025-12-15`|Cost-sensitive assistants|
26
+
|GPT Realtime 2 |`gpt-realtime-2`|Recommended for new assistants|
27
27
28
28
## Voice options
29
29
@@ -66,7 +66,7 @@ The tool's `body` schema defines the `location` argument the model supplies. For
66
66
{
67
67
"model": {
68
68
"provider": "openai",
69
-
"model": "gpt-realtime-2025-08-28",
69
+
"model": "gpt-realtime-2",
70
70
"messages": [
71
71
{
72
72
"role": "system",
@@ -112,7 +112,7 @@ const vapi = new VapiClient({ token: apiKey });
112
112
const assistant =awaitvapi.assistants.create({
113
113
model: {
114
114
provider: "openai",
115
-
model: "gpt-realtime-2025-08-28",
115
+
model: "gpt-realtime-2",
116
116
messages: [{
117
117
role: "system",
118
118
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"))
154
154
assistant = vapi.assistants.create(
155
155
model={
156
156
"provider": "openai",
157
-
"model": "gpt-realtime-2025-08-28",
157
+
"model": "gpt-realtime-2",
158
158
"messages": [{
159
159
"role": "system",
160
160
"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:
311
311
{
312
312
"model": {
313
313
"provider": "openai",
314
-
"model": "gpt-realtime-2025-08-28"// Changed from gpt-4
314
+
"model": "gpt-realtime-2"
315
315
}
316
316
}
317
317
```
@@ -336,32 +336,6 @@ Transitioning from standard STT/TTS to realtime models:
336
336
337
337
## Best practices
338
338
339
-
### Model selection strategy
340
-
341
-
<AccordionGroup>
342
-
<Accordiontitle="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
-
<Accordiontitle="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
-
<Accordiontitle="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
-
365
339
### Performance optimization
366
340
367
341
-**Temperature settings**: Use 0.5-0.7 for consistent yet natural responses
Copy file name to clipboardExpand all lines: fern/tools/api-request/response-handling.mdx
+3-2Lines changed: 3 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -150,12 +150,13 @@ After a test call, inspect the tool arguments and result before changing the sch
150
150
151
151
<Tabs>
152
152
<Tabtitle="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:
154
154
155
155
- The assistant called the expected tool.
156
156
- The model-generated arguments contain the confirmed customer name, product ID, and quantity.
157
157
- The tool result contains either the accepted order or the structured error.
158
158
- 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.
159
160
</Tab>
160
161
161
162
<Tabtitle="cURL">
@@ -174,7 +175,7 @@ After a test call, inspect the tool arguments and result before changing the sch
174
175
</Tab>
175
176
</Tabs>
176
177
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).
Copy file name to clipboardExpand all lines: fern/tools/custom-tools-troubleshooting.mdx
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -325,6 +325,8 @@ Tool behavior doesn't match your expectations.
325
325
processing for long-running operations.
326
326
</Tip>
327
327
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.
Copy file name to clipboardExpand all lines: fern/tools/custom-tools.mdx
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -312,6 +312,8 @@ If the location can't be found, report the failure through `error` instead of `r
312
312
313
313
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.
314
314
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
+
315
317
**Some Key Points:**
316
318
317
319
- Pay attention to the required parameters and response format of your functions.
0 commit comments