/** * 格式转换工具函数集 * * 参考 cc-switch (farion1231/cc-switch) 的转换模式,提供通用的请求/响应格式转换辅助函数。 * 这些函数是纯函数,可以被 BaseProxy 子类在 transformRequest / transformResponse 中调用。 */ /** 生成指定长度的随机字符串 */ export declare function generateRandomString(length?: number): string; /** 估算文本的 token 数 */ export declare function estimateTokens(text: string): number; /** * 移除 system prompt 开头的 Anthropic billing header 行 * * cc-swift 对应:`transform::strip_leading_anthropic_billing_header` * * Anthropic SDK 会自动注入形如 "x-anthropic-billing-header: cc_version=..." 的头部行, * 转发给非 Anthropic 上游时需要剥离。 */ export declare function stripLeadingAnthropicBillingHeader(text: string): string; /** * 判断是否为 OpenAI o-series 模型(需使用 max_completion_tokens 而非 max_tokens) * * cc-switch 对应:`transform::is_openai_o_series` */ export declare function isOpenAISeries(model: string): boolean; /** * tool_choice 映射:Anthropic → OpenAI Chat * * cc-switch 对应:`transform::map_tool_choice_to_chat` * * Anthropic 格式: * { type: "auto" | "any" | "none" | "tool", name: "xxx" } * OpenAI Chat 格式: * "auto" | "none" | "required" | { type: "function", function: { name: "xxx" } } */ export declare function mapToolChoiceToChat(toolChoice: unknown): unknown; /** * tool_choice 映射:Anthropic → OpenAI Responses * * cc-switch 对应:`transform_responses::map_tool_choice_to_responses` * * Responses API 格式: * "auto" | "none" | "required" | { type: "function", name: "xxx" } */ export declare function mapToolChoiceToResponses(toolChoice: unknown): unknown; /** * tool_choice 映射:OpenAI Chat → Anthropic */ export declare function mapToolChoiceToAnthropic(toolChoice: unknown): unknown; /** * stop_sequences 映射:Anthropic ↔ OpenAI * * Anthropic 格式:string[] * OpenAI Chat 格式:string | string[] */ export declare function mapStopSequencesToOpenAI(stop: unknown): string | string[] | undefined; export declare function mapStopSequencesToAnthropic(stop: unknown): string[] | undefined; /** * 从 Anthropic 内容块中移除 cache_control 字段 * * cc-switch 对应:`transform::clean_cache_control` * OpenAI 不支持 Anthropic 的 cache_control,转发前需移除。 */ export declare function removeCacheControl(obj: Record): Record; /** * 从 tools 数组中移除 cache_control 和过滤 BatchTool * * cc-switch 对应: * - `transform::clean_schema`(清理 input_schema) * - BatchTool 过滤 */ export declare function cleanTools(tools: unknown, format?: 'openai-chat' | 'openai-responses'): unknown; /** * 清理 JSON Schema — 移除 Anthropic 特有的字段 * * cc-switch 对应:`transform::clean_schema` */ export declare function cleanSchema(schema: Record): Record; /** * 将值规范化为 JSON 字符串(用于工具调用的 arguments 序列化) * * cc-switch 对应:`canonical_json_string` */ export declare function canonicalJsonString(value: unknown): string; /** * 将 OpenAI Chat usage 映射为 Anthropic usage 格式 * * cc-switch 对应:`openai_to_anthropic` 中的 usage 映射逻辑 * * OpenAI prompt_tokens 含缓存命中,Anthropic input_tokens 不含 * → 减去 cache_read + cache_creation */ export declare function mapChatUsageToAnthropic(usage: Record | null | undefined): Record | undefined; /** * 将 OpenAI Responses usage 映射为 Anthropic usage 格式 * * Responses API 的 usage 字段命名与 Anthropic 一致(input_tokens/output_tokens), * 但 flat 结构不同。 */ export declare function mapResponsesUsageToAnthropic(usage: Record | null | undefined): Record | undefined; /** * OpenAI Chat finish_reason → Anthropic stop_reason */ export declare function mapFinishReasonToStopReason(finishReason: string | null | undefined): string | null; /** * Anthropic stop_reason → OpenAI Chat finish_reason */ export declare function mapStopReasonToFinishReason(stopReason: string | null | undefined): string | null; /** * OpenAI Responses status → Anthropic stop_reason * * cc-switch 对应:`transform_responses::map_responses_stop_reason` */ export declare function mapResponsesStatusToStopReason(status: string | null | undefined, hasToolUse: boolean, incompleteReason?: string | null): string | null; /** * Anthropic Messages 请求 → OpenAI Chat Completions 请求 * * cc-switch 对应:`anthropic_to_openai_with_reasoning_content` * * 核心转换: * - system 字符串/数组 → system role message * - messages 中的 tool_use → assistant message.tool_calls * - messages 中的 tool_result → tool role message * - messages 中的 image → image_url content part * - messages 中的 thinking → reasoning_content(可选) * - tools: input_schema → parameters * - tool_choice 映射 * - max_tokens → max_tokens / max_completion_tokens (o-series) */ export declare function anthropicRequestToChatRequest(body: Record, preserveReasoning?: boolean): Record; /** * OpenAI Chat Completions 响应 → Anthropic Messages 响应 * * cc-switch 对应:`openai_to_anthropic` * * 核心转换: * - choices[0].message.content → content text block * - choices[0].message.tool_calls → content tool_use blocks * - choices[0].message.reasoning_content → content thinking block * - finish_reason → stop_reason * - usage (减去 cache tokens) */ export declare function chatResponseToAnthropicResponse(chatResponse: Record): Record; /** * Anthropic Messages 请求 → OpenAI Responses 请求 * * cc-switch 对应:`anthropic_to_responses` * * 核心转换: * - system → instructions * - messages → input items (tool_use 提升为 function_call, tool_result 提升为 function_call_output) * - max_tokens → max_output_tokens * - tools: input_schema → parameters(过滤 BatchTool) * - tool_choice 映射 */ export declare function anthropicRequestToResponsesRequest(body: Record): Record; /** * OpenAI Responses 响应 → Anthropic Messages 响应 * * cc-switch 对应:`responses_to_anthropic` * * 核心转换: * - output message → content text blocks * - output function_call → tool_use blocks * - output reasoning → thinking blocks * - status → stop_reason * - usage 映射 */ export declare function responsesResponseToAnthropicResponse(responsesResponse: Record): Record; /** * Responses API 请求 → Chat Completions 请求 * * cc-switch 对应:`responses_to_chat_completions_with_reasoning` * * 核心转换: * - instructions → system message * - input items → messages(function_call → assistant tool_calls, function_call_output → tool messages) * - max_output_tokens → max_tokens / max_completion_tokens (o-series) * - reasoning → reasoning_effort */ export declare function responsesRequestToChatRequest(body: Record): Record; /** * OpenAI Chat Completions 请求 → Responses API 请求 * * 参考 OmniRoute 的 `openaiToOpenAIResponsesRequest` * * 核心转换规则: * - system/developer → instructions(顶层字符串) * - user text → input_text 消息 * - user image_url → input_image 消息 * - assistant tool_calls → function_call items * - tool messages → function_call_output items * - max_tokens/max_completion_tokens → max_output_tokens */ export declare function chatRequestToResponsesRequest(body: Record): Record; /** * Chat Completions 响应 → Responses API 响应 * * cc-switch 对应:`chat_completion_to_response` * * 核心转换: * - choices[0].message.content → output message with output_text * - choices[0].message.tool_calls → output function_call items * - finish_reason → status * - usage 映射 */ export declare function chatResponseToResponsesResponse(chatResponse: Record, requestBody?: Record): Record; /** * OpenAI Chat Completions 请求 → Anthropic Messages API 请求 * * 对应 musistudio/llms 的 `convertFromOpenAI` + `convertToolsToAnthropic` * * 核心转换: * - system messages 提取为顶层 system 字段 * - assistant tool_calls → tool_use blocks * - tool messages → tool_result blocks * - max_tokens / max_completion_tokens → max_tokens * - reasoning_effort → thinking budget */ export declare function chatRequestToAnthropicRequest(body: Record): Record; /** * Chat Completions SSE 流 → Anthropic SSE 事件生成器 * * 对应 musistudio/llms 的 `convertOpenAIStreamToAnthropic` * * 将 Chat SSE chunks 实时转换为 Anthropic SSE 事件(text_delta, content_block_* 等)。 * 用法:在 parseChatCompletionsStream 的 callbacks 中调用这些方法。 */ export declare class ChatToAnthropicStreamConverter { private messageId; private model; private hasStarted; private hasTextContentStarted; private hasFinished; private contentBlockIndex; private currentContentBlockIndex; private pendingToolCalls; private textBuffer; private accumulatedUsage; private finalStopReason; private encoder; /** 获取 SSE event 的 encoder */ get encoder_(): TextEncoder; constructor(); /** * 处理 Chat SSE chunk,返回 Anthropic SSE 事件字节数组 * @returns Uint8Array[] 需要写入响应的 Anthropic SSE 事件 */ processChatChunk(chunk: Record): Uint8Array[]; /** 处理 [DONE] 标记 */ processDone(): Uint8Array[]; get messageId_(): string; get finalStopReason_(): string; private _encode; private _ensureTextBlock; private _closeTextBlock; } //# sourceMappingURL=convert-utils.d.ts.map