Skip to main content

Message Transforms

BluesMinds can transform message formats on the fly, allowing you to use a single OpenAI-compatible format and have it routed to providers that use different native protocols (Anthropic Messages API, Google Gemini API, etc.).

OpenAI → Anthropic Transform​

When you route a request to a Claude model via the standard /v1/chat/completions endpoint, BluesMinds automatically converts the OpenAI message format to Anthropic's Messages API format.

You write:

{
"model": "claude-sonnet-4-5",
"messages": [
{"role": "system", "content": "You are a concise assistant."},
{"role": "user", "content": "Summarize AI in one sentence."}
]
}

BluesMinds internally sends:

{
"model": "claude-sonnet-20240229",
"system": "You are a concise assistant.",
"messages": [
{"role": "user", "content": "Summarize AI in one sentence."}
],
"max_tokens": 1024
}

Your code never needs to know about Anthropic's format.

Native Anthropic Messages Endpoint​

If you prefer to use Anthropic's native message format directly, BluesMinds also exposes it:

POST https://api.bluesminds.com/v1/messages
Authorization: Bearer sk-...
Content-Type: application/json
{
"model": "claude-sonnet-4-5",
"messages": [{"role": "user", "content": "Hello Claude!"}],
"max_tokens": 256
}

This is useful for applications already built against the Anthropic SDK.

OpenAI → Gemini Transform​

Similarly, requests to Gemini models via /v1/chat/completions are automatically transformed into Google's generateContent format internally. The response is converted back to the OpenAI format before being returned to you.

System Messages​

All providers handle system messages differently. BluesMinds normalizes them:

ProviderHandling
OpenAINative {"role": "system", ...}
AnthropicExtracted to top-level "system" field
Google GeminiMapped to system_instruction

Just use standard OpenAI {"role": "system"} in your messages array — BluesMinds handles the rest.

Streaming Normalization​

All providers use different streaming formats. BluesMinds normalizes all of them to OpenAI's SSE format:

data: {"id":"chatcmpl-...","choices":[{"delta":{"content":"Hello"}}]}
data: {"choices":[{"delta":{"content":" world"}}]}
data: [DONE]

You never need to handle Anthropic event streams or Google SSE formats.

Limitations​

  • Embeddings are not currently available
  • Audio STT (speech-to-text) transforms are provider-specific; check model availability
  • Some provider-specific parameters (e.g., Anthropic's top_k) are not forwarded through the OpenAI compat layer — use the native endpoint if you need them