diff --git a/llms-full.txt b/llms-full.txt index ca78c6d7..4d358b5d 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -88499,6 +88499,11 @@ tasks.define( route throws on its first request instead of running anything unverified. * When your handler throws, the task is not marked failed. Only the dispatcher marks it `failed`, and only after QStash has stopped retrying. The failed message stays in the QStash DLQ. + * When your handler *returns* a tool error (`isError: true`), the task is `failed` at once, with no + retry, and `task_status` returns your content with `isError`, as the synchronous tool would. + * The model only sees a failure's `error.code` and `error.message`. The transport's details + (`error.data`: the QStash DLQ id, the Workflow run id) stay in Redis for you. What your handler + threw and a dispatch error are logged, never stored or returned. * By default QStash tries 5 times with backoff `min(pow(3, retried) * 1000, 300000)`, about two minutes in total, so a task survives a server restart. The free tier and the local dev server allow at most 5 retries. @@ -88913,6 +88918,11 @@ tasks.define( route throws on its first request instead of running anything unverified. * When your handler throws, the task is not marked failed. Only the dispatcher marks it `failed`, and only after QStash has stopped retrying. The failed message stays in the QStash DLQ. + * When your handler *returns* a tool error (`isError: true`), the task is `failed` at once, with no + retry, and `task_status` returns your content with `isError`, as the synchronous tool would. + * The model only sees a failure's `error.code` and `error.message`. The transport's details + (`error.data`: the QStash DLQ id, the Workflow run id) stay in Redis for you. What your handler + threw and a dispatch error are logged, never stored or returned. * By default QStash tries 5 times with backoff `min(pow(3, retried) * 1000, 300000)`, about two minutes in total, so a task survives a server restart. The free tier and the local dev server allow at most 5 retries. diff --git a/redis/sdks/agentkit/mcp-tasks.mdx b/redis/sdks/agentkit/mcp-tasks.mdx index 6d740bde..74a86c4f 100644 --- a/redis/sdks/agentkit/mcp-tasks.mdx +++ b/redis/sdks/agentkit/mcp-tasks.mdx @@ -320,6 +320,11 @@ tasks.define( route throws on its first request instead of running anything unverified. - When your handler throws, the task is not marked failed. Only the dispatcher marks it `failed`, and only after QStash has stopped retrying. The failed message stays in the QStash DLQ. + - When your handler *returns* a tool error (`isError: true`), the task is `failed` at once, with no + retry, and `task_status` returns your content with `isError`, as the synchronous tool would. + - The model only sees a failure's `error.code` and `error.message`. The transport's details + (`error.data`: the QStash DLQ id, the Workflow run id) stay in Redis for you. What your handler + threw and a dispatch error are logged, never stored or returned. - By default QStash tries 5 times with backoff `min(pow(3, retried) * 1000, 300000)`, about two minutes in total, so a task survives a server restart. The free tier and the local dev server allow at most 5 retries.