Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions fern/assistants/pronunciation-dictionaries.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ Cartesia pronunciation dictionaries use a `text` and `alias` format. Each entry

<Steps>
<Step title="Create an ElevenLabs Pronunciation Dictionary">
For Vapi v1 built-in voices, create the pronunciation dictionary through the ElevenLabs endpoint shown above. The response includes both a dictionary ID and a `versionId`; keep both values.
For Vapi v1 built-in voices, create the pronunciation dictionary through the ElevenLabs endpoint shown above. The response includes both a dictionary ID and a `versionId`. Keep the dictionary ID, and keep the `versionId` if you want to pin that version.

Vapi built-in voices use a unified `pronunciationDictionary` field, but most v1 built-in voices route through ElevenLabs under the hood. Do not assume a Cartesia dictionary ID works with every Vapi built-in voice. Cartesia dictionary IDs only apply to Vapi voices that are routed to a Cartesia Sonic voice path.
</Step>
Expand All @@ -277,7 +277,7 @@ Cartesia pronunciation dictionaries use a `text` and `alias` format. Each entry
```

<Note>
For ElevenLabs-backed dictionaries, `versionId` is required. It pins the exact dictionary version that the Vapi voice should use.
For ElevenLabs-backed dictionaries, `versionId` is optional. Set it to pin the exact dictionary version that the Vapi voice should use. To use the dictionary's latest version, leave out `versionId` and set `provider` to `11labs`.
</Note>
</Step>

Expand Down
3 changes: 3 additions & 0 deletions fern/calls/assistant-based-warm-transfer.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@ Use these fields to control the transfer assistant and the two call legs. See th
| `transferAssistant.maxDurationSeconds` | Maximum length of the transfer-assistant conversation | 120 seconds; allowed range is 10–43,200 seconds |
| `transferAssistant.silenceTimeoutSeconds` | Silence allowed before the transfer is canceled | 30 seconds; allowed range is 5–3,600 seconds |
| `transferAssistant.model` | Model and instructions used for the operator conversation | Required when you configure `transferAssistant` |
| `transferAssistant.hooks` | Hooks the transfer assistant runs during the operator conversation. The operator counts as the customer, so `customer.speech.timeout` fires on operator silence | `call.ending` and `call.timeElapsed` hooks aren't allowed. A `tool` action needs an inline `tool`, not a `toolId` |
| `transferAssistant.assistantHooksInheritEnabled` | Whether the transfer assistant also runs the original assistant's hooks during the operator conversation | `true`. When `false`, only `transferAssistant.hooks` and the original assistant's `call.ending` hooks run |
| `holdAudioUrl` | MP3 or WAV audio played to the customer while on hold | Default hold audio |
| `transferCompleteAudioUrl` | MP3 or WAV audio played to the destination after the introduction | No custom completion audio |
| `fallbackPlan` | Customer message and end-call behavior after a failed warm transfer | If omitted, the original assistant says "Could not transfer the call." and continues the conversation |
Expand Down Expand Up @@ -255,6 +257,7 @@ Open the affected call in [**Calls**](/observability/logs/call-logs) under **Log
| The customer hears the wrong audio | Hold audio was configured as a tool message | Put customer hold audio in `transferPlan.holdAudioUrl`. Use `transferCompleteAudioUrl` for audio played to the destination after the introduction. |
| The customer cannot continue after a failed transfer | `fallbackPlan.endCallEnabled` is `true` | Set it to `false` so the original assistant remains on the call. |
| The transfer ends during a long operator interaction | A duration or silence timeout is too short | Increase `maxDurationSeconds` or `silenceTimeoutSeconds` within the supported ranges. |
| The whole call ends when the operator goes quiet | The transfer assistant inherited a `customer.speech.timeout` hook with an `endCall` action from the original assistant | Set `transferAssistant.assistantHooksInheritEnabled` to `false`, and add any hooks the operator conversation needs to `transferAssistant.hooks`. |

## API reference

Expand Down
11 changes: 9 additions & 2 deletions fern/calls/call-ended-reason.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ Each voice provider has specific error codes. Common patterns:
- `*-quota-exceeded` / `*-out-of-credits` — Voice provider credits exhausted.
- `*-unauthorized-access` / `*-invalid-api-key` — Voice provider credential issue.
- `*-unsupported-model` — The voice provider rejected the configured model.
- `*-socket-hang-up` / `*-500-server-error` / `*-503-server-error` — Voice provider infrastructure issue.
- `*-socket-hang-up` / `*-500-server-error` / `*-502-server-error` / `*-503-server-error` — Voice provider infrastructure issue.

**Supported providers:** ElevenLabs, Cartesia, Deepgram, Azure, OpenAI, Rime AI, Smallest AI, Neuphonic, Hume, Sesame, Inworld, Minimax, WellSaid, Custom Voice.

Expand All @@ -151,7 +151,14 @@ Common transcriber error patterns:
- `*-returning-403-*` — Model access denied on the transcriber.
- `*-returning-500-*` / `*-returning-502-*` — Transcriber provider server error.

**Supported providers:** Deepgram, AssemblyAI, Gladia, Speechmatics, Azure Speech, Google, OpenAI, Soniox, ElevenLabs, Custom Transcriber.
**Supported providers:** Deepgram, AssemblyAI, Gladia, Speechmatics, Azure Speech, Google, OpenAI, Soniox, ElevenLabs, Reson8, Custom Transcriber.

Soniox, xAI, and Reson8 report these more specific reasons instead of a generic failure:

- `*-transcriber-auth-failed` — The transcriber provider rejected the credentials.
- `*-transcriber-invalid-config` — The transcriber provider rejected the transcriber settings.
- `*-transcriber-rate-limited` — The transcriber provider rate-limited the request.
- `reson8-transcriber-closed` — The Reson8 connection closed unexpectedly.

## Transfer errors

Expand Down
2 changes: 2 additions & 0 deletions fern/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -884,6 +884,8 @@ navigation:
path: providers/transcriber/google.mdx
- page: OpenAI
path: providers/transcriber/openai.mdx
- page: Reson8
path: providers/transcriber/reson8.mdx
- page: Soniox
path: providers/transcriber/soniox.mdx
- page: Speechmatics
Expand Down
2 changes: 1 addition & 1 deletion fern/gpt-live/configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ These fields belong to the assistant object. See [Create Assistant](/api-referen
| `model.tools` | Inline base tool definitions, available whether or not a skill is loaded |
| `model.toolIds` | IDs of saved base tools |
| `voice.provider` | `openai` |
| `voice.voiceId` | One of the [22 supported voices](#voices) |
| `voice.voiceId` | One of the [31 supported voices](#voices) |

## Prompt defaults and overrides

Expand Down
2 changes: 1 addition & 1 deletion fern/gpt-live/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Vapi connects GPT-Live to your phone numbers and tools, and provides call record

- Browser, Twilio, Vapi SIP, and WebSocket calls.
- Function, API request, and MCP tools, Google Calendar, Google Sheets, and Slack tools, plus built-in Hang Up, transfer, and DTMF tools.
- Speaker and reasoner prompts, reasoner skills, personality packs, and 22 voices.
- Speaker and reasoner prompts, reasoner skills, personality packs, and 31 voices.
- Idle-message hooks and HTTP live call control.
- Transcripts, recordings, structured outputs, scorecards, Boards, Monitoring, and Voice Simulations.

Expand Down
139 changes: 65 additions & 74 deletions fern/providers/model/anthropic-bedrock.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,15 @@ Vapi's Anthropic Bedrock integration allows you to connect your own AWS Bedrock

For the current Anthropic Claude models available through Amazon Bedrock, see [Anthropic models in the Amazon Bedrock documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/model-cards-anthropic.html). Model availability varies by AWS Region.

For additional API configuration options, review the [`AnthropicBedrockModel` fields](/api-reference/assistants/create#request.body.model.AnthropicBedrock) in the Create Assistant API reference.
Some Claude models are available through Bedrock's global cross-Region inference profiles. Their model IDs start with `global.`. A global profile can route requests to supported commercial AWS Regions worldwide.

To use a global profile, grant access to the profile, its foundation model in the source Region, and its global foundation model ARN. See the [`AnthropicBedrockModel` fields](/api-reference/assistants/create#request.body.model.AnthropicBedrock) for the model IDs Vapi accepts.

For more information, see the following Amazon Bedrock documentation:

- [Cross-Region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference.html)
- [Global cross-Region inference](https://docs.aws.amazon.com/bedrock/latest/userguide/global-cross-region-inference.html), including its IAM policy requirements
- [Supported Regions and models for inference profiles](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html)

### Prerequisites

Expand Down Expand Up @@ -46,11 +54,15 @@ Before configuring Anthropic Bedrock with Vapi, ensure you have:
<Step title="Attach the Trust Policy">
Configure the trust policy to allow Vapi's AWS account to assume this role.

An External ID is optional. If you use one, enter the same unique value in the trust policy and Vapi credential. Both examples trust Vapi's production AWS account.

For more information about these policies, see AWS's guides to [creating a role with a custom trust policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html) and [using External IDs for third-party access](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html).

<Tabs>
<Tab title="Without External ID">
Use this simpler policy if you don't need the additional security of an External ID:
<Tab title="With External ID">
Replace `YOUR_UNIQUE_EXTERNAL_ID` with a unique value before use. AWS recommends an External ID for third-party cross-account access.

```json title="Trust Policy (Basic)"
```json title="Trust policy with External ID"
{
"Version": "2012-10-17",
"Statement": [
Expand All @@ -59,16 +71,21 @@ Before configuring Anthropic Bedrock with Vapi, ensure you have:
"Principal": {
"AWS": "arn:aws:iam::533267069243:root"
},
"Action": "sts:AssumeRole"
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "YOUR_UNIQUE_EXTERNAL_ID"
}
}
}
]
}
```
</Tab>
<Tab title="With External ID">
Use this policy if you want the additional security of an External ID:
<Tab title="Without External ID">
Use this policy only if you do not require an External ID for the role. It does not check which Vapi customer the request is for.

