Skip to content
v0.8.4stable

Anthropic Messages

POST /v1/messages  compatible  semantic operation generate  contract revision 1

State semantics: stateless; portable is default; native pins one exact Anthropic-wire provider profile and disables cross-provider fallback

Raw contract deviations

These statements are source-contract evidence. Use the examples, field table, and Profile coverage matrix for ordinary integration, and expand this list when investigating a compatibility boundary.

  • only anthropic-version 2023-06-01 is accepted
  • anthropic-beta is forwarded only in native mode and only for tokens the selected connection has been configured to accept; portable mode rejects it because the request is re-authored through the canonical model and a beta token describes the request as written
  • tools are classified by execution site: Anthropic-defined client-executed tools are accepted at any dated version suffix, while provider-executed tools require the selected connection to declare provider_executed_tools, because the upstream would make network calls outside SafeTransport’s host allowlist
  • family matching is anchored to <family><YYYYMMDD>, so a longer name that merely begins with a known family (bash_code_execution*) is classified on its own terms rather than as the client-executed tool it resembles
  • portable mode rejects members of tools[], output_config, and message content blocks that the canonical model cannot carry, because that path re-authors the body and would otherwise drop them silently; native mode forwards them verbatim
  • mcp_servers, container, and fallbacks are rejected as deliberate boundaries rather than unmodelled fields: the first two delegate egress or code execution to the upstream, and the third moves model selection outside Halro’s routing and cost attribution
  • in native mode tool and content-block bodies are forwarded verbatim, so cache_control and per-tool configuration reach the provider unchanged; portable mode refuses them rather than re-authoring the body without them
  • Gateway Keys are accepted through x-api-key for official SDK compatibility and are never forwarded upstream
  • native mode is selected with Halro-Route-Mode and requires either the direct Anthropic or Bedrock Mantle Anthropic profile

Anthropic-compatible facade. The Anthropic SDK base URL does not include /v1; the SDK appends it. This is the opposite of the OpenAI SDK and a wrong base URL normally returns 404. Authenticate with x-api-key or Authorization; if both are present and differ, authentication fails.

Terminal window
curl https://halro.example.com/v1/messages \
-H "x-api-key: $HALRO_GATEWAY_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{ "model": "claude", "max_tokens": 256,
"messages": [{"role": "user", "content": "Hello"}] }'
  • x-api-key or Authorization
  • anthropic-version
  • anthropic-beta
  • Halro-Route-Mode
  • Content-Type
Request fields
FieldProvider Profiles that do not support itCombination-level constraints
model1
max_tokensminimax.chat.v1, kimi.chat.v1, kimi.responses.v12
messages3
messages[].role4
messages[].content5
messages[].content[].type=document6
messages[].content[].type=search_result7
system
stream8
stop_sequencesopenai.responses.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1, minimax.anthropic.messages.v1, minimax.chat.v1, minimax.responses.v1, kimi.chat.v1, kimi.responses.v19
temperaturekimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v110
top_pkimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v111
top_kopenai.chat-embeddings.v1, openai.responses.v1, azure-openai.chat-embeddings.v1, deepseek.chat.v1, openai-compatible.chat-embeddings.v1, gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.chat.v1, bedrock.mantle.openai.chat.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1, minimax.anthropic.messages.v1, minimax.chat.v1, minimax.responses.v1, kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v112
toolsgemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v113
tools[].type=custom14
tools[].type=bash_*15
tools[].type=text_editor_*16
tools[].type=memory_*17
tools[].type=computer_*18
tool_choicegemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, kimi.chat.v119
thinkingopenai.chat-embeddings.v1, openai.responses.v1, azure-openai.chat-embeddings.v1, deepseek.chat.v1, openai-compatible.chat-embeddings.v1, gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.chat.v1, bedrock.mantle.openai.chat.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1, minimax.chat.v1, minimax.responses.v1, kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v120
metadataopenai.chat-embeddings.v1, openai.responses.v1, azure-openai.chat-embeddings.v1, deepseek.chat.v1, openai-compatible.chat-embeddings.v1, gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.chat.v1, bedrock.mantle.openai.chat.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1, minimax.chat.v1, minimax.responses.v1, kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v1
service_tieropenai.chat-embeddings.v1, openai.responses.v1, azure-openai.chat-embeddings.v1, deepseek.chat.v1, openai-compatible.chat-embeddings.v1, gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.chat.v1, bedrock.mantle.openai.chat.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1, minimax.chat.v1, minimax.responses.v1, kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v1
output_config21
output_config.effortopenai.responses.v1, deepseek.chat.v1, gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1, bedrock.mantle.anthropic.messages.v1, minimax.anthropic.messages.v1, minimax.responses.v1, kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v122
output_config.formatdeepseek.chat.v1, gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.anthropic.messages.v1, minimax.anthropic.messages.v1, minimax.chat.v1, minimax.responses.v123

