转换器
转换器是适配不同 LLM 提供商 API 差异的核心机制。它们在不同格式之间转换请求和响应,处理认证,并管理提供商特定的功能。
理解转换器
什么是转换器?
转换器是一个插件,它可以:
- 转换请求:从统一格式转换为提供商特定格式
- 转换响应:从提供商格式转换回统一格式
- 处理认证:为提供商 API 处理认证
- 修改请求:添加或调整参数
数据流
┌─────────────────┐
│ 传入请求 │ (来自 Claude Code 的 Anthropic 格式)
└────────┬────────┘
│
▼
┌─────────────────────────────────┐
│ transformRequestOut │ ← 将传入请求解析为统一格式
└────────┬────────────────────────┘
│
▼
┌─────────────────────────────────┐
│ UnifiedChatRequest │
└────────┬────────────────────────┘
│
▼
┌─────────────────────────────────┐
│ transformRequestIn (可选) │ ← 在发送前修改统一请求
└────────┬────────────────────────┘
│
▼
┌─────────────────────────────────┐
│ 提供商 API 调用 │
└────────┬────────────────────────┘
│
▼
┌─────────────────────────────────┐
│ transformResponseIn (可选) │ ← 将提供商响应转换为统一格式
└────────┬────────────────────────┘
│
▼
┌─────────────────────────────────┐
│ transformResponseOut (可选) │ ← 将统一响应转换为 Anthropic 格式
└────────┬────────────────────────┘
│
▼
┌─────────────────┐
│ 传出响应 │ (返回给 Claude Code 的 Anthropic 格式)
└─────────────────┘
转换器接口
所有转换器都实现以下接口:
interface Transformer {
// 将统 一请求转换为提供商特定格式
transformRequestIn?: (
request: UnifiedChatRequest,
provider: LLMProvider,
context: TransformerContext
) => Promise<Record<string, any>>;
// 将提供商请求转换为统一格式
transformRequestOut?: (
request: any,
context: TransformerContext
) => Promise<UnifiedChatRequest>;
// 将提供商响应转换为统一格式
transformResponseIn?: (
response: Response,
context?: TransformerContext
) => Promise<Response>;
// 将统一响应转换为提供商格式
transformResponseOut?: (
response: Response,
context: TransformerContext
) => Promise<Response>;
// 自定义端点路径(可选)
endPoint?: string;
// 转换器名称(用于自定义转换器)
name?: string;
// 自定义认证处理器(可选)
auth?: (
request: any,
provider: LLMProvider,
context: TransformerContext
) => Promise<any>;
// Logger 实例(自动注入)
logger?: any;
}
关键类型
UnifiedChatRequest
interface UnifiedChatRequest {
messages: UnifiedMessage[];
model: string;
max_tokens?: number;
temperature?: number;
stream?: boolean;
tools?: UnifiedTool[];
tool_choice?: any;
reasoning?: {
effort?: ThinkLevel; // "none" | "low" | "medium" | "high" | "xhigh" | "max"
max_tokens?: number;
enabled?: boolean;
};
}
UnifiedMessage
interface UnifiedMessage {
role: "user" | "assistant" | "system" | "tool";
content: string | null | MessageContent[];
tool_calls?: Array<{
id: string;
type: "function";
function: {
name: string;
arguments: string;
};
}>;
tool_call_id?: string;
thinking?: {
content: string;
signature?: string;
};
}
内置转换器
anthropic
将请求转换为兼容 Anthropic 风格的 API:
{
"transformers": [
{
"name": "anthropic",
"providers": ["deepseek", "groq"]
}
]
}
功能:
- 在 Anthropic 消息格式和 OpenAI 格式之间转换
- 处理工具调用和工具结果
- 支持思考/推理内容块
- 管理流式响应
deepseek
专门用于 DeepSeek API 的转换器:
{
"transformers": [
{
"name": "deepseek",
"providers": ["deepseek"]
}
]
}
功能:
- DeepSeek 特定的推理格式
- 处理响应中的
reasoning_content - 支持思考预算令牌
gemini
用于 Google Gemini API 的转换器:
{
"transformers": [
{
"name": "gemini",
"providers": ["gemini"]
}
]
}
maxtoken
限制请求中的 max_tokens:
{
"transformers": [
{
"name": "maxtoken",
"options": {
"max_tokens": 8192
},
"models": ["deepseek,deepseek-chat"]
}
]
}
customparams
向请求中注入自定义参数:
{
"transformers": [
{
"name": "customparams",
"options": {
"include_reasoning": true,
"custom_header": "value"
}
}
]
}
创建自定义转换器
简单转换器:修改请求
最简单的转换器只修改发送到提供商之前的请求。
示例:为所有请求添加自定义头
// custom-header-transformer.js
module.exports = class CustomHeaderTransformer {
name = 'custom-header';
constructor(options) {
this.headerName = options?.headerName || 'X-Custom-Header';
this.headerValue = options?.headerValue || 'default-value';
}
async transformRequestIn(request, provider, context) {
// 添加自定义头(将被 auth 方法使用)
request._customHeaders = {
[this.headerName]: this.headerValue
};
return request;
}
async auth(request, provider) {
const headers = {
'authorization': `Bearer ${provider.apiKey}`,
...request._customHeaders
};
return {
body: request,
config: { headers }
};
}
};
在配置中使用:
{
"transformers": [
{
"name": "custom-header",
"path": "/path/to/custom-header-transformer.js",
"options": {
"headerName": "X-My-Header",
"headerValue": "my-value"
}
}
]
}