llm-messages 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +119 -1
- package/README.md +79 -34
- package/ROADMAP.md +3 -3
- package/SECURITY.md +24 -0
- package/dist/index.cjs +643 -93
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -9
- package/dist/index.d.ts +11 -9
- package/dist/index.js +641 -92
- package/dist/index.js.map +1 -1
- package/docs/adoption-guide.md +7 -0
- package/docs/conformance-fixtures.md +113 -13
- package/examples/commonjs.cjs +34 -0
- package/examples/usage.mjs +19 -4
- package/package.json +8 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/util.ts","../src/image.ts","../src/media.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/convert.ts","../src/response.ts"],"sourcesContent":["export { toAnthropic, fromAnthropic } from './providers/anthropic.js';\nexport { toGemini, fromGemini } from './providers/gemini.js';\nexport { convert } from './convert.js';\nexport type { ConversationOf } from './convert.js';\nexport { parseDataUrl, toDataUrl } from './image.js';\nexport type { NormalizedImage } from './image.js';\nexport type { MediaPart, MediaModality, MediaSource } from './media.js';\nexport {\n responseFromOpenAI,\n responseFromOpenAIResponses,\n responseFromAnthropic,\n responseFromGemini,\n normalizeResponse,\n} from './response.js';\nexport type { NormalizedResponse, FinishReason, Usage, ResponseProvider } from './response.js';\n\nexport type {\n Provider,\n Warning,\n WarningCode,\n ConvertOptions,\n OpenAIMessage,\n OpenAISystemMessage,\n OpenAIUserMessage,\n OpenAIAssistantMessage,\n OpenAIToolMessage,\n OpenAIToolCall,\n OpenAIContentPart,\n OpenAITextPart,\n OpenAIImagePart,\n OpenAIAudioPart,\n OpenAIFilePart,\n AnthropicConversation,\n AnthropicMessage,\n AnthropicContentBlock,\n AnthropicTextBlock,\n AnthropicToolUseBlock,\n AnthropicToolResultBlock,\n AnthropicImageBlock,\n AnthropicDocumentBlock,\n GeminiConversation,\n GeminiContent,\n GeminiPart,\n GeminiTextPart,\n GeminiFunctionCallPart,\n GeminiFunctionResponsePart,\n GeminiInlineDataPart,\n GeminiFileDataPart,\n} from './types.js';\n","import type { ConvertOptions, OpenAITextPart, Warning, WarningCode } from './types.js';\n\n/** Thin wrapper around the optional `onWarning` callback. */\nexport class Reporter {\n constructor(private readonly options: ConvertOptions = {}) {}\n\n warn(code: WarningCode, message: string): void {\n this.options.onWarning?.({ code, message } satisfies Warning);\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Flattens any supported text content (a plain string or an array of text\n * parts/blocks) into a single string. Non text parts are ignored.\n */\nexport function textOf(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === 'string') return part;\n if (isRecord(part) && typeof part.text === 'string') return part.text;\n return '';\n })\n .join('');\n }\n return '';\n}\n\n/** Wraps a string as a single OpenAI/Anthropic text part array. */\nexport function textPart(text: string): OpenAITextPart[] {\n return [{ type: 'text', text }];\n}\n\n/** Safely parses a JSON string, returning a discriminated result. */\nexport function tryParseJson(input: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(input) };\n } catch {\n return { ok: false };\n }\n}\n\n/**\n * Parses an OpenAI tool-call `arguments` JSON string into an object. Reports and\n * returns `{}` when the string is not valid JSON object syntax.\n */\nexport function parseArguments(args: string, reporter: Reporter, fnName: string): Record<string, unknown> {\n const parsed = tryParseJson(args);\n if (parsed.ok && isRecord(parsed.value)) return parsed.value;\n reporter.warn(\n 'invalid-json-arguments',\n `Tool call '${fnName}' had arguments that were not a JSON object; used an empty object instead.`,\n );\n return {};\n}\n\n/**\n * Converts an OpenAI tool result string into a Gemini `functionResponse.response`\n * object. A JSON object string is used directly; anything else is wrapped as\n * `{ result: <text> }`, which {@link unwrapResponse} reverses.\n */\nexport function wrapResponse(content: string): Record<string, unknown> {\n const parsed = tryParseJson(content);\n if (parsed.ok && isRecord(parsed.value)) return parsed.value;\n return { result: content };\n}\n\n/** Reverses {@link wrapResponse}: a lone `{ result: string }` becomes that string. */\nexport function unwrapResponse(response: Record<string, unknown>): string {\n const keys = Object.keys(response);\n if (keys.length === 1 && keys[0] === 'result' && typeof response.result === 'string') {\n return response.result;\n }\n return JSON.stringify(response);\n}\n","import type { AnthropicImageBlock, GeminiPart, OpenAIImagePart } from './types.js';\nimport { Reporter, isRecord } from './util.js';\n\n/**\n * A provider-neutral image. `base64` carries the raw bytes plus media type\n * (mapping to a data URL, an Anthropic base64 source or a Gemini `inlineData`\n * part); `url` carries a remote reference.\n */\nexport type NormalizedImage = { kind: 'base64'; mediaType: string; data: string } | { kind: 'url'; url: string };\n\nconst DATA_URL = /^data:([^;,]+);base64,(.*)$/s;\n\n/** Decomposes a `data:<mediaType>;base64,<data>` URL. Returns null otherwise. */\nexport function parseDataUrl(url: string): { mediaType: string; data: string } | null {\n const match = DATA_URL.exec(url);\n if (!match) return null;\n return { mediaType: match[1], data: match[2] };\n}\n\n/** Reassembles a base64 data URL. The inverse of {@link parseDataUrl}. */\nexport function toDataUrl(mediaType: string, data: string): string {\n return `data:${mediaType};base64,${data}`;\n}\n\n/* ------------------------------- OpenAI -------------------------------- */\n\nexport function imageFromOpenAI(part: unknown): NormalizedImage | null {\n if (!isRecord(part) || part.type !== 'image_url' || !isRecord(part.image_url)) return null;\n const url = part.image_url.url;\n if (typeof url !== 'string') return null;\n const parsed = parseDataUrl(url);\n return parsed ? { kind: 'base64', ...parsed } : { kind: 'url', url };\n}\n\nexport function imageToOpenAI(image: NormalizedImage): OpenAIImagePart {\n const url = image.kind === 'base64' ? toDataUrl(image.mediaType, image.data) : image.url;\n return { type: 'image_url', image_url: { url } };\n}\n\n/* ------------------------------ Anthropic ------------------------------ */\n\nexport function imageFromAnthropic(block: unknown): NormalizedImage | null {\n if (!isRecord(block) || block.type !== 'image' || !isRecord(block.source)) return null;\n const source = block.source;\n if (source.type === 'base64' && typeof source.media_type === 'string' && typeof source.data === 'string') {\n return { kind: 'base64', mediaType: source.media_type, data: source.data };\n }\n if (source.type === 'url' && typeof source.url === 'string') {\n return { kind: 'url', url: source.url };\n }\n return null;\n}\n\nexport function imageToAnthropic(image: NormalizedImage): AnthropicImageBlock {\n if (image.kind === 'base64') {\n return { type: 'image', source: { type: 'base64', media_type: image.mediaType, data: image.data } };\n }\n return { type: 'image', source: { type: 'url', url: image.url } };\n}\n\n/* -------------------------------- Gemini ------------------------------- */\n\nexport function imageFromGemini(part: unknown): NormalizedImage | null {\n if (isRecord(part) && isRecord(part.inlineData)) {\n const data = part.inlineData;\n if (typeof data.mimeType === 'string' && typeof data.data === 'string' && data.mimeType.startsWith('image/')) {\n return { kind: 'base64', mediaType: data.mimeType, data: data.data };\n }\n }\n if (isRecord(part) && isRecord(part.fileData)) {\n const data = part.fileData;\n // A fileData with no mimeType is assumed to be an image (the only media we\n // emit as a bare fileUri); a typed non-image fileData belongs to media.ts.\n const mime = typeof data.mimeType === 'string' ? data.mimeType : '';\n if (typeof data.fileUri === 'string' && (mime === '' || mime.startsWith('image/'))) {\n return { kind: 'url', url: data.fileUri };\n }\n }\n return null;\n}\n\nexport function imageToGemini(image: NormalizedImage, reporter: Reporter): GeminiPart {\n if (image.kind === 'base64') {\n return { inlineData: { mimeType: image.mediaType, data: image.data } };\n }\n // Gemini's fileData.fileUri is intended for Files API URIs, not arbitrary\n // public URLs. We emit it as a best effort and flag it so the caller can\n // upload via the Files API or inline the bytes if Gemini rejects it.\n reporter.warn(\n 'gemini-url-image',\n 'A remote image URL was emitted as Gemini fileData.fileUri; Gemini may require the Files API for non-Google URIs.',\n );\n return { fileData: { fileUri: image.url } };\n}\n","import type {\n AnthropicDocumentBlock,\n GeminiPart,\n OpenAIAudioPart,\n OpenAIContentPart,\n OpenAIFilePart,\n} from './types.js';\nimport { Reporter, isRecord } from './util.js';\nimport { parseDataUrl, toDataUrl } from './image.js';\n\n/**\n * A provider-neutral non-image media part (audio or document). Images keep their\n * own dedicated path in `image.ts`; everything else flows through here.\n */\nexport type MediaModality = 'audio' | 'document';\n\nexport type MediaSource =\n | { kind: 'base64'; mediaType: string; data: string }\n | { kind: 'url'; url: string }\n | { kind: 'file_id'; id: string };\n\nexport interface MediaPart {\n modality: MediaModality;\n source: MediaSource;\n filename?: string;\n}\n\nfunction modalityFromMime(mediaType: string): MediaModality {\n return mediaType.startsWith('audio/') ? 'audio' : 'document';\n}\n\n/* -------------------------------- OpenAI ------------------------------- */\n\nexport function mediaFromOpenAI(part: unknown): MediaPart | null {\n if (!isRecord(part)) return null;\n\n if (part.type === 'input_audio' && isRecord(part.input_audio)) {\n const audio = part.input_audio;\n if (typeof audio.data === 'string') {\n const format = typeof audio.format === 'string' ? audio.format : 'wav';\n return { modality: 'audio', source: { kind: 'base64', mediaType: `audio/${format}`, data: audio.data } };\n }\n }\n\n if (part.type === 'file' && isRecord(part.file)) {\n const file = part.file;\n const filename = typeof file.filename === 'string' ? file.filename : undefined;\n if (typeof file.file_data === 'string') {\n const parsed = parseDataUrl(file.file_data);\n if (parsed) return { modality: 'document', source: { kind: 'base64', ...parsed }, filename };\n }\n if (typeof file.file_id === 'string') {\n return { modality: 'document', source: { kind: 'file_id', id: file.file_id }, filename };\n }\n }\n\n return null;\n}\n\nexport function mediaToOpenAI(media: MediaPart): OpenAIContentPart | null {\n const { modality, source } = media;\n if (modality === 'audio') {\n if (source.kind !== 'base64') return null; // Chat Completions has no URL/id audio input\n const audio: OpenAIAudioPart = {\n type: 'input_audio',\n input_audio: { data: source.data, format: source.mediaType.replace(/^audio\\//, '') },\n };\n return audio;\n }\n // document\n if (source.kind === 'base64') {\n const file: OpenAIFilePart = {\n type: 'file',\n file: {\n file_data: toDataUrl(source.mediaType, source.data),\n ...(media.filename ? { filename: media.filename } : {}),\n },\n };\n return file;\n }\n if (source.kind === 'file_id') {\n const file: OpenAIFilePart = {\n type: 'file',\n file: { file_id: source.id, ...(media.filename ? { filename: media.filename } : {}) },\n };\n return file;\n }\n return null; // Chat Completions has no URL document input\n}\n\n/* ------------------------------- Anthropic ----------------------------- */\n\nexport function mediaFromAnthropic(block: unknown): MediaPart | null {\n if (!isRecord(block) || block.type !== 'document' || !isRecord(block.source)) return null;\n const source = block.source;\n if (source.type === 'base64' && typeof source.media_type === 'string' && typeof source.data === 'string') {\n return { modality: 'document', source: { kind: 'base64', mediaType: source.media_type, data: source.data } };\n }\n if (source.type === 'url' && typeof source.url === 'string') {\n return { modality: 'document', source: { kind: 'url', url: source.url } };\n }\n if (source.type === 'file' && typeof source.file_id === 'string') {\n return { modality: 'document', source: { kind: 'file_id', id: source.file_id } };\n }\n return null;\n}\n\nexport function mediaToAnthropic(media: MediaPart, reporter: Reporter): AnthropicDocumentBlock | null {\n if (media.modality === 'audio') {\n reporter.warn('unsupported-modality', 'Anthropic has no audio input; dropped an audio part.');\n return null;\n }\n const { source } = media;\n if (source.kind === 'base64') {\n return { type: 'document', source: { type: 'base64', media_type: source.mediaType, data: source.data } };\n }\n if (source.kind === 'url') {\n return { type: 'document', source: { type: 'url', url: source.url } };\n }\n return { type: 'document', source: { type: 'file', file_id: source.id } };\n}\n\n/* -------------------------------- Gemini ------------------------------- */\n\nexport function mediaFromGemini(part: unknown): MediaPart | null {\n if (isRecord(part) && isRecord(part.inlineData)) {\n const data = part.inlineData;\n if (typeof data.mimeType === 'string' && typeof data.data === 'string' && !data.mimeType.startsWith('image/')) {\n return {\n modality: modalityFromMime(data.mimeType),\n source: { kind: 'base64', mediaType: data.mimeType, data: data.data },\n };\n }\n }\n if (isRecord(part) && isRecord(part.fileData)) {\n const data = part.fileData;\n const mime = typeof data.mimeType === 'string' ? data.mimeType : '';\n // A bare fileUri (no mimeType) is treated as an image in image.ts.\n if (typeof data.fileUri === 'string' && mime !== '' && !mime.startsWith('image/')) {\n return { modality: modalityFromMime(mime), source: { kind: 'url', url: data.fileUri } };\n }\n }\n return null;\n}\n\nexport function mediaToGemini(media: MediaPart, reporter: Reporter): GeminiPart | null {\n const { source } = media;\n if (source.kind === 'base64') {\n return { inlineData: { mimeType: source.mediaType, data: source.data } };\n }\n if (source.kind === 'url') {\n reporter.warn(\n 'gemini-url-media',\n 'A media URL was emitted as Gemini fileData.fileUri; Gemini may require the Files API for non-Google URIs.',\n );\n return { fileData: { fileUri: source.url } };\n }\n reporter.warn('unsupported-modality', 'Gemini has no file-id media reference; dropped a file_id part.');\n return null;\n}\n","import type {\n OpenAIAssistantMessage,\n OpenAIMessage,\n OpenAISystemMessage,\n OpenAIToolMessage,\n OpenAIUserMessage,\n} from '../types.js';\nimport { Reporter, textOf } from '../util.js';\n\n/** Any canonical message other than a system/developer prompt. */\nexport type NonSystemMessage = OpenAIUserMessage | OpenAIAssistantMessage | OpenAIToolMessage;\n\nfunction isSystem(message: OpenAIMessage): message is OpenAISystemMessage {\n return message.role === 'system' || message.role === 'developer';\n}\n\n/**\n * Splits a canonical OpenAI conversation into its system prompt and the\n * remaining messages. All `system` / `developer` messages are folded into a\n * single string (joined by blank lines) because Anthropic and Gemini carry the\n * system prompt as one top-level field. A system message that appears after the\n * conversation has started is still folded in, but reported as `system-midstream`.\n */\nexport function splitSystem(\n messages: OpenAIMessage[],\n reporter: Reporter,\n): { system?: string; rest: NonSystemMessage[] } {\n const systemParts: string[] = [];\n const rest: NonSystemMessage[] = [];\n let started = false;\n\n for (const message of messages) {\n if (isSystem(message)) {\n if (typeof message.name === 'string') {\n reporter.warn(\n 'dropped-metadata',\n `${message.role} message name '${message.name}' has no top-level system prompt equivalent; dropped.`,\n );\n }\n if (started) {\n reporter.warn(\n 'system-midstream',\n 'A system message appeared mid conversation; it was merged into the top-level system prompt.',\n );\n }\n systemParts.push(textOf(message.content));\n continue;\n }\n started = true;\n rest.push(message);\n }\n\n const system = systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined;\n return system === undefined ? { rest } : { system, rest };\n}\n","import type {\n AnthropicContentBlock,\n AnthropicConversation,\n AnthropicMessage,\n ConvertOptions,\n OpenAIAssistantMessage,\n OpenAIContentPart,\n OpenAIMessage,\n OpenAIToolMessage,\n} from '../types.js';\nimport { Reporter, isRecord, parseArguments, textOf } from '../util.js';\nimport { imageFromAnthropic, imageFromOpenAI, imageToAnthropic, imageToOpenAI } from '../image.js';\nimport { mediaFromAnthropic, mediaFromOpenAI, mediaToAnthropic, mediaToOpenAI } from '../media.js';\nimport { splitSystem } from './openai.js';\n\n/* ------------------------------------------------------------------ */\n/* OpenAI (canonical) -> Anthropic */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts a canonical OpenAI conversation into an Anthropic request fragment\n * (`{ system, messages }`). System messages move to the top-level `system`\n * field, tool-call arguments are JSON parsed into `input` objects, tool results\n * are folded into `tool_result` blocks inside a user turn, and consecutive\n * same-role turns are merged to satisfy Anthropic's strict alternation.\n */\nexport function toAnthropic(messages: OpenAIMessage[], options: ConvertOptions = {}): AnthropicConversation {\n const reporter = new Reporter(options);\n const { system, rest } = splitSystem(messages, reporter);\n const out: AnthropicMessage[] = [];\n\n for (let i = 0; i < rest.length; i++) {\n const message = rest[i];\n\n if (message.role === 'tool') {\n const blocks: AnthropicContentBlock[] = [];\n let j = i;\n while (j < rest.length && rest[j].role === 'tool') {\n const tool = rest[j] as OpenAIToolMessage;\n if (typeof tool.name === 'string') {\n reporter.warn(\n 'dropped-metadata',\n `Tool message name '${tool.name}' has no Anthropic tool_result equivalent; dropped.`,\n );\n }\n blocks.push({\n type: 'tool_result',\n tool_use_id: tool.tool_call_id,\n content: textOf(tool.content),\n ...(typeof tool.is_error === 'boolean' ? { is_error: tool.is_error } : {}),\n });\n j++;\n }\n out.push({ role: 'user', content: blocks });\n i = j - 1;\n continue;\n }\n\n if (message.role === 'user') {\n warnDroppedName('User', message.name, 'Anthropic', reporter);\n out.push({ role: 'user', content: userContent(message.content, reporter) });\n continue;\n }\n\n out.push({ role: 'assistant', content: assistantContent(message, reporter) });\n }\n\n const merged = mergeConsecutive(out, reporter);\n return system === undefined ? { messages: merged } : { system, messages: merged };\n}\n\nfunction userContent(content: string | OpenAIContentPart[], reporter: Reporter): string | AnthropicContentBlock[] {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return textOf(content);\n const blocks: AnthropicContentBlock[] = [];\n for (const part of content) {\n if (isRecord(part) && part.type === 'text' && typeof part.text === 'string') {\n blocks.push({ type: 'text', text: part.text });\n continue;\n }\n const image = imageFromOpenAI(part);\n if (image) {\n blocks.push(imageToAnthropic(image));\n continue;\n }\n const media = mediaFromOpenAI(part);\n if (media) {\n const block = mediaToAnthropic(media, reporter);\n if (block) blocks.push(block);\n continue;\n }\n reporter.warn('dropped-content', 'Dropped an unsupported user content part.');\n }\n return blocks;\n}\n\nfunction assistantContent(message: OpenAIAssistantMessage, reporter: Reporter): string | AnthropicContentBlock[] {\n warnDroppedName('Assistant', message.name, 'Anthropic', reporter);\n const text = textOf(message.content ?? '');\n const toolCalls = message.tool_calls ?? [];\n if (toolCalls.length === 0) return text;\n\n const blocks: AnthropicContentBlock[] = [];\n if (text) blocks.push({ type: 'text', text });\n for (const call of toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: call.id,\n name: call.function.name,\n input: parseArguments(call.function.arguments, reporter, call.function.name),\n });\n }\n return blocks;\n}\n\nfunction warnDroppedName(role: string, name: string | undefined, provider: string, reporter: Reporter): void {\n if (typeof name !== 'string') return;\n reporter.warn('dropped-metadata', `${role} message name '${name}' has no ${provider} equivalent; dropped.`);\n}\n\n/** Merges adjacent same-role messages by concatenating their content blocks. */\nfunction mergeConsecutive(messages: AnthropicMessage[], reporter: Reporter): AnthropicMessage[] {\n const result: AnthropicMessage[] = [];\n for (const message of messages) {\n const previous = result[result.length - 1];\n if (previous && previous.role === message.role) {\n previous.content = [...asBlocks(previous.content), ...asBlocks(message.content)];\n reporter.warn(\n 'merged-role',\n `Merged consecutive '${message.role}' turns (Anthropic requires alternating roles).`,\n );\n } else {\n result.push({ role: message.role, content: message.content });\n }\n }\n return result;\n}\n\nfunction asBlocks(content: string | AnthropicContentBlock[]): AnthropicContentBlock[] {\n if (typeof content !== 'string') return content;\n return content ? [{ type: 'text', text: content }] : [];\n}\n\n/* ------------------------------------------------------------------ */\n/* Anthropic -> OpenAI (canonical) */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts an Anthropic request fragment back into a canonical OpenAI message\n * array. The top-level `system` becomes a leading system message, `tool_use`\n * blocks become `tool_calls` (with `input` re-serialized to a JSON string), and\n * `tool_result` blocks become standalone `role: 'tool'` messages.\n */\nexport function fromAnthropic(conversation: AnthropicConversation, options: ConvertOptions = {}): OpenAIMessage[] {\n const reporter = new Reporter(options);\n const out: OpenAIMessage[] = [];\n if (conversation.system) {\n out.push({ role: 'system', content: textOf(conversation.system) });\n }\n\n for (const message of conversation.messages) {\n const blocks = asBlocks(message.content);\n\n if (message.role === 'user') {\n if (blocks.length === 0) {\n out.push({ role: 'user', content: '' });\n continue;\n }\n\n let contentBlocks: AnthropicContentBlock[] = [];\n const flushContent = (): void => {\n if (contentBlocks.length > 0) {\n out.push({ role: 'user', content: userContentToOpenAI(contentBlocks, reporter) });\n contentBlocks = [];\n }\n };\n\n for (const block of blocks) {\n if (block.type !== 'tool_result') {\n contentBlocks.push(block);\n continue;\n }\n\n flushContent();\n out.push({\n role: 'tool',\n tool_call_id: String((block as { tool_use_id?: string }).tool_use_id ?? ''),\n content: textOf((block as { content?: unknown }).content),\n ...(typeof (block as { is_error?: unknown }).is_error === 'boolean'\n ? { is_error: (block as { is_error: boolean }).is_error }\n : {}),\n });\n }\n flushContent();\n continue;\n }\n\n // assistant\n const text = textOf(blocks.filter((b) => b.type === 'text'));\n const toolUses = blocks.filter((b) => b.type === 'tool_use');\n const assistant: OpenAIAssistantMessage = { role: 'assistant', content: text || null };\n if (toolUses.length > 0) {\n assistant.tool_calls = toolUses.map((block) => {\n const b = block as { id: string; name: string; input: Record<string, unknown> };\n return { id: b.id, type: 'function', function: { name: b.name, arguments: JSON.stringify(b.input ?? {}) } };\n });\n }\n out.push(assistant);\n }\n\n return out;\n}\n\n/** Rebuilds OpenAI user content from Anthropic blocks, as a string unless media is present. */\nfunction userContentToOpenAI(blocks: AnthropicContentBlock[], reporter: Reporter): string | OpenAIContentPart[] {\n const hasMedia = blocks.some((block) => imageFromAnthropic(block) !== null || mediaFromAnthropic(block) !== null);\n if (!hasMedia) return textOf(blocks);\n const parts: OpenAIContentPart[] = [];\n for (const block of blocks) {\n const image = imageFromAnthropic(block);\n if (image) {\n parts.push(imageToOpenAI(image));\n continue;\n }\n const media = mediaFromAnthropic(block);\n if (media) {\n const part = mediaToOpenAI(media);\n if (part) parts.push(part);\n else reporter.warn('dropped-content', 'A document URL has no OpenAI Chat Completions equivalent; dropped.');\n continue;\n }\n if (isRecord(block) && block.type === 'text' && typeof block.text === 'string') {\n parts.push({ type: 'text', text: block.text });\n }\n }\n return parts;\n}\n","import type {\n ConvertOptions,\n GeminiContent,\n GeminiConversation,\n GeminiPart,\n OpenAIAssistantMessage,\n OpenAIContentPart,\n OpenAIMessage,\n OpenAIToolCall,\n OpenAIToolMessage,\n} from '../types.js';\nimport { Reporter, isRecord, parseArguments, textOf, unwrapResponse, wrapResponse } from '../util.js';\nimport { imageFromGemini, imageFromOpenAI, imageToGemini, imageToOpenAI } from '../image.js';\nimport { mediaFromGemini, mediaFromOpenAI, mediaToGemini, mediaToOpenAI } from '../media.js';\nimport { splitSystem } from './openai.js';\n\n/* ------------------------------------------------------------------ */\n/* OpenAI (canonical) -> Gemini */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts a canonical OpenAI conversation into a Gemini request fragment\n * (`{ systemInstruction, contents }`). The assistant role becomes `model`,\n * tool-call arguments are JSON parsed into `args` objects, tool results become\n * `functionResponse` parts whose `name` is recovered from the matching call, and\n * consecutive same-role turns are merged for Gemini's strict alternation.\n *\n * The OpenAI tool-call `id` is carried through as `functionCall.id` so that a\n * round trip (OpenAI -> Gemini -> OpenAI) preserves ids exactly.\n */\nexport function toGemini(messages: OpenAIMessage[], options: ConvertOptions = {}): GeminiConversation {\n const reporter = new Reporter(options);\n const { system, rest } = splitSystem(messages, reporter);\n\n const idToName = new Map<string, string>();\n for (const message of rest) {\n if (message.role === 'assistant' && message.tool_calls) {\n for (const call of message.tool_calls) idToName.set(call.id, call.function.name);\n }\n }\n\n const contents: GeminiContent[] = [];\n for (let i = 0; i < rest.length; i++) {\n const message = rest[i];\n\n if (message.role === 'tool') {\n const parts: GeminiPart[] = [];\n let j = i;\n while (j < rest.length && rest[j].role === 'tool') {\n const tool = rest[j] as OpenAIToolMessage;\n const matchingName = idToName.get(tool.tool_call_id);\n if (typeof tool.is_error === 'boolean') {\n reporter.warn(\n 'dropped-metadata',\n `Tool message is_error=${tool.is_error} has no Gemini functionResponse equivalent; dropped.`,\n );\n }\n if (typeof tool.name === 'string' && matchingName && tool.name !== matchingName) {\n reporter.warn(\n 'dropped-metadata',\n `Tool message name '${tool.name}' differs from matching tool call '${matchingName}'; used the tool-call function name for Gemini.`,\n );\n }\n const name = matchingName ?? tool.name;\n if (!name) {\n reporter.warn(\n 'unmapped-tool-result',\n `Tool result '${tool.tool_call_id}' has no matching call; used the id as the function name.`,\n );\n }\n parts.push({\n functionResponse: {\n id: tool.tool_call_id,\n name: name ?? tool.tool_call_id,\n response: wrapResponse(textOf(tool.content)),\n },\n });\n j++;\n }\n contents.push({ role: 'user', parts });\n i = j - 1;\n continue;\n }\n\n if (message.role === 'user') {\n warnDroppedName('User', message.name, 'Gemini', reporter);\n contents.push({ role: 'user', parts: userParts(message.content, reporter) });\n continue;\n }\n\n warnDroppedName('Assistant', message.name, 'Gemini', reporter);\n contents.push({ role: 'model', parts: assistantParts(message, reporter) });\n }\n\n const merged = mergeConsecutive(contents, reporter);\n return system === undefined\n ? { contents: merged }\n : { systemInstruction: { parts: [{ text: system }] }, contents: merged };\n}\n\nfunction userParts(content: string | OpenAIContentPart[], reporter: Reporter): GeminiPart[] {\n if (typeof content === 'string') return [{ text: content }];\n const parts: GeminiPart[] = [];\n for (const part of content) {\n if (isRecord(part) && part.type === 'text' && typeof part.text === 'string') {\n parts.push({ text: part.text });\n continue;\n }\n const image = imageFromOpenAI(part);\n if (image) {\n parts.push(imageToGemini(image, reporter));\n continue;\n }\n const media = mediaFromOpenAI(part);\n if (media) {\n const geminiPart = mediaToGemini(media, reporter);\n if (geminiPart) parts.push(geminiPart);\n continue;\n }\n reporter.warn('dropped-content', 'Dropped an unsupported user content part.');\n }\n return parts.length > 0 ? parts : [{ text: '' }];\n}\n\nfunction assistantParts(message: OpenAIAssistantMessage, reporter: Reporter): GeminiPart[] {\n const parts: GeminiPart[] = [];\n const text = textOf(message.content ?? '');\n if (text) parts.push({ text });\n for (const call of message.tool_calls ?? []) {\n parts.push({\n functionCall: {\n id: call.id,\n name: call.function.name,\n args: parseArguments(call.function.arguments, reporter, call.function.name),\n },\n });\n }\n return parts.length > 0 ? parts : [{ text: '' }];\n}\n\nfunction warnDroppedName(role: string, name: string | undefined, provider: string, reporter: Reporter): void {\n if (typeof name !== 'string') return;\n reporter.warn('dropped-metadata', `${role} message name '${name}' has no ${provider} equivalent; dropped.`);\n}\n\n/** Merges adjacent same-role contents by concatenating their `parts` arrays. */\nfunction mergeConsecutive(contents: GeminiContent[], reporter: Reporter): GeminiContent[] {\n const result: GeminiContent[] = [];\n for (const content of contents) {\n const previous = result[result.length - 1];\n if (previous && previous.role === content.role) {\n previous.parts = [...previous.parts, ...content.parts];\n reporter.warn('merged-role', `Merged consecutive '${content.role}' turns (Gemini requires alternating roles).`);\n } else {\n result.push({ role: content.role, parts: [...content.parts] });\n }\n }\n return result;\n}\n\n/* ------------------------------------------------------------------ */\n/* Gemini -> OpenAI (canonical) */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts a Gemini request fragment back into a canonical OpenAI message array.\n * Because Gemini matches tool calls and responses by function name (the `id`\n * field is optional), this maintains a queue of pending calls and resolves each\n * `functionResponse` by id when present, otherwise by name in call order,\n * generating a deterministic id as a last resort.\n */\nexport function fromGemini(conversation: GeminiConversation, options: ConvertOptions = {}): OpenAIMessage[] {\n const reporter = new Reporter(options);\n const out: OpenAIMessage[] = [];\n\n if (conversation.systemInstruction) {\n const text = textOf(conversation.systemInstruction.parts);\n if (text) out.push({ role: 'system', content: text });\n }\n\n const pending: { id: string; name: string }[] = [];\n let counter = 0;\n const generateId = (name: string): string => `call_${name.replace(/[^a-zA-Z0-9_-]/g, '_')}_${counter++}`;\n\n for (const content of conversation.contents) {\n const parts = Array.isArray(content.parts) ? content.parts : [];\n\n if (content.role === 'model') {\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n for (const part of parts) {\n if (isRecord(part) && isRecord(part.functionCall)) {\n const fc = part.functionCall as { id?: string; name: string; args?: Record<string, unknown> };\n const id = fc.id ?? generateId(fc.name);\n if (!fc.id) reporter.warn('generated-id', `Gemini functionCall '${fc.name}' had no id; generated '${id}'.`);\n toolCalls.push({\n id,\n type: 'function',\n function: { name: fc.name, arguments: JSON.stringify(fc.args ?? {}) },\n });\n pending.push({ id, name: fc.name });\n } else if (isRecord(part) && typeof part.text === 'string') {\n textPieces.push(part.text);\n }\n }\n const text = textPieces.join('');\n const assistant: OpenAIAssistantMessage = { role: 'assistant', content: text || null };\n if (toolCalls.length > 0) assistant.tool_calls = toolCalls;\n out.push(assistant);\n continue;\n }\n\n // role 'user' or unspecified\n const contentParts: OpenAIContentPart[] = [];\n let hasMedia = false;\n for (const part of parts) {\n if (isRecord(part) && isRecord(part.functionResponse)) {\n const fr = part.functionResponse as { id?: string; name: string; response?: Record<string, unknown> };\n const { id, matched } = resolveResponseId(fr, pending, reporter, generateId);\n out.push({\n role: 'tool',\n tool_call_id: id,\n content: unwrapResponse(fr.response ?? {}),\n ...(matched ? {} : { name: fr.name }),\n });\n continue;\n }\n const image = imageFromGemini(part);\n if (image) {\n contentParts.push(imageToOpenAI(image));\n hasMedia = true;\n continue;\n }\n const media = mediaFromGemini(part);\n if (media) {\n const openaiPart = mediaToOpenAI(media);\n if (openaiPart) {\n contentParts.push(openaiPart);\n hasMedia = true;\n }\n continue;\n }\n if (isRecord(part) && typeof part.text === 'string') {\n contentParts.push({ type: 'text', text: part.text });\n }\n }\n if (contentParts.length > 0) {\n if (hasMedia) {\n out.push({ role: 'user', content: contentParts });\n } else {\n const text = textOf(contentParts);\n out.push({ role: 'user', content: text });\n }\n }\n }\n\n return out;\n}\n\nfunction resolveResponseId(\n response: { id?: string; name: string },\n pending: { id: string; name: string }[],\n reporter: Reporter,\n generateId: (name: string) => string,\n): { id: string; matched: boolean } {\n if (response.id) {\n const index = pending.findIndex((p) => p.id === response.id);\n if (index >= 0) pending.splice(index, 1);\n return { id: response.id, matched: index >= 0 };\n }\n const index = pending.findIndex((p) => p.name === response.name);\n if (index >= 0) {\n const { id } = pending[index];\n pending.splice(index, 1);\n return { id, matched: true };\n }\n const id = generateId(response.name);\n reporter.warn(\n 'unmapped-tool-result',\n `Gemini functionResponse for '${response.name}' had no matching call; generated '${id}'.`,\n );\n return { id, matched: false };\n}\n","import type { AnthropicConversation, ConvertOptions, GeminiConversation, OpenAIMessage, Provider } from './types.js';\nimport { fromAnthropic, toAnthropic } from './providers/anthropic.js';\nimport { fromGemini, toGemini } from './providers/gemini.js';\n\n/** Maps a provider to the conversation shape it accepts and returns. */\nexport type ConversationOf<P extends Provider> = P extends 'openai'\n ? OpenAIMessage[]\n : P extends 'anthropic'\n ? AnthropicConversation\n : P extends 'gemini'\n ? GeminiConversation\n : never;\n\n/**\n * Converts a conversation from one provider format to another. Every conversion\n * routes through the canonical OpenAI representation, so any source/target pair\n * is supported, including same-provider normalization.\n *\n * @example\n * const gemini = convert(openaiMessages, { from: 'openai', to: 'gemini' });\n * const openai = convert(anthropicBody, { from: 'anthropic', to: 'openai' });\n */\nexport function convert<From extends Provider, To extends Provider>(\n conversation: ConversationOf<From>,\n route: { from: From; to: To },\n options: ConvertOptions = {},\n): ConversationOf<To> {\n const canonical = toCanonical(conversation, route.from, options);\n return fromCanonical(canonical, route.to, options) as ConversationOf<To>;\n}\n\nfunction toCanonical(conversation: unknown, from: Provider, options: ConvertOptions): OpenAIMessage[] {\n switch (from) {\n case 'openai':\n return conversation as OpenAIMessage[];\n case 'anthropic':\n return fromAnthropic(conversation as AnthropicConversation, options);\n case 'gemini':\n return fromGemini(conversation as GeminiConversation, options);\n default:\n throw new Error(`Unknown source provider: ${String(from)}`);\n }\n}\n\nfunction fromCanonical(canonical: OpenAIMessage[], to: Provider, options: ConvertOptions): ConversationOf<Provider> {\n switch (to) {\n case 'openai':\n return canonical;\n case 'anthropic':\n return toAnthropic(canonical, options);\n case 'gemini':\n return toGemini(canonical, options);\n default:\n throw new Error(`Unknown target provider: ${String(to)}`);\n }\n}\n","import type { ConvertOptions, OpenAIAssistantMessage, OpenAIToolCall, Provider } from './types.js';\nimport { Reporter, isRecord, textOf } from './util.js';\n\n/** A provider-neutral finish reason. */\nexport type FinishReason = 'stop' | 'tool_calls' | 'length' | 'content_filter' | 'unknown';\n\n/** Provider-neutral token usage. */\nexport interface Usage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/** A provider response normalized to the canonical OpenAI assistant shape. */\nexport interface NormalizedResponse {\n message: OpenAIAssistantMessage;\n finishReason: FinishReason;\n usage: Usage;\n}\n\nconst num = (value: unknown): number => (typeof value === 'number' ? value : 0);\n\n/** Builds the canonical message, setting `content` to null when only tool calls are present. */\nfunction buildMessage(text: string, toolCalls: OpenAIToolCall[]): OpenAIAssistantMessage {\n const message: OpenAIAssistantMessage = { role: 'assistant', content: text ? text : null };\n if (toolCalls.length > 0) message.tool_calls = toolCalls;\n return message;\n}\n\n/** When tool calls are present the canonical finish reason is always `tool_calls`. */\nfunction finalReason(mapped: FinishReason, toolCalls: OpenAIToolCall[]): FinishReason {\n return toolCalls.length > 0 ? 'tool_calls' : mapped;\n}\n\n/* -------------------------------- OpenAI ------------------------------- */\n\nconst OPENAI_FINISH: Record<string, FinishReason> = {\n stop: 'stop',\n length: 'length',\n tool_calls: 'tool_calls',\n content_filter: 'content_filter',\n function_call: 'tool_calls',\n};\n\n/** Normalizes an OpenAI Chat Completions response body. */\nexport function responseFromOpenAI(body: unknown): NormalizedResponse {\n const root = isRecord(body) ? body : {};\n const choice = Array.isArray(root.choices) && isRecord(root.choices[0]) ? root.choices[0] : {};\n const message = isRecord(choice.message) ? choice.message : {};\n\n const text = typeof message.content === 'string' ? message.content : textOf(message.content);\n const toolCalls = Array.isArray(message.tool_calls) ? (message.tool_calls as OpenAIToolCall[]) : [];\n\n const usage = isRecord(root.usage) ? root.usage : {};\n return {\n message: buildMessage(text, toolCalls),\n finishReason: finalReason(OPENAI_FINISH[String(choice.finish_reason)] ?? 'unknown', toolCalls),\n usage: { inputTokens: num(usage.prompt_tokens), outputTokens: num(usage.completion_tokens) },\n };\n}\n\nconst OPENAI_RESPONSES_INCOMPLETE: Record<string, FinishReason> = {\n max_output_tokens: 'length',\n content_filter: 'content_filter',\n};\n\nfunction responseApiFinishReason(root: Record<string, unknown>): FinishReason {\n if (root.status === 'completed') return 'stop';\n if (root.status !== 'incomplete') return 'unknown';\n\n const details = isRecord(root.incomplete_details) ? root.incomplete_details : {};\n return OPENAI_RESPONSES_INCOMPLETE[String(details.reason)] ?? 'unknown';\n}\n\n/** Normalizes an OpenAI Responses API response body. */\nexport function responseFromOpenAIResponses(body: unknown): NormalizedResponse {\n const root = isRecord(body) ? body : {};\n const output = Array.isArray(root.output) ? root.output : [];\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n let counter = 0;\n\n for (const item of output) {\n if (!isRecord(item)) continue;\n\n if (item.type === 'message') {\n const content = Array.isArray(item.content) ? item.content : [];\n for (const part of content) {\n if (!isRecord(part)) continue;\n if (typeof part.text === 'string' && (part.type === 'output_text' || part.type === 'text')) {\n textPieces.push(part.text);\n } else if (part.type === 'refusal' && typeof part.refusal === 'string') {\n textPieces.push(part.refusal);\n }\n }\n } else if (item.type === 'function_call' && typeof item.name === 'string') {\n const name = item.name;\n const id =\n typeof item.call_id === 'string'\n ? item.call_id\n : typeof item.id === 'string'\n ? item.id\n : `call_${name.replace(/[^a-zA-Z0-9_-]/g, '_')}_${counter++}`;\n const args = typeof item.arguments === 'string' ? item.arguments : JSON.stringify(item.arguments ?? {});\n toolCalls.push({ id, type: 'function', function: { name, arguments: args } });\n }\n }\n\n const usage = isRecord(root.usage) ? root.usage : {};\n return {\n message: buildMessage(textPieces.join(''), toolCalls),\n finishReason: finalReason(responseApiFinishReason(root), toolCalls),\n usage: { inputTokens: num(usage.input_tokens), outputTokens: num(usage.output_tokens) },\n };\n}\n\nexport type ResponseProvider = Provider | 'openai-responses';\n\n/* ------------------------------- Anthropic ----------------------------- */\n\nconst ANTHROPIC_FINISH: Record<string, FinishReason> = {\n end_turn: 'stop',\n stop_sequence: 'stop',\n tool_use: 'tool_calls',\n max_tokens: 'length',\n refusal: 'content_filter',\n pause_turn: 'unknown',\n};\n\n/** Normalizes an Anthropic Messages response body. */\nexport function responseFromAnthropic(body: unknown): NormalizedResponse {\n const root = isRecord(body) ? body : {};\n const blocks = Array.isArray(root.content) ? root.content : [];\n\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n for (const block of blocks) {\n if (!isRecord(block)) continue;\n if (block.type === 'text' && typeof block.text === 'string') {\n textPieces.push(block.text);\n } else if (block.type === 'tool_use' && typeof block.name === 'string') {\n toolCalls.push({\n id: typeof block.id === 'string' ? block.id : '',\n type: 'function',\n function: { name: block.name, arguments: JSON.stringify(block.input ?? {}) },\n });\n }\n }\n\n const usage = isRecord(root.usage) ? root.usage : {};\n return {\n message: buildMessage(textPieces.join(''), toolCalls),\n finishReason: finalReason(ANTHROPIC_FINISH[String(root.stop_reason)] ?? 'unknown', toolCalls),\n usage: { inputTokens: num(usage.input_tokens), outputTokens: num(usage.output_tokens) },\n };\n}\n\n/* -------------------------------- Gemini ------------------------------- */\n\nconst GEMINI_FINISH: Record<string, FinishReason> = {\n STOP: 'stop',\n MAX_TOKENS: 'length',\n SAFETY: 'content_filter',\n RECITATION: 'content_filter',\n MALFORMED_FUNCTION_CALL: 'content_filter',\n};\n\n/** Normalizes a Gemini generateContent response body. */\nexport function responseFromGemini(body: unknown, options: ConvertOptions = {}): NormalizedResponse {\n const reporter = new Reporter(options);\n const root = isRecord(body) ? body : {};\n const candidate = Array.isArray(root.candidates) && isRecord(root.candidates[0]) ? root.candidates[0] : {};\n const content = isRecord(candidate.content) ? candidate.content : {};\n const parts = Array.isArray(content.parts) ? content.parts : [];\n\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n let counter = 0;\n for (const part of parts) {\n if (!isRecord(part)) continue;\n if (isRecord(part.functionCall)) {\n const call = part.functionCall as { id?: string; name?: string; args?: Record<string, unknown> };\n const name = typeof call.name === 'string' ? call.name : 'function';\n let id = call.id;\n if (!id) {\n id = `call_${name.replace(/[^a-zA-Z0-9_-]/g, '_')}_${counter++}`;\n reporter.warn('generated-id', `Gemini functionCall '${name}' had no id; generated '${id}'.`);\n }\n toolCalls.push({ id, type: 'function', function: { name, arguments: JSON.stringify(call.args ?? {}) } });\n } else if (typeof part.text === 'string') {\n textPieces.push(part.text);\n }\n }\n\n const usage = isRecord(root.usageMetadata) ? root.usageMetadata : {};\n return {\n message: buildMessage(textPieces.join(''), toolCalls),\n finishReason: finalReason(GEMINI_FINISH[String(candidate.finishReason)] ?? 'unknown', toolCalls),\n usage: { inputTokens: num(usage.promptTokenCount), outputTokens: num(usage.candidatesTokenCount) },\n };\n}\n\n/* ------------------------------ Dispatcher ----------------------------- */\n\n/** Normalizes a provider response body into the canonical shape. */\nexport function normalizeResponse(\n body: unknown,\n route: { from: ResponseProvider },\n options: ConvertOptions = {},\n): NormalizedResponse {\n switch (route.from) {\n case 'openai':\n return responseFromOpenAI(body);\n case 'openai-responses':\n return responseFromOpenAIResponses(body);\n case 'anthropic':\n return responseFromAnthropic(body);\n case 'gemini':\n return responseFromGemini(body, options);\n default:\n throw new Error(`Unknown source provider: ${String(route.from)}`);\n }\n}\n"],"mappings":"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","names":["warnDroppedName","mergeConsecutive","index","id"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/util.ts","../src/image.ts","../src/media.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/convert.ts","../src/response.ts","../src/types.ts"],"sourcesContent":["export { toAnthropic, fromAnthropic } from './providers/anthropic.js';\nexport { toGemini, fromGemini } from './providers/gemini.js';\nexport { convert } from './convert.js';\nexport type { ConversationOf } from './convert.js';\nexport { parseDataUrl, toDataUrl } from './image.js';\nexport type { NormalizedImage } from './image.js';\nexport type { MediaPart, MediaModality, MediaSource } from './media.js';\nexport {\n responseFromOpenAI,\n responseFromOpenAIResponses,\n responseFromAnthropic,\n responseFromGemini,\n normalizeResponse,\n} from './response.js';\nexport type { NormalizedResponse, FinishReason, Usage, ResponseProvider } from './response.js';\nexport { warningCodes } from './types.js';\n\nexport type {\n Provider,\n Warning,\n WarningCode,\n ConvertOptions,\n OpenAIMessage,\n OpenAISystemMessage,\n OpenAIUserMessage,\n OpenAIAssistantMessage,\n OpenAIToolMessage,\n OpenAIToolCall,\n OpenAIContentPart,\n OpenAITextPart,\n OpenAIImagePart,\n OpenAIAudioPart,\n OpenAIFilePart,\n AnthropicConversation,\n AnthropicMessage,\n AnthropicContentBlock,\n AnthropicTextBlock,\n AnthropicToolUseBlock,\n AnthropicToolResultBlock,\n AnthropicImageBlock,\n AnthropicDocumentBlock,\n GeminiConversation,\n GeminiContent,\n GeminiPart,\n GeminiTextPart,\n GeminiFunctionCallPart,\n GeminiFunctionResponsePart,\n GeminiInlineDataPart,\n GeminiFileDataPart,\n} from './types.js';\n","import type { ConvertOptions, OpenAITextPart, Warning, WarningCode } from './types.js';\n\n/** Thin wrapper around the optional `onWarning` callback. */\nexport class Reporter {\n constructor(private readonly options: ConvertOptions = {}) {}\n\n warn(code: WarningCode, message: string): void {\n this.options.onWarning?.({ code, message } satisfies Warning);\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Flattens any supported text content (a plain string or an array of text\n * parts/blocks) into a single string. Non text parts are ignored.\n */\nexport function textOf(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .map((part) => {\n if (typeof part === 'string') return part;\n if (isRecord(part) && typeof part.text === 'string') return part.text;\n if (isRecord(part) && part.type === 'refusal' && typeof part.refusal === 'string') return part.refusal;\n return '';\n })\n .join('');\n }\n return '';\n}\n\n/** Wraps a string as a single OpenAI/Anthropic text part array. */\nexport function textPart(text: string): OpenAITextPart[] {\n return [{ type: 'text', text }];\n}\n\n/** Safely parses a JSON string, returning a discriminated result. */\nexport function tryParseJson(input: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(input) };\n } catch {\n return { ok: false };\n }\n}\n\n/**\n * Parses an OpenAI tool-call `arguments` JSON string into an object. Reports and\n * returns `{}` when the string is not valid JSON object syntax.\n */\nexport function parseArguments(args: string, reporter: Reporter, fnName: string): Record<string, unknown> {\n const parsed = tryParseJson(args);\n if (parsed.ok && isRecord(parsed.value)) return parsed.value;\n reporter.warn(\n 'invalid-json-arguments',\n `Tool call '${fnName}' had arguments that were not a JSON object; used an empty object instead.`,\n );\n return {};\n}\n\n/** Serializes provider-native argument objects into the canonical OpenAI JSON string. */\nexport function stringifyArgumentsObject(\n value: unknown,\n reporter: Reporter,\n provider: string,\n part: string,\n fnName: string,\n): string {\n if (value === undefined) return '{}';\n if (isRecord(value)) {\n try {\n return JSON.stringify(value);\n } catch {\n reporter.warn(\n 'invalid-json-arguments',\n `${provider} ${part} '${fnName}' had arguments that could not be serialized as JSON; used an empty object instead.`,\n );\n return '{}';\n }\n }\n reporter.warn(\n 'invalid-json-arguments',\n `${provider} ${part} '${fnName}' had arguments that were not an object; used an empty object instead.`,\n );\n return '{}';\n}\n\nconst OPENAI_FUNCTION_NAME = /^[a-zA-Z0-9_-]{1,64}$/;\n\nexport function isProviderFunctionName(value: unknown): value is string {\n return typeof value === 'string' && OPENAI_FUNCTION_NAME.test(value);\n}\n\n/** Returns a canonical function name for malformed provider tool-call payloads. */\nexport function providerFunctionName(value: unknown, reporter: Reporter, provider: string, part: string): string {\n if (isProviderFunctionName(value)) return value;\n reporter.warn(\n 'dropped-metadata',\n `${provider} ${part} had a missing or invalid function name; used 'unknown_function'.`,\n );\n return 'unknown_function';\n}\n\n/** Generates deterministic OpenAI tool-call ids without reusing seen ids. */\nexport function createToolCallIdGenerator(reservedIds: Iterable<string> = []): {\n claim: (id: string, name: string) => string;\n generate: (name: string) => string;\n} {\n const reserved = new Set(reservedIds);\n const used = new Set<string>();\n let counter = 0;\n\n const generate = (name: string): string => {\n let id: string;\n do {\n id = `call_${name.replace(/[^a-zA-Z0-9_-]/g, '_')}_${counter++}`;\n } while (used.has(id) || reserved.has(id));\n used.add(id);\n return id;\n };\n\n return {\n claim(id: string, name: string): string {\n if (used.has(id)) return generate(name);\n used.add(id);\n reserved.delete(id);\n return id;\n },\n generate(name: string): string {\n return generate(name);\n },\n };\n}\n\n/**\n * Converts an OpenAI tool result string into a Gemini `functionResponse.response`\n * object. A JSON object string is used directly; anything else is wrapped as\n * `{ result: <text> }`, which {@link unwrapResponse} reverses.\n */\nexport function wrapResponse(content: string): Record<string, unknown> {\n const parsed = tryParseJson(content);\n if (parsed.ok && isRecord(parsed.value)) return parsed.value;\n return { result: content };\n}\n\n/** Reverses {@link wrapResponse}: a lone `{ result: string }` becomes that string. */\nexport function unwrapResponse(\n response: unknown,\n reporter?: Reporter,\n provider = 'Provider',\n part = 'response',\n): string {\n if (response === undefined) return '{}';\n if (isRecord(response)) {\n const keys = Object.keys(response);\n if (keys.length === 1 && keys[0] === 'result' && typeof response.result === 'string') {\n return response.result;\n }\n }\n try {\n return JSON.stringify(response) ?? '{}';\n } catch {\n reporter?.warn(\n 'dropped-content',\n `${provider} ${part} response could not be serialized as JSON; used an empty object instead.`,\n );\n return '{}';\n }\n}\n","import type { AnthropicImageBlock, GeminiPart, OpenAIImagePart } from './types.js';\nimport { Reporter, isRecord } from './util.js';\n\n/**\n * A provider-neutral image. `base64` carries the raw bytes plus media type\n * (mapping to a data URL, an Anthropic base64 source or a Gemini `inlineData`\n * part); `url` carries a remote reference.\n */\nexport type NormalizedImage = { kind: 'base64'; mediaType: string; data: string } | { kind: 'url'; url: string };\n\nconst DATA_URL = /^data:([^;,]+);base64,(.*)$/s;\n\n/** Decomposes a `data:<mediaType>;base64,<data>` URL. Returns null otherwise. */\nexport function parseDataUrl(url: string): { mediaType: string; data: string } | null {\n const match = DATA_URL.exec(url);\n if (!match) return null;\n return { mediaType: match[1], data: match[2] };\n}\n\n/** Reassembles a base64 data URL. The inverse of {@link parseDataUrl}. */\nexport function toDataUrl(mediaType: string, data: string): string {\n return `data:${mediaType};base64,${data}`;\n}\n\n/* ------------------------------- OpenAI -------------------------------- */\n\nexport function imageFromOpenAI(part: unknown): NormalizedImage | null {\n if (!isRecord(part) || part.type !== 'image_url' || !isRecord(part.image_url)) return null;\n const url = part.image_url.url;\n if (typeof url !== 'string') return null;\n const parsed = parseDataUrl(url);\n return parsed ? { kind: 'base64', ...parsed } : { kind: 'url', url };\n}\n\nexport function imageToOpenAI(image: NormalizedImage): OpenAIImagePart {\n const url = image.kind === 'base64' ? toDataUrl(image.mediaType, image.data) : image.url;\n return { type: 'image_url', image_url: { url } };\n}\n\n/* ------------------------------ Anthropic ------------------------------ */\n\nexport function imageFromAnthropic(block: unknown): NormalizedImage | null {\n if (!isRecord(block) || block.type !== 'image' || !isRecord(block.source)) return null;\n const source = block.source;\n if (source.type === 'base64' && typeof source.media_type === 'string' && typeof source.data === 'string') {\n return { kind: 'base64', mediaType: source.media_type, data: source.data };\n }\n if (source.type === 'url' && typeof source.url === 'string') {\n return { kind: 'url', url: source.url };\n }\n return null;\n}\n\nexport function imageToAnthropic(image: NormalizedImage): AnthropicImageBlock {\n if (image.kind === 'base64') {\n return { type: 'image', source: { type: 'base64', media_type: image.mediaType, data: image.data } };\n }\n return { type: 'image', source: { type: 'url', url: image.url } };\n}\n\n/* -------------------------------- Gemini ------------------------------- */\n\nexport function imageFromGemini(part: unknown): NormalizedImage | null {\n if (isRecord(part) && isRecord(part.inlineData)) {\n const data = part.inlineData;\n if (typeof data.mimeType === 'string' && typeof data.data === 'string' && data.mimeType.startsWith('image/')) {\n return { kind: 'base64', mediaType: data.mimeType, data: data.data };\n }\n }\n if (isRecord(part) && isRecord(part.fileData)) {\n const data = part.fileData;\n // A fileData with no mimeType is assumed to be an image (the only media we\n // emit as a bare fileUri); a typed non-image fileData belongs to media.ts.\n const mime = typeof data.mimeType === 'string' ? data.mimeType : '';\n if (typeof data.fileUri === 'string' && (mime === '' || mime.startsWith('image/'))) {\n return { kind: 'url', url: data.fileUri };\n }\n }\n return null;\n}\n\nexport function imageToGemini(image: NormalizedImage, reporter: Reporter): GeminiPart {\n if (image.kind === 'base64') {\n return { inlineData: { mimeType: image.mediaType, data: image.data } };\n }\n // Gemini's fileData.fileUri is intended for Files API URIs, not arbitrary\n // public URLs. We emit it as a best effort and flag it so the caller can\n // upload via the Files API or inline the bytes if Gemini rejects it.\n reporter.warn(\n 'gemini-url-image',\n 'A remote image URL was emitted as Gemini fileData.fileUri; Gemini may require the Files API for non-Google URIs.',\n );\n return { fileData: { fileUri: image.url } };\n}\n","import type {\n AnthropicDocumentBlock,\n GeminiPart,\n OpenAIAudioPart,\n OpenAIContentPart,\n OpenAIFilePart,\n} from './types.js';\nimport { Reporter, isRecord } from './util.js';\nimport { parseDataUrl, toDataUrl } from './image.js';\n\n/**\n * A provider-neutral non-image media part (audio or document). Images keep their\n * own dedicated path in `image.ts`; everything else flows through here.\n */\nexport type MediaModality = 'audio' | 'document';\n\nexport type MediaSource =\n | { kind: 'base64'; mediaType: string; data: string }\n | { kind: 'url'; url: string }\n | { kind: 'file_id'; id: string };\n\nexport interface MediaPart {\n modality: MediaModality;\n source: MediaSource;\n filename?: string;\n}\n\nfunction modalityFromMime(mediaType: string): MediaModality {\n return mediaType.startsWith('audio/') ? 'audio' : 'document';\n}\n\n/* -------------------------------- OpenAI ------------------------------- */\n\nexport function mediaFromOpenAI(part: unknown): MediaPart | null {\n if (!isRecord(part)) return null;\n\n if (part.type === 'input_audio' && isRecord(part.input_audio)) {\n const audio = part.input_audio;\n if (typeof audio.data === 'string') {\n const format = typeof audio.format === 'string' ? audio.format : 'wav';\n return { modality: 'audio', source: { kind: 'base64', mediaType: `audio/${format}`, data: audio.data } };\n }\n }\n\n if (part.type === 'file' && isRecord(part.file)) {\n const file = part.file;\n const filename = typeof file.filename === 'string' ? file.filename : undefined;\n if (typeof file.file_data === 'string') {\n const parsed = parseDataUrl(file.file_data);\n if (parsed) return { modality: 'document', source: { kind: 'base64', ...parsed }, filename };\n }\n if (typeof file.file_id === 'string') {\n return { modality: 'document', source: { kind: 'file_id', id: file.file_id }, filename };\n }\n }\n\n return null;\n}\n\nexport function mediaToOpenAI(media: MediaPart): OpenAIContentPart | null {\n const { modality, source } = media;\n if (modality === 'audio') {\n if (source.kind !== 'base64') return null; // Chat Completions has no URL/id audio input\n const audio: OpenAIAudioPart = {\n type: 'input_audio',\n input_audio: { data: source.data, format: source.mediaType.replace(/^audio\\//, '') },\n };\n return audio;\n }\n // document\n if (source.kind === 'base64') {\n const file: OpenAIFilePart = {\n type: 'file',\n file: {\n file_data: toDataUrl(source.mediaType, source.data),\n ...(media.filename ? { filename: media.filename } : {}),\n },\n };\n return file;\n }\n if (source.kind === 'file_id') {\n const file: OpenAIFilePart = {\n type: 'file',\n file: { file_id: source.id, ...(media.filename ? { filename: media.filename } : {}) },\n };\n return file;\n }\n return null; // Chat Completions has no URL document input\n}\n\n/* ------------------------------- Anthropic ----------------------------- */\n\nexport function mediaFromAnthropic(block: unknown): MediaPart | null {\n if (!isRecord(block) || block.type !== 'document' || !isRecord(block.source)) return null;\n const source = block.source;\n if (source.type === 'base64' && typeof source.media_type === 'string' && typeof source.data === 'string') {\n return { modality: 'document', source: { kind: 'base64', mediaType: source.media_type, data: source.data } };\n }\n if (source.type === 'url' && typeof source.url === 'string') {\n return { modality: 'document', source: { kind: 'url', url: source.url } };\n }\n if (source.type === 'file' && typeof source.file_id === 'string') {\n return { modality: 'document', source: { kind: 'file_id', id: source.file_id } };\n }\n return null;\n}\n\nexport function mediaToAnthropic(media: MediaPart, reporter: Reporter): AnthropicDocumentBlock | null {\n if (media.modality === 'audio') {\n reporter.warn('unsupported-modality', 'Anthropic has no audio input; dropped an audio part.');\n return null;\n }\n const { source } = media;\n if (source.kind === 'base64') {\n return { type: 'document', source: { type: 'base64', media_type: source.mediaType, data: source.data } };\n }\n if (source.kind === 'url') {\n return { type: 'document', source: { type: 'url', url: source.url } };\n }\n return { type: 'document', source: { type: 'file', file_id: source.id } };\n}\n\n/* -------------------------------- Gemini ------------------------------- */\n\nexport function mediaFromGemini(part: unknown): MediaPart | null {\n if (isRecord(part) && isRecord(part.inlineData)) {\n const data = part.inlineData;\n if (typeof data.mimeType === 'string' && typeof data.data === 'string' && !data.mimeType.startsWith('image/')) {\n return {\n modality: modalityFromMime(data.mimeType),\n source: { kind: 'base64', mediaType: data.mimeType, data: data.data },\n };\n }\n }\n if (isRecord(part) && isRecord(part.fileData)) {\n const data = part.fileData;\n const mime = typeof data.mimeType === 'string' ? data.mimeType : '';\n // A bare fileUri (no mimeType) is treated as an image in image.ts.\n if (typeof data.fileUri === 'string' && mime !== '' && !mime.startsWith('image/')) {\n return { modality: modalityFromMime(mime), source: { kind: 'url', url: data.fileUri } };\n }\n }\n return null;\n}\n\nexport function mediaToGemini(media: MediaPart, reporter: Reporter): GeminiPart | null {\n const { source } = media;\n if (source.kind === 'base64') {\n return { inlineData: { mimeType: source.mediaType, data: source.data } };\n }\n if (source.kind === 'url') {\n reporter.warn(\n 'gemini-url-media',\n 'A media URL was emitted as Gemini fileData.fileUri; Gemini may require the Files API for non-Google URIs.',\n );\n return { fileData: { fileUri: source.url } };\n }\n reporter.warn('unsupported-modality', 'Gemini has no file-id media reference; dropped a file_id part.');\n return null;\n}\n","import type {\n OpenAIAssistantMessage,\n OpenAIMessage,\n OpenAISystemMessage,\n OpenAIToolMessage,\n OpenAIUserMessage,\n} from '../types.js';\nimport { Reporter, textOf } from '../util.js';\n\n/** Any canonical message other than a system/developer prompt. */\nexport type NonSystemMessage = OpenAIUserMessage | OpenAIAssistantMessage | OpenAIToolMessage;\n\nfunction isSystem(message: OpenAIMessage): message is OpenAISystemMessage {\n return message.role === 'system' || message.role === 'developer';\n}\n\n/**\n * Splits a canonical OpenAI conversation into its system prompt and the\n * remaining messages. All `system` / `developer` messages are folded into a\n * single string (joined by blank lines) because Anthropic and Gemini carry the\n * system prompt as one top-level field. A system message that appears after the\n * conversation has started is still folded in, but reported as `system-midstream`.\n */\nexport function splitSystem(\n messages: OpenAIMessage[],\n reporter: Reporter,\n): { system?: string; rest: NonSystemMessage[] } {\n const systemParts: string[] = [];\n const rest: NonSystemMessage[] = [];\n let started = false;\n\n for (const message of messages) {\n if (isSystem(message)) {\n if (typeof message.name === 'string') {\n reporter.warn(\n 'dropped-metadata',\n `${message.role} message name '${message.name}' has no top-level system prompt equivalent; dropped.`,\n );\n }\n if (started) {\n reporter.warn(\n 'system-midstream',\n 'A system message appeared mid conversation; it was merged into the top-level system prompt.',\n );\n }\n systemParts.push(textOf(message.content));\n continue;\n }\n started = true;\n rest.push(message);\n }\n\n const system = systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined;\n return system === undefined ? { rest } : { system, rest };\n}\n","import type {\n AnthropicContentBlock,\n AnthropicConversation,\n AnthropicMessage,\n ConvertOptions,\n OpenAIAssistantMessage,\n OpenAIContentPart,\n OpenAIMessage,\n OpenAIToolMessage,\n} from '../types.js';\nimport {\n Reporter,\n createToolCallIdGenerator,\n isRecord,\n parseArguments,\n providerFunctionName,\n stringifyArgumentsObject,\n textOf,\n} from '../util.js';\nimport { imageFromAnthropic, imageFromOpenAI, imageToAnthropic, imageToOpenAI } from '../image.js';\nimport { mediaFromAnthropic, mediaFromOpenAI, mediaToAnthropic, mediaToOpenAI } from '../media.js';\nimport { splitSystem } from './openai.js';\n\nconst nonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0;\n\n/* ------------------------------------------------------------------ */\n/* OpenAI (canonical) -> Anthropic */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts a canonical OpenAI conversation into an Anthropic request fragment\n * (`{ system, messages }`). System messages move to the top-level `system`\n * field, tool-call arguments are JSON parsed into `input` objects, tool results\n * are folded into `tool_result` blocks inside a user turn, and consecutive\n * same-role turns are merged to satisfy Anthropic's strict alternation.\n */\nexport function toAnthropic(messages: OpenAIMessage[], options: ConvertOptions = {}): AnthropicConversation {\n const reporter = new Reporter(options);\n const { system, rest } = splitSystem(messages, reporter);\n const out: AnthropicMessage[] = [];\n\n for (let i = 0; i < rest.length; i++) {\n const message = rest[i];\n\n if (message.role === 'tool') {\n const blocks: AnthropicContentBlock[] = [];\n let j = i;\n while (j < rest.length && rest[j].role === 'tool') {\n const tool = rest[j] as OpenAIToolMessage;\n if (typeof tool.name === 'string') {\n reporter.warn(\n 'dropped-metadata',\n `Tool message name '${tool.name}' has no Anthropic tool_result equivalent; dropped.`,\n );\n }\n blocks.push({\n type: 'tool_result',\n tool_use_id: tool.tool_call_id,\n content: textOf(tool.content),\n ...(typeof tool.is_error === 'boolean' ? { is_error: tool.is_error } : {}),\n });\n j++;\n }\n out.push({ role: 'user', content: blocks });\n i = j - 1;\n continue;\n }\n\n if (message.role === 'user') {\n warnDroppedName('User', message.name, 'Anthropic', reporter);\n out.push({ role: 'user', content: userContent(message.content, reporter) });\n continue;\n }\n\n out.push({ role: 'assistant', content: assistantContent(message, reporter) });\n }\n\n const merged = mergeConsecutive(out, reporter);\n return system === undefined ? { messages: merged } : { system, messages: merged };\n}\n\nfunction userContent(content: string | OpenAIContentPart[], reporter: Reporter): string | AnthropicContentBlock[] {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return textOf(content);\n const blocks: AnthropicContentBlock[] = [];\n for (const part of content) {\n if (isRecord(part) && part.type === 'text' && typeof part.text === 'string') {\n blocks.push({ type: 'text', text: part.text });\n continue;\n }\n const image = imageFromOpenAI(part);\n if (image) {\n blocks.push(imageToAnthropic(image));\n continue;\n }\n const media = mediaFromOpenAI(part);\n if (media) {\n const block = mediaToAnthropic(media, reporter);\n if (block) blocks.push(block);\n continue;\n }\n reporter.warn('dropped-content', 'Dropped an unsupported user content part.');\n }\n return blocks.length > 0 ? blocks : '';\n}\n\nfunction assistantContent(message: OpenAIAssistantMessage, reporter: Reporter): string | AnthropicContentBlock[] {\n warnDroppedName('Assistant', message.name, 'Anthropic', reporter);\n const text = textOf(message.content ?? '');\n const toolCalls = message.tool_calls ?? [];\n if (toolCalls.length === 0) return text;\n\n const blocks: AnthropicContentBlock[] = [];\n if (text) blocks.push({ type: 'text', text });\n for (const call of toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: call.id,\n name: call.function.name,\n input: parseArguments(call.function.arguments, reporter, call.function.name),\n });\n }\n return blocks;\n}\n\nfunction warnDroppedName(role: string, name: string | undefined, provider: string, reporter: Reporter): void {\n if (typeof name !== 'string') return;\n reporter.warn('dropped-metadata', `${role} message name '${name}' has no ${provider} equivalent; dropped.`);\n}\n\n/** Merges adjacent same-role messages by concatenating their content blocks. */\nfunction mergeConsecutive(messages: AnthropicMessage[], reporter: Reporter): AnthropicMessage[] {\n const result: AnthropicMessage[] = [];\n for (const message of messages) {\n const previous = result[result.length - 1];\n if (previous && previous.role === message.role) {\n previous.content = [...asBlocks(previous.content), ...asBlocks(message.content)];\n reporter.warn(\n 'merged-role',\n `Merged consecutive '${message.role}' turns (Anthropic requires alternating roles).`,\n );\n } else {\n result.push({ role: message.role, content: message.content });\n }\n }\n return result;\n}\n\nfunction asBlocks(content: unknown): AnthropicContentBlock[] {\n if (Array.isArray(content)) return content.filter(isRecord) as AnthropicContentBlock[];\n if (typeof content !== 'string') return [];\n return content ? [{ type: 'text', text: content }] : [];\n}\n\nfunction warnMalformedBlocks(content: unknown, reporter: Reporter): void {\n if (Array.isArray(content)) {\n for (const block of content) {\n if (!isRecord(block)) {\n reporter.warn('dropped-content', 'Dropped a malformed Anthropic content block.');\n }\n }\n return;\n }\n if (typeof content !== 'string') {\n reporter.warn('dropped-content', 'Dropped malformed Anthropic message content.');\n }\n}\n\nfunction isSupportedUserBlock(block: AnthropicContentBlock): boolean {\n return (\n (block.type === 'text' && typeof block.text === 'string') ||\n block.type === 'tool_result' ||\n imageFromAnthropic(block) !== null ||\n mediaFromAnthropic(block) !== null\n );\n}\n\nfunction isSupportedAssistantBlock(block: AnthropicContentBlock): boolean {\n return (block.type === 'text' && typeof block.text === 'string') || block.type === 'tool_use';\n}\n\nfunction warnUnsupportedBlocks(blocks: AnthropicContentBlock[], role: 'user' | 'assistant', reporter: Reporter): void {\n const isSupported = role === 'user' ? isSupportedUserBlock : isSupportedAssistantBlock;\n for (const block of blocks) {\n if (isSupported(block)) continue;\n reporter.warn('dropped-content', `Dropped unsupported Anthropic ${role} content block '${String(block.type)}'.`);\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Anthropic -> OpenAI (canonical) */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts an Anthropic request fragment back into a canonical OpenAI message\n * array. The top-level `system` becomes a leading system message, `tool_use`\n * blocks become `tool_calls` (with `input` re-serialized to a JSON string), and\n * `tool_result` blocks become standalone `role: 'tool'` messages.\n */\nexport function fromAnthropic(conversation: AnthropicConversation, options: ConvertOptions = {}): OpenAIMessage[] {\n const reporter = new Reporter(options);\n const out: OpenAIMessage[] = [];\n const root: Record<string, unknown> = isRecord(conversation) ? conversation : {};\n const system = textOf(root.system);\n if (system) {\n out.push({ role: 'system', content: system });\n }\n const messages = Array.isArray(root.messages) ? root.messages : [];\n const ids = createToolCallIdGenerator(anthropicProviderIds(root));\n const pendingToolUseIds = new Map<string, string[]>();\n\n for (const message of messages) {\n if (!isRecord(message)) {\n reporter.warn('dropped-content', 'Dropped a malformed Anthropic message.');\n continue;\n }\n if (message.role !== 'user' && message.role !== 'assistant') {\n reporter.warn('dropped-content', `Dropped an Anthropic message with unsupported role '${String(message.role)}'.`);\n continue;\n }\n warnMalformedBlocks(message.content, reporter);\n const blocks = asBlocks(message.content);\n warnUnsupportedBlocks(blocks, message.role, reporter);\n\n if (message.role === 'user') {\n if (blocks.length === 0) {\n out.push({ role: 'user', content: '' });\n continue;\n }\n\n let contentBlocks: AnthropicContentBlock[] = [];\n const flushContent = (): void => {\n if (contentBlocks.length > 0) {\n out.push({ role: 'user', content: userContentToOpenAI(contentBlocks, reporter) });\n contentBlocks = [];\n }\n };\n\n for (const block of blocks) {\n if (block.type !== 'tool_result') {\n contentBlocks.push(block);\n continue;\n }\n\n flushContent();\n const rawToolUseId = (block as { tool_use_id?: unknown }).tool_use_id;\n const hasToolUseId = nonEmptyString(rawToolUseId);\n const matchedToolCallId = hasToolUseId ? takePendingToolUseId(pendingToolUseIds, rawToolUseId) : undefined;\n const toolCallId =\n matchedToolCallId ?? (hasToolUseId ? ids.claim(rawToolUseId, 'tool_result') : ids.generate('tool_result'));\n if (!hasToolUseId) {\n reporter.warn(\n 'unmapped-tool-result',\n `Anthropic tool_result had no usable tool_use_id; generated '${toolCallId}'.`,\n );\n } else if (!matchedToolCallId) {\n const unmappedMessage =\n toolCallId === rawToolUseId\n ? `Anthropic tool_result '${rawToolUseId}' had no matching tool_use; kept the result id.`\n : `Anthropic tool_result '${rawToolUseId}' had no matching tool_use; generated '${toolCallId}'.`;\n reporter.warn('unmapped-tool-result', unmappedMessage);\n if (toolCallId !== rawToolUseId) {\n reporter.warn(\n 'generated-id',\n `Anthropic tool_result '${rawToolUseId}' reused an existing id; generated '${toolCallId}'.`,\n );\n }\n }\n out.push({\n role: 'tool',\n tool_call_id: toolCallId,\n content: textOf((block as { content?: unknown }).content),\n ...(typeof (block as { is_error?: unknown }).is_error === 'boolean'\n ? { is_error: (block as { is_error: boolean }).is_error }\n : {}),\n });\n }\n flushContent();\n continue;\n }\n\n // assistant\n const text = textOf(blocks.filter((b) => b.type === 'text'));\n const toolUses = blocks.filter((b) => b.type === 'tool_use');\n const assistant: OpenAIAssistantMessage = { role: 'assistant', content: text || null };\n if (toolUses.length > 0) {\n assistant.tool_calls = toolUses.map((block) => {\n const b = block as { id?: unknown; name?: unknown; input?: unknown };\n const name = providerFunctionName(b.name, reporter, 'Anthropic', 'tool_use');\n const providedId = nonEmptyString(b.id) ? b.id : undefined;\n const id = providedId ? ids.claim(providedId, name) : ids.generate(name);\n if (!providedId) {\n reporter.warn('generated-id', `Anthropic tool_use '${name}' had no id; generated '${id}'.`);\n } else if (id !== providedId) {\n reporter.warn('generated-id', `Anthropic tool_use '${name}' reused id '${providedId}'; generated '${id}'.`);\n }\n if (providedId) pushPendingToolUseId(pendingToolUseIds, providedId, id);\n return {\n id,\n type: 'function',\n function: {\n name,\n arguments: stringifyArgumentsObject(b.input, reporter, 'Anthropic', 'tool_use', name),\n },\n };\n });\n }\n out.push(assistant);\n }\n\n return out;\n}\n\nfunction pushPendingToolUseId(pending: Map<string, string[]>, providerId: string, normalizedId: string): void {\n const ids = pending.get(providerId);\n if (ids) ids.push(normalizedId);\n else pending.set(providerId, [normalizedId]);\n}\n\nfunction takePendingToolUseId(pending: Map<string, string[]>, providerId: string): string | undefined {\n const ids = pending.get(providerId);\n const id = ids?.shift();\n if (ids?.length === 0) pending.delete(providerId);\n return id;\n}\n\nfunction anthropicProviderIds(conversation: unknown): string[] {\n const ids: string[] = [];\n const root: Record<string, unknown> = isRecord(conversation) ? conversation : {};\n const messages = Array.isArray(root.messages) ? root.messages : [];\n for (const message of messages) {\n if (!isRecord(message)) continue;\n for (const block of asBlocks(message.content)) {\n if (block.type === 'tool_use' && nonEmptyString((block as { id?: unknown }).id)) {\n ids.push((block as { id: string }).id);\n }\n if (block.type === 'tool_result' && nonEmptyString((block as { tool_use_id?: unknown }).tool_use_id)) {\n ids.push((block as { tool_use_id: string }).tool_use_id);\n }\n }\n }\n return ids;\n}\n\n/** Rebuilds OpenAI user content from Anthropic blocks, as a string unless media is present. */\nfunction userContentToOpenAI(blocks: AnthropicContentBlock[], reporter: Reporter): string | OpenAIContentPart[] {\n const hasMedia = blocks.some((block) => imageFromAnthropic(block) !== null || mediaFromAnthropic(block) !== null);\n if (!hasMedia) return textOf(blocks);\n const parts: OpenAIContentPart[] = [];\n for (const block of blocks) {\n const image = imageFromAnthropic(block);\n if (image) {\n parts.push(imageToOpenAI(image));\n continue;\n }\n const media = mediaFromAnthropic(block);\n if (media) {\n const part = mediaToOpenAI(media);\n if (part) parts.push(part);\n else reporter.warn('dropped-content', 'A document URL has no OpenAI Chat Completions equivalent; dropped.');\n continue;\n }\n if (isRecord(block) && block.type === 'text' && typeof block.text === 'string') {\n parts.push({ type: 'text', text: block.text });\n }\n }\n return parts.length > 0 ? parts : '';\n}\n","import type {\n ConvertOptions,\n GeminiContent,\n GeminiConversation,\n GeminiPart,\n OpenAIAssistantMessage,\n OpenAIContentPart,\n OpenAIMessage,\n OpenAIToolCall,\n OpenAIToolMessage,\n} from '../types.js';\nimport {\n Reporter,\n createToolCallIdGenerator,\n isProviderFunctionName,\n isRecord,\n parseArguments,\n providerFunctionName,\n stringifyArgumentsObject,\n textOf,\n unwrapResponse,\n wrapResponse,\n} from '../util.js';\nimport { imageFromGemini, imageFromOpenAI, imageToGemini, imageToOpenAI } from '../image.js';\nimport { mediaFromGemini, mediaFromOpenAI, mediaToGemini, mediaToOpenAI } from '../media.js';\nimport { splitSystem } from './openai.js';\n\nconst nonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0;\ntype PendingFunctionCall = { id: string; name: string; providerId?: string };\n\n/* ------------------------------------------------------------------ */\n/* OpenAI (canonical) -> Gemini */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts a canonical OpenAI conversation into a Gemini request fragment\n * (`{ systemInstruction, contents }`). The assistant role becomes `model`,\n * tool-call arguments are JSON parsed into `args` objects, tool results become\n * `functionResponse` parts whose `name` is recovered from the matching call, and\n * consecutive same-role turns are merged for Gemini's strict alternation.\n *\n * The OpenAI tool-call `id` is carried through as `functionCall.id` so that a\n * round trip (OpenAI -> Gemini -> OpenAI) preserves ids exactly.\n */\nexport function toGemini(messages: OpenAIMessage[], options: ConvertOptions = {}): GeminiConversation {\n const reporter = new Reporter(options);\n const { system, rest } = splitSystem(messages, reporter);\n\n const idToName = new Map<string, string>();\n for (const message of rest) {\n if (message.role === 'assistant' && message.tool_calls) {\n for (const call of message.tool_calls) idToName.set(call.id, call.function.name);\n }\n }\n\n const contents: GeminiContent[] = [];\n for (let i = 0; i < rest.length; i++) {\n const message = rest[i];\n\n if (message.role === 'tool') {\n const parts: GeminiPart[] = [];\n let j = i;\n while (j < rest.length && rest[j].role === 'tool') {\n const tool = rest[j] as OpenAIToolMessage;\n const matchingName = idToName.get(tool.tool_call_id);\n if (typeof tool.is_error === 'boolean') {\n reporter.warn(\n 'dropped-metadata',\n `Tool message is_error=${tool.is_error} has no Gemini functionResponse equivalent; dropped.`,\n );\n }\n if (typeof tool.name === 'string' && matchingName && tool.name !== matchingName) {\n reporter.warn(\n 'dropped-metadata',\n `Tool message name '${tool.name}' differs from matching tool call '${matchingName}'; used the tool-call function name for Gemini.`,\n );\n }\n const hasStandaloneName = nonEmptyString(tool.name);\n const name = matchingName ?? (hasStandaloneName ? tool.name : tool.tool_call_id);\n if (!matchingName && !hasStandaloneName) {\n reporter.warn(\n 'unmapped-tool-result',\n `Tool result '${tool.tool_call_id}' has no matching call; used the id as the function name.`,\n );\n }\n parts.push({\n functionResponse: {\n id: tool.tool_call_id,\n name: name ?? tool.tool_call_id,\n response: wrapResponse(textOf(tool.content)),\n },\n });\n j++;\n }\n contents.push({ role: 'user', parts });\n i = j - 1;\n continue;\n }\n\n if (message.role === 'user') {\n warnDroppedName('User', message.name, 'Gemini', reporter);\n contents.push({ role: 'user', parts: userParts(message.content, reporter) });\n continue;\n }\n\n warnDroppedName('Assistant', message.name, 'Gemini', reporter);\n contents.push({ role: 'model', parts: assistantParts(message, reporter) });\n }\n\n const merged = mergeConsecutive(contents, reporter);\n return system === undefined\n ? { contents: merged }\n : { systemInstruction: { parts: [{ text: system }] }, contents: merged };\n}\n\nfunction userParts(content: string | OpenAIContentPart[], reporter: Reporter): GeminiPart[] {\n if (typeof content === 'string') return [{ text: content }];\n const parts: GeminiPart[] = [];\n for (const part of content) {\n if (isRecord(part) && part.type === 'text' && typeof part.text === 'string') {\n parts.push({ text: part.text });\n continue;\n }\n const image = imageFromOpenAI(part);\n if (image) {\n parts.push(imageToGemini(image, reporter));\n continue;\n }\n const media = mediaFromOpenAI(part);\n if (media) {\n const geminiPart = mediaToGemini(media, reporter);\n if (geminiPart) parts.push(geminiPart);\n continue;\n }\n reporter.warn('dropped-content', 'Dropped an unsupported user content part.');\n }\n return parts.length > 0 ? parts : [{ text: '' }];\n}\n\nfunction assistantParts(message: OpenAIAssistantMessage, reporter: Reporter): GeminiPart[] {\n const parts: GeminiPart[] = [];\n const text = textOf(message.content ?? '');\n if (text) parts.push({ text });\n for (const call of message.tool_calls ?? []) {\n parts.push({\n functionCall: {\n id: call.id,\n name: call.function.name,\n args: parseArguments(call.function.arguments, reporter, call.function.name),\n },\n });\n }\n return parts.length > 0 ? parts : [{ text: '' }];\n}\n\nfunction warnDroppedName(role: string, name: string | undefined, provider: string, reporter: Reporter): void {\n if (typeof name !== 'string') return;\n reporter.warn('dropped-metadata', `${role} message name '${name}' has no ${provider} equivalent; dropped.`);\n}\n\n/** Merges adjacent same-role contents by concatenating their `parts` arrays. */\nfunction mergeConsecutive(contents: GeminiContent[], reporter: Reporter): GeminiContent[] {\n const result: GeminiContent[] = [];\n for (const content of contents) {\n const previous = result[result.length - 1];\n if (previous && previous.role === content.role) {\n previous.parts = [...previous.parts, ...content.parts];\n reporter.warn('merged-role', `Merged consecutive '${content.role}' turns (Gemini requires alternating roles).`);\n } else {\n result.push({ role: content.role, parts: [...content.parts] });\n }\n }\n return result;\n}\n\n/* ------------------------------------------------------------------ */\n/* Gemini -> OpenAI (canonical) */\n/* ------------------------------------------------------------------ */\n\n/**\n * Converts a Gemini request fragment back into a canonical OpenAI message array.\n * Because Gemini may omit ids and rely on function names, this maintains a\n * queue of pending calls and resolves each `functionResponse` by id when\n * present, otherwise by name in call order, generating a deterministic id as a\n * last resort.\n */\nexport function fromGemini(conversation: GeminiConversation, options: ConvertOptions = {}): OpenAIMessage[] {\n const reporter = new Reporter(options);\n const out: OpenAIMessage[] = [];\n const root: Record<string, unknown> = isRecord(conversation) ? conversation : {};\n\n const systemInstruction = isRecord(root.systemInstruction) ? root.systemInstruction : undefined;\n if (systemInstruction) {\n const text = textOf(systemInstruction.parts);\n if (text) out.push({ role: 'system', content: text });\n }\n\n const pending: PendingFunctionCall[] = [];\n const contents = Array.isArray(root.contents) ? root.contents : [];\n const ids = createToolCallIdGenerator(geminiProviderIds(root));\n\n for (const content of contents) {\n if (!isRecord(content)) {\n reporter.warn('dropped-content', 'Dropped a malformed Gemini content entry.');\n continue;\n }\n\n if (content.role === 'model') {\n const parts = geminiParts(content, reporter);\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n for (const part of parts) {\n if (isRecord(part) && isRecord(part.functionCall)) {\n const fc = part.functionCall as { id?: unknown; name?: unknown; args?: unknown };\n const name = providerFunctionName(fc.name, reporter, 'Gemini', 'functionCall');\n const providedId = nonEmptyString(fc.id) ? fc.id : undefined;\n const id = providedId ? ids.claim(providedId, name) : ids.generate(name);\n if (!providedId) {\n reporter.warn('generated-id', `Gemini functionCall '${name}' had no id; generated '${id}'.`);\n } else if (id !== providedId) {\n reporter.warn(\n 'generated-id',\n `Gemini functionCall '${name}' reused id '${providedId}'; generated '${id}'.`,\n );\n }\n toolCalls.push({\n id,\n type: 'function',\n function: {\n name,\n arguments: stringifyArgumentsObject(fc.args, reporter, 'Gemini', 'functionCall', name),\n },\n });\n pending.push({ id, name, ...(providedId ? { providerId: providedId } : {}) });\n } else if (isRecord(part) && typeof part.text === 'string') {\n textPieces.push(part.text);\n } else {\n reporter.warn('dropped-content', 'Dropped an unsupported Gemini model content part.');\n }\n }\n const text = textPieces.join('');\n const assistant: OpenAIAssistantMessage = { role: 'assistant', content: text || null };\n if (toolCalls.length > 0) assistant.tool_calls = toolCalls;\n out.push(assistant);\n continue;\n }\n\n // role 'user' or unspecified\n if (content.role !== undefined && content.role !== 'user') {\n reporter.warn(\n 'dropped-content',\n `Dropped a Gemini content entry with unsupported role '${String(content.role)}'.`,\n );\n continue;\n }\n const parts = geminiParts(content, reporter);\n let contentParts: OpenAIContentPart[] = [];\n let hasMedia = false;\n let sawUserContent = false;\n const flushContent = (): void => {\n if (!sawUserContent) return;\n if (contentParts.length === 0) {\n out.push({ role: 'user', content: '' });\n } else if (hasMedia) {\n out.push({ role: 'user', content: contentParts });\n } else {\n const text = textOf(contentParts);\n out.push({ role: 'user', content: text });\n }\n contentParts = [];\n hasMedia = false;\n sawUserContent = false;\n };\n\n for (const part of parts) {\n if (isRecord(part) && isRecord(part.functionResponse)) {\n const fr = part.functionResponse as { id?: unknown; name?: unknown; response?: unknown };\n const response = Object.prototype.hasOwnProperty.call(fr, 'response') ? fr.response : {};\n const responseId = nonEmptyString(fr.id) ? fr.id : undefined;\n const matchedName = responseId\n ? pending.find((pendingCall) => pendingCall.providerId === responseId || pendingCall.id === responseId)?.name\n : undefined;\n const name = geminiFunctionResponseName(fr.name, matchedName, reporter);\n const { id, matched } = resolveResponseId({ id: fr.id, name }, pending, reporter, ids);\n flushContent();\n out.push({\n role: 'tool',\n tool_call_id: id,\n content: unwrapResponse(response, reporter, 'Gemini', 'functionResponse'),\n ...(matched ? {} : { name }),\n });\n continue;\n }\n const image = imageFromGemini(part);\n if (image) {\n contentParts.push(imageToOpenAI(image));\n hasMedia = true;\n sawUserContent = true;\n continue;\n }\n const media = mediaFromGemini(part);\n if (media) {\n const openaiPart = mediaToOpenAI(media);\n if (openaiPart) {\n contentParts.push(openaiPart);\n hasMedia = true;\n } else {\n reporter.warn(\n 'dropped-content',\n `A Gemini ${media.modality} ${media.source.kind} has no OpenAI Chat Completions equivalent; dropped.`,\n );\n }\n sawUserContent = true;\n continue;\n }\n if (isRecord(part) && typeof part.text === 'string') {\n contentParts.push({ type: 'text', text: part.text });\n sawUserContent = true;\n continue;\n }\n reporter.warn('dropped-content', 'Dropped an unsupported Gemini user content part.');\n }\n flushContent();\n }\n\n return out;\n}\n\nfunction geminiParts(content: Record<string, unknown>, reporter: Reporter): unknown[] {\n if (Array.isArray(content.parts)) return content.parts;\n reporter.warn('dropped-content', 'Dropped malformed Gemini content parts.');\n return [];\n}\n\nfunction geminiFunctionResponseName(value: unknown, matchedName: string | undefined, reporter: Reporter): string {\n if (matchedName && value === undefined) return matchedName;\n if (matchedName && !isProviderFunctionName(value)) {\n reporter.warn(\n 'dropped-metadata',\n `Gemini functionResponse had a missing or invalid function name; used matching functionCall '${matchedName}'.`,\n );\n return matchedName;\n }\n return providerFunctionName(value, reporter, 'Gemini', 'functionResponse');\n}\n\nfunction resolveResponseId(\n response: { id?: unknown; name: string },\n pending: PendingFunctionCall[],\n reporter: Reporter,\n ids: ReturnType<typeof createToolCallIdGenerator>,\n): { id: string; matched: boolean } {\n const responseId = nonEmptyString(response.id) ? response.id : undefined;\n if (response.id !== undefined && typeof response.id !== 'string') {\n reporter.warn(\n 'dropped-metadata',\n `Gemini functionResponse for '${response.name}' had a non-string id; ignored it.`,\n );\n }\n\n if (responseId) {\n const index = pending.findIndex((p) => p.providerId === responseId || p.id === responseId);\n if (index >= 0) {\n const [match] = pending.splice(index, 1);\n if (response.name !== match.name) {\n reporter.warn(\n 'dropped-metadata',\n `Gemini functionResponse '${responseId}' name '${response.name}' differed from matching functionCall '${match.name}'; used the call id mapping.`,\n );\n }\n return { id: match.id, matched: true };\n }\n reporter.warn(\n 'unmapped-tool-result',\n `Gemini functionResponse '${responseId}' for '${response.name}' had no matching call; kept the response id.`,\n );\n const id = ids.claim(responseId, response.name);\n if (id !== responseId) {\n reporter.warn(\n 'generated-id',\n `Gemini functionResponse '${responseId}' for '${response.name}' reused an existing id; generated '${id}'.`,\n );\n }\n return { id, matched: false };\n }\n const index = pending.findIndex((p) => p.name === response.name);\n if (index >= 0) {\n const { id } = pending[index];\n pending.splice(index, 1);\n return { id, matched: true };\n }\n const id = ids.generate(response.name);\n reporter.warn(\n 'unmapped-tool-result',\n `Gemini functionResponse for '${response.name}' had no matching call; generated '${id}'.`,\n );\n return { id, matched: false };\n}\n\nfunction geminiProviderIds(conversation: unknown): string[] {\n const ids: string[] = [];\n const root: Record<string, unknown> = isRecord(conversation) ? conversation : {};\n const contents = Array.isArray(root.contents) ? root.contents : [];\n for (const content of contents) {\n if (!isRecord(content)) continue;\n const parts = Array.isArray(content.parts) ? content.parts : [];\n for (const part of parts) {\n if (isRecord(part) && isRecord(part.functionCall) && nonEmptyString(part.functionCall.id)) {\n ids.push(part.functionCall.id);\n }\n if (isRecord(part) && isRecord(part.functionResponse) && nonEmptyString(part.functionResponse.id)) {\n ids.push(part.functionResponse.id);\n }\n }\n }\n return ids;\n}\n","import type { AnthropicConversation, ConvertOptions, GeminiConversation, OpenAIMessage, Provider } from './types.js';\nimport { fromAnthropic, toAnthropic } from './providers/anthropic.js';\nimport { fromGemini, toGemini } from './providers/gemini.js';\n\n/** Maps a provider to the conversation shape it accepts and returns. */\nexport type ConversationOf<P extends Provider> = P extends 'openai'\n ? OpenAIMessage[]\n : P extends 'anthropic'\n ? AnthropicConversation\n : P extends 'gemini'\n ? GeminiConversation\n : never;\n\n/**\n * Converts a conversation from one provider format to another. Every conversion\n * routes through the canonical OpenAI representation, so any source/target pair\n * is supported, including same-provider normalization.\n *\n * @example\n * const gemini = convert(openaiMessages, { from: 'openai', to: 'gemini' });\n * const openai = convert(anthropicBody, { from: 'anthropic', to: 'openai' });\n */\nexport function convert<From extends Provider, To extends Provider>(\n conversation: ConversationOf<From>,\n route: { from: From; to: To },\n options: ConvertOptions = {},\n): ConversationOf<To> {\n const canonical = toCanonical(conversation, route.from, options);\n return fromCanonical(canonical, route.to, options) as ConversationOf<To>;\n}\n\nfunction toCanonical(conversation: unknown, from: Provider, options: ConvertOptions): OpenAIMessage[] {\n switch (from) {\n case 'openai':\n return conversation as OpenAIMessage[];\n case 'anthropic':\n return fromAnthropic(conversation as AnthropicConversation, options);\n case 'gemini':\n return fromGemini(conversation as GeminiConversation, options);\n default:\n throw new Error(`Unknown source provider: ${String(from)}`);\n }\n}\n\nfunction fromCanonical(canonical: OpenAIMessage[], to: Provider, options: ConvertOptions): ConversationOf<Provider> {\n switch (to) {\n case 'openai':\n return canonical;\n case 'anthropic':\n return toAnthropic(canonical, options);\n case 'gemini':\n return toGemini(canonical, options);\n default:\n throw new Error(`Unknown target provider: ${String(to)}`);\n }\n}\n","import type { ConvertOptions, OpenAIAssistantMessage, OpenAIToolCall, Provider } from './types.js';\nimport {\n Reporter,\n createToolCallIdGenerator,\n isRecord,\n providerFunctionName,\n stringifyArgumentsObject,\n tryParseJson,\n} from './util.js';\n\n/** A provider-neutral finish reason. */\nexport type FinishReason = 'stop' | 'tool_calls' | 'length' | 'content_filter' | 'unknown';\n\n/** Provider-neutral token usage. */\nexport interface Usage {\n inputTokens: number;\n outputTokens: number;\n}\n\n/** A provider response normalized to the canonical OpenAI assistant shape. */\nexport interface NormalizedResponse {\n message: OpenAIAssistantMessage;\n finishReason: FinishReason;\n usage: Usage;\n}\n\nconst num = (value: unknown): number => (typeof value === 'number' ? value : 0);\nconst nonEmptyString = (value: unknown): value is string => typeof value === 'string' && value.length > 0;\n\nfunction responseRoot(body: unknown, reporter: Reporter, provider: string): Record<string, unknown> {\n if (isRecord(body)) return body;\n reporter.warn('dropped-content', `Dropped malformed ${provider} response body; expected an object.`);\n return {};\n}\n\nfunction responseArrayField(\n root: Record<string, unknown>,\n field: string,\n reporter: Reporter,\n context: string,\n noun: string,\n): unknown[] {\n const value = root[field];\n if (value === undefined) {\n reporter.warn('dropped-content', `${context} missing ${field} array; no ${noun} were read.`);\n return [];\n }\n if (!Array.isArray(value)) {\n reporter.warn('dropped-content', `Dropped malformed ${context} ${field}; expected an array.`);\n return [];\n }\n return value;\n}\n\nfunction firstResponseRecord(\n items: unknown[],\n reporter: Reporter,\n provider: string,\n noun: string,\n): Record<string, unknown> {\n if (items.length === 0) return {};\n if (isRecord(items[0])) return items[0];\n reporter.warn('dropped-content', `Dropped malformed ${provider} response ${noun}; expected an object.`);\n return {};\n}\n\nfunction responseRecordField(\n root: Record<string, unknown>,\n field: string,\n reporter: Reporter,\n context: string,\n noun: string,\n): Record<string, unknown> {\n const value = root[field];\n if (value === undefined) {\n reporter.warn('dropped-content', `${context} missing ${field} object; no ${noun} were read.`);\n return {};\n }\n if (!isRecord(value)) {\n reporter.warn('dropped-content', `Dropped malformed ${context} ${field}; expected an object.`);\n return {};\n }\n return value;\n}\n\n/** Builds the canonical message, setting `content` to null when only tool calls are present. */\nfunction buildMessage(text: string, toolCalls: OpenAIToolCall[]): OpenAIAssistantMessage {\n const message: OpenAIAssistantMessage = { role: 'assistant', content: text ? text : null };\n if (toolCalls.length > 0) message.tool_calls = toolCalls;\n return message;\n}\n\n/** When tool calls are present the canonical finish reason is always `tool_calls`. */\nfunction finalReason(mapped: FinishReason, toolCalls: OpenAIToolCall[]): FinishReason {\n return toolCalls.length > 0 ? 'tool_calls' : mapped;\n}\n\nfunction normalizeProviderArguments(\n value: unknown,\n reporter: Reporter,\n provider: string,\n part: string,\n fnName: string,\n): string {\n if (typeof value !== 'string') return stringifyArgumentsObject(value, reporter, provider, part, fnName);\n\n const parsed = tryParseJson(value);\n if (parsed.ok && isRecord(parsed.value)) return value;\n\n reporter.warn(\n 'invalid-json-arguments',\n `${provider} ${part} '${fnName}' had arguments that were not a JSON object string; used an empty object instead.`,\n );\n return '{}';\n}\n\nfunction normalizeOpenAIToolCalls(value: unknown, reporter: Reporter): OpenAIToolCall[] {\n if (value === undefined) return [];\n if (!Array.isArray(value)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Chat Completions tool_calls; expected an array.');\n return [];\n }\n\n const toolCalls: OpenAIToolCall[] = [];\n const ids = createToolCallIdGenerator(\n value.flatMap((call) =>\n isRecord(call) && (call.type === undefined || call.type === 'function') && nonEmptyString(call.id)\n ? [call.id]\n : [],\n ),\n );\n for (const call of value) {\n if (!isRecord(call)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Chat Completions tool_call; expected an object.');\n continue;\n }\n if (call.type !== undefined && call.type !== 'function') {\n reporter.warn(\n 'dropped-content',\n `OpenAI Chat Completions tool_call type '${String(call.type)}' is not supported; dropped.`,\n );\n continue;\n }\n const fn = isRecord(call.function) ? call.function : {};\n const name = providerFunctionName(fn.name, reporter, 'OpenAI Chat Completions', 'tool_call.function');\n const providedId = nonEmptyString(call.id) ? call.id : undefined;\n const id = providedId ? ids.claim(providedId, name) : ids.generate(name);\n if (!providedId) {\n reporter.warn('generated-id', `OpenAI Chat Completions tool_call '${name}' had no id; generated '${id}'.`);\n } else if (id !== providedId) {\n reporter.warn(\n 'generated-id',\n `OpenAI Chat Completions tool_call '${name}' reused id '${providedId}'; generated '${id}'.`,\n );\n }\n const args = normalizeProviderArguments(\n fn.arguments,\n reporter,\n 'OpenAI Chat Completions',\n 'tool_call.function',\n name,\n );\n toolCalls.push({ id, type: 'function', function: { name, arguments: args } });\n }\n return toolCalls;\n}\n\nfunction normalizeOpenAIFunctionCall(value: unknown, reporter: Reporter): OpenAIToolCall[] {\n if (!isRecord(value)) return [];\n\n const name = providerFunctionName(value.name, reporter, 'OpenAI Chat Completions', 'function_call');\n const id = `call_${name.replace(/[^a-zA-Z0-9_-]/g, '_')}_0`;\n reporter.warn('generated-id', `OpenAI Chat Completions function_call '${name}' had no id; generated '${id}'.`);\n const args = normalizeProviderArguments(value.arguments, reporter, 'OpenAI Chat Completions', 'function_call', name);\n return [{ id, type: 'function', function: { name, arguments: args } }];\n}\n\nfunction openAIChatContentText(content: unknown, reporter: Reporter): string {\n if (typeof content === 'string') return content;\n if (content === null || content === undefined) return '';\n if (!Array.isArray(content)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Chat Completions response content.');\n return '';\n }\n\n const pieces: string[] = [];\n for (const part of content) {\n if (typeof part === 'string') {\n pieces.push(part);\n } else if (isRecord(part) && typeof part.text === 'string') {\n pieces.push(part.text);\n } else if (isRecord(part) && part.type === 'refusal' && typeof part.refusal === 'string') {\n pieces.push(part.refusal);\n } else {\n reporter.warn('dropped-content', 'Dropped unsupported OpenAI Chat Completions response content part.');\n }\n }\n return pieces.join('');\n}\n\nfunction openAIChatMessageText(message: Record<string, unknown>, reporter: Reporter): string {\n const content = openAIChatContentText(message.content, reporter);\n if (content) return content;\n return typeof message.refusal === 'string' ? message.refusal : content;\n}\n\n/* -------------------------------- OpenAI ------------------------------- */\n\nconst OPENAI_FINISH: Record<string, FinishReason> = {\n stop: 'stop',\n length: 'length',\n tool_calls: 'tool_calls',\n content_filter: 'content_filter',\n function_call: 'tool_calls',\n};\n\n/** Normalizes an OpenAI Chat Completions response body. */\nexport function responseFromOpenAI(body: unknown, options: ConvertOptions = {}): NormalizedResponse {\n const reporter = new Reporter(options);\n const isObjectBody = isRecord(body);\n const root = isObjectBody ? body : responseRoot(body, reporter, 'OpenAI Chat Completions');\n const choices = isObjectBody\n ? responseArrayField(root, 'choices', reporter, 'OpenAI Chat Completions response', 'choices')\n : [];\n const hasChoiceRecord = choices.length > 0 && isRecord(choices[0]);\n const choice = firstResponseRecord(choices, reporter, 'OpenAI Chat Completions', 'choice');\n const message = hasChoiceRecord\n ? responseRecordField(\n choice,\n 'message',\n reporter,\n 'OpenAI Chat Completions response choice',\n 'message content or tool calls',\n )\n : {};\n\n const text = openAIChatMessageText(message, reporter);\n const toolCalls = normalizeOpenAIToolCalls(message.tool_calls, reporter);\n const normalizedToolCalls =\n toolCalls.length > 0 ? toolCalls : normalizeOpenAIFunctionCall(message.function_call, reporter);\n\n const usage = isRecord(root.usage) ? root.usage : {};\n return {\n message: buildMessage(text, normalizedToolCalls),\n finishReason: finalReason(OPENAI_FINISH[String(choice.finish_reason)] ?? 'unknown', normalizedToolCalls),\n usage: { inputTokens: num(usage.prompt_tokens), outputTokens: num(usage.completion_tokens) },\n };\n}\n\nconst OPENAI_RESPONSES_INCOMPLETE: Record<string, FinishReason> = {\n max_output_tokens: 'length',\n content_filter: 'content_filter',\n};\n\nfunction openAIResponsesContentText(content: unknown, reporter: Reporter): string {\n if (content === undefined) return '';\n if (!Array.isArray(content)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Responses message content.');\n return '';\n }\n\n const pieces: string[] = [];\n for (const part of content) {\n if (!isRecord(part)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Responses message content part.');\n } else if (typeof part.text === 'string' && (part.type === 'output_text' || part.type === 'text')) {\n pieces.push(part.text);\n } else if (part.type === 'refusal' && typeof part.refusal === 'string') {\n pieces.push(part.refusal);\n } else {\n reporter.warn('dropped-content', 'Dropped unsupported OpenAI Responses message content part.');\n }\n }\n return pieces.join('');\n}\n\nfunction responseApiFinishReason(root: Record<string, unknown>): FinishReason {\n if (root.status === 'completed') return 'stop';\n if (root.status !== 'incomplete') return 'unknown';\n\n const details = isRecord(root.incomplete_details) ? root.incomplete_details : {};\n return OPENAI_RESPONSES_INCOMPLETE[String(details.reason)] ?? 'unknown';\n}\n\nfunction openAIResponsesOutput(root: Record<string, unknown>, reporter: Reporter): unknown[] {\n if (root.output === undefined) {\n reporter.warn(\n 'dropped-content',\n 'OpenAI Responses response missing top-level output array; no output items were read.',\n );\n return [];\n }\n if (!Array.isArray(root.output)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Responses top-level output; expected an array.');\n return [];\n }\n return root.output;\n}\n\n/** Normalizes an OpenAI Responses API response body. */\nexport function responseFromOpenAIResponses(body: unknown, options: ConvertOptions = {}): NormalizedResponse {\n const reporter = new Reporter(options);\n const isObjectBody = isRecord(body);\n const root = isObjectBody ? body : responseRoot(body, reporter, 'OpenAI Responses');\n const output = isObjectBody ? openAIResponsesOutput(root, reporter) : [];\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n const ids = createToolCallIdGenerator(\n output.flatMap((item) => {\n if (!isRecord(item) || item.type !== 'function_call') return [];\n if (nonEmptyString(item.call_id)) return [item.call_id];\n return nonEmptyString(item.id) ? [item.id] : [];\n }),\n );\n\n for (const item of output) {\n if (!isRecord(item)) {\n reporter.warn('dropped-content', 'Dropped malformed OpenAI Responses output item.');\n continue;\n }\n\n if (item.type === 'message') {\n textPieces.push(openAIResponsesContentText(item.content, reporter));\n } else if (item.type === 'function_call') {\n const name = providerFunctionName(item.name, reporter, 'OpenAI Responses', 'function_call');\n const callId = nonEmptyString(item.call_id) ? item.call_id : undefined;\n const itemId = nonEmptyString(item.id) ? item.id : undefined;\n const id = callId ?? itemId;\n const toolCallId = id ? ids.claim(id, name) : ids.generate(name);\n if (!callId && !itemId) {\n reporter.warn('generated-id', `OpenAI Responses function_call '${name}' had no id; generated '${toolCallId}'.`);\n } else if (toolCallId !== id) {\n reporter.warn(\n 'generated-id',\n `OpenAI Responses function_call '${name}' reused id '${id}'; generated '${toolCallId}'.`,\n );\n }\n const args = normalizeProviderArguments(item.arguments, reporter, 'OpenAI Responses', 'function_call', name);\n toolCalls.push({ id: toolCallId, type: 'function', function: { name, arguments: args } });\n } else {\n reporter.warn('dropped-content', `Dropped unsupported OpenAI Responses output item '${String(item.type)}'.`);\n }\n }\n\n const usage = isRecord(root.usage) ? root.usage : {};\n return {\n message: buildMessage(textPieces.join(''), toolCalls),\n finishReason: finalReason(responseApiFinishReason(root), toolCalls),\n usage: { inputTokens: num(usage.input_tokens), outputTokens: num(usage.output_tokens) },\n };\n}\n\nexport type ResponseProvider = Provider | 'openai-responses';\n\n/* ------------------------------- Anthropic ----------------------------- */\n\nconst ANTHROPIC_FINISH: Record<string, FinishReason> = {\n end_turn: 'stop',\n stop_sequence: 'stop',\n tool_use: 'tool_calls',\n max_tokens: 'length',\n refusal: 'content_filter',\n pause_turn: 'unknown',\n};\n\n/** Normalizes an Anthropic Messages response body. */\nexport function responseFromAnthropic(body: unknown, options: ConvertOptions = {}): NormalizedResponse {\n const reporter = new Reporter(options);\n const isObjectBody = isRecord(body);\n const root = isObjectBody ? body : responseRoot(body, reporter, 'Anthropic');\n const blocks = isObjectBody\n ? responseArrayField(root, 'content', reporter, 'Anthropic response', 'content blocks')\n : [];\n\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n const ids = createToolCallIdGenerator(\n blocks.flatMap((block) =>\n isRecord(block) && block.type === 'tool_use' && nonEmptyString(block.id) ? [block.id] : [],\n ),\n );\n for (const block of blocks) {\n if (!isRecord(block)) {\n reporter.warn('dropped-content', 'Dropped a malformed Anthropic response content block.');\n continue;\n }\n if (block.type === 'text' && typeof block.text === 'string') {\n textPieces.push(block.text);\n } else if (block.type === 'tool_use') {\n const name = providerFunctionName(block.name, reporter, 'Anthropic', 'tool_use');\n const providedId = nonEmptyString(block.id) ? block.id : undefined;\n const id = providedId ? ids.claim(providedId, name) : ids.generate(name);\n if (!providedId) {\n reporter.warn('generated-id', `Anthropic tool_use '${name}' had no id; generated '${id}'.`);\n } else if (id !== providedId) {\n reporter.warn('generated-id', `Anthropic tool_use '${name}' reused id '${providedId}'; generated '${id}'.`);\n }\n toolCalls.push({\n id,\n type: 'function',\n function: {\n name,\n arguments: stringifyArgumentsObject(block.input, reporter, 'Anthropic', 'tool_use', name),\n },\n });\n } else {\n reporter.warn(\n 'dropped-content',\n `Anthropic response content block '${String(block.type)}' is not supported; dropped.`,\n );\n }\n }\n\n const usage = isRecord(root.usage) ? root.usage : {};\n return {\n message: buildMessage(textPieces.join(''), toolCalls),\n finishReason: finalReason(ANTHROPIC_FINISH[String(root.stop_reason)] ?? 'unknown', toolCalls),\n usage: { inputTokens: num(usage.input_tokens), outputTokens: num(usage.output_tokens) },\n };\n}\n\n/* -------------------------------- Gemini ------------------------------- */\n\nconst GEMINI_FINISH: Record<string, FinishReason> = {\n STOP: 'stop',\n MAX_TOKENS: 'length',\n SAFETY: 'content_filter',\n RECITATION: 'content_filter',\n BLOCKLIST: 'content_filter',\n PROHIBITED_CONTENT: 'content_filter',\n SPII: 'content_filter',\n MALFORMED_FUNCTION_CALL: 'content_filter',\n MODEL_ARMOR: 'content_filter',\n IMAGE_SAFETY: 'content_filter',\n IMAGE_PROHIBITED_CONTENT: 'content_filter',\n IMAGE_RECITATION: 'content_filter',\n};\n\n/** Normalizes a Gemini generateContent response body. */\nexport function responseFromGemini(body: unknown, options: ConvertOptions = {}): NormalizedResponse {\n const reporter = new Reporter(options);\n const isObjectBody = isRecord(body);\n const root = isObjectBody ? body : responseRoot(body, reporter, 'Gemini');\n const candidates = isObjectBody\n ? responseArrayField(root, 'candidates', reporter, 'Gemini response', 'candidates')\n : [];\n const hasCandidateRecord = candidates.length > 0 && isRecord(candidates[0]);\n const candidate = firstResponseRecord(candidates, reporter, 'Gemini', 'candidate');\n const content = isRecord(candidate.content) ? candidate.content : {};\n if (hasCandidateRecord && !isRecord(candidate.content)) {\n reporter.warn('dropped-content', 'Dropped malformed Gemini response candidate content; expected an object.');\n }\n const parts =\n hasCandidateRecord && isRecord(candidate.content)\n ? responseArrayField(content, 'parts', reporter, 'Gemini response candidate content', 'content parts')\n : [];\n\n const textPieces: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n const ids = createToolCallIdGenerator(\n parts.flatMap((part) =>\n isRecord(part) && isRecord(part.functionCall) && nonEmptyString(part.functionCall.id)\n ? [part.functionCall.id]\n : [],\n ),\n );\n for (const part of parts) {\n if (!isRecord(part)) {\n reporter.warn('dropped-content', 'Dropped a malformed Gemini response content part.');\n continue;\n }\n if (isRecord(part.functionCall)) {\n const call = part.functionCall as { id?: unknown; name?: unknown; args?: unknown };\n const name = providerFunctionName(call.name, reporter, 'Gemini', 'functionCall');\n const providedId = nonEmptyString(call.id) ? call.id : undefined;\n const id = providedId ? ids.claim(providedId, name) : ids.generate(name);\n if (!providedId) {\n reporter.warn('generated-id', `Gemini functionCall '${name}' had no id; generated '${id}'.`);\n } else if (id !== providedId) {\n reporter.warn('generated-id', `Gemini functionCall '${name}' reused id '${providedId}'; generated '${id}'.`);\n }\n toolCalls.push({\n id,\n type: 'function',\n function: {\n name,\n arguments: stringifyArgumentsObject(call.args, reporter, 'Gemini', 'functionCall', name),\n },\n });\n } else if (part.thought === true) {\n // Gemini marks thinking with a `thought` flag on an otherwise normal text\n // part. Reasoning is not part of the portable assistant message.\n reporter.warn('dropped-content', 'Dropped a Gemini thought (reasoning) response part.');\n } else if (typeof part.text === 'string') {\n textPieces.push(part.text);\n } else {\n reporter.warn('dropped-content', 'Dropped an unsupported Gemini response content part.');\n }\n }\n\n const usage = isRecord(root.usageMetadata) ? root.usageMetadata : {};\n return {\n message: buildMessage(textPieces.join(''), toolCalls),\n finishReason: finalReason(GEMINI_FINISH[String(candidate.finishReason)] ?? 'unknown', toolCalls),\n usage: { inputTokens: num(usage.promptTokenCount), outputTokens: num(usage.candidatesTokenCount) },\n };\n}\n\n/* ------------------------------ Dispatcher ----------------------------- */\n\n/** Normalizes a provider response body into the canonical shape. */\nexport function normalizeResponse(\n body: unknown,\n route: { from: ResponseProvider },\n options: ConvertOptions = {},\n): NormalizedResponse {\n switch (route.from) {\n case 'openai':\n return responseFromOpenAI(body, options);\n case 'openai-responses':\n return responseFromOpenAIResponses(body, options);\n case 'anthropic':\n return responseFromAnthropic(body, options);\n case 'gemini':\n return responseFromGemini(body, options);\n default:\n throw new Error(`Unknown source provider: ${String(route.from)}`);\n }\n}\n","/**\n * Type definitions for the three supported provider message formats plus the\n * shared conversion plumbing.\n *\n * The OpenAI Chat Completions format is the canonical hub: every conversion goes\n * `source -> OpenAI -> target`. The provider request shapes (Anthropic, Gemini)\n * keep the system prompt outside the message list, so they are modelled as\n * \"conversation\" objects rather than plain arrays.\n */\n\n/** A supported provider. */\nexport type Provider = 'openai' | 'anthropic' | 'gemini';\n\n/** Frozen, stable, machine readable codes describing non fatal conversion events. */\nexport const warningCodes = Object.freeze([\n 'generated-id',\n 'unmapped-tool-result',\n 'merged-role',\n 'dropped-content',\n 'dropped-metadata',\n 'invalid-json-arguments',\n 'system-midstream',\n 'gemini-url-image',\n 'gemini-url-media',\n 'unsupported-modality',\n] as const);\n\n/** A stable, machine readable code describing a non fatal conversion event. */\nexport type WarningCode = (typeof warningCodes)[number];\n\n/** A non fatal event raised during conversion. */\nexport interface Warning {\n code: WarningCode;\n message: string;\n}\n\n/** Options accepted by every conversion function. */\nexport interface ConvertOptions {\n /** Called for each non fatal conversion event (generated id, merged turn, ...). */\n onWarning?: (warning: Warning) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* OpenAI Chat Completions (canonical hub) */\n/* ------------------------------------------------------------------ */\n\nexport interface OpenAITextPart {\n type: 'text';\n text: string;\n}\n\nexport interface OpenAIImagePart {\n type: 'image_url';\n /** `url` is a remote https URL or a `data:<mediaType>;base64,<data>` data URL. */\n image_url: { url: string; detail?: 'auto' | 'low' | 'high' | 'original' };\n}\n\nexport interface OpenAIAudioPart {\n type: 'input_audio';\n /** `data` is raw base64 (no data URL prefix); `format` is `wav` or `mp3`. */\n input_audio: { data: string; format: string };\n}\n\nexport interface OpenAIFilePart {\n type: 'file';\n /** `file_data` is a `data:<mediaType>;base64,<data>` data URL, or use `file_id`. */\n file: { file_data?: string; file_id?: string; filename?: string };\n}\n\n/** A content part. Unknown part types are preserved verbatim. */\nexport type OpenAIContentPart =\n | OpenAITextPart\n | OpenAIImagePart\n | OpenAIAudioPart\n | OpenAIFilePart\n | { type: string; [key: string]: unknown };\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n /** Arguments as a JSON encoded string, per the OpenAI wire format. */\n arguments: string;\n };\n}\n\nexport interface OpenAISystemMessage {\n /** `developer` is the o-series alias for `system`; both map to a system prompt. */\n role: 'system' | 'developer';\n content: string | OpenAITextPart[];\n name?: string;\n}\n\nexport interface OpenAIUserMessage {\n role: 'user';\n content: string | OpenAIContentPart[];\n name?: string;\n}\n\nexport interface OpenAIAssistantMessage {\n role: 'assistant';\n /** Text reply. `null` (or omitted) when the turn only contains tool calls. */\n content?: string | OpenAIContentPart[] | null;\n name?: string;\n tool_calls?: OpenAIToolCall[];\n}\n\nexport interface OpenAIToolMessage {\n role: 'tool';\n tool_call_id: string;\n /** Optional provider metadata used to preserve Gemini functionResponse names. */\n name?: string;\n content: string | OpenAITextPart[];\n /** Optional provider metadata used to preserve Anthropic tool_result errors. */\n is_error?: boolean;\n}\n\nexport type OpenAIMessage = OpenAISystemMessage | OpenAIUserMessage | OpenAIAssistantMessage | OpenAIToolMessage;\n\n/* ------------------------------------------------------------------ */\n/* Anthropic Messages API */\n/* ------------------------------------------------------------------ */\n\nexport interface AnthropicTextBlock {\n type: 'text';\n text: string;\n}\n\nexport interface AnthropicToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n /** Parsed arguments object (not a JSON string). */\n input: Record<string, unknown>;\n}\n\nexport interface AnthropicToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n content: string | AnthropicTextBlock[];\n is_error?: boolean;\n}\n\nexport interface AnthropicImageBlock {\n type: 'image';\n source: { type: 'base64'; media_type: string; data: string } | { type: 'url'; url: string };\n}\n\nexport interface AnthropicDocumentBlock {\n type: 'document';\n source:\n | { type: 'base64'; media_type: string; data: string }\n | { type: 'url'; url: string }\n | { type: 'file'; file_id: string };\n}\n\nexport type AnthropicContentBlock =\n | AnthropicTextBlock\n | AnthropicToolUseBlock\n | AnthropicToolResultBlock\n | AnthropicImageBlock\n | AnthropicDocumentBlock\n | { type: string; [key: string]: unknown };\n\nexport interface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | AnthropicContentBlock[];\n}\n\n/** An Anthropic request body fragment: the system prompt sits outside `messages`. */\nexport interface AnthropicConversation {\n system?: string;\n messages: AnthropicMessage[];\n}\n\n/* ------------------------------------------------------------------ */\n/* Google Gemini generateContent */\n/* ------------------------------------------------------------------ */\n\nexport interface GeminiTextPart {\n text: string;\n}\n\nexport interface GeminiFunctionCallPart {\n functionCall: {\n id?: string;\n name: string;\n /** Parsed arguments object (not a JSON string). */\n args: Record<string, unknown>;\n };\n}\n\nexport interface GeminiFunctionResponsePart {\n functionResponse: {\n id?: string;\n name: string;\n /** Result as a JSON object. Gemini has no string shorthand. */\n response: Record<string, unknown>;\n };\n}\n\nexport interface GeminiInlineDataPart {\n inlineData: { mimeType: string; data: string };\n}\n\nexport interface GeminiFileDataPart {\n fileData: { mimeType?: string; fileUri: string };\n}\n\nexport type GeminiPart =\n | GeminiTextPart\n | GeminiFunctionCallPart\n | GeminiFunctionResponsePart\n | GeminiInlineDataPart\n | GeminiFileDataPart\n | Record<string, unknown>;\n\nexport interface GeminiContent {\n /** `model` is Gemini's name for the assistant role. */\n role?: 'user' | 'model';\n parts: GeminiPart[];\n}\n\n/** A Gemini request body fragment: `systemInstruction` sits outside `contents`. */\nexport interface GeminiConversation {\n systemInstruction?: GeminiContent;\n contents: GeminiContent[];\n}\n"],"mappings":"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","names":["nonEmptyString","warnDroppedName","mergeConsecutive","parts","index","id","nonEmptyString"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
/** A supported provider. */
|
|
11
11
|
type Provider = 'openai' | 'anthropic' | 'gemini';
|
|
12
|
+
/** Frozen, stable, machine readable codes describing non fatal conversion events. */
|
|
13
|
+
declare const warningCodes: readonly ["generated-id", "unmapped-tool-result", "merged-role", "dropped-content", "dropped-metadata", "invalid-json-arguments", "system-midstream", "gemini-url-image", "gemini-url-media", "unsupported-modality"];
|
|
12
14
|
/** A stable, machine readable code describing a non fatal conversion event. */
|
|
13
|
-
type WarningCode =
|
|
15
|
+
type WarningCode = (typeof warningCodes)[number];
|
|
14
16
|
/** A non fatal event raised during conversion. */
|
|
15
17
|
interface Warning {
|
|
16
18
|
code: WarningCode;
|
|
@@ -219,10 +221,10 @@ declare function fromAnthropic(conversation: AnthropicConversation, options?: Co
|
|
|
219
221
|
declare function toGemini(messages: OpenAIMessage[], options?: ConvertOptions): GeminiConversation;
|
|
220
222
|
/**
|
|
221
223
|
* Converts a Gemini request fragment back into a canonical OpenAI message array.
|
|
222
|
-
* Because Gemini
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
224
|
+
* Because Gemini may omit ids and rely on function names, this maintains a
|
|
225
|
+
* queue of pending calls and resolves each `functionResponse` by id when
|
|
226
|
+
* present, otherwise by name in call order, generating a deterministic id as a
|
|
227
|
+
* last resort.
|
|
226
228
|
*/
|
|
227
229
|
declare function fromGemini(conversation: GeminiConversation, options?: ConvertOptions): OpenAIMessage[];
|
|
228
230
|
|
|
@@ -299,12 +301,12 @@ interface NormalizedResponse {
|
|
|
299
301
|
usage: Usage;
|
|
300
302
|
}
|
|
301
303
|
/** Normalizes an OpenAI Chat Completions response body. */
|
|
302
|
-
declare function responseFromOpenAI(body: unknown): NormalizedResponse;
|
|
304
|
+
declare function responseFromOpenAI(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
303
305
|
/** Normalizes an OpenAI Responses API response body. */
|
|
304
|
-
declare function responseFromOpenAIResponses(body: unknown): NormalizedResponse;
|
|
306
|
+
declare function responseFromOpenAIResponses(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
305
307
|
type ResponseProvider = Provider | 'openai-responses';
|
|
306
308
|
/** Normalizes an Anthropic Messages response body. */
|
|
307
|
-
declare function responseFromAnthropic(body: unknown): NormalizedResponse;
|
|
309
|
+
declare function responseFromAnthropic(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
308
310
|
/** Normalizes a Gemini generateContent response body. */
|
|
309
311
|
declare function responseFromGemini(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
310
312
|
/** Normalizes a provider response body into the canonical shape. */
|
|
@@ -312,4 +314,4 @@ declare function normalizeResponse(body: unknown, route: {
|
|
|
312
314
|
from: ResponseProvider;
|
|
313
315
|
}, options?: ConvertOptions): NormalizedResponse;
|
|
314
316
|
|
|
315
|
-
export { type AnthropicContentBlock, type AnthropicConversation, type AnthropicDocumentBlock, type AnthropicImageBlock, type AnthropicMessage, type AnthropicTextBlock, type AnthropicToolResultBlock, type AnthropicToolUseBlock, type ConversationOf, type ConvertOptions, type FinishReason, type GeminiContent, type GeminiConversation, type GeminiFileDataPart, type GeminiFunctionCallPart, type GeminiFunctionResponsePart, type GeminiInlineDataPart, type GeminiPart, type GeminiTextPart, type MediaModality, type MediaPart, type MediaSource, type NormalizedImage, type NormalizedResponse, type OpenAIAssistantMessage, type OpenAIAudioPart, type OpenAIContentPart, type OpenAIFilePart, type OpenAIImagePart, type OpenAIMessage, type OpenAISystemMessage, type OpenAITextPart, type OpenAIToolCall, type OpenAIToolMessage, type OpenAIUserMessage, type Provider, type ResponseProvider, type Usage, type Warning, type WarningCode, convert, fromAnthropic, fromGemini, normalizeResponse, parseDataUrl, responseFromAnthropic, responseFromGemini, responseFromOpenAI, responseFromOpenAIResponses, toAnthropic, toDataUrl, toGemini };
|
|
317
|
+
export { type AnthropicContentBlock, type AnthropicConversation, type AnthropicDocumentBlock, type AnthropicImageBlock, type AnthropicMessage, type AnthropicTextBlock, type AnthropicToolResultBlock, type AnthropicToolUseBlock, type ConversationOf, type ConvertOptions, type FinishReason, type GeminiContent, type GeminiConversation, type GeminiFileDataPart, type GeminiFunctionCallPart, type GeminiFunctionResponsePart, type GeminiInlineDataPart, type GeminiPart, type GeminiTextPart, type MediaModality, type MediaPart, type MediaSource, type NormalizedImage, type NormalizedResponse, type OpenAIAssistantMessage, type OpenAIAudioPart, type OpenAIContentPart, type OpenAIFilePart, type OpenAIImagePart, type OpenAIMessage, type OpenAISystemMessage, type OpenAITextPart, type OpenAIToolCall, type OpenAIToolMessage, type OpenAIUserMessage, type Provider, type ResponseProvider, type Usage, type Warning, type WarningCode, convert, fromAnthropic, fromGemini, normalizeResponse, parseDataUrl, responseFromAnthropic, responseFromGemini, responseFromOpenAI, responseFromOpenAIResponses, toAnthropic, toDataUrl, toGemini, warningCodes };
|
package/dist/index.d.ts
CHANGED
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
/** A supported provider. */
|
|
11
11
|
type Provider = 'openai' | 'anthropic' | 'gemini';
|
|
12
|
+
/** Frozen, stable, machine readable codes describing non fatal conversion events. */
|
|
13
|
+
declare const warningCodes: readonly ["generated-id", "unmapped-tool-result", "merged-role", "dropped-content", "dropped-metadata", "invalid-json-arguments", "system-midstream", "gemini-url-image", "gemini-url-media", "unsupported-modality"];
|
|
12
14
|
/** A stable, machine readable code describing a non fatal conversion event. */
|
|
13
|
-
type WarningCode =
|
|
15
|
+
type WarningCode = (typeof warningCodes)[number];
|
|
14
16
|
/** A non fatal event raised during conversion. */
|
|
15
17
|
interface Warning {
|
|
16
18
|
code: WarningCode;
|
|
@@ -219,10 +221,10 @@ declare function fromAnthropic(conversation: AnthropicConversation, options?: Co
|
|
|
219
221
|
declare function toGemini(messages: OpenAIMessage[], options?: ConvertOptions): GeminiConversation;
|
|
220
222
|
/**
|
|
221
223
|
* Converts a Gemini request fragment back into a canonical OpenAI message array.
|
|
222
|
-
* Because Gemini
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
224
|
+
* Because Gemini may omit ids and rely on function names, this maintains a
|
|
225
|
+
* queue of pending calls and resolves each `functionResponse` by id when
|
|
226
|
+
* present, otherwise by name in call order, generating a deterministic id as a
|
|
227
|
+
* last resort.
|
|
226
228
|
*/
|
|
227
229
|
declare function fromGemini(conversation: GeminiConversation, options?: ConvertOptions): OpenAIMessage[];
|
|
228
230
|
|
|
@@ -299,12 +301,12 @@ interface NormalizedResponse {
|
|
|
299
301
|
usage: Usage;
|
|
300
302
|
}
|
|
301
303
|
/** Normalizes an OpenAI Chat Completions response body. */
|
|
302
|
-
declare function responseFromOpenAI(body: unknown): NormalizedResponse;
|
|
304
|
+
declare function responseFromOpenAI(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
303
305
|
/** Normalizes an OpenAI Responses API response body. */
|
|
304
|
-
declare function responseFromOpenAIResponses(body: unknown): NormalizedResponse;
|
|
306
|
+
declare function responseFromOpenAIResponses(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
305
307
|
type ResponseProvider = Provider | 'openai-responses';
|
|
306
308
|
/** Normalizes an Anthropic Messages response body. */
|
|
307
|
-
declare function responseFromAnthropic(body: unknown): NormalizedResponse;
|
|
309
|
+
declare function responseFromAnthropic(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
308
310
|
/** Normalizes a Gemini generateContent response body. */
|
|
309
311
|
declare function responseFromGemini(body: unknown, options?: ConvertOptions): NormalizedResponse;
|
|
310
312
|
/** Normalizes a provider response body into the canonical shape. */
|
|
@@ -312,4 +314,4 @@ declare function normalizeResponse(body: unknown, route: {
|
|
|
312
314
|
from: ResponseProvider;
|
|
313
315
|
}, options?: ConvertOptions): NormalizedResponse;
|
|
314
316
|
|
|
315
|
-
export { type AnthropicContentBlock, type AnthropicConversation, type AnthropicDocumentBlock, type AnthropicImageBlock, type AnthropicMessage, type AnthropicTextBlock, type AnthropicToolResultBlock, type AnthropicToolUseBlock, type ConversationOf, type ConvertOptions, type FinishReason, type GeminiContent, type GeminiConversation, type GeminiFileDataPart, type GeminiFunctionCallPart, type GeminiFunctionResponsePart, type GeminiInlineDataPart, type GeminiPart, type GeminiTextPart, type MediaModality, type MediaPart, type MediaSource, type NormalizedImage, type NormalizedResponse, type OpenAIAssistantMessage, type OpenAIAudioPart, type OpenAIContentPart, type OpenAIFilePart, type OpenAIImagePart, type OpenAIMessage, type OpenAISystemMessage, type OpenAITextPart, type OpenAIToolCall, type OpenAIToolMessage, type OpenAIUserMessage, type Provider, type ResponseProvider, type Usage, type Warning, type WarningCode, convert, fromAnthropic, fromGemini, normalizeResponse, parseDataUrl, responseFromAnthropic, responseFromGemini, responseFromOpenAI, responseFromOpenAIResponses, toAnthropic, toDataUrl, toGemini };
|
|
317
|
+
export { type AnthropicContentBlock, type AnthropicConversation, type AnthropicDocumentBlock, type AnthropicImageBlock, type AnthropicMessage, type AnthropicTextBlock, type AnthropicToolResultBlock, type AnthropicToolUseBlock, type ConversationOf, type ConvertOptions, type FinishReason, type GeminiContent, type GeminiConversation, type GeminiFileDataPart, type GeminiFunctionCallPart, type GeminiFunctionResponsePart, type GeminiInlineDataPart, type GeminiPart, type GeminiTextPart, type MediaModality, type MediaPart, type MediaSource, type NormalizedImage, type NormalizedResponse, type OpenAIAssistantMessage, type OpenAIAudioPart, type OpenAIContentPart, type OpenAIFilePart, type OpenAIImagePart, type OpenAIMessage, type OpenAISystemMessage, type OpenAITextPart, type OpenAIToolCall, type OpenAIToolMessage, type OpenAIUserMessage, type Provider, type ResponseProvider, type Usage, type Warning, type WarningCode, convert, fromAnthropic, fromGemini, normalizeResponse, parseDataUrl, responseFromAnthropic, responseFromGemini, responseFromOpenAI, responseFromOpenAIResponses, toAnthropic, toDataUrl, toGemini, warningCodes };
|