Complete API documentation for Claude Adapter — Adapt any model for Claude Code.
The main API endpoint that accepts Anthropic Messages API requests and proxies them to an OpenAI-compatible backend.
Request Headers:
Content-Type: application/json
Request Body:
{
model: string; // Required: Model name (passed through directly)
max_tokens: number; // Required: Maximum tokens in response
messages: Message[]; // Required: Array of conversation messages
system?: string; // Optional: System prompt
temperature?: number; // Optional: 0-1, sampling temperature
top_p?: number; // Optional: 0-1, nucleus sampling
stream?: boolean; // Optional: Enable streaming responses
stop_sequences?: string[]; // Optional: Stop sequences
tools?: Tool[]; // Optional: Tool definitions
tool_choice?: ToolChoice; // Optional: Tool selection preference
}Message Format:
{
role: 'user' | 'assistant';
content: string | ContentBlock[];
}Response (Non-streaming):
{
id: string;
type: 'message';
role: 'assistant';
content: ContentBlock[];
model: string;
stop_reason: 'end_turn' | 'max_tokens' | 'tool_use' | null;
stop_sequence: string | null;
usage: {
input_tokens: number;
output_tokens: number;
};
}Response (Streaming): Server-Sent Events (SSE) with the following event types:
message_start- Initial message metadatacontent_block_start- Start of a content blockcontent_block_delta- Content updatecontent_block_stop- End of a content blockmessage_delta- Final message metadata with stop_reasonmessage_stop- Stream complete
Health check endpoint.
Response:
{
"status": "ok",
"adapter": "claude-adapter"
}Converts an Anthropic Messages API request to OpenAI Chat Completions format.
import { convertRequestToOpenAI } from 'claude-adapter';
const openaiRequest = convertRequestToOpenAI(anthropicRequest, 'gpt-4');Parameters:
anthropicRequest: AnthropicMessageRequest- The incoming requesttargetModel: string- The OpenAI model to use
Returns: OpenAIChatRequest
Converts an OpenAI Chat Completion response to Anthropic format.
import { convertResponseToAnthropic } from 'claude-adapter';
const anthropicResponse = convertResponseToAnthropic(openaiResponse, 'claude-4-opus');Parameters:
openaiResponse: OpenAIChatResponse- The OpenAI responseoriginalModelRequested: string- Model name to include in response
Returns: AnthropicMessageResponse
Transforms an OpenAI streaming response to Anthropic SSE format.
import { streamOpenAIToAnthropic } from 'claude-adapter';
await streamOpenAIToAnthropic(openaiStream, fastifyReply, 'claude-4-opus');All errors follow Anthropic's error format:
{
"error": {
"type": "invalid_request_error",
"message": "Description of the error"
}
}Error Types:
| Status Code | Error Type |
|---|---|
| 400 | invalid_request_error |
| 401 | authentication_error |
| 403 | permission_error |
| 404 | not_found_error |
| 429 | rate_limit_error |
| 500 | api_error |
interface AdapterConfig {
baseUrl: string; // OpenAI-compatible API base URL
apiKey: string; // API key for authentication
models: {
opus: string; // Model for Claude Opus requests
sonnet: string; // Model for Claude Sonnet requests
haiku: string; // Model for Claude Haiku requests
};
}import { createServer } from 'claude-adapter';
const config = {
baseUrl: 'https://api.openai.com/v1',
apiKey: process.env.OPENAI_API_KEY,
models: {
opus: 'gpt-4-turbo',
sonnet: 'gpt-4',
haiku: 'gpt-3.5-turbo',
},
};
const server = createServer(config);
await server.start(3080);
// Server now accepts Anthropic API requests at http://localhost:3080