190proof opinionated unified interface to interact with multiple AI providers A new npm package called 190proof provides a unified interface for calling models from OpenAI, Anthropic, Google, Groq, OpenRouter, and AWS Bedrock through a single `provider:model-id` string format. The package handles retries, streaming by default, function/tool calling, message alternation, and image normalization across providers, and it degrades images to inline text references for text-only providers such as Groq or when OpenRouter rejects a request with a routing-layer 404. It is installed via `npm install 190proof` and exposes a `callWithRetries` function alongside a `GenericPayload` type. An opinionated unified interface for interacting with multiple AI providers including OpenAI , Anthropic , Google , Groq , OpenRouter , and AWS Bedrock . This package provides a consistent API for making requests to different LLM providers while handling retries, streaming, and multimodal inputs. Fully-local unified interface across multiple AI providers that includes: - 🛠️ Consistent function/tool calling across all providers - 💬 Consistent message alternation & system instructions - 🖼️ Image format & size normalization - 🔄 Automatic retries with configurable attempts - 📡 Streaming by default - ☁️ Cloud service providers supported Azure, AWS Bedrock - 🔌 Provider prefix strings for any model without waiting for package updates npm install 190proof Use any model from any provider with the provider:model-id format: js import { callWithRetries, GenericPayload } from "190proof"; const payload: GenericPayload = { model: "openai:gpt-4o-mini", messages: { role: "user", content: "Tell me a joke.", }, , }; const response = await callWithRetries "my-request-id", payload ; console.log response.content ; js import { callWithRetries, GenericPayload } from "190proof"; // OpenAI const openaiPayload: GenericPayload = { model: "openai:gpt-5", messages: { role: "user", content: "Hello " } , }; // Anthropic const claudePayload: GenericPayload = { model: "anthropic:claude-sonnet-4-5", messages: { role: "user", content: "Hello " } , }; // Google const geminiPayload: GenericPayload = { model: "google:gemini-2.0-flash", messages: { role: "user", content: "Hello " } , }; // Groq const groqPayload: GenericPayload = { model: "groq:llama-3.3-70b-versatile", messages: { role: "user", content: "Hello " } , }; // OpenRouter const openRouterPayload: GenericPayload = { model: "openrouter:google/gemma-4-31b-it:free", messages: { role: "user", content: "Hello " } , }; const response = await callWithRetries "request-id", claudePayload ; js const payload: GenericPayload = { model: "openai:gpt-4o", messages: { role: "user", content: "What is the capital of France?", }, , functions: { name: "get country capital", description: "Get the capital of a given country", parameters: { type: "object", properties: { country name: { type: "string", description: "The name of the country", }, }, required: "country name" , }, }, , }; const response = await callWithRetries "function-call-example", payload ; // response.function call contains { name: string, arguments: Record