Skip to content

Choosing a Protocol

ProxAI has two protocol decisions:

  • Inbound protocol — what the local client sends, detected from the request path.
  • Provider protocol — what ProxAI sends upstream, configured on the selected provider.

They can be the same for pass-through, or different when ProxAI performs a supported conversion.

Client request path
/v1/responses, /v1/chat/completions, or /v1/messages
Route selection
default provider or explicit route by request_protocol + model
Provider protocol
provider.protocol controls outbound wire behavior
Upstream request
serialized in the selected provider protocol
Client speaksUse inbound protocolTypical reason
OpenAI Responsesopenai_responsesItemized output, modern Responses semantics, hosted-tool style payloads.
OpenAI Chat Completionsopenai_chat_completionsOlder SDKs, clients that expect choices[], or Chat Completions-only integrations.
Anthropic Messagesanthropic_messagesClients that already emit Anthropic-style message payloads.
Provider expectsSet provider.protocolNotes
OpenAI Responsesopenai_responsesBest fit for OpenAI-compatible Responses upstreams.
OpenAI Chat Completionsopenai_chat_completionsBest fit for Chat Completions-only upstreams.
Anthropic Messagesanthropic_messagesBest fit for Anthropic-compatible /v1/messages upstreams.

Provider names are labels. They do not imply protocol semantics. The provider protocol field is the semantic value.

Inbound \ ProviderResponsesChatAnthropic
openai_responsesPass-throughSupportedSupported
openai_chat_completionsUnsupportedPass-throughSupported
anthropic_messagesSupportedUnsupportedPass-through

Unsupported pairs fail explicitly. ProxAI should not silently fall through to another provider if a route matched but the protocol pair is not implemented.

Before choosing a cross-protocol pair, ask:

QuestionWhy it matters
Does the client rely on exact output item ids?Responses has itemized output and stable item identities that other protocols may not model the same way.
Does the provider emit tool calls incrementally?Streaming tool-call chunks have protocol-specific identifiers and terminal events.
Does the client inspect stop or finish reasons?Stop reasons are related but not identical across protocols. See status reference.
Does the client require provider-specific fields?Provider-specific fields should not leak through a generic conversion boundary.