LLM stop and finish reasons by provider
Every finish and stop reason OpenAI, Anthropic and Gemini document, what each means and what to do, with its source, and what Salyro does with it.
Every response says why the model stopped: finish_reason in Chat Completions, status and incomplete_details.reason in Responses, stop_reason at Anthropic, finishReason at Gemini. When Gemini blocks a prompt before answering, the reason is in promptFeedback.blockReason instead. The table has one row for each value a provider documents, in each of those formats. Each row gives the value exactly as a response carries it, what it means, what to do about it, and whether the answer is whole: complete, cut short, a tool call, filtered, refused, paused or failed.
Where the rows come from
Each meaning is quoted from the provider's own page or schema, and the Source column gives that page and the day it was read.
- Anthropic: its stop-reasons page on platform.claude.com, which also says what to do about each value.
- OpenAI: its published OpenAPI description on GitHub. It says what a value means, not what to do.
- Gemini: the
FinishReasonandBlockReasonenums of Google's publishedgenerative_service.protoon GitHub. It says what a value means, and what to do only about a blocked prompt.
The outcome is read from each value's meaning, so a cut-short answer can be found whichever provider sent it. These are the same facts the finish-reason explainer reads. To look up one value and see what Salyro does with it, use the explainer.
The rows marked Salyro come from Salyro's own code, not from a provider. Salyro has one rule about a finish reason: on /v1/responses, only a finish_reason of length can end an answer incomplete. How it applies depends on whether the answer is streamed:
- Streamed:
lengthends the stream withresponse.incompleteinstead ofresponse.completed, whatever the answer holds. - Not streamed: the response is
incompleteonly when the answer has text. Its message item is thenincompletetoo. An answer cut short with empty text or only tool calls has no message item, so it endscompleted.
An answer that is not streamed and has neither content nor tool calls is no answer to Salyro, whatever its finish reason. A refusal carried only in refusal, an empty message and a thinking-only answer are all examples. Salyro drops it and answers 502 provider_error instead, on /v1/responses and /v1/chat/completions alike. A streamed answer with nothing in it still ends with its finish reason.
With every other value, an answer with something in it ends completed, streamed or not. Otherwise the value passes through: /v1/chat/completions carries finish_reason as Salyro's routing layer returns it, except for that 502, and Salyro keeps no mapping from one provider's values to another's. So the Through Salyro column gives no Chat Completions value for an Anthropic or Gemini reason. It says the mapping is unknown.
How often it is checked
Every fact has the day it was read. Each is due to be read again 90 days later, and Salyro's data report lists every fact with its re-check date. A fact past its date is flagged, not removed. Who re-reads the pages, and whether 90 days is the right interval, is still an open decision. A change to the data changes this table the next time the site is built. Nothing in the table is typed by hand.
What it does not know
- xAI's values. Its page could not be read, so its row says unknown rather than listing values from memory. xAI speaks the Chat Completions format.
- What to do, where the provider does not say. OpenAI's schema and Gemini's enum give meanings only, so What to do is unknown on their rows. It is not filled in with advice.
- Values added after the day shown. A value missing from the table may be newer than the reading.
- OpenAI's own guides. They could not be read from the build. Only the published schema was.
Search by value or meaning, filter by format or outcome, sort by any column, and download the rows you see as CSV. Each row has its own link: select the value.
50 rows
stop | OpenAI Chat Completions | finish_ | Complete | The model hit a natural stop point or a provided stop sequence. | unknown | /v1/chat/completions carries it as Salyro’s routing layer returns it — except that an answer that is not streamed, with neither content nor tool calls, is answered with provider_error (HTTP 502) instead. On /v1/responses, with this finish_reason, a streamed answer ends completed, whatever it holds; one that is not streamed ends completed when it has text, empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L42723 (read 2026-09-26) |
|---|---|---|---|---|---|---|---|
length | OpenAI Chat Completions | finish_ | Cut short | The maximum number of tokens specified in the request was reached. | unknown | /v1/chat/completions carries it as Salyro’s routing layer returns it — except that an answer that is not streamed, with neither content nor tool calls, is answered with provider_error (HTTP 502) instead. On /v1/responses, with this finish_reason, a streamed answer ends incomplete, whatever it holds; one that is not streamed ends incomplete when it has text and completed when it has empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L42723 (read 2026-09-26) |
content_ | OpenAI Chat Completions | finish_ | Filtered | Content was omitted due to a flag from OpenAI's content filters. | unknown | /v1/chat/completions carries it as Salyro’s routing layer returns it — except that an answer that is not streamed, with neither content nor tool calls, is answered with provider_error (HTTP 502) instead. On /v1/responses, with this finish_reason, a streamed answer ends completed, whatever it holds; one that is not streamed ends completed when it has text, empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L42723 (read 2026-09-26) |
tool_ | OpenAI Chat Completions | finish_ | Tool call | The model called a tool. | unknown | /v1/chat/completions carries it as Salyro’s routing layer returns it — except that an answer that is not streamed, with neither content nor tool calls, is answered with provider_error (HTTP 502) instead. On /v1/responses, with this finish_reason, a streamed answer ends completed, whatever it holds; one that is not streamed ends completed when it has text, empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L42723 (read 2026-09-26) |
function_ | OpenAI Chat Completions | finish_ | Tool call | The model called a function (deprecated). | unknown | /v1/chat/completions carries it as Salyro’s routing layer returns it — except that an answer that is not streamed, with neither content nor tool calls, is answered with provider_error (HTTP 502) instead. On /v1/responses, with this finish_reason, a streamed answer ends completed, whatever it holds; one that is not streamed ends completed when it has text, empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L42723 (read 2026-09-26) |
completed | OpenAI Responses | status · incomplete_ | Complete | The response generation completed. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L67442 (read 2026-09-26) |
incomplete | OpenAI Responses | status · incomplete_ | Cut short | The response finished as incomplete; `incomplete_details.reason` says why. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L68563 (read 2026-09-26) |
failed | OpenAI Responses | status · incomplete_ | Failed | The response failed. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L67936 (read 2026-09-26) |
cancelled | OpenAI Responses | status · incomplete_ | Failed | The response was cancelled. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66896 (read 2026-09-26) |
in_ | OpenAI Responses | status · incomplete_ | Not finished yet | The response is still being generated. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L68499 (read 2026-09-26) |
queued | OpenAI Responses | status · incomplete_ | Not finished yet | The response is queued and has not started. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66896 (read 2026-09-26) |
max_ | OpenAI Responses | status · incomplete_ | Cut short | Incomplete: the response reached its output token limit. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66951 (read 2026-09-26) |
content_ | OpenAI Responses | status · incomplete_ | Filtered | Incomplete: content was withheld by a content filter. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66953 (read 2026-09-26) |
max_ | OpenAI Responses | status · incomplete_ | Cut short | Incomplete: the response reached a limit on the number of messages. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66952 (read 2026-09-26) |
steered | OpenAI Responses | status · incomplete_ | Other | Incomplete: over WebSocket, the response stopped at a safe output boundary after a `response.steer` event. | unknown | Not passed through: Salyro’s /v1/responses sets its own status from the finish_reason (see Salyro’s rows) and sends no incomplete_details. | github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66937 (read 2026-09-26) |
end_ | Anthropic Messages | stop_ | Complete | Claude finished its response naturally. | Use the response. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
max_ | Anthropic Messages | stop_ | Cut short | The response reached your `max_tokens` limit. | Raise `max_tokens` or continue the response. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
stop_ | Anthropic Messages | stop_ | Complete | Claude emitted one of your `stop_sequences`. | Read `stop_sequence` to see which one fired. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
tool_ | Anthropic Messages | stop_ | Tool call | Claude is calling a tool. | Run the tool and return the result. A server tool call still missing its result block completes in a later response. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
pause_ | Anthropic Messages | stop_ | Paused | A server-tool loop reached its iteration limit. | Send the assistant content back to continue. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
refusal | Anthropic Messages | stop_ | Refused | Claude declined to respond. | Read `stop_details` and retry on a fallback model. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
model_ | Anthropic Messages | stop_ | Cut short | The response filled the model's context window. | Treat the response as truncated. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | platform.claude.com/docs/en/build-with-claude/handling-stop-reasons (read 2026-09-26) |
FINISH_ | Gemini | finishReason | Unspecified | Default value. This value is unused. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L691 (read 2026-09-26) |
STOP | Gemini | finishReason | Complete | Natural stop point of the model or provided stop sequence. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L694 (read 2026-09-26) |
MAX_ | Gemini | finishReason | Cut short | The maximum number of tokens as specified in the request was reached. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L697 (read 2026-09-26) |
SAFETY | Gemini | finishReason | Filtered | The response candidate content was flagged for safety reasons. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L700 (read 2026-09-26) |
RECITATION | Gemini | finishReason | Filtered | The response candidate content was flagged for recitation reasons. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L703 (read 2026-09-26) |
LANGUAGE | Gemini | finishReason | Filtered | The response candidate content was flagged for using an unsupported language. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L707 (read 2026-09-26) |
OTHER | Gemini | finishReason | Other | Unknown reason. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L710 (read 2026-09-26) |
BLOCKLIST | Gemini | finishReason | Filtered | Token generation stopped because the content contains forbidden terms. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L713 (read 2026-09-26) |
PROHIBITED_ | Gemini | finishReason | Filtered | Token generation stopped for potentially containing prohibited content. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L716 (read 2026-09-26) |
SPII | Gemini | finishReason | Filtered | Token generation stopped because the content potentially contains Sensitive Personally Identifiable Information (SPII). | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L720 (read 2026-09-26) |
MALFORMED_ | Gemini | finishReason | Failed | The function call generated by the model is invalid. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L723 (read 2026-09-26) |
IMAGE_ | Gemini | finishReason | Filtered | Token generation stopped because generated images contain safety violations. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L727 (read 2026-09-26) |
IMAGE_ | Gemini | finishReason | Filtered | Image generation stopped because generated images has other prohibited content. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L731 (read 2026-09-26) |
IMAGE_ | Gemini | finishReason | Other | Image generation stopped because of other miscellaneous issue. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L734 (read 2026-09-26) |
NO_ | Gemini | finishReason | Failed | The model was expected to generate an image, but none was generated. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L737 (read 2026-09-26) |
IMAGE_ | Gemini | finishReason | Filtered | Image generation stopped due to recitation. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L740 (read 2026-09-26) |
UNEXPECTED_ | Gemini | finishReason | Failed | Model generated a tool call but no tools were enabled in the request. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L743 (read 2026-09-26) |
TOO_ | Gemini | finishReason | Failed | Model called too many tools consecutively, thus the system exited execution. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L747 (read 2026-09-26) |
BLOCK_ | Gemini, prompt blocked | promptFeedback. | Unspecified | Default value. This value is unused. | unknown | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L598 (read 2026-09-26) |
SAFETY | Gemini, prompt blocked | promptFeedback. | Filtered | Prompt was blocked due to safety reasons. Inspect `safety_ratings` to understand which safety category blocked it. | Rephrase the prompt. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L602 (read 2026-09-26) |
OTHER | Gemini, prompt blocked | promptFeedback. | Filtered | Prompt was blocked due to unknown reasons. | Rephrase the prompt. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L605 (read 2026-09-26) |
BLOCKLIST | Gemini, prompt blocked | promptFeedback. | Filtered | Prompt was blocked due to the terms which are included from the terminology blocklist. | Rephrase the prompt. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L609 (read 2026-09-26) |
PROHIBITED_ | Gemini, prompt blocked | promptFeedback. | Filtered | Prompt was blocked due to prohibited content. | Rephrase the prompt. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L612 (read 2026-09-26) |
IMAGE_ | Gemini, prompt blocked | promptFeedback. | Filtered | Candidates blocked due to unsafe image generation content. | Rephrase the prompt. | A Salyro caller does not receive this field: Salyro answers with the finish_reason its routing layer returns. Salyro keeps no mapping from this value to a finish_reason, so which one it becomes is unknown. | github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L615 (read 2026-09-26) |
| unknown | xAI | finish_ | unknown | xAI's API reference is blocked by this build's network egress and was not read. xAI speaks the Chat Completions format, but which `finish_reason` values it sends, and what each means, is not recorded until somebody reads its page. | unknown | A Chat Completions finish_reason: carried as Salyro’s routing layer returns it. Only length can end a /v1/responses answer incomplete (see Salyro’s rows). | docs.x.ai/docs/api-reference (tried, not read, 2026-09-26) |
length | Salyro /v1/responses, streamed | status | Cut short | A finish_reason of length — the model ran out of room: a streamed answer ends incomplete, whatever it holds. Its stream ends with response.incomplete. | unknown | The one rule Salyro has about a finish reason, applied to the stream as a whole: length → incomplete. | Salyro’s code: responseStatusForFinishReason in @salyro/types, and how /v1/responses applies it |
length | Salyro /v1/responses, not streamed | status | Cut short | A finish_reason of length: a response that is not streamed ends incomplete when it has text and completed when it has empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | unknown | The response’s status follows its message item, which is incomplete for length — and there is a message item only when the answer has text. A cut-short answer with no text is not marked incomplete. An answer with neither content nor tool calls — a refusal carried only in refusal, say — is no answer to Salyro, whatever its finish reason: “The upstream model provider returned no completion.” | Salyro’s code: responseStatusForFinishReason in @salyro/types, and how /v1/responses applies it |
any other value | Salyro /v1/responses | status | Depends on the value | Every other finish_reason, whatever the provider meant by it: a streamed answer ends completed, whatever it holds; one that is not streamed ends completed when it has text, empty text or only tool calls; with neither content nor tool calls, Salyro answers provider_error (HTTP 502) instead. | unknown | Passed through otherwise: /v1/chat/completions carries it as Salyro’s routing layer returns it — except that an answer that is not streamed, with neither content nor tool calls, is answered with provider_error (HTTP 502) instead. Salyro keeps no mapping from one provider’s values to another’s. | Salyro’s code: responseStatusForFinishReason in @salyro/types, and how /v1/responses applies it |
Where the rows come from
- xAI (tried, not reachable from the build): docs.x.ai/docs/api-reference, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L598, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L602, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L605, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L609, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L612, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L615, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L618, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L691, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L694, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L697, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L700, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L703, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L707, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L710, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L713, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L716, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L720, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L723, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L727, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L731, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L734, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L737, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L740, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L743, 2026-09-26.
- Google (read): github.com/googleapis/googleapis/blob/5174d7c27d275560a3c963d41c3911d0a060a207/google/ai/generativelanguage/v1beta/generative_service.proto#L747, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L42723, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66896, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66937, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66951, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66952, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L66953, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L67442, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L67936, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L68499, 2026-09-26.
- OpenAI (read): github.com/openai/openai-openapi/blob/42eccf12b80a8aecb5a457060d6b17e6f1f84b8d/openapi.yaml#L68563, 2026-09-26.
- Anthropic (read): platform.claude.com/docs/en/build-with-claude/handling-stop-reasons, 2026-09-26.
