
Security News
GitHub Actions Checkout Now Blocks Risky pull_request_target Checkouts
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.
A 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 hand
A 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:
npm install 190proof
Use any model from any provider with the provider:model-id format:
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);
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);
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<string, any> }
const payload: GenericPayload = {
model: "anthropic:claude-sonnet-4-5",
messages: [
{
role: "user",
content: "What's in this image?",
files: [
{
mimeType: "image/jpeg",
url: "https://example.com/image.jpg",
},
],
},
],
};
const response = await callWithRetries("image-example", payload);
const payload: GenericPayload = {
model: "google:gemini-2.0-flash",
messages: [
{
role: "system",
content: "You are a helpful assistant that speaks in a friendly tone.",
},
{
role: "user",
content: "Tell me about yourself.",
},
],
};
const response = await callWithRetries("system-message-example", payload);
Use parseModelString to see how a model string will be routed:
import { parseModelString } from "190proof";
parseModelString("openai:gpt-7");
// → { provider: "openai", modelId: "gpt-7" }
parseModelString("openrouter:org/model-name:free");
// → { provider: "openrouter", modelId: "org/model-name:free" }
The model string format is provider:model-id, where the provider prefix is one of:
| Prefix | Provider |
|---|---|
openai | OpenAI |
anthropic | Anthropic |
google | Google (Gemini) |
groq | Groq |
openrouter | OpenRouter |
The prefix is stripped before sending to the API, so the model ID should be exactly what the provider expects (e.g. "openai:gpt-4o" sends "gpt-4o" to OpenAI).
These models are tested. You can use any model with the provider:model-id format.
openai:gpt-5openai:gpt-5-miniopenai:gpt-4.1openai:gpt-4.1-miniopenai:gpt-4.1-nanoopenai:gpt-4oopenai:gpt-4o-miniopenai:o3-miniopenai:o1-previewopenai:o1-minianthropic:claude-opus-4-5anthropic:claude-sonnet-4-5anthropic:claude-haiku-4-5anthropic:claude-opus-4-1anthropic:claude-opus-4-20250514anthropic:claude-sonnet-4-20250514anthropic:claude-3-5-sonnet-20241022anthropic:claude-3-5-haiku-20241022google:gemini-3.1-flash-lite-previewgoogle:gemini-3-flash-previewgoogle:gemini-2.5-flash-preview-04-17google:gemini-2.0-flashgoogle:gemini-2.0-flash-exp-image-generationgoogle:gemini-1.5-pro-latestgroq:llama-3.3-70b-versatilegroq:llama3-70b-8192groq:qwen/qwen3-32bgroq:deepseek-r1-distill-llama-70bopenrouter:google/gemma-4-31b-it:freeopenrouter:google/gemma-4-31b-itSet the following environment variables for the providers you want to use:
# OpenAI
OPENAI_API_KEY=your-openai-api-key
# Anthropic
ANTHROPIC_API_KEY=your-anthropic-api-key
# Google
GEMINI_API_KEY=your-gemini-api-key
# Groq
GROQ_API_KEY=your-groq-api-key
# OpenRouter
OPENROUTER_API_KEY=your-openrouter-api-key
# AWS Bedrock (for Anthropic via Bedrock)
AWS_ACCESS_KEY_ID=your-aws-access-key
AWS_SECRET_ACCESS_KEY=your-aws-secret-key
callWithRetries(identifier, payload, config?, retries?, chunkTimeoutMs?)Main function to make requests to any supported AI provider.
identifier: string | string[] - Unique identifier for the request (used for logging)payload: GenericPayload - Request payload containing model, messages, and optional functionsconfig: OpenAIConfig | AnthropicAIConfig - Optional configuration for the specific providerretries: number - Number of retry attempts (default: 5)chunkTimeoutMs: number - Timeout for streaming chunks in ms (default: 15000)Promise<ParsedResponseMessage>:
interface ParsedResponseMessage {
role: "assistant";
content: string | null;
function_call: FunctionCall | null;
function_calls: FunctionCall[];
files: File[]; // For models that return files (e.g., image generation)
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
} | null; // null when streaming
}
parseModelString(model)Parses a model string into its provider and model ID components.
model: string - A model string in "provider:model-id" format{ provider: Provider, modelId: string }
interface OpenAIConfig {
service: "azure" | "openai";
apiKey: string;
/**
* Optional base URL. Defaults to `https://api.openai.com/v1`. Set to point
* at any OpenAI-compatible endpoint (e.g. a self-hosted proxy). The path
* `/chat/completions` is appended automatically. Ignored for Azure.
*/
baseUrl?: string;
orgId?: string;
modelConfigMap?: Record<
string,
{
resource: string;
deployment: string;
apiVersion: string;
apiKey: string;
endpoint?: string;
}
>;
}
To talk to an OpenAI-compatible server instead of OpenAI itself:
await callWithRetries(
"my-identifier",
{
model: "openai:gpt-4o-mini",
messages: [{ role: "user", content: "hi" }],
},
{
service: "openai",
apiKey: process.env.SOME_SERVER_API_KEY,
baseUrl: "https://your-proxy.example.com/v1",
},
);
interface AnthropicAIConfig {
service: "anthropic" | "bedrock";
}
ISC
FAQs
A 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 hand
We found that 190proof demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.

Product
Socket MCP now lets AI assistants review org alerts, investigate threats using the Socket threat feed, and inspect package files in addition to dependency scoring.