@juspay/neurolink
Version:
The pipe layer of an AI nervous system: one interface connecting provider neurons to your application, across three inference types — generate, stream and decide. `decide` returns typed, calibrated judgements from a non-generative model (~400ms, ~$0.00002
48 lines (47 loc) • 2.59 kB
TypeScript
/**
* Pure converters from multimodal content parts into native Anthropic
* Messages-API content blocks (image / document).
*
* Two input shapes reach the native Anthropic surface:
*
* 1. NeuroLink/V3 multimodal parts — `{ type: "image", image }` produced by
* the multimodal message builder (base64, data URL, https URL, or bytes).
*
* 2. AI-SDK LanguageModel prompt parts — `{ type: "file", mediaType, data }`.
* This is how `ai@6` encodes BOTH images and PDFs in the prompt that the
* provider's `doGenerate(options.prompt)` receives. Before this module the
* converter only handled `type:"image"`, so on the tool-using generate
* path (which always normalises images to `type:"file"`) the image part
* was silently dropped — the model never saw the image ("no image
* detected"). Gemini/Vertex are immune because they read `input.images`
* directly in their own builders instead of going through this conversion.
*
* Media type is taken from the AI-SDK-provided `mediaType` when present, then
* sniffed from magic bytes, and only then defaulted — a hardcoded `image/png`
* default silently corrupts JPEG/GIF/WebP uploads (the Anthropic API rejects a
* mislabeled base64 image with HTTP 400 and the image vanishes).
*/
import type Anthropic from "@anthropic-ai/sdk";
/**
* Detect a supported image media type from a buffer's magic bytes. Returns
* undefined when the bytes are not one of the four Anthropic-supported formats.
*/
export declare function sniffImageMediaType(bytes: Uint8Array): Anthropic.Messages.Base64ImageSource["media_type"] | undefined;
/**
* Convert an image part (data URL, bare base64, https URL, byte array, or
* ArrayBuffer) into an Anthropic image block. Honors `mediaTypeHint` (the
* AI-SDK `mediaType`), falls back to magic-byte sniffing, then to image/png.
* Returns undefined for unusable inputs.
*/
export declare function toAnthropicImageBlock(data: unknown, mediaTypeHint?: string): Anthropic.Messages.ImageBlockParam | undefined;
/**
* Convert an AI-SDK `{ type: "file", mediaType, data }` content part into the
* matching Anthropic content block: image/* → image block (media type honored,
* not hardcoded), application/pdf → document block. Returns undefined for
* unsupported media types (so the caller simply omits them rather than 400ing).
* When `mediaType` is absent, image bytes are still salvaged via sniffing.
*/
export declare function fileToAnthropicBlock(part: {
mediaType?: string;
data?: unknown;
}): Anthropic.Messages.ContentBlockParam | undefined;