Halro rejects these fields before any Provider I/O:

  • provider-executed tools (web_search_*, web_fetch_*, code_execution_*, advisor_*, tool_search_*) unless the selected connection declares provider_executed_tools
  • mcp_servers
  • container
  • fallbacks
  • Anthropic-defined tools in portable mode
  • strict tools in portable mode
  • signed thinking in portable mode
  • unknown top-level fields
  • unknown members of tools[] and output_config in portable mode

id type role content model stop_reason stop_sequence usage

message_start content_block_start content_block_delta content_block_stop message_delta message_stop ping error

Provider Profile contract coverage and current availability

Section titled “Provider Profile contract coverage and current availability”
Provider Profile contract coverage and current availability
Provider ProfileMaturityCurrent buildUnsupported request fields
openai.chat-embeddings.v1compatiblecreatablemetadata, service_tier, thinking, top_k
openai.responses.v1compatiblecreatablemetadata, output_config.effort, service_tier, stop_sequences, thinking, top_k
anthropic.messages.2023-06-01compatiblecreatableundeclared
azure-openai.chat-embeddings.v1compatiblecreatablemetadata, service_tier, thinking, top_k
deepseek.chat.v1compatiblecreatablemetadata, output_config.effort, output_config.format, service_tier, thinking, top_k
openai-compatible.chat-embeddings.v1compatiblecreatablemetadata, service_tier, thinking, top_k
gemini.generate-content.text.v1betacompatiblecreatablemetadata, output_config.effort, output_config.format, service_tier, thinking, tool_choice, tools, top_k
bedrock.runtime.converse.text.v1compatiblewithheld (cannot create)metadata, output_config.effort, output_config.format, service_tier, thinking, tool_choice, tools, top_k
bedrock.mantle.chat.v1compatiblecreatablemetadata, service_tier, thinking, top_k
bedrock.mantle.openai.chat.v1compatiblecreatablemetadata, service_tier, thinking, top_k
bedrock.mantle.responses.v1compatiblecreatablemetadata, output_config.effort, service_tier, stop_sequences, thinking, tools, top_k
bedrock.mantle.openai.responses.v1compatiblecreatablemetadata, output_config.effort, service_tier, stop_sequences, thinking, tools, top_k
bedrock.mantle.anthropic.messages.v1compatiblecreatableoutput_config.effort, output_config.format
minimax.anthropic.messages.v1compatiblecreatabletop_k, stop_sequences, output_config.effort, output_config.format
minimax.chat.v1compatiblecreatablemax_tokens, metadata, output_config.format, service_tier, stop_sequences, thinking, top_k
minimax.responses.v1compatiblecreatablemetadata, output_config.effort, output_config.format, service_tier, stop_sequences, thinking, top_k
kimi.chat.v1compatiblecreatablemax_tokens, metadata, output_config.effort, service_tier, stop_sequences, temperature, thinking, tool_choice, top_k, top_p
kimi.anthropic.messages.v1compatiblecreatablemetadata, output_config.effort, service_tier, temperature, thinking, top_k, top_p
kimi.responses.v1compatiblewithheld (cannot create)max_tokens, metadata, output_config.effort, service_tier, stop_sequences, temperature, thinking, top_k, top_p
openai.chat-embeddings.v1
  • portable Messages content is mapped through OpenAI Chat Completions
openai.responses.v1
  • portable Messages content is mapped through the OpenAI Responses endpoint
  • this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
anthropic.messages.2023-06-01
  • native mode preserves validated Anthropic content blocks and events
azure-openai.chat-embeddings.v1
  • portable Messages content is mapped through Azure Chat Completions