```json title="Trust Policy (With External ID)"
```json title="Trust policy without External ID"
{
"Version": "2012-10-17",
"Statement": [
Expand All @@ -77,85 +94,61 @@ Before configuring Anthropic Bedrock with Vapi, ensure you have:
"Principal": {
"AWS": "arn:aws:iam::533267069243:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "YOUR_EXTERNAL_ID"
}
}
"Action": "sts:AssumeRole"
}
]
}
```

Replace `YOUR_EXTERNAL_ID` with your chosen value. You'll use the same value when creating the Vapi credential.
</Tab>
</Tabs>

<Note>
**About External ID**: The External ID is an optional security feature that provides an additional layer of protection for cross-account access. If you choose to use one, specify the same value in both your IAM trust policy and the Vapi credential configuration.
</Note>
</Step>

<Step title="Attach the Permissions Policy">
Create and attach a permissions policy that grants access to Bedrock model invocation.
Use this policy when your Vapi credential Region is `us-east-1`. It allows Claude Haiku 5.5 through the US inference profile, which can route to `us-east-1`, `us-east-2`, or `us-west-2`. Replace `YOUR_AWS_ACCOUNT_ID` with your AWS account ID before creating the policy.

<Tabs>
<Tab title="Broad Access">
Use this policy to grant access to all Anthropic models across all regions:

```json title="Permissions Policy (All Models)"
```json title="Permissions policy: us-east-1"
{
"Version": "2012-10-17",
"Statement": [
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:*::foundation-model/anthropic.*",
"arn:aws:bedrock:*:*:inference-profile/us.anthropic.*"
]
}
]
}
```
</Tab>
<Tab title="Restrictive Access">
Use this policy to limit access to specific models and regions:

