> ## Documentation Index
> Fetch the complete documentation index at: https://docs.voxworks.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Keywords | Set

> Replace the call's speech-recognition keyword list part-way through a call, from a comma-separated value.

## Description

Keywords are words and short phrases you tell the speech recogniser to listen out for — names, products, suburbs, jargon it usually mishears. Normally you set them on the script and on individual steps; see [Keywords](/conversation-dynamics/keywords).

**Keywords | Set** replaces that list while the call is running. Use it when the words worth listening for are only known once the call has started.

Good fits:

* A list of product names pulled from a CRM for this particular customer
* The suburbs served by the branch the caller has just been matched to
* A policy or reference number the caller is about to read back

Two things to know before you use it:

* It **replaces** the list. It never adds to it. Running it a second time throws away the first list.
* It takes effect at the **next speaking step**. So place a Keywords | Set step immediately before the step whose wording it is meant to help.

***

## Manual Inputs

| Name     | Data Type | Required | Description                                           |
| -------- | --------- | -------- | ----------------------------------------------------- |
| Keywords | string    | No       | Comma-separated words and short phrases to listen for |

### Keywords

A single comma-separated list. Each term should be one to three words. Longer phrases and very common words are dropped, because the recogniser keeps a limited budget of terms for the call.

The field accepts `{{...}}` variable references, which is the point of the tool — the value is normally built earlier in the call:

```text theme={null}
fascia, soffit, guttering
{{custom.product_names}}
{{custom.suburb_list}}, {{contact.last_name}}
```

Leave the field empty, or pass a variable that resolves to nothing, to **clear** the list. That drops back to the keywords the script and step already carry.

***

## Manual Outputs

| Name   | Data Type | Description                                  |
| ------ | --------- | -------------------------------------------- |
| result | bool      | Always `true` once the list has been updated |

***

## Conditions

### Success (true)

The keyword list was updated. This includes clearing it with an empty value.

### Failure (false)

This tool does not fail. It always reports success, so you only need the one route out of the step. There is no need to build a failure path.

***

## Variables this tool writes

**Variables this tool writes: none.** Keywords | Set has no variable namespace of its own and writes nothing to any `{{...}}` variable. It changes how the call listens, not what it has recorded, and its `result` is always `true`.

The variable that matters is the one you feed into it, which you set yourself:

| Variable                   | Type   | Example                     | Description                                                                                                                                                                                                    |
| -------------------------- | ------ | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `{{custom.product_names}}` | string | `fascia, soffit, guttering` | A comma-separated list built earlier in the call — from a webhook response, a [Code Step](/tools/code-step/overview), or an [LLM tool](/tools/llm/overview) — and passed straight into the **Keywords** input. |

Name your own variable however you like; the pattern is what counts. For the full list of namespaces and fields, see [Variables](/flows/variables).

***

## Example Usage

Load a customer's product names, then ask about them:

```text theme={null}
Step 1 (Tool): Send Webhook
   Response Map:
     {{custom.product_names}} -> data.customer.products

Step 2 (Tool): Keywords | Set
   Keywords: {{custom.product_names}}

Step 3 (Voice): "Which of your products is the enquiry about?"
```

Clear the list once that part of the call is over:

```text theme={null}
Step 8 (Tool): Keywords | Set
   Keywords: (leave empty)

Step 9 (Voice): "Is there anything else I can help with today?"
```

***

## Common Issues

* **The words still get misheard** — check the step order. The new list only applies from the next speaking step, so a Keywords | Set step placed after the question does nothing for that question.
* **Earlier keywords have disappeared** — that is expected. Each run replaces the list. Include everything you still need in the one value.
* **Long phrases are ignored** — keep each term to one to three words.
* **The variable resolves to nothing** — an empty value clears the list rather than leaving it alone. Guard it with a condition if that is not what you want.

***

## Best Practices

1. **Put the step directly before the step that needs it.**
2. **Send one complete list** rather than several small updates.
3. **Keep terms short** — one to three words each.
4. **Skip the everyday words** — the recogniser already handles them, and they crowd out the terms that matter.
5. **Clear the list** once the specialised part of the call is finished.

***

## Next Steps

* [Keywords](/conversation-dynamics/keywords) — Script-level and per-step keywords
* [Tool Steps](/flows/steps-tool) — Learn how to configure tool steps
* [Variables](/flows/variables) — See all available variables
