Skip to main content

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
provider
ProviderV3
required
The AI SDK v3 provider to wrap (e.g., openai, anthropic, google)
options
CruelProviderOptions
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.

Build docs developers (and LLMs) love