```json title="Permissions Policy (Specific Models)"
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:us-east-1:YOUR_AWS_ACCOUNT_ID:inference-profile/us.anthropic.claude-haiku-5-5"
},
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-*",
"arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-7-sonnet-*",
"arn:aws:bedrock:us-east-1:*:inference-profile/us.anthropic.claude-3-5-sonnet-*",
"arn:aws:bedrock:us-east-1:*:inference-profile/us.anthropic.claude-3-7-sonnet-*"
]
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-haiku-5-5",
"arn:aws:bedrock:us-east-2::foundation-model/anthropic.claude-haiku-5-5",
"arn:aws:bedrock:us-west-2::foundation-model/anthropic.claude-haiku-5-5"
],
"Condition": {
"StringEquals": {
"bedrock:InferenceProfileArn": "arn:aws:bedrock:us-east-1:YOUR_AWS_ACCOUNT_ID:inference-profile/us.anthropic.claude-haiku-5-5"
}
]
}
}
```
]
}
```

<Tip>
Replace `us-east-1` with your preferred AWS region. You can also add or remove specific model versions based on your needs.
</Tip>
</Tab>
</Tabs>
To adapt the policy, check the exact profile ID, supported source Regions, and destination Regions in the [AWS Claude Haiku 5.5 model card](https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-anthropic-claude-haiku-5-5.html). You can also call [GetInferenceProfile](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-view.html) from your source Region with an AWS identity that has `bedrock:GetInferenceProfile` permission. Update the profile ARN, foundation model ARNs, and `bedrock:InferenceProfileArn` condition together. Check the [`AnthropicBedrockModel` fields](/api-reference/assistants/create#request.body.model.AnthropicBedrock) for the model IDs Vapi accepts.

For more information about the required resources, see AWS's [inference profile prerequisites](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-prereq.html). Global profiles require a different policy shape; see AWS's [global cross-Region inference guidance](https://docs.aws.amazon.com/bedrock/latest/userguide/global-cross-region-inference.html).

Before attaching the policy, use [IAM Access Analyzer policy validation](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html) to review its syntax and permissions. Other policies and service control policies can also affect the role's effective access.

To attach the policy:

1. In the IAM Console, go to **Policies** and click **Create policy**
2. Select **JSON** and paste your chosen policy
2. Select **JSON** and paste the policy
3. Name the policy (e.g., `VapiBedrockInvokePolicy`)
4. Attach the policy to your IAM role
</Step>
Expand All @@ -173,7 +166,7 @@ Before configuring Anthropic Bedrock with Vapi, ensure you have:
"authenticationPlan": {
"type": "aws-sts",
"roleArn": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/VapiBedrockRole",
"externalId": "your-optional-external-id"
"externalId": "YOUR_UNIQUE_EXTERNAL_ID"
}
}'
```
Expand All @@ -184,11 +177,9 @@ Before configuring Anthropic Bedrock with Vapi, ensure you have:
| `region` | AWS region where Bedrock is enabled (e.g., `us-east-1`) |
| `authenticationPlan.type` | Must be `aws-sts` for role assumption |
| `authenticationPlan.roleArn` | The ARN of the IAM role you created |
| `authenticationPlan.externalId` | Optional: Your chosen External ID for additional security |
| `authenticationPlan.externalId` | Optional; include only with the matching External ID trust policy |

