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

# Request cancellation

> Abort in-flight chat calls and stop polling safely

Cancellation is supported at both request and polling levels.

## Cancel `sendMessage`

`IllaSDK.sendMessage` accepts an abort signal via the fourth argument.

```ts theme={null}
const controller = new AbortController()

const pending = sdk.sendMessage(
  'Check my balance',
  { chatId },
  undefined,
  { signal: controller.signal },
)

setTimeout(() => controller.abort(), 1_000)

const result = await pending
if (result.response.isError) {
  console.error('Request failed or was aborted:', result.response.error)
}
```

## Cancel `sendMessageStreaming`

`sendMessageStreaming` accepts `signal` in its streaming options.

```ts theme={null}
const controller = new AbortController()

const pending = sdk.sendMessageStreaming(
  'Swap 0.1 ETH to USDC',
  { chatId },
  {
    signal: controller.signal,
    onEvent: (event) => console.log(event.type),
    onError: (error) => console.error(error),
  },
)

setTimeout(() => controller.abort(), 1_000)

try {
  await pending
} catch (error) {
  console.error('Streaming request stopped:', error)
}
```

## Cancel provider-level requests

`CoreApiProvider.sendMessage` and `CoreApiProvider.awaitTransaction` also accept `signal`.

```ts theme={null}
const ac = new AbortController()

const pending = provider.sendMessage(body, { signal: ac.signal })
ac.abort()

await pending
```

Apply the same pattern to `provider.awaitTransaction(params, { signal: ac.signal })`.

## Stop polling subscriptions

`subscribeToToolStatus` and `AsyncToolChecker.subscribe` return a subscription with `unsubscribe()`.

```ts theme={null}
const sub = sdk.subscribeToToolStatus(
  {
    toolName: 'swap',
    protocol: 'lifi',
    descriptor: { txHash: '0x...' },
  },
  {
    onStatusChange: ({ current }) => console.log(current.pollStatus),
    onError: (error) => console.error(error),
  },
)

sub.unsubscribe()
```

## Notes

* `sendToolResult` and `sendToolResults` do not currently accept an abort signal.
* Always wire cancellation to route changes and component unmounts.
