Documentation Index
Fetch the complete documentation index at: https://mintlify.com/visible/cruel/llms.txt
Use this file to discover all available pages before exploring further.
Overview
cruelProvider() wraps an entire AI SDK v3 provider (e.g., OpenAI, Anthropic, Google) to inject chaos into all models created from that provider. This is more convenient than wrapping individual models when you want consistent chaos behavior across your application.
Function Signature
function cruelProvider<T extends ProviderV3>(
provider: T,
options?: CruelProviderOptions
): T
The AI SDK v3 provider to wrap (e.g., openai, anthropic, google)
Chaos configuration options. Extends CruelChaosOptions with model-specific overrides.
Returns
Returns a proxied provider that intercepts all model creation methods:
languageModel(modelId) / provider(modelId) (callable provider)
embeddingModel(modelId) / textEmbeddingModel(modelId)
imageModel(modelId)
speechModel(modelId)
transcriptionModel(modelId)
videoModel(modelId)
All created models are automatically wrapped with chaos injection.
Options
Global Chaos Options
All options from cruelModel() apply globally to every model created from this provider.
Model-Specific Overrides
models
Record<string, CruelChaosOptions>
Override chaos options for specific model IDs. Model-specific options are merged with global options.{
// Global options
rateLimit: 0.05,
delay: [50, 150],
// Model-specific overrides
models: {
'gpt-4': {
rateLimit: 0.2, // Higher rate limit for GPT-4
},
'gpt-3.5-turbo': {
delay: [10, 50], // Lower delay for GPT-3.5
},
},
}
Examples
Wrap Entire Provider
import { openai } from '@ai-sdk/openai'
import { cruelProvider } from '@anthropic-ai/cruel'
const provider = cruelProvider(openai, {
rateLimit: 0.1,
overloaded: 0.05,
delay: [50, 200],
})
// All models get chaos injection
const gpt4 = provider('gpt-4')
const gpt35 = provider('gpt-3.5-turbo')
const embedding = provider.textEmbeddingModel('text-embedding-3-small')
Model-Specific Configuration
import { anthropic } from '@ai-sdk/anthropic'
import { cruelProvider } from '@anthropic-ai/cruel'
const provider = cruelProvider(anthropic, {
// Default chaos for all models
rateLimit: 0.05,
delay: [50, 100],
// Harsher chaos for specific models
models: {
'claude-3-5-sonnet-20241022': {
rateLimit: 0.15, // 15% rate limit for Sonnet
streamCut: 0.1, // 10% stream cuts
slowTokens: [50, 150], // Slower tokens
},
'claude-3-5-haiku-20241022': {
delay: [10, 50], // Faster responses for Haiku
},
},
})
const sonnet = provider('claude-3-5-sonnet-20241022') // Gets harsher chaos
const haiku = provider('claude-3-5-haiku-20241022') // Gets lower delays
const opus = provider('claude-3-opus-20240229') // Gets default chaos
Provider-Wide Observability
import { google } from '@ai-sdk/google'
import { cruelProvider } from '@anthropic-ai/cruel'
const provider = cruelProvider(google, {
rateLimit: 0.05,
overloaded: 0.02,
onChaos: (event) => {
// Log all chaos events across all models
logger.warn('Chaos injected', {
type: event.type,
modelId: event.modelId,
timestamp: new Date().toISOString(),
})
// Track metrics
metrics.increment('ai_chaos_events', {
event_type: event.type,
model: event.modelId,
})
},
})
Testing with Multiple Providers
import { openai } from '@ai-sdk/openai'
import { anthropic } from '@ai-sdk/anthropic'
import { cruelProvider, presets } from '@anthropic-ai/cruel'
// Apply realistic chaos to both providers
const testOpenAI = cruelProvider(openai, presets.realistic)
const testAnthropic = cruelProvider(anthropic, presets.realistic)
// Use in your application
const model = useFastModel
? testOpenAI('gpt-3.5-turbo')
: testAnthropic('claude-3-5-haiku-20241022')
Conditional Provider Wrapping
import { openai } from '@ai-sdk/openai'
import { cruelProvider, presets } from '@anthropic-ai/cruel'
// Only wrap in development/staging
const provider = process.env.ENABLE_CHAOS === 'true'
? cruelProvider(openai, presets.unstable)
: openai
const model = provider('gpt-4')
Supported Model Types
The provider wrapper automatically detects and wraps all AI SDK model types:
Language Models
const model = provider('gpt-4')
const model = provider.languageModel('gpt-4')
Embedding Models
const embedding = provider.textEmbeddingModel('text-embedding-3-small')
const embedding = provider.embeddingModel('text-embedding-3-small')
Embedding models support a subset of chaos options:
fail, delay, timeout
rateLimit, overloaded
invalidApiKey, quotaExceeded
onChaos
Image Models
const imageModel = provider.imageModel('dall-e-3')
Speech Models
const speechModel = provider.speechModel('tts-1')
Transcription Models
const transcriptionModel = provider.transcriptionModel('whisper-1')
Video Models
const videoModel = provider.videoModel('sora-1')
Environment Variable Support
Cruel automatically respects the MODEL environment variable to override model IDs:
# Override all models to use gpt-4
MODEL=gpt-4 npm test
const provider = cruelProvider(openai, { rateLimit: 0.1 })
// Requests gpt-3.5-turbo but actually uses gpt-4
const model = provider('gpt-3.5-turbo')
This works for partial model IDs too:
MODEL=claude-3-5-sonnet-20241022 npm test
// Provider prefix is preserved
const model = provider('anthropic/claude-3-opus-20240229')
// Actually uses: anthropic/claude-3-5-sonnet-20241022
Chaos Options Reference
See cruelModel() Chaos Options for the complete list of available chaos configuration options.