<Tip>
If you don't need an External ID, you can remove the `Condition` block from your trust policy entirely.
</Tip>
If you choose the trust policy without an External ID, omit the `externalId` field from the request.
</Step>
</Steps>

Expand Down
1 change: 1 addition & 0 deletions fern/providers/transcriber/assembly-ai.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Both Universal Pro models support additional configuration:
- `agentContextAutoUpdateEnabled`: Automatically send what the assistant just said as agent context after every assistant turn. Defaults to `false`.
- `languageCodes`: Steer automatic language detection with language codes such as `["en", "es"]`.
- `keytermsPrompt`: Boost recognition of domain-specific terms. Included at no extra cost on the Universal Pro models.
- `confidenceThreshold`: Discard caller transcripts with a confidence below this value, from `0` to `1`. Universal Pro models don't filter by confidence unless you set it. In the dashboard, turn on **Low-confidence filter** in the transcriber settings.

### Automatic agent context

Expand Down
4 changes: 2 additions & 2 deletions fern/providers/transcriber/deepgram.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ The Nova 3 column applies to Nova 3 and Nova 3 General, and the Nova 2 column ap
| Macedonian | `mk` | X | | | | | |
| Malay | `ms` | X | | X | | | |
| Marathi | `mr` | X | | | | | |
| Multilingual | `multi` | X | | X | | | |
| Multilingual | `multi` | X | X | X | | | |
| Norwegian | `no` | X | | X | | | |
| Persian | `fa` | X | | | | | |
| Polish | `pl` | X | | X | | | |
Expand All @@ -139,7 +139,7 @@ The Nova 3 column applies to Nova 3 and Nova 3 General, and the Nova 2 column ap

### Multilingual transcription

For Nova 3 or Nova 2, set `transcriber.language` to `multi`. For Flux, select `flux-general-multi` and omit `transcriber.languages` to use automatic language detection. You can also provide a `languages` array to give Flux language hints for multilingual or code-switching conversations. See [Deepgram's Flux language prompting documentation](https://developers.deepgram.com/docs/flux/language-prompting).
For Nova 3, Nova 3 Medical, or Nova 2, set `transcriber.language` to `multi`. For Flux, select `flux-general-multi` and omit `transcriber.languages` to use automatic language detection. You can also provide a `languages` array to give Flux language hints for multilingual or code-switching conversations. See [Deepgram's Flux language prompting documentation](https://developers.deepgram.com/docs/flux/language-prompting).

## Related

Expand Down
Loading