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.
Request examples
Section titled “Request examples”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"}] }'import osfrom anthropic import Anthropic
# Do not include /v1; the SDK appends it.client = Anthropic(base_url="https://halro.example.com", api_key=os.environ["HALRO_GATEWAY_KEY"], timeout=60.0, max_retries=0)message = client.messages.create( model="claude", max_tokens=256, messages=[{"role": "user", "content": "Hello"}],)print(message.content[0].text)import Anthropic from "@anthropic-ai/sdk";
// Do not include /v1; the SDK appends it.const client = new Anthropic({ baseURL: "https://halro.example.com", apiKey: process.env.HALRO_GATEWAY_KEY, timeout: 60_000, maxRetries: 0,});const message = await client.messages.create({ model: "claude", max_tokens: 256, messages: [{ role: "user", content: "Hello" }],});console.log(message.content[0].text);Request headers
Section titled “Request headers”x-api-key or Authorizationanthropic-versionanthropic-betaHalro-Route-ModeContent-Type
Request fields
Section titled “Request fields”| Field | Provider Profiles that do not support it | Combination-level constraints |
|---|---|---|
model | — | 1 |
max_tokens | minimax.chat.v1, kimi.chat.v1, kimi.responses.v1 | 2 |
messages | — | 3 |
messages[].role | — | 4 |
messages[].content | — | 5 |
messages[].content[].type=document | — | 6 |
messages[].content[].type=search_result | — | 7 |
system | — | — |
stream | — | 8 |
stop_sequences | openai.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.v1 | 9 |
temperature | kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v1 | 10 |
top_p | kimi.chat.v1, kimi.anthropic.messages.v1, kimi.responses.v1 | 11 |
top_k | openai.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.v1 | 12 |
tools | gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, bedrock.mantle.responses.v1, bedrock.mantle.openai.responses.v1 | 13 |
tools[].type=custom | — | 14 |
tools[].type=bash_* | — | 15 |
tools[].type=text_editor_* | — | 16 |
tools[].type=memory_* | — | 17 |
tools[].type=computer_* | — | 18 |
tool_choice | gemini.generate-content.text.v1beta, bedrock.runtime.converse.text.v1, kimi.chat.v1 | 19 |
thinking | openai.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 | 20 |
metadata | openai.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_tier | openai.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_config | — | 21 |
output_config.effort | openai.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.v1 | 22 |
output_config.format | deepseek.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.v1 | 23 |
Fields rejected at the facade
Section titled “Fields rejected at the facade”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_toolsmcp_serverscontainerfallbacksAnthropic-defined tools in portable modestrict tools in portable modesigned thinking in portable modeunknown top-level fieldsunknown members of tools[] and output_config in portable mode
Response fields
Section titled “Response fields”id type role content model stop_reason stop_sequence usage
Stream events
Section titled “Stream events”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 | Maturity | Current build | Unsupported request fields |
|---|---|---|---|
openai.chat-embeddings.v1 | compatible | creatable | metadata, service_tier, thinking, top_k |
openai.responses.v1 | compatible | creatable | metadata, output_config.effort, service_tier, stop_sequences, thinking, top_k |
anthropic.messages.2023-06-01 | compatible | creatable | undeclared |
azure-openai.chat-embeddings.v1 | compatible | creatable | metadata, service_tier, thinking, top_k |
deepseek.chat.v1 | compatible | creatable | metadata, output_config.effort, output_config.format, service_tier, thinking, top_k |
openai-compatible.chat-embeddings.v1 | compatible | creatable | metadata, service_tier, thinking, top_k |
gemini.generate-content.text.v1beta | compatible | creatable | metadata, output_config.effort, output_config.format, service_tier, thinking, tool_choice, tools, top_k |
bedrock.runtime.converse.text.v1 | compatible | withheld (cannot create) | metadata, output_config.effort, output_config.format, service_tier, thinking, tool_choice, tools, top_k |
bedrock.mantle.chat.v1 | compatible | creatable | metadata, service_tier, thinking, top_k |
bedrock.mantle.openai.chat.v1 | compatible | creatable | metadata, service_tier, thinking, top_k |
bedrock.mantle.responses.v1 | compatible | creatable | metadata, output_config.effort, service_tier, stop_sequences, thinking, tools, top_k |
bedrock.mantle.openai.responses.v1 | compatible | creatable | metadata, output_config.effort, service_tier, stop_sequences, thinking, tools, top_k |
bedrock.mantle.anthropic.messages.v1 | compatible | creatable | output_config.effort, output_config.format |
minimax.anthropic.messages.v1 | compatible | creatable | top_k, stop_sequences, output_config.effort, output_config.format |
minimax.chat.v1 | compatible | creatable | max_tokens, metadata, output_config.format, service_tier, stop_sequences, thinking, top_k |
minimax.responses.v1 | compatible | creatable | metadata, output_config.effort, output_config.format, service_tier, stop_sequences, thinking, top_k |
kimi.chat.v1 | compatible | creatable | max_tokens, metadata, output_config.effort, service_tier, stop_sequences, temperature, thinking, tool_choice, top_k, top_p |
kimi.anthropic.messages.v1 | compatible | creatable | metadata, output_config.effort, service_tier, temperature, thinking, top_k, top_p |
kimi.responses.v1 | compatible | withheld (cannot create) | max_tokens, metadata, output_config.effort, service_tier, stop_sequences, temperature, thinking, top_k, top_p |
Declared transformations
Section titled “Declared transformations”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
Evidence
Section titled “Evidence”Verified evidence: gateway_contract, provider_transport_fixture, sdk_blackbox
SDK black-box protocol-stub matrix
Section titled “SDK black-box protocol-stub matrix”anthropic-go, anthropic-typescript, anthropic-python
Best practices
Section titled “Best practices”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.
Footnotes
Section titled “Footnotes”-
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 errorkimi.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/Okimi.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 serveskimi.responses.v1: temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
-
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 translatedkimi.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
-
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 fieldminimax.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 thereminimax.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 translatedminimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by fieldkimi.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 markkimi.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/Okimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
-
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 fieldminimax.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 thereminimax.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 translatedminimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by fieldkimi.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 markkimi.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/Okimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
-
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 fieldminimax.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 thereminimax.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 translatedminimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by fieldkimi.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 markkimi.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/Okimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
-
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 fieldminimax.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 thereminimax.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 translatedminimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by fieldkimi.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 markkimi.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/Okimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
-
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 fieldminimax.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 thereminimax.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 translatedminimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by fieldkimi.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 markkimi.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/Okimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
-
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 fieldbedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/Ominimax.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by fieldkimi.responses.v1: this profile binds no stream primitive, so a streaming Messages request is routed away rather than refused by field
-
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 honouredkimi.anthropic.messages.v1: stop_sequences is carried and was measured honoured, so it is not refused the way MiniMax’s iskimi.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
-
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 errorkimi.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/Okimi.responses.v1: temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
-
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 errorkimi.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/Okimi.responses.v1: temperature and top_p are rejected for the same reason as on the Kimi Chat profile: Kimi models neither member
-
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 honouredkimi.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
-
Combination constraints for
tools:bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
-
Combination constraints for
tools[].type=custom:bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
-
Combination constraints for
tools[].type=bash_*:bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
-
Combination constraints for
tools[].type=text_editor_*:bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
-
Combination constraints for
tools[].type=memory_*:bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
-
Combination constraints for
tools[].type=computer_*:bedrock.mantle.responses.v1: streaming requests with tools are rejected before provider I/Obedrock.mantle.openai.responses.v1: streaming requests with tools are rejected before provider I/O
-
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
-
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 translatedkimi.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
-
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/Obedrock.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/Obedrock.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/Obedrock.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/Obedrock.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 verbatimminimax.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
-
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/Obedrock.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/Obedrock.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/Obedrock.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/Ominimax.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
-
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/Obedrock.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