deepseek.chat.v1
  • portable Messages content is mapped through DeepSeek Chat Completions
  • output_config.effort and output_config.format are declared unsupported at field granularity because support is value-dependent: none, low and high reach DeepSeek’s thinking switch while minimal, medium and xhigh have no rung, and DeepSeek has json_object but no schema mode
  • thinking stays unsupported for the same reason it is on every other portable profile — it is the Anthropic-native block config, which only native mode forwards; DeepSeek’s own thinking switch is reached through output_config.effort
openai-compatible.chat-embeddings.v1
  • portable Messages content is mapped through an OpenAI-compatible primitive
gemini.generate-content.text.v1beta
  • portable text Messages content is mapped through Gemini generateContent
  • output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
bedrock.runtime.converse.text.v1
  • portable text Messages content is mapped through Bedrock Converse
  • output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
bedrock.mantle.chat.v1
  • portable Messages content is mapped through Bedrock Mantle Chat Completions
bedrock.mantle.openai.chat.v1
  • portable Messages content is mapped through Bedrock Mantle Chat Completions
bedrock.mantle.responses.v1
  • portable Messages content is mapped through stateless Bedrock Mantle Responses
  • streaming requests with tools are rejected before provider I/O
  • output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry, so a request carrying it is routed away before provider I/O
bedrock.mantle.openai.responses.v1
  • portable Messages content is mapped through stateless Bedrock Mantle Responses
  • streaming requests with tools are rejected before provider I/O
  • output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry, so a request carrying it is routed away before provider I/O
bedrock.mantle.anthropic.messages.v1
  • native mode preserves validated Anthropic content blocks, thinking signatures, and events
  • output_config is unsupported in portable mode only: this profile shares the Anthropic wire form and could carry the member, but its Mantle Beta capability ceiling is fixed by the build and widening it is a separate contract review, so a portable request carrying effort or format is routed away before provider I/O while native mode forwards the member verbatim
minimax.anthropic.messages.v1
  • native mode preserves validated Anthropic content blocks, thinking signatures, and events
  • top_k, stop_sequences and cache_control are rejected on the native path as well as the portable one, because MiniMax documents them as ignored rather than refused and a silently dropped boundary is billed as if it had been honoured
  • prompt caching is unavailable, so a cache_control marker would claim a discount that does not exist
  • anthropic-beta is never forwarded: MiniMax does not accept beta headers
  • output_config is unsupported because MiniMax’s reasoning switch is the older thinking member; a portable request that asks for no depth still arrives with thinking disabled, which is MiniMax’s exact spelling
  • video and mid_conv_system content blocks are refused by the Messages decoder, which accepts only Anthropic’s own block types — MiniMax extends the wire form and Halro does not follow it there
minimax.chat.v1
  • portable Messages content is mapped through MiniMax Chat Completions
  • output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
  • max_tokens is why: MiniMax has one output bound and it counts reasoning, so the answer-only bound this endpoint requires is the same quantity only while nothing is thinking
minimax.responses.v1
  • portable Messages content is mapped through stateless MiniMax Responses
  • this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  • output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry
kimi.anthropic.messages.v1
  • native mode preserves validated Anthropic content blocks, thinking signatures, and events
  • output_config.effort is unsupported in portable mode only: a portable request naming a depth comes back carrying a thinking block, which the portable decoder refuses after the upstream has been paid, while native mode forwards the member and reads the block back verbatim
  • output_config.format is carried: this endpoint always names a schema, and Kimi takes a json_schema through the same member and enforces it
  • temperature and top_p are rejected on both paths because Kimi pins each per model and answers any other value with an error
  • top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
  • anthropic-beta is never forwarded: Kimi documents no beta headers
  • stop_sequences is carried and was measured honoured, so it is not refused the way MiniMax’s is
