As AI agents move from proof-of-concept to production deployments, one critical challenge emerges: ensuring your system meets real-world reliability standards. When your customer-facing chatbot processes 10,000 requests per minute, a single 429 rate limit error or unexplained timeout can cascade into a service outage. I have personally deployed AI pipelines for three enterprise clients this year, and I can tell you that without proper SLA monitoring, you will discover failures only when customers start complaining. This comprehensive guide walks you through setting up production-grade SLA acceptance testing using the HolySheep AI gateway, complete with real code examples, monitoring dashboards, and fallback strategies that keep your AI agents running smoothly.
What is SLA Acceptance Testing for AI Agents?
Service Level Agreement (SLA) acceptance testing validates that your AI agent infrastructure meets defined performance and reliability thresholds before you launch. Unlike standard unit tests that verify code logic, SLA testing simulates real production traffic patterns and measures whether your system responds within acceptable timeframes, handles errors gracefully, and maintains throughput under load.
For AI agents built on large language models, SLA testing becomes particularly complex because you must monitor not just HTTP status codes but also model-specific behaviors including token usage, response latency distribution, and fallback mechanisms when primary models fail. The HolySheep gateway addresses these challenges by providing unified monitoring across multiple model providers with automatic fallback capabilities.
Understanding the Critical Error Codes
429 Too Many Requests
The HTTP 429 status code signals that you have exceeded your rate limit quota. In the context of AI API calls, this occurs when your application sends more requests per minute than your plan allows. For example, if your current tier permits 1,000 requests per minute and your agent spikes to 1,200 during peak hours, the API returns 429 and your request fails.
Without proper monitoring, a 429 error can cause your entire agent workflow to stall because downstream components wait indefinitely for responses. HolySheep mitigates this by implementing intelligent request queuing and automatic rate limit handling that distributes requests evenly rather than letting them pile up.
5xx Server Errors
The 5xx range indicates server-side errors originating from the API provider. Common scenarios include 500 Internal Server Error (the provider's model inference service encountered an unexpected condition), 502 Bad Gateway (the upstream server returned an invalid response), and 503 Service Unavailable (the provider is experiencing capacity constraints). These errors are particularly problematic because they are outside your control and may resolve spontaneously or persist for minutes.
I once spent three hours debugging a 502 error that turned out to be a temporary upstream issue. With HolySheep monitoring enabled, I would have received an immediate alert and the system would have automatically routed traffic to a backup model while the primary provider recovered.
Timeout Errors
Request timeouts occur when an API call takes longer than the configured maximum duration. LLM inference is inherently variable—simple prompts might complete in 200 milliseconds while complex reasoning tasks can take 30 seconds or more. If your application sets a 10-second timeout but the model needs 25 seconds for a complex task, the request fails even though the computation would have succeeded with more patience.
HolySheep gateway allows you to configure per-model timeout thresholds and implements adaptive timeout strategies that learn from your traffic patterns to optimize response windows dynamically.
Model-Level Fallback: Your Safety Net
Model-level fallback refers to the automatic switching from a primary AI model to a secondary model when the primary fails or becomes unavailable. This architecture ensures continuous service availability even during provider outages or rate limit exhaustion.
For instance, you might configure GPT-4.1 as your primary model with Gemini 2.5 Flash as your fallback. When the gateway detects consecutive 429 or 5xx errors from the OpenAI endpoint, it automatically redirects requests to Google's API. Your application code remains unchanged—the fallback happens transparently at the gateway level.
Step-by-Step SLA Testing Setup
Prerequisites
- A HolySheep AI account (sign up at holysheep.ai/register)
- Your HolySheep API key from the dashboard
- Python 3.8 or higher
- The requests library (pip install requests)
Step 1: Configure Your Gateway Endpoint
First, set up your base configuration to point to the HolySheep gateway instead of direct provider endpoints. This single change enables unified monitoring, automatic fallback, and rate limit management across all your AI model calls.
# holy_sheep_sla_config.py
import os
import time
from dataclasses import dataclass, field
from typing import List, Optional, Dict, Any
import requests
@dataclass
class SLAThresholds:
"""Define acceptable SLA parameters for your AI agent."""
max_latency_p95_ms: int = 2000 # 95th percentile latency must be under 2 seconds
max_timeout_rate: float = 0.01 # Allow only 1% of requests to timeout
max_error_rate: float = 0.005 # Allow only 0.5% combined 4xx/5xx errors
max_429_rate: float = 0.02 # Allow only 2% rate limit errors
min_success_rate: float = 0.995 # 99.5% of requests must succeed
@dataclass
class ModelConfig:
"""Configure primary and fallback models with their priorities."""
name: str
provider: str
endpoint: str
priority: int # Lower number = higher priority
timeout_seconds: int = 30
fallback_models: List[str] = field(default_factory=list)
HolySheep Gateway Configuration
CRITICAL: Always use the HolySheep gateway URL, never direct provider endpoints
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = os.environ.get("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
Model hierarchy with fallback chains
MODEL_CONFIGS = {
"reasoning": ModelConfig(
name="gpt-4.1",
provider="openai",
endpoint=f"{BASE_URL}/chat/completions",
priority=1,
timeout_seconds=30,
fallback_models=["claude-sonnet-4.5", "gemini-2.5-flash"]
),
"fast": ModelConfig(
name="gemini-2.5-flash",
provider="google",
endpoint=f"{BASE_URL}/chat/completions",
priority=1,
timeout_seconds=10,
fallback_models=["deepseek-v3.2"]
),
"economy": ModelConfig(
name="deepseek-v3.2",
provider="deepseek",
endpoint=f"{BASE_URL}/chat/completions",
priority=1,
timeout_seconds=45,
fallback_models=["gemini-2.5-flash"]
)
}
print("✓ SLA Configuration initialized")
print(f" Base URL: {BASE_URL}")
print(f" Primary reasoning model: {MODEL_CONFIGS['reasoning'].name}")
print(f" Fallback chain: {' → '.join(MODEL_CONFIGS['reasoning'].fallback_models)}")
Step 2: Implement the SLA Monitoring Client
Now we create the core monitoring client that tracks every request's outcome, measures latency, and automatically triggers fallbacks when error thresholds are exceeded.
# holy_sheep_sla_monitor.py
import time
import threading
from collections import defaultdict, deque
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Tuple
from dataclasses import dataclass, asdict
import requests
import json
@dataclass
class RequestMetrics:
"""Stores metrics for a single request."""
request_id: str
timestamp: datetime
model_used: str
latency_ms: float
status_code: Optional[int]
error_type: Optional[str] # 'timeout', '429', '5xx', '4xx', None
tokens_used: Optional[int]
fallback_triggered: bool
fallback_reason: Optional[str]
class SLAMonitor:
"""
Production-grade SLA monitoring for HolySheep AI gateway.
Tracks latency percentiles, error rates, and automatic fallback events.
"""
def __init__(self, window_minutes: int = 5):
self.window_minutes = window_minutes
self.request_history: deque = deque(maxlen=10000)
self.model_call_counts: Dict[str, Dict[str, int]] = defaultdict(
lambda: defaultdict(int)
)
self.fallback_log: List[Dict] = []
self._lock = threading.Lock()
def record_request(self, metrics: RequestMetrics):
"""Thread-safe recording of request metrics."""
with self._lock:
self.request_history.append(metrics)
# Track which model handled each request
self.model_call_counts[metrics.model_used]['total'] += 1
if metrics.fallback_triggered:
self.model_call_counts[metrics.model_used]['fallback_count'] += 1
if metrics.error_type:
self.model_call_counts[metrics.model_used][f'{metrics.error_type}_count'] = \
self.model_call_counts[metrics.model_used].get(f'{metrics.error_type}_count', 0) + 1
def record_fallback(self, from_model: str, to_model: str, reason: str):
"""Log when a fallback is triggered."""
with self._lock:
self.fallback_log.append({
'timestamp': datetime.utcnow().isoformat(),
'from_model': from_model,
'to_model': to_model,
'reason': reason
})
def get_window_requests(self) -> List[RequestMetrics]:
"""Get all requests within the sliding time window."""
cutoff = datetime.utcnow() - timedelta(minutes=self.window_minutes)
with self._lock:
return [r for r in self.request_history if r.timestamp >= cutoff]
def calculate_latency_percentiles(self) -> Dict[str, float]:
"""Calculate p50, p90, p95, and p99 latency percentiles."""
window_requests = self.get_window_requests()
if not window_requests:
return {'p50': 0, 'p90': 0, 'p95': 0, 'p99': 0}
latencies = sorted([r.latency_ms for r in window_requests])
n = len(latencies)
return {
'p50': latencies[int(n * 0.50)],
'p90': latencies[int(n * 0.90)],
'p95': latencies[int(n * 0.95)],
'p99': latencies[int(n * 0.99)]
}
def calculate_error_rates(self) -> Dict[str, float]:
"""Calculate error rates by category."""
window_requests = self.get_window_requests()
total = len(window_requests)
if total == 0:
return {'total_error_rate': 0, 'timeout_rate': 0,
'rate_429_rate': 0, 'server_5xx_rate': 0}
error_counts = {
'timeout': 0,
'rate_429': 0,
'server_5xx': 0,
'total_errors': 0
}
for req in window_requests:
if req.error_type:
error_counts['total_errors'] += 1
if req.error_type == 'timeout':
error_counts['timeout'] += 1
elif req.error_type == '429':
error_counts['rate_429'] += 1
elif req.error_type in ['5xx', '500', '502', '503']:
error_counts['server_5xx'] += 1
return {
'total_error_rate': error_counts['total_errors'] / total,
'timeout_rate': error_counts['timeout'] / total,
'rate_429_rate': error_counts['rate_429'] / total,
'server_5xx_rate': error_counts['server_5xx'] / total
}
def get_model_distribution(self) -> Dict[str, float]:
"""Calculate percentage of requests handled by each model."""
window_requests = self.get_window_requests()
total = len(window_requests)
if total == 0:
return {}
distribution = defaultdict(int)
for req in window_requests:
distribution[req.model_used] += 1
return {model: (count / total) * 100
for model, count in distribution.items()}
def check_sla_compliance(self, thresholds) -> Tuple[bool, List[str]]:
"""
Check if current metrics meet SLA thresholds.
Returns (is_compliant, list_of_violations).
"""
violations = []
# Check latency
percentiles = self.calculate_latency_percentiles()
if percentiles['p95'] > thresholds.max_latency_p95_ms:
violations.append(
f"Latency SLA violated: p95={percentiles['p95']:.0f}ms "
f"(threshold: {thresholds.max_latency_p95_ms}ms)"
)
# Check error rates
error_rates = self.calculate_error_rates()
if error_rates['total_error_rate'] > thresholds.max_error_rate:
violations.append(
f"Total error rate: {error_rates['total_error_rate']*100:.2f}% "
f"(threshold: {thresholds.max_error_rate*100}%)"
)
if error_rates['timeout_rate'] > thresholds.max_timeout_rate:
violations.append(
f"Timeout rate: {error_rates['timeout_rate']*100:.2f}% "
f"(threshold: {thresholds.max_timeout_rate*100}%)"
)
if error_rates['rate_429_rate'] > thresholds.max_429_rate:
violations.append(
f"429 rate limit rate: {error_rates['rate_429_rate']*100:.2f}% "
f"(threshold: {thresholds.max_429_rate*100}%)"
)
is_compliant = len(violations) == 0
return is_compliant, violations
def generate_sla_report(self, thresholds) -> Dict[str, Any]:
"""Generate a comprehensive SLA report."""
percentiles = self.calculate_latency_percentiles()
error_rates = self.calculate_error_rates()
model_dist = self.get_model_distribution()
is_compliant, violations = self.check_sla_compliance(window_requests=None, thresholds=thresholds)
recent_fallbacks = self.fallback_log[-10:] if self.fallback_log else []
return {
'report_timestamp': datetime.utcnow().isoformat(),
'window_minutes': self.window_minutes,
'total_requests': len(self.get_window_requests()),
'latency_percentiles_ms': percentiles,
'error_rates': error_rates,
'model_distribution': model_dist,
'sla_compliant': is_compliant,
'violations': violations,
'recent_fallbacks': recent_fallbacks
}
Global monitor instance
sla_monitor = SLAMonitor(window_minutes=5)
print("✓ SLA Monitor initialized with 5-minute sliding window")
print(" Monitoring: latency percentiles, error rates, model distribution")
Step 3: Create the Intelligent Request Handler with Automatic Fallback
This is the heart of your production AI pipeline. The request handler automatically routes requests, handles errors with retry logic, and switches models when failures exceed thresholds.
# holy_sheep_request_handler.py
import time
import uuid
import random
from datetime import datetime
from typing import Dict, List, Optional, Any
from collections import defaultdict
import requests
from requests.exceptions import Timeout, ConnectionError as ReqConnectionError
Import our modules
from holy_sheep_sla_config import BASE_URL, API_KEY, MODEL_CONFIGS, SLAThresholds
from holy_sheep_sla_monitor import SLAMonitor, RequestMetrics, sla_monitor
class HolySheepRequestHandler:
"""
Production request handler with automatic fallback and SLA monitoring.
This handler automatically:
1. Routes requests to the appropriate model based on task type
2. Monitors response quality and error rates in real-time
3. Triggers automatic fallback when error thresholds are exceeded
4. Records all metrics for SLA compliance reporting
"""
def __init__(self, api_key: str, sla_monitor: SLAMonitor):
self.api_key = api_key
self.sla_monitor = sla_monitor
self.fallback_state = defaultdict(lambda: {
'consecutive_errors': 0,
'is_degraded': False,
'degraded_until': None
})
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def _call_model(self, model_name: str, messages: List[Dict],
timeout: int = 30) -> Dict[str, Any]:
"""
Make a single API call to the specified model through HolySheep gateway.
"""
request_id = str(uuid.uuid4())
start_time = datetime.utcnow()
payload = {
"model": model_name,
"messages": messages,
"temperature": 0.7,
"max_tokens": 2048
}
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=self.headers,
json=payload,
timeout=timeout
)
latency_ms = (datetime.utcnow() - start_time).total_seconds() * 1000
if response.status_code == 200:
result = response.json()
tokens_used = result.get('usage', {}).get('total_tokens', 0)
metrics = RequestMetrics(
request_id=request_id,
timestamp=start_time,
model_used=model_name,
latency_ms=latency_ms,
status_code=200,
error_type=None,
tokens_used=tokens_used,
fallback_triggered=False,
fallback_reason=None
)
self.sla_monitor.record_request(metrics)
return {
'success': True,
'model': model_name,
'response': result,
'latency_ms': latency_ms,
'tokens_used': tokens_used
}
elif response.status_code == 429:
latency_ms = (datetime.utcnow() - start_time).total_seconds() * 1000
metrics = RequestMetrics(
request_id=request_id,
timestamp=start_time,
model_used=model_name,
latency_ms=latency_ms,
status_code=429,
error_type='429',
tokens_used=None,
fallback_triggered=False,
fallback_reason=None
)
self.sla_monitor.record_request(metrics)
return {'success': False, 'error': 'rate_limit', 'status_code': 429}
elif 500 <= response.status_code < 600:
latency_ms = (datetime.utcnow() - start_time).total_seconds() * 1000
metrics = RequestMetrics(
request_id=request_id,
timestamp=start_time,
model_used=model_name,
latency_ms=latency_ms,
status_code=response.status_code,
error_type='5xx',
tokens_used=None,
fallback_triggered=False,
fallback_reason=None
)
self.sla_monitor.record_request(metrics)
return {'success': False, 'error': 'server_error', 'status_code': response.status_code}
else:
return {'success': False, 'error': 'unknown', 'status_code': response.status_code}
except Timeout:
latency_ms = (datetime.utcnow() - start_time).total_seconds() * 1000
metrics = RequestMetrics(
request_id=request_id,
timestamp=start_time,
model_used=model_name,
latency_ms=latency_ms,
status_code=None,
error_type='timeout',
tokens_used=None,
fallback_triggered=False,
fallback_reason=None
)
self.sla_monitor.record_request(metrics)
return {'success': False, 'error': 'timeout', 'timeout_seconds': timeout}
except ReqConnectionError:
latency_ms = (datetime.utcnow() - start_time).total_seconds() * 1000
metrics = RequestMetrics(
request_id=request_id,
timestamp=start_time,
model_used=model_name,
latency_ms=latency_ms,
status_code=None,
error_type='connection',
tokens_used=None,
fallback_triggered=False,
fallback_reason=None
)
self.sla_monitor.record_request(metrics)
return {'success': False, 'error': 'connection_error'}
def send_message(self, messages: List[Dict], task_type: str = "reasoning",
fallback_enabled: bool = True) -> Dict[str, Any]:
"""
Send a message with automatic fallback support.
Args:
messages: Chat messages in OpenAI format
task_type: One of 'reasoning', 'fast', or 'economy'
fallback_enabled: Whether to try fallback models on failure
Returns:
Dict with 'success', 'model', 'response', and metadata
"""
config = MODEL_CONFIGS.get(task_type, MODEL_CONFIGS['reasoning'])
# Get the chain of models to try (primary + fallbacks)
model_chain = [config.name] + config.fallback_models
fallback_triggered = False
fallback_reason = None
for attempt, model_name in enumerate(model_chain):
if attempt > 0:
fallback_triggered = True
fallback_reason = f"Fallback from {model_chain[attempt-1]} due to failure"
self.sla_monitor.record_fallback(
from_model=model_chain[attempt-1],
to_model=model_name,
reason=fallback_reason
)
# Apply degraded state penalty
if self.fallback_state[model_name]['is_degraded']:
# Skip degraded models unless this is the last resort
if attempt < len(model_chain) - 1:
continue
result = self._call_model(
model_name=model_name,
messages=messages,
timeout=config.timeout_seconds
)
if result['success']:
# Update fallback state on success
self.fallback_state[model_name]['consecutive_errors'] = 0
result['response']['fallback_triggered'] = fallback_triggered
result['response']['fallback_reason'] = fallback_reason
return result
# Track consecutive errors
self.fallback_state[model_name]['consecutive_errors'] += 1
# Mark model as degraded after 3 consecutive failures
if self.fallback_state[model_name]['consecutive_errors'] >= 3:
self.fallback_state[model_name]['is_degraded'] = True
self.fallback_state[model_name]['degraded_until'] = \
datetime.utcnow().timestamp() + 300 # 5 minutes
# If fallback is disabled or this was the last model, return failure
if not fallback_enabled or attempt == len(model_chain) - 1:
return {
'success': False,
'error': result['error'],
'models_tried': model_chain[:attempt+1],
'fallback_triggered': fallback_triggered
}
return {'success': False, 'error': 'exhausted_all_models'}
Initialize the handler
handler = HolySheepRequestHandler(
api_key=API_KEY,
sla_monitor=sla_monitor
)
print("✓ HolySheep Request Handler initialized")
print(" Automatic fallback: enabled")
print(" Degraded model recovery: 5 minutes")
Step 4: Run Your SLA Acceptance Test
With your monitoring and request handling in place, you can now run comprehensive SLA acceptance tests that simulate production traffic patterns.
# holy_sheep_sla_test.py
import concurrent.futures
import time
import json
from datetime import datetime
from holy_sheep_sla_config import BASE_URL, API_KEY, MODEL_CONFIGS, SLAThresholds
from holy_sheep_sla_monitor import SLAMonitor, sla_monitor
from holy_sheep_request_handler import HolySheepRequestHandler
def run_sla_acceptance_test(
num_requests: int = 100,
concurrent_workers: int = 10,
task_mix: Dict[str, float] = None
) -> Dict:
"""
Run a comprehensive SLA acceptance test simulating production traffic.
Args:
num_requests: Total number of requests to send
concurrent_workers: Number of parallel workers
task_mix: Distribution of task types (default: 60% reasoning, 30% fast, 10% economy)
"""
if task_mix is None:
task_mix = {'reasoning': 0.6, 'fast': 0.3, 'economy': 0.1}
handler = HolySheepRequestHandler(api_key=API_KEY, sla_monitor=sla_monitor)
thresholds = SLAThresholds()
# Generate test messages for each task type
test_messages = {
'reasoning': [
{"role": "user", "content": "Explain the tradeoffs between using a relational database versus a NoSQL database for a high-traffic e-commerce platform."},
{"role": "user", "content": "Write a Python function that implements binary search with proper error handling."},
],
'fast': [
{"role": "user", "content": "Translate 'Hello, how are you?' to Spanish."},
{"role": "user", "content": "What is 2+2?"},
],
'economy': [
{"role": "user", "content": "Give me a brief summary of the benefits of exercise."},
{"role": "user", "content": "List three programming languages popular in 2025."},
]
}
results = {
'test_start': datetime.utcnow().isoformat(),
'total_requests': num_requests,
'concurrent_workers': concurrent_workers,
'task_mix': task_mix,
'successful': 0,
'failed': 0,
'by_task_type': {task: {'success': 0, 'failed': 0} for task in task_mix.keys()}
}
def send_single_request(request_id: int):
"""Send a single request with the appropriate task type."""
# Select task type based on mix
rand = random.random()
cumulative = 0
selected_task = 'reasoning'
for task, weight in task_mix.items():
cumulative += weight
if rand <= cumulative:
selected_task = task
break
message = random.choice(test_messages[selected_task])
start = time.time()
response = handler.send_message(
messages=[message],
task_type=selected_task,
fallback_enabled=True
)
elapsed_ms = (time.time() - start) * 1000
return {
'request_id': request_id,
'task_type': selected_task,
'success': response.get('success', False),
'latency_ms': elapsed_ms,
'model_used': response.get('model', 'unknown'),
'fallback_triggered': response.get('response', {}).get('fallback_triggered', False),
'error': response.get('error')
}
print(f"🚀 Starting SLA acceptance test")
print(f" Requests: {num_requests}")
print(f" Concurrency: {concurrent_workers}")
print(f" Task mix: {task_mix}")
print()
start_time = time.time()
# Execute requests in parallel
with concurrent.futures.ThreadPoolExecutor(max_workers=concurrent_workers) as executor:
futures = [
executor.submit(send_single_request, i)
for i in range(num_requests)
]
completed = 0
for future in concurrent.futures.as_completed(futures):
result = future.result()
completed += 1
if result['success']:
results['successful'] += 1
results['by_task_type'][result['task_type']]['success'] += 1
else:
results['failed'] += 1
results['by_task_type'][result['task_type']]['failed'] += 1
# Progress indicator
if completed % 20 == 0:
print(f" Progress: {completed}/{num_requests} requests completed")
test_duration = time.time() - start_time
# Get SLA metrics from the monitor
report = sla_monitor.generate_sla_report(thresholds)
# Compile final results
results.update({
'test_end': datetime.utcnow().isoformat(),
'test_duration_seconds': round(test_duration, 2),
'requests_per_second': round(num_requests / test_duration, 2),
'sla_report': report
})
# Print summary
print()
print("=" * 60)
print("📊 SLA ACCEPTANCE TEST RESULTS")
print("=" * 60)
print(f"Total Requests: {results['total_requests']}")
print(f"Successful: {results['successful']} ({results['successful']/num_requests*100:.1f}%)")
print(f"Failed: {results['failed']} ({results['failed']/num_requests*100:.1f}%)")
print(f"Duration: {results['test_duration_seconds']}s")
print(f"Throughput: {results['requests_per_second']} req/s")
print()
print("📈 LATENCY PERCENTILES")
print(f" p50: {report['latency_percentiles_ms']['p50']:.0f}ms")
print(f" p90: {report['latency_percentiles_ms']['p90']:.0f}ms")
print(f" p95: {report['latency_percentiles_ms']['p95']:.0f}ms")
print(f" p99: {report['latency_percentiles_ms']['p99']:.0f}ms")
print()
print("⚠️ ERROR RATES")
print(f" Total Error Rate: {report['error_rates']['total_error_rate']*100:.2f}%")
print(f" Timeout Rate: {report['error_rates']['timeout_rate']*100:.2f}%")
print(f" 429 Rate Limit: {report['error_rates']['rate_429_rate']*100:.2f}%")
print(f" 5xx Server: {report['error_rates']['server_5xx_rate']*100:.2f}%")
print()
print("🔄 MODEL DISTRIBUTION")
for model, percentage in report['model_distribution'].items():
print(f" {model}: {percentage:.1f}%")
print()
print("✅ SLA COMPLIANCE:", "PASSED" if report['sla_compliant'] else "FAILED")
if report['violations']:
for violation in report['violations']:
print(f" ⚠️ {violation}")
print("=" * 60)
return results
if __name__ == "__main__":
# Run a 100-request test with 10 concurrent workers
test_results = run_sla_acceptance_test(
num_requests=100,
concurrent_workers=10
)
Common Errors and Fixes
Error 1: HTTP 429 Rate Limit Exceeded
Symptom: After running your SLA test, you see multiple 429 status codes in your error log. The request count in the HolySheep dashboard shows you have hit your rate limit quota, causing request failures even though the models themselves are operational.
Root Cause: Your application is sending more requests per minute than your HolySheep plan permits. This commonly occurs when you scale up concurrent workers without adjusting your rate limit tier, or when a sudden traffic spike exceeds your allocated quota.
Solution: Implement request throttling in your application and upgrade your HolySheep plan. Add a token bucket rate limiter before your API calls:
# rate_limit_handler.py
import time
from threading import Lock
from collections import deque
class RateLimiter:
"""
Token bucket rate limiter to prevent 429 errors.
Adjust tokens_per_minute based on your HolySheep plan tier.
"""
def __init__(self, requests_per_minute: int = 1000):
self.requests_per_minute = requests_per_minute
self.request_timestamps = deque()
self.lock = Lock()
def acquire(self) -> bool:
"""
Attempt to acquire a rate limit slot.
Returns True if request can proceed, False if rate limited.
"""
with self.lock:
now = time.time()
cutoff = now - 60 # 1 minute ago
# Remove timestamps older than 60 seconds
while self.request_timestamps and self.request_timestamps[0] < cutoff:
self.request_timestamps.popleft()
if len(self.request_timestamps) < self.requests_per_minute:
self.request_timestamps.append(now)
return True
else:
return False
def wait_and_acquire(self, timeout: float = 60):
"""Wait until a rate limit slot is available."""
start = time.time()
while time.time() - start < timeout:
if self.acquire():
return True
time.sleep(0.1) # Wait 100ms before retrying
return False
Usage with your request handler
rate_limiter = RateLimiter(requests_per_minute=1000) # Adjust based on your tier
def throttled_send_message(messages, task_type):
if rate_limiter.wait_and_acquire(timeout=30):
return handler.send_message(messages, task_type)
else:
return {
'success': False,
'error': 'rate_limit_timeout',
'message': 'Could not acquire rate limit slot within 30 seconds'
}
print("✓ Rate limiter configured: 1000 requests/minute")
print(" Upgrade to higher tier at https://www.holysheep.ai/register for more capacity")
Error 2: Timeout Errors with Long-Running Requests
Symptom: Your SLA monitor reports a high timeout rate (above 1%) even though the models eventually produce correct responses. The error occurs specifically with complex reasoning tasks that take longer than 10 seconds.
Root Cause: The default timeout setting in your configuration is too aggressive for complex tasks. LLM inference time varies significantly based on prompt complexity, model size, and server load. A 10-second timeout might be appropriate for simple Q&A but insufficient for multi-step reasoning.
Solution: Configure adaptive timeouts based on task complexity and implement timeout retry logic:
# adaptive_timeout_handler.py
import time
from typing import Dict, Any
Define timeout thresholds based on task type
TIMEOUT_CONFIG = {
'simple_qa': {
'initial_timeout': 15,
'max_timeout': 30,
'retry_delay': 2
},
'reasoning': {
'initial_timeout': 30,