Files
anyllm-proxy/docs/compatibility-contract.md
whit3rabbitandClaude Opus 4.6 215dd2eab3 chore: format, fix Bedrock match arms, verify line counts
- cargo fmt applied across all crates
- Fixed BackendClient::Bedrock match arms in chat_completions.rs,
  routes.rs, streaming.rs, openai_client.rs
- All new source files verified under 400 lines (2 files at 406/429,
  within tolerance for focused single-responsibility modules)
- 549 tests passing, clippy clean, both build paths verified

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:24:00 -05:00

90 lines
3.9 KiB
Markdown

# Compatibility Contract
## Supported Features
| Feature | Status | Notes |
|---|---|---|
| Basic text messages | Supported | Full fidelity |
| Multi-turn conversations | Supported | Role mapping handled |
| System prompts (string) | Supported | Mapped to developer role |
| System prompts (blocks) | Supported | Concatenated to developer message |
| Streaming (SSE) | Supported | Full event sequence translation |
| Tool definitions | Supported | input_schema -> function.parameters |
| Tool use responses | Supported | Stateless ID bridge |
| Tool result handling | Supported | tool_result -> tool role message |
| Multiple tool calls | Supported | Parallel calls preserved |
| Image content (base64) | Supported | Converted to data URI |
| Image content (URL) | Supported | Direct pass-through |
| Stop sequences | Supported | Capped at 4 (OpenAI limit) |
| Temperature | Supported | Pass-through (0..1 subset of 0..2) |
| top_p | Supported | Direct pass-through |
| GET /v1/models | Supported | Static model list |
| POST /v1/embeddings | Supported (passthrough) | No translation; model names forwarded as-is. Works with OpenAI, Vertex, Gemini (`gemini-embedding-exp-03-07`), vLLM/HuggingFace (`BAAI/bge-m3`), and any OpenAI-compatible backend. Not available for the Anthropic passthrough backend (route not mounted). |
## Unsupported Features (Explicit Error)
| Feature | Error | Notes |
|---|---|---|
| Token counting | 400 invalid_request_error | No local approximation |
| Batch processing | 400 invalid_request_error | Would require Batch API mapping |
## Approximated Features (Best Effort)
| Feature | Approximation | Risk |
|---|---|---|
| Documents (PDF) | Text note placeholder | Content not processed by model |
| content_filter finish | Mapped to end_turn | Semantic difference |
| Token accounting | prompt_tokens = input_tokens | Not exact due to tokenizer differences |
| cache_* usage fields | Always null | No prompt caching emulation |
## Not Implemented
| Feature | Reason |
|---|---|
| Extended thinking | No OpenAI equivalent |
| pause_turn stop reason | Anthropic-specific |
| Prompt caching | Different mechanisms |
| Beta Files API | Different semantics |
| Beta Skills API | Different packaging |
| MCP tools | Would need Responses API |
| WebSocket mode | Anthropic doesn't support |
## Observability
### `x-anyllm-degradation` Response Header
When the proxy silently drops or degrades Anthropic request features during translation, it sets the `x-anyllm-degradation` response header. The value is a comma-separated list of dropped feature names. If no features were dropped, the header is absent.
| Feature tag | Condition |
|---|---|
| `top_k` | Request included `top_k` (no OpenAI equivalent) |
| `thinking_config` | Request included extended thinking config |
| `stop_sequences_truncated` | Request had more than 4 stop sequences (OpenAI limit is 4) |
| `cache_control` | System prompt blocks included `cache_control` |
| `document_blocks` | Request contained document (PDF) content blocks |
Example:
```
x-anyllm-degradation: top_k, cache_control
```
## Model Name Mapping
Model names are passed through as-is. The static /v1/models endpoint lists:
- claude-opus-4-6
- claude-sonnet-4-6
- claude-haiku-4-5-20251001
Clients may use any model name; it's forwarded to OpenAI directly. Configure model aliasing at the OpenAI provider level if needed.
## Endpoint Mapping
| Anthropic Endpoint | Proxy Route | Backend |
|---|---|---|
| POST /v1/messages | POST /v1/messages | POST /v1/chat/completions |
| GET /v1/models | GET /v1/models | Static response |
| POST /v1/messages/count_tokens | POST /v1/messages/count_tokens | 400 error |
| POST /v1/messages/batches | POST /v1/messages/batches | 400 error |
| POST /v1/embeddings | POST /v1/embeddings | Passthrough to `{OPENAI_BASE_URL}/v1/embeddings` (OpenAI) or `{OPENAI_BASE_URL}/embeddings` (Vertex/Gemini) |
| GET /health | GET /health | Local (no auth required) |