You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Universal translator between AI provider protocols.
Convert between OpenAI Chat Completions, OpenAI Responses, Anthropic Messages, and Google Gemini APIs — with full support for tool calling, multimodal content, extended thinking, web search, grounding, and streaming.
Install
npm install @zenmux/rosetta-ai
How It Works
Each converter follows the gateway pattern: request goes forward (user protocol → backend protocol), while response and stream go backward (backend → user).
User ──request──→ [Converter] ──request──→ Backend
User ←─response── [Converter] ←─response── Backend
User ←──stream─── [Converter] ←──stream─── Backend
One converter instance handles the full round-trip for a single gateway route.
Converters
Converter
User Protocol
Backend Protocol
ChatCompletionToMessagesConverter
OpenAI Chat Completions
Anthropic Messages
ChatCompletionToResponsesConverter
OpenAI Chat Completions
OpenAI Responses
ChatCompletionToGeminiConverter
OpenAI Chat Completions
Google Gemini
MessagesToChatCompletionConverter
Anthropic Messages
OpenAI Chat Completions
MessagesToResponsesConverter
Anthropic Messages
OpenAI Responses
MessagesToGeminiConverter
Anthropic Messages
Google Gemini
ResponsesToChatCompletionConverter
OpenAI Responses
OpenAI Chat Completions
ResponsesToMessagesConverter
OpenAI Responses
Anthropic Messages
ResponsesToGeminiConverter
OpenAI Responses
Google Gemini
GeminiToChatCompletionConverter
Google Gemini
OpenAI Chat Completions
GeminiToMessagesConverter
Google Gemini
Anthropic Messages
GeminiToResponsesConverter
Google Gemini
OpenAI Responses
Usage
OpenAI Chat Completions → Anthropic Messages
import{ChatCompletionToMessagesConverter}from"@zenmux/rosetta-ai";constconverter=newChatCompletionToMessagesConverter();// Request: CC → Messages (forward)constanthropicRequest=converter.convertRequest(openaiRequest);// Call the backendconstanthropicResponse=awaitanthropicClient.messages.create(anthropicRequest);// Response: Messages → CC (backward)constopenaiResponse=converter.convertResponse(anthropicResponse);// Streaming: Messages stream → CC stream (backward)conststream=awaitanthropicClient.messages.create({ ...anthropicRequest,stream: true});forawait(constchunkofconverter.convertStream(stream)){// chunk is an OpenAI ChatCompletionChunk}
Anthropic Messages → OpenAI Chat Completions
import{MessagesToChatCompletionConverter}from"@zenmux/rosetta-ai";constconverter=newMessagesToChatCompletionConverter();// Request: Messages → CC (forward)constopenaiRequest=converter.convertRequest(anthropicRequest);// Call the backendconstopenaiResponse=awaitopenaiClient.chat.completions.create(openaiRequest);// Response: CC → Messages (backward)constanthropicResponse=converter.convertResponse(openaiResponse);// Streaming: CC stream → Messages stream (backward)conststream=awaitopenaiClient.chat.completions.create({ ...openaiRequest,stream: true});forawait(consteventofconverter.convertStream(stream)){// event is an Anthropic RawMessageStreamEvent}
OpenAI Chat Completions → OpenAI Responses
import{ChatCompletionToResponsesConverter}from"@zenmux/rosetta-ai";constconverter=newChatCompletionToResponsesConverter();// Request: CC → Responses (forward)constresponsesRequest=converter.convertRequest(ccRequest);// Response: Responses → CC (backward)constccResponse=converter.convertResponse(responsesResponse);// Streaming: Responses stream → CC stream (backward)forawait(constchunkofconverter.convertStream(responsesStream)){// chunk is an OpenAI ChatCompletionChunk}
OpenAI Responses → OpenAI Chat Completions
import{ResponsesToChatCompletionConverter}from"@zenmux/rosetta-ai";constconverter=newResponsesToChatCompletionConverter();// Request: Responses → CC (forward)constccRequest=converter.convertRequest(responsesRequest);// Response: CC → Responses (backward)constresponsesResponse=converter.convertResponse(ccResponse);// Streaming: CC stream → Responses stream (backward)forawait(consteventofconverter.convertStream(ccStream)){// event is a Responses ResponseStreamEvent}
import{ChatCompletionToGeminiConverter}from"@zenmux/rosetta-ai";import{GoogleGenAI}from"@google/genai";constconverter=newChatCompletionToGeminiConverter();constgenai=newGoogleGenAI({apiKey: "..."});// Request: CC → Gemini (forward)constgeminiRequest=converter.convertRequest(openaiRequest);// Call the backendconstgeminiResponse=awaitgenai.models.generateContent(geminiRequest);// Response: Gemini → CC (backward)constopenaiResponse=converter.convertResponse(geminiResponse);// Streaming: Gemini stream → CC stream (backward)conststream=awaitgenai.models.generateContentStream(geminiRequest);forawait(constchunkofconverter.convertStream(stream)){// chunk is an OpenAI ChatCompletionChunk}
import{GeminiToChatCompletionConverter}from"@zenmux/rosetta-ai";constconverter=newGeminiToChatCompletionConverter();// Request: Gemini → CC (forward)constccRequest=converter.convertRequest(geminiRequest);// Response: CC → Gemini (backward)constgeminiResponse=converter.convertResponse(ccResponse);// Streaming: CC stream → Gemini stream (backward)forawait(constchunkofconverter.convertStream(ccStream)){// chunk is a Google GenerateContentResponse}
Google Gemini → Anthropic Messages
import{GeminiToMessagesConverter}from"@zenmux/rosetta-ai";constconverter=newGeminiToMessagesConverter();// Request: Gemini → Messages (forward)constmessagesRequest=converter.convertRequest(geminiRequest);// Response: Messages → Gemini (backward)constgeminiResponse=converter.convertResponse(anthropicResponse);// Streaming: Messages stream → Gemini stream (backward)forawait(constchunkofconverter.convertStream(messagesStream)){// chunk is a Google GenerateContentResponse}
Google Gemini → OpenAI Responses
import{GeminiToResponsesConverter}from"@zenmux/rosetta-ai";constconverter=newGeminiToResponsesConverter();// Request: Gemini → Responses (forward)constresponsesRequest=converter.convertRequest(geminiRequest);// Response: Responses → Gemini (backward)constgeminiResponse=converter.convertResponse(responsesResponse);// Streaming: Responses stream → Gemini stream (backward)forawait(constchunkofconverter.convertStream(responsesStream)){// chunk is a Google GenerateContentResponse}
Supported Conversions
Chat Completions ↔ Messages
OpenAI Chat Completions
Anthropic Messages
model
model
messages (system/developer/user/assistant/tool)
system + messages (user/assistant with content blocks)