gproxy-protocol
Wire-format types and cross-protocol transforms for the three major LLM APIs —
Anthropic Claude, OpenAI (ChatCompletions + Responses), and Google Gemini.
Zero HTTP dependencies, pure serde data + typed converters.
gproxy-protocol is the protocol types crate of the
gproxy project. It covers request,
response, streaming event, and shared types for the Claude, OpenAI, and Gemini
APIs, and provides cross-protocol conversions through the transform module.
Quick start
Typed cross-protocol conversion via TryFrom:
use ClaudeCreateMessageRequest;
use OpenAiChatCompletionsRequest;
Or runtime-keyed dispatch when source / destination only come from config:
use ;
use transform_request;
let out: = transform_request?;
SSE → NDJSON framing rewriter for gateway passthrough:
use SseToNdjsonRewriter;
let mut rewriter = default;
let out = rewriter.push_chunk;
assert_eq!;
Public Entry Points
| Entry Point | Source | Description |
|---|---|---|
pub mod claude |
src/lib.rs |
Claude protocol module. |
pub mod openai |
src/lib.rs |
OpenAI protocol module. |
pub mod gemini |
src/lib.rs |
Gemini protocol module. |
pub mod stream |
src/lib.rs |
SSE / NDJSON stream processing utilities. |
pub mod transform |
src/lib.rs |
Cross-protocol transformation matrix. |
pub use kinds::{OperationFamily, ProtocolKind} |
src/lib.rs |
Shared operation and protocol enums used across modules. |
Supported Protocols
| Protocol | Module | Description |
|---|---|---|
| Claude | gproxy_protocol::claude |
Types related to the Anthropic Messages API, files, models, and token counting. |
| OpenAI | gproxy_protocol::openai |
Types for Chat Completions, Responses, Embeddings, Images, Models, and related APIs. |
| Gemini | gproxy_protocol::gemini |
Types for GenerateContent, StreamGenerateContent, Embeddings, Batch Embeddings, Models, and the Live API. |
Protocol Operation List
Claude
| Operation Module | Primary Endpoint / Purpose | Typical Public Types |
|---|---|---|
create_message |
POST /v1/messages |
ClaudeCreateMessageRequest, ClaudeCreateMessageResponse, ClaudeStreamEvent, BetaMessage |
count_tokens |
POST /v1/messages/count_tokens |
ClaudeCountTokensRequest, ClaudeCountTokensResponse, BetaMessageTokensCount |
model_list |
GET /v1/models |
ClaudeModelListRequest, ClaudeModelListResponse |
model_get |
GET /v1/models/{model_id} |
ClaudeModelGetRequest, ClaudeModelGetResponse, BetaModelInfo |
file_upload |
POST /v1/files |
ClaudeFileUploadRequest, ClaudeFileUploadResponse, FileMetadata |
file_list |
GET /v1/files |
ClaudeFileListRequest, ClaudeFileListResponse |
file_download |
GET /v1/files/{file_id}/content |
ClaudeFileDownloadRequest, ClaudeFileDownloadResponse |
file_get |
GET /v1/files/{file_id} |
ClaudeFileGetRequest, ClaudeFileGetResponse, FileMetadata |
file_delete |
DELETE /v1/files/{file_id} |
ClaudeFileDeleteRequest, ClaudeFileDeleteResponse, DeletedFile |
OpenAI
| Operation Module | Primary Endpoint / Purpose | Typical Public Types |
|---|---|---|
create_chat_completions |
POST /v1/chat/completions |
OpenAiChatCompletionsRequest, OpenAiChatCompletionsResponse, ChatCompletion, ChatCompletionChunk |
create_response |
POST /v1/responses |
OpenAiCreateResponseRequest, OpenAiCreateResponseResponse, ResponseBody, ResponseStreamEvent |
create_response::websocket |
Responses WebSocket connection and messages | OpenAiCreateResponseWebSocketConnectRequest, OpenAiCreateResponseWebSocketClientMessage, OpenAiCreateResponseWebSocketServerMessage |
compact_response |
POST /v1/responses/{id}/compact |
OpenAiCompactRequest, OpenAiCompactResponse, CompactedResponseOutputItem |
count_tokens |
POST /v1/responses/input_tokens/count |
OpenAiCountTokensRequest, OpenAiCountTokensResponse |
embeddings |
POST /v1/embeddings |
OpenAiEmbeddingsRequest, OpenAiEmbeddingsResponse, OpenAiCreateEmbeddingResponse |
create_image |
POST /v1/images/generations |
OpenAiCreateImageRequest, OpenAiCreateImageResponse, ImageGenerationStreamEvent |
create_image_edit |
POST /v1/images/edits |
OpenAiCreateImageEditRequest, OpenAiCreateImageEditResponse, ImageEditStreamEvent |
model_list |
GET /v1/models |
OpenAiModelListRequest, OpenAiModelListResponse, OpenAiModelList |
model_get |
GET /v1/models/{model} |
OpenAiModelGetRequest, OpenAiModelGetResponse, OpenAiModel |
Gemini
| Operation Module | Primary Endpoint / Purpose | Typical Public Types |
|---|---|---|
generate_content |
POST models/{model}:generateContent |
GeminiGenerateContentRequest, GeminiGenerateContentResponse, gemini::generate_content::response::ResponseBody |
stream_generate_content |
POST models/{model}:streamGenerateContent |
GeminiStreamGenerateContentRequest, GeminiStreamGenerateContentResponse, GeminiNdjsonChunk, GeminiSseChunk |
count_tokens |
POST models/{model}:countTokens |
GeminiCountTokensRequest, GeminiCountTokensResponse |
embeddings |
POST models/{model}:embedContent |
GeminiEmbedContentRequest, GeminiEmbedContentResponse, GeminiContentEmbedding |
batch_embed_contents |
POST models/{model}:batchEmbedContents |
GeminiBatchEmbedContentsRequest, GeminiBatchEmbedContentsResponse, BatchRequestItem |
model_list |
GET models |
GeminiModelListRequest, GeminiModelListResponse |
model_get |
GET models/{model} |
GeminiModelGetRequest, GeminiModelGetResponse, GeminiModelInfo |
live |
Live API / BidiGenerateContent WebSocket | GeminiLiveConnectRequest, GeminiBidiGenerateContentClientMessage, GeminiBidiGenerateContentServerMessage |
Cross-Protocol Transformation Matrix
Notes:
- In the source tree, OpenAI is split into two target or source shapes:
openai_chat_completionsandopenai_response. - The table below is organized by whether the corresponding submodule exists under
src/transform/; it does not include conversions within the same protocol.
| Operation | Claude ↔ OpenAI | Claude ↔ Gemini | OpenAI ↔ Gemini | Evidence |
|---|---|---|---|---|
model_list |
Bidirectional | Bidirectional | Bidirectional | transform/{claude,openai,gemini}/model_list/* |
model_get |
Bidirectional | Bidirectional | Bidirectional | transform/{claude,openai,gemini}/model_get/* |
count_tokens |
Bidirectional | Bidirectional | Bidirectional | transform/{claude,openai,gemini}/count_tokens/* |
generate_content |
Bidirectional | Bidirectional | Bidirectional | transform/claude/generate_content/*, transform/openai/generate_content/*, transform/gemini/generate_content/* |
stream_generate_content |
Bidirectional | Bidirectional | Bidirectional | transform/claude/stream_generate_content/*, transform/openai/stream_generate_content/*, transform/gemini/stream_generate_content/* |
embeddings |
Not supported | Not supported | Bidirectional | transform/openai/embeddings/gemini, transform/gemini/embeddings/openai |
compact |
One-way OpenAI → Claude |
Not supported | One-way OpenAI → Gemini |
transform/openai/compact/{claude,gemini} |
create_image |
Not supported | Not supported | One-way OpenAI → Gemini |
transform/openai/create_image/gemini |
create_image_edit |
Not supported | Not supported | One-way OpenAI → Gemini |
transform/openai/create_image_edit/gemini |
websocket / live |
Not supported | Not supported | Each side only provides its own HTTP ↔ WebSocket bridge; no Claude interop is provided | transform/openai/websocket/*, transform/gemini/websocket/* |
file_* |
Not supported | Not supported | Not supported | There is no file-operation directory under transform/ |
Key Public Types
| Category | Type | Location | Purpose |
|---|---|---|---|
| Root type | OperationFamily |
src/kinds.rs |
Protocol-agnostic operation family enum. |
| Root type | ProtocolKind |
src/kinds.rs |
Shared protocol enum used by routing, transforms, and provider dispatch. |
| Stream utility | SseToNdjsonRewriter |
src/stream.rs |
Incremental SSE → NDJSON rewriter. |
| Transform | TransformError |
src/transform/utils.rs |
Cross-protocol transform error. |
| Transform | TransformResult<T> |
src/transform/utils.rs |
Type alias for cross-protocol transform results. |
| Claude | ClaudeCreateMessageRequest |
src/claude/create_message/request.rs |
Claude message creation request. |
| Claude | ClaudeCreateMessageResponse |
src/claude/create_message/response.rs |
Claude message creation response enum. |
| Claude | ClaudeStreamEvent |
src/claude/create_message/stream.rs |
Claude streaming event. |
| Claude | BetaMessage |
src/claude/create_message/types.rs |
Claude message response body. |
| Claude | ClaudeCountTokensRequest |
src/claude/count_tokens/request.rs |
Claude token counting request. |
| Claude | BetaMessageTokensCount |
src/claude/count_tokens/types.rs |
Claude token counting result. |
| Claude | BetaModelInfo |
src/claude/types.rs |
Claude model metadata. |
| Claude | FileMetadata |
src/claude/types.rs |
Claude file metadata. |
| OpenAI | OpenAiChatCompletionsRequest |
src/openai/create_chat_completions/request.rs |
Chat Completions request. |
| OpenAI | ChatCompletion |
src/openai/create_chat_completions/types.rs |
Full Chat Completions response body. |
| OpenAI | ChatCompletionChunk |
src/openai/create_chat_completions/stream.rs |
Chat Completions streaming chunk. |
| OpenAI | OpenAiCreateResponseRequest |
src/openai/create_response/request.rs |
Responses API request. |
| OpenAI | OpenAiCreateResponseResponse |
src/openai/create_response/response.rs |
Responses API response enum. |
| OpenAI | ResponseStreamEvent |
src/openai/create_response/stream.rs |
Responses API streaming event. |
| OpenAI | OpenAiCreateResponseWebSocketConnectRequest |
src/openai/create_response/websocket/request.rs |
Responses WebSocket connection request. |
| OpenAI | OpenAiEmbeddingsRequest |
src/openai/embeddings/request.rs |
Embeddings request. |
| OpenAI | OpenAiCreateEmbeddingResponse |
src/openai/embeddings/types.rs |
Embeddings response body. |
| OpenAI | OpenAiCreateImageRequest |
src/openai/create_image/request.rs |
Image generation request. |
| OpenAI | OpenAiCreateImageEditRequest |
src/openai/create_image_edit/request.rs |
Image edit request. |
| OpenAI | OpenAiCompactRequest |
src/openai/compact_response/request.rs |
Response compaction request. |
| OpenAI | OpenAiModel |
src/openai/types.rs |
OpenAI model object. |
| OpenAI | OpenAiModelList |
src/openai/types.rs |
OpenAI model list body. |
| Gemini | GeminiGenerateContentRequest |
src/gemini/generate_content/request.rs |
GenerateContent request. |
| Gemini | GeminiGenerateContentResponse |
src/gemini/generate_content/response.rs |
GenerateContent response enum. |
| Gemini | GeminiStreamGenerateContentRequest |
src/gemini/stream_generate_content/request.rs |
StreamGenerateContent request. |
| Gemini | GeminiNdjsonChunk |
src/gemini/stream_generate_content/stream.rs |
NDJSON streaming chunk. |
| Gemini | GeminiSseChunk |
src/gemini/stream_generate_content/stream.rs |
SSE streaming chunk. |
| Gemini | GeminiCountTokensRequest |
src/gemini/count_tokens/request.rs |
CountTokens request. |
| Gemini | GeminiEmbedContentRequest |
src/gemini/embeddings/request.rs |
Single embedding request. |
| Gemini | GeminiBatchEmbedContentsRequest |
src/gemini/batch_embed_contents/request.rs |
Batch embedding request. |
| Gemini | GeminiLiveConnectRequest |
src/gemini/live/request.rs |
Live API connection request. |
| Gemini | GeminiBidiGenerateContentClientMessage |
src/gemini/live/types.rs |
Live API client message. |
| Gemini | GeminiBidiGenerateContentServerMessage |
src/gemini/live/types.rs |
Live API server message. |
| Gemini | GeminiModelInfo |
src/gemini/types.rs |
Gemini model metadata. |
License
Licensed under the MIT License.