kimi.chat.v1
  • portable Messages content is mapped through Kimi Chat Completions
  • temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
  • output_config.effort is this endpoint’s spelling of reasoning_effort and is value-dependent: low and high reach Kimi’s switch, while medium, xhigh, Anthropic’s max and a request for no reasoning at all have no Kimi rung on this profile
  • output_config.format is carried: it is always a schema on this endpoint, and the Kimi Chat face documents the json_schema response format
  • max_tokens is carried as max_completion_tokens, which Kimi documents as the same bound under a newer name — but the two are the same quantity only while nothing is thinking, because Kimi’s single output bound counts reasoning, measured 2026-09-01. This endpoint requires max_tokens and means the answer alone, so a request that also asks for a depth is routed away rather than having this layer decide which of the two quantities the caller meant
  • stop_sequences is carried and was measured honoured, within Kimi’s published bounds of five sequences of at most 32 bytes each; a request outside them is routed away before provider I/O
  • tool_choice is value-dependent: a named function together with a depth is refused by every Kimi model and routed away before provider I/O, while required together with a depth is refused by the K2.x line alone — a per-model limit this declaration cannot express, refused after the reservation rather than costing kimi-k3 the request it serves
kimi.responses.v1
  • portable Messages content is mapped through stateless Kimi Responses
  • this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  • output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry
  • temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
  • output_config.format is carried: it is always a schema on this endpoint, and a schema is exactly what Kimi’s Responses face accepts

Verified evidence: gateway_contract, provider_transport_fixture, sdk_blackbox

anthropic-go, anthropic-typescript, anthropic-python

See Anthropic native features and Token Count.


