# LLM: generate text

The **LLM: generate text** Point template asks a Claude model for a short piece of text and saves it as a traveler attribute, so a later step can drop it into a push, an email, or an SMS.

This point authenticates with its own Anthropic API key — it doesn't use any account-level integration configured elsewhere in Settings.

## Configure the point

1. Drag **LLM: generate text** from the **Integrations** section of the left panel onto the canvas.
2. Double-click the point and enter a **Step Name**.
3. In **Anthropic API key**, enter your Anthropic API key. It's stored masked, like a webhook secret header.
4. In **Model**, choose **claude-haiku-4-5**, **claude-sonnet-5**, or **claude-opus-5**. Defaults to **claude-haiku-4-5**. Haiku answers fastest. Opus is slower but still finishes within the point's 10-second timeout. Every call bills your own Anthropic key for every traveler who reaches this step, and Opus costs more per token than Sonnet or Haiku.
5. In **Prompt**, write what you want the model to generate. It takes the same macros as any Webhook body, for example `{{device:hwid}}`.
6. Click **Save**.

Responses are capped at about 300 tokens (roughly a short paragraph) to keep the request inside the [Webhook timeout](/product/customer-journey/journey-elements/channels/webhook/#timeout-retries-and-failed-requests). Ask for something that short. A longer or more detailed prompt doesn't get more room to answer.

## Response

After the step runs, the generated text is available in later steps as attribute **`llm_text`** — use it the same way you'd use a [Webhook response attribute](/product/customer-journey/journey-elements/channels/webhook/#map-webhook-response-data-to-variables), for example with [Dynamic Content](/product/personalization/dynamic-content/) in a later message. Attributes **`llm_input_tokens`** and **`llm_output_tokens`** carry the token counts for that request.

A failed request drops the traveler from the journey — see [Errors and failed requests](/product/customer-journey/journey-elements/integrations/#errors-and-failed-requests). A response that comes back but isn't what you expected doesn't drop the traveler: if the model's answer runs into the 300-token cap, **`llm_text`** holds the truncated text. If the model declines to answer, **`llm_text`** holds whatever it replied with instead. Either way, the journey continues with that value.