
Security News
Another Round of TEA Protocol Spam Floods npm, But It’s Not a Worm
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.
@upstash/model-multiplexer
Advanced tools
A multiplexer for Large Language Model APIs built on the OpenAI SDK. It combines quotas from multiple models and automatically uses fallback models when the primary models are rate limited.
Eliminate 429 Rate Limit Errors Forever 🚀
A lightweight, zero-dependency TypeScript library that combines the quotas of multiple LLM providers into a single unified API. Never hit rate limits again by automatically distributing your requests across OpenAI, Claude, Gemini, and other providers.
✅ 10x Higher Throughput: Combine OpenAI + Claude + Gemini quotas
✅ Zero 429 Errors: Automatic failover when one provider hits limits
✅ Seamless Integration: Drop-in replacement for OpenAI SDK
✅ Smart Load Balancing: Weight-based distribution across providers
npm install @upstash/model-multiplexer openai
Note: You need to install
openaias it's a peer dependency
import { Multiplexer } from "@upstash/model-multiplexer";
import OpenAI from "openai";
// Create client instances
const claude = new OpenAI({
apiKey: process.env.ANTHROPIC_API_KEY,
baseURL: "https://api.anthropic.com/v1/",
});
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: "https://api.openai.com/v1",
});
// Initialize multiplexer
const multiplexer = new Multiplexer();
// Add models with weights and specific model names
multiplexer.addModel(claude, 5, "claude-sonnet-4-0");
multiplexer.addModel(openai, 3, "gpt-4.1-mini");
// Use like a regular OpenAI client
const completion = await multiplexer.chat.completions.create({
model: "claude-sonnet-4-0", // Will be overridden by selected model
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "What is the capital of France?" },
],
});
console.log(completion.choices[0].message.content);
import { Multiplexer } from "@upstash/model-multiplexer";
import OpenAI from "openai";
// Set up clients for different providers
const claude = new OpenAI({
apiKey: process.env.ANTHROPIC_API_KEY,
baseURL: "https://api.anthropic.com/v1/",
});
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: "https://api.openai.com/v1",
});
const gemini = new OpenAI({
apiKey: process.env.GEMINI_API_KEY,
baseURL: "https://generativelanguage.googleapis.com/v1beta/",
});
const multiplexer = new Multiplexer();
// Add primary models (higher quality, potentially stricter rate limits)
multiplexer.addModel(claude, 5, "claude-sonnet-4-0");
multiplexer.addModel(claude, 3, "claude-opus-4-0"); // Same provider, separate quota!
multiplexer.addModel(gemini, 4, "gemini-2.5-pro-preview-05-06");
// Add fallback models (cheaper, higher availability)
multiplexer.addFallbackModel(openai, 5, "gpt-4.1-mini");
multiplexer.addFallbackModel(openai, 3, "gpt-4.1"); // Same provider, separate quota!
multiplexer.addFallbackModel(gemini, 3, "gemini-2.0-flash");
// Result: Combined quotas from multiple models + multiple providers = massive throughput
const multiplexer = new Multiplexer();
// Add a primary model
multiplexer.addModel(client: OpenAI, weight: number, modelName: string)
// Add a fallback model
multiplexer.addFallbackModel(client: OpenAI, weight: number, modelName: string)
Parameters:
client: OpenAI-compatible client instanceweight: Positive integer for weight-based selection (higher = more likely to be selected)modelName: Specific model name to use (e.g., "gpt-4.1-mini", "claude-sonnet-4-0")const stats = multiplexer.getStats();
// Returns: Record<string, { success: number; rateLimited: number; failed: number }>
multiplexer.reset(); // Clears all models and resets state
const stream = (await multiplexer.chat.completions.create({
model: "claude-sonnet-4-0",
messages: [{ role: "user", content: "Write a poem about AI." }],
stream: true,
})) as AsyncIterable<OpenAI.Chat.Completions.ChatCompletionChunk>;
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
Single Model: [GPT-4: 10,000 RPM] ❌ 429 Error at 10,001 requests
Multiple Providers: [OpenAI: 10K] + [Claude: 15K] + [Gemini: 20K] = 45,000 RPM ✅
Multiple Models: [GPT-4: 10K] + [GPT-4-mini: 50K] + [Claude: 15K] = 75,000 RPM ✅✅
Single Model Approach:
Multi-Model Same Provider:
Multi-Provider Setup:
Set up your API keys:
export OPENAI_API_KEY="your-openai-key"
export ANTHROPIC_API_KEY="your-anthropic-key"
export GEMINI_API_KEY="your-gemini-key"
Check out the examples directory for more detailed usage patterns.
Full TypeScript support with proper type definitions included.
import { Multiplexer } from "@upstash/model-multiplexer";
// All OpenAI types are available through the peer dependency
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
Upstash provides serverless databases and messaging infrastructure for modern applications.
FAQs
A multiplexer for Large Language Model APIs built on the OpenAI SDK. It combines quotas from multiple models and automatically uses fallback models when the primary models are rate limited.
The npm package @upstash/model-multiplexer receives a total of 31 weekly downloads. As such, @upstash/model-multiplexer popularity was classified as not popular.
We found that @upstash/model-multiplexer demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers 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
Recent coverage mislabels the latest TEA protocol spam as a worm. Here’s what’s actually happening.

Security News
PyPI adds Trusted Publishing support for GitLab Self-Managed as adoption reaches 25% of uploads

Research
/Security News
A malicious Chrome extension posing as an Ethereum wallet steals seed phrases by encoding them into Sui transactions, enabling full wallet takeover.