Fields, coverage, transformations, and deviations are generated from Halro 8f185de7674c (scripts/generate-api-pages-en.mjs; synchronized manifest digest 8e5e7a0a794721aa…). The synchronized copy contains 1 recorded accuracy correction(s); source manifest digest b321ee18ad2e38f3…. The contract currently carries field names, not complete types, required relationships, or value semantics.

  1. Combination constraints for model:

    • kimi.anthropic.messages.v1: temperature and top_p are rejected on both paths because Kimi pins each per model and answers any other value with an error
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.chat.v1: tool_choice is value-dependent: a named function together with a depth is refused by every Kimi model and routed away before provider I/O, while required together with a depth is refused by the K2.x line alone — a per-model limit this declaration cannot express, refused after the reservation rather than costing kimi-k3 the request it serves
    • kimi.responses.v1: temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
  2. Combination constraints for max_tokens:

    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • kimi.chat.v1: max_tokens is carried as max_completion_tokens, which Kimi documents as the same bound under a newer name — but the two are the same quantity only while nothing is thinking, because Kimi’s single output bound counts reasoning, measured 2026-09-01. This endpoint requires max_tokens and means the answer alone, so a request that also asks for a depth is routed away rather than having this layer decide which of the two quantities the caller meant
  3. Combination constraints for messages:

    • openai.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • minimax.anthropic.messages.v1: video and mid_conv_system content blocks are refused by the Messages decoder, which accepts only Anthropic’s own block types — MiniMax extends the wire form and Halro does not follow it there
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • minimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • kimi.anthropic.messages.v1: top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  4. Combination constraints for messages[].role:

    • openai.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • minimax.anthropic.messages.v1: video and mid_conv_system content blocks are refused by the Messages decoder, which accepts only Anthropic’s own block types — MiniMax extends the wire form and Halro does not follow it there
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • minimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • kimi.anthropic.messages.v1: top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  5. Combination constraints for messages[].content:

    • openai.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • minimax.anthropic.messages.v1: video and mid_conv_system content blocks are refused by the Messages decoder, which accepts only Anthropic’s own block types — MiniMax extends the wire form and Halro does not follow it there
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • minimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • kimi.anthropic.messages.v1: top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  6. Combination constraints for messages[].content[].type=document:

    • openai.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • minimax.anthropic.messages.v1: video and mid_conv_system content blocks are refused by the Messages decoder, which accepts only Anthropic’s own block types — MiniMax extends the wire form and Halro does not follow it there
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • minimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • kimi.anthropic.messages.v1: top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  7. Combination constraints for messages[].content[].type=search_result:

    • openai.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • minimax.anthropic.messages.v1: video and mid_conv_system content blocks are refused by the Messages decoder, which accepts only Anthropic’s own block types — MiniMax extends the wire form and Halro does not follow it there
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • minimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • kimi.anthropic.messages.v1: top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  8. Combination constraints for stream:

    • openai.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
    • minimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
    • kimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
  9. Combination constraints for stop_sequences:

    • minimax.anthropic.messages.v1: top_k, stop_sequences and cache_control are rejected on the native path as well as the portable one, because MiniMax documents them as ignored rather than refused and a silently dropped boundary is billed as if it had been honoured
    • kimi.anthropic.messages.v1: stop_sequences is carried and was measured honoured, so it is not refused the way MiniMax’s is
    • kimi.chat.v1: stop_sequences is carried and was measured honoured, within Kimi’s published bounds of five sequences of at most 32 bytes each; a request outside them is routed away before provider I/O
  10. Combination constraints for temperature:

    • kimi.anthropic.messages.v1: temperature and top_p are rejected on both paths because Kimi pins each per model and answers any other value with an error
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
  11. Combination constraints for top_p:

    • kimi.anthropic.messages.v1: temperature and top_p are rejected on both paths because Kimi pins each per model and answers any other value with an error
    • kimi.chat.v1: temperature and top_p are this endpoint’s own members and Kimi models neither: they are absent from its request schema and pinned per model, so a Messages request naming either is routed away before provider I/O
    • kimi.responses.v1: temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
  12. Combination constraints for top_k:

    • minimax.anthropic.messages.v1: top_k, stop_sequences and cache_control are rejected on the native path as well as the portable one, because MiniMax documents them as ignored rather than refused and a silently dropped boundary is billed as if it had been honoured
    • kimi.anthropic.messages.v1: top_k and cache_control are rejected on the native path as well as the portable one: Kimi’s Messages schema has neither member, top_k answers 200 without anything establishing what it did, and prompt caching is automatic with no handle to mark
  13. Combination constraints for tools:

    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
  14. Combination constraints for tools[].type=custom:

    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
  15. Combination constraints for tools[].type=bash_*:

    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
  16. Combination constraints for tools[].type=text_editor_*:

    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
  17. Combination constraints for tools[].type=memory_*:

    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
  18. Combination constraints for tools[].type=computer_*:

    • bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/O
    • bedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
  19. Combination constraints for tool_choice:

    • kimi.chat.v1: tool_choice is value-dependent: a named function together with a depth is refused by every Kimi model and routed away before provider I/O, while required together with a depth is refused by the K2.x line alone — a per-model limit this declaration cannot express, refused after the reservation rather than costing kimi-k3 the request it serves
  20. Combination constraints for thinking:

    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
    • kimi.chat.v1: max_tokens is carried as max_completion_tokens, which Kimi documents as the same bound under a newer name — but the two are the same quantity only while nothing is thinking, because Kimi’s single output bound counts reasoning, measured 2026-09-01. This endpoint requires max_tokens and means the answer alone, so a request that also asks for a depth is routed away rather than having this layer decide which of the two quantities the caller meant
  21. Combination constraints for output_config:

    • gemini.generate-content.text.v1beta: output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
    • bedrock.runtime.converse.text.v1: output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
    • bedrock.mantle.responses.v1: output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry, so a request carrying it is routed away before provider I/O
    • bedrock.mantle.openai.responses.v1: output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry, so a request carrying it is routed away before provider I/O
    • bedrock.mantle.anthropic.messages.v1: output_config is unsupported in portable mode only: this profile shares the Anthropic wire form and could carry the member, but its Mantle Beta capability ceiling is fixed by the build and widening it is a separate contract review, so a portable request carrying effort or format is routed away before provider I/O while native mode forwards the member verbatim
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
  22. Combination constraints for output_config.effort:

    • gemini.generate-content.text.v1beta: output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
    • bedrock.runtime.converse.text.v1: output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
    • bedrock.mantle.responses.v1: output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry, so a request carrying it is routed away before provider I/O
    • bedrock.mantle.openai.responses.v1: output_config.effort is this endpoint’s spelling of reasoning_effort, which the stateless Responses primitive does not carry, so a request carrying it is routed away before provider I/O
    • minimax.chat.v1: output_config.effort reaches MiniMax’s thinking switch, which has one on state and no depth ladder, so a depth is honoured as on rather than preserved — but only on a request that does not also bound the answer, and this endpoint requires max_tokens, so an effort-bearing Messages request is routed away from this profile by field rather than translated
  23. Combination constraints for output_config.format:

    • gemini.generate-content.text.v1beta: output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O
    • bedrock.runtime.converse.text.v1: output_config.effort and output_config.format are this endpoint’s spelling of reasoning_effort and response_format, which this profile declares unsupported at every value, so a request carrying either is routed away before provider I/O