Skip to main content

Production Deployment Checklist

Ready to deploy QWED to production? Follow this comprehensive checklist.

Pre-Deployment Checklist

✅ 1. Integration Testing Complete

  • All integration tests pass (test_qwed_integration.py)
  • Performance tests meet requirements
  • Error handling tested
  • Batch processing tested (if applicable)

✅ 2. API Key Management

  • API keys stored in environment variables
  • Different keys for dev/staging/production
  • Key rotation plan in place
  • API keys NOT in Git/version control

Example .env file:

# Production
QWED_API_KEY=qwed_prod_...

# Staging
# QWED_API_KEY=qwed_staging_...

# Development
# QWED_API_KEY=qwed_dev_...

✅ 3. Error Handling

  • All QWED calls wrapped in try/except
  • Fallback mechanisms in place
  • Error logging configured
  • Alerts for critical failures

Example:

from qwed.exceptions import QWEDError
import logging

logger = logging.getLogger(__name__)

try:
result = client.verify(query)
if result.verified:
return result.value
else:
logger.warning(f"Verification failed: {result.reason}")
return fallback_value()
except QWEDError as e:
logger.error(f"QWED error: {e}")
alert_team(e)
return safe_default()

✅ 4. Rate Limiting

  • Understood quota limits for your plan
  • Rate limiting logic implemented
  • Backoff/retry logic in place
  • Monitoring quota usage

✅ 5. Logging & Monitoring

  • All QWED calls logged
  • Verification results tracked
  • Error rates monitored
  • Performance metrics captured

Deployment Strategy

Week 1: Canary (5% traffic)

import random

def should_use_qwed():
return random.random() < 0.05 # 5% of requests

if should_use_qwed():
result = qwed.verify(query)
else:
result = legacy_method(query)

Week 2-3: Increase to 25%, then 50% Week 4: Full rollout (100%)

Option 2: Shadow Mode

Run QWED in parallel without affecting production:

# Production path (existing)
prod_result = existing_llm_call()

# Shadow QWED verification (doesn't affect result)
try:
qwed_result = qwed.verify(query)
log_comparison(prod_result, qwed_result)
except Exception as e:
log_error(e) # Don't fail production

return prod_result # Always return existing result

Option 3: Feature Flag

Use feature flags (LaunchDarkly, Split.io):

if feature_flags.is_enabled('qwed_verification', user_id):
result = qwed.verify(query)
else:
result = legacy_method(query)

Production Configuration

from qwed import QWEDClient

client = QWEDClient(
api_key=os.getenv("QWED_API_KEY"),
timeout=30, # 30 seconds
max_retries=3, # Retry failed requests
strict_mode=True, # Fail on uncertainty
verbose=False # Disable verbose logs in prod
)

Environment-Specific Config

# config.py
import os

ENVIRONMENT = os.getenv("ENVIRONMENT", "development")

QWED_CONFIG = {
"development": {
"api_key": os.getenv("QWED_DEV_KEY"),
"timeout": 60,
"verbose": True,
},
"staging": {
"api_key": os.getenv("QWED_STAGING_KEY"),
"timeout": 30,
"verbose": True,
},
"production": {
"api_key": os.getenv("QWED_PROD_KEY"),
"timeout": 30,
"verbose": False,
},
}

def get_qwed_client():
config = QWED_CONFIG[ENVIRONMENT]
return QWEDClient(**config)

Security Considerations

1. API Key Security

DO:

  • Use environment variables
  • Rotate keys regularly (every 90 days)
  • Use different keys per environment
  • Revoke compromised keys immediately

DON'T:

  • Commit keys to Git
  • Share keys via email/Slack
  • Use same key across environments
  • Log API keys

2. Input Validation

def safe_verify(user_input):
# Sanitize input
if len(user_input) > 10000:
raise ValueError("Input too long")

if not user_input.strip():
raise ValueError("Empty input")

# Verify
result = qwed.verify(user_input)
return result

3. Output Sanitization

def use_verified_output(result):
if not result.verified:
# Don't use unverified output
raise SecurityError("Verification failed")

# Sanitize even verified output
safe_value = sanitize(result.value)
return safe_value

Performance Optimization

1. Use Batch Processing

# ❌ Slow (N API calls)
for query in queries:
result = qwed.verify(query)

# ✅ Fast (1 API call)
results = qwed.verify_batch([
BatchItem(query=q, type="math")
for q in queries
])

2. Caching

from functools import lru_cache

@lru_cache(maxsize=1000)
def cached_verify(query):
result = qwed.verify(query)
return result

3. Async Processing

import asyncio
from qwed import AsyncQWEDClient

async def verify_async(queries):
client = AsyncQWEDClient(api_key="...")

tasks = [client.verify(q) for q in queries]
results = await asyncio.gather(*tasks)

return results

Database Integration

Storing Verification Results

CREATE TABLE verification_logs (
id SERIAL PRIMARY KEY,
query TEXT NOT NULL,
verified BOOLEAN NOT NULL,
evidence JSONB,
timestamp TIMESTAMPTZ DEFAULT NOW(),
user_id INTEGER,
duration_ms INTEGER
);

Logging example:

def verify_and_log(query, user_id):
start = time.time()

result = qwed.verify(query)

duration_ms = int((time.time() - start) * 1000)

db.execute("""
INSERT INTO verification_logs
(query, verified, evidence, user_id, duration_ms)
VALUES (%s, %s, %s, %s, %s)
""", (query, result.verified, result.evidence, user_id, duration_ms))

return result

Compliance & Audit Trails

Requirements

  • All verifications logged
  • Logs retained for compliance period
  • Audit trail accessible
  • Failed verifications flagged

Audit Log Format

{
"timestamp": "2026-01-02T23:00:00Z",
"user_id": "user_123",
"query": "Calculate loan payment",
"verified": true,
"evidence": {
"calculated": 500.25,
"claimed": 500.25
},
"duration_ms": 234,
"environment": "production"
}

Deployment Checklist

Before Deploy:

  • All tests pass
  • API keys configured
  • Error handling in place
  • Logging configured
  • Monitoring dashboards ready
  • Rollback plan documented
  • Team notified

During Deploy:

  • Deploy to staging first
  • Run smoke tests
  • Check logs for errors
  • Monitor metrics
  • Gradual traffic ramp-up

After Deploy:

  • Verify no error rate increase
  • Check performance metrics
  • Review audit logs
  • Update documentation
  • Team retrospective

Rollback Plan

If issues occur:

1. Immediate Rollback:

# Feature flag
feature_flags.disable('qwed_verification')

# Or: Revert deployment
git revert HEAD
git push

2. Investigate:

  • Check error logs
  • Review verification failures
  • Analyze performance metrics

3. Fix & Redeploy:

  • Patch issue
  • Test thoroughly
  • Gradual re-rollout

Go-Live Checklist

Final checks before 100% rollout:

  • 7 days of stable canary deployment
  • Error rate < 0.1%
  • Performance acceptable (p95 < 3s)
  • No security incidents
  • Team trained on troubleshooting
  • Monitoring dashboards operational
  • Runbook documented

Next Steps

Once deployed:


Questions? Contact support@qwedai.com