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

# Summer Router: character reply

> A character answers the player in text, remembers the conversation and calls your game's tools. Call it from your game with Summer.client.router.reply(character: String, text: String, options: Dictionary = {}).

A character answers the player in text, remembers the conversation and calls your game's tools.

| | |
| - | - |
| In your game | `Summer.client.router.reply(character: String, text: String, options: Dictionary = {})` |
| Status | Available |
| Metered | per token in and out, from the creator's Summer credits |
| Counts toward | per player per day, per game per day, per game per month, per account per month, per character per player per day, per character per game per day ([limits](https://docs.summerengine.com/router/limits.md)). A multiplayer server's calls count toward the game's caps, not the player's. |

## Example

```gdscript theme={null}
var r: SummerRouterResult = await Summer.client.router.reply("guard", "Let me in.", {
    "tools": {"open_gate": func(_args): $Gate.open(); return {"opened": true}},
})
$Subtitle.text = r.text if r.ok else "The guard ignores you."
```

The result has `text`, the `tool_calls` the character made, `exchange_id` and `conversation_id`. Pass the `conversation_id` on the next call, and Summer keeps the history of that conversation.

**Tools.** Declare each tool on the character in Studio, with the same name as in `tools`. When the character calls one, the SDK runs your handler with the arguments as a `Dictionary`, sends what it returns back to the character, and the character goes on, for up to 8 rounds in one call. Return any JSON value; return `{"error": "..."}` to tell the character it failed. A handler that takes longer than 30 seconds sends a timeout to the character.

**Options.** `variables` fill the character's declared `{{variables}}`, such as the player's name; the character must list `variables` in its overridable fields. `context` tells the character what just happened in the game. `overrides` set the fields you marked overridable on the character, such as its first message.

For a whole conversation in one node, use **SummerRouterCharacter** (see the [quickstart](https://docs.summerengine.com/router/quickstart.md)).

## Input limits

The SDK builds the request from the call's arguments and options. Summer checks these limits:

| Field | Type | Limits |
| - | - | - |
| `character` (required) | string | The id of a character you made in Studio |
| `text` | string | 1 to 4000 characters |
| `conversation_id` | string | 1 to 64 letters, digits, dashes or underscores; your game may choose it |
| `variables` | object | up to 32 entries |
| `context` | string | 0 to 4000 characters |
| `overrides` | object | up to 16 entries |
| `tool_results` | array of objects | up to 16 items |

Send `text`, `tool_results`, or both. With only `tool_results`, leave the text empty: it answers the previous turn's tool calls.

## Errors

Every refusal has a stable tag and a one-line fix, and the game keeps running. See [errors](https://docs.summerengine.com/router/errors.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.