Chào các bạn developer! Mình là Minh, Technical Architect tại một startup thương mại điện tử Việt Nam. Hôm nay mình muốn chia sẻ câu chuyện thực tế về việc chúng tôi xây dựng hệ thống AI proxy đa mô hình — từ bài toán thực tế đến giải pháp hoàn chỉnh.

Bối cảnh: Khi đỉnh dịch vụ AI đến bất ngờ

T11/2024, đợt Flash Sale 11.11 của chúng tôi thu hút gần 50,000 người dùng đồng thời. Hệ thống chatbot chăm sóc khách hàng dựa trên AI phải xử lý hàng ngàn request mỗi phút. Ban đầu, chúng tôi chỉ dùng một provider AI duy nhất — và đó là lúc mọi thứ bắt đầu vỡ tan.

Latency tăng vọt từ 200ms lên hơn 8 giây. Timeout xảy ra liên tục. Khách hàng phản hồi tiêu cực trên mạng xã hội. Chúng tôi mất 3 ngày cuối tuần để khắc phục và quyết định: cần một giải pháp proxy thông minh hơn.

Kiến trúc Multi-Model AI Proxy

Sau nhiều đêm thức trắng, đội ngũ của mình đã thiết kế một kiến trúc proxy đa mô hình với các tính năng:

Triển khai với Node.js + TypeScript

Mình sẽ hướng dẫn các bạn xây dựng một proxy hoàn chỉnh. Trước tiên, khởi tạo project:

mkdir multi-model-proxy
cd multi-model-proxy
npm init -y
npm install express axios dotenv cors uuid
npm install -D typescript @types/express @types/node @types/cors ts-node

npx tsc --init

Cấu hình TypeScript và Types

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

Định nghĩa Types và Interfaces

// src/types.ts

export interface AIModel {
  id: string;
  provider: 'holysheep' | 'openai' | 'anthropic';
  name: string;
  contextWindow: number;
  costPerMToken: number; // USD per million tokens
  maxRPM: number; // requests per minute
  priority: number;
  enabled: boolean;
}

export interface ProxyRequest {
  model: string;
  messages: Array<{
    role: 'system' | 'user' | 'assistant';
    content: string;
  }>;
  temperature?: number;
  max_tokens?: number;
  stream?: boolean;
}

export interface ProxyResponse {
  id: string;
  model: string;
  provider: string;
  choices: Array<{
    message: {
      role: string;
      content: string;
    };
    finish_reason: string;
  }>;
  usage: {
    prompt_tokens: number;
    completion_tokens: number;
    total_tokens: number;
  };
  latency_ms: number;
  cost_usd: number;
}

export interface HealthStatus {
  model: string;
  status: 'healthy' | 'degraded' | 'down';
  avgLatency: number;
  successRate: number;
  lastCheck: Date;
}

Load Balancer Core Implementation

// src/loadBalancer.ts

import { AIModel, ProxyRequest, ProxyResponse } from './types';

interface ModelStats {
  successCount: number;
  failureCount: number;
  totalLatency: number;
  lastSuccess: Date;
  lastFailure: Date;
}

export class LoadBalancer {
  private models: Map = new Map();
  private stats: Map = new Map();
  private requestCount: Map = new Map();

  constructor() {
    this.initializeModels();
  }

  private initializeModels(): void {
    // Khởi tạo các model từ HolySheep AI
    // Đăng ký tại: https://www.holysheep.ai/register
    
    const modelConfigs: AIModel[] = [
      {
        id: 'gpt-4.1',
        provider: 'holysheep',
        name: 'GPT-4.1',
        contextWindow: 128000,
        costPerMToken: 8.0, // $8/MTok
        maxRPM: 500,
        priority: 1,
        enabled: true
      },
      {
        id: 'claude-sonnet-4.5',
        provider: 'holysheep',
        name: 'Claude Sonnet 4.5',
        contextWindow: 200000,
        costPerMToken: 15.0, // $15/MTok
        maxRPM: 300,
        priority: 2,
        enabled: true
      },
      {
        id: 'gemini-2.5-flash',
        provider: 'holysheep',
        name: 'Gemini 2.5 Flash',
        contextWindow: 1000000,
        costPerMToken: 2.50, // $2.50/MTok
        maxRPM: 1000,
        priority: 3,
        enabled: true
      },
      {
        id: 'deepseek-v3.2',
        provider: 'holysheep',
        name: 'DeepSeek V3.2',
        contextWindow: 64000,
        costPerMToken: 0.42, // Chỉ $0.42/MTok - tiết kiệm 85%+
        maxRPM: 2000,
        priority: 4,
        enabled: true
      }
    ];

    modelConfigs.forEach(model => {
      this.models.set(model.id, model);
      this.stats.set(model.id, {
        successCount: 0,
        failureCount: 0,
        totalLatency: 0,
        lastSuccess: new Date(),
        lastFailure: new Date()
      });
    });
  }

  selectModel(request: ProxyRequest): AIModel {
    // 1. Kiểm tra model được chỉ định
    if (request.model && this.models.has(request.model)) {
      const model = this.models.get(request.model)!;
      if (model.enabled && this.checkRateLimit(model.id)) {
        return model;
      }
    }

    // 2. Chọn model tối ưu dựa trên weighted scoring
    const enabledModels = Array.from(this.models.values())
      .filter(m => m.enabled && this.checkRateLimit(m.id));

    if (enabledModels.length === 0) {
      throw new Error('No available models');
    }

    // Tính điểm cho mỗi model
    const scoredModels = enabledModels.map(model => {
      const stats = this.stats.get(model.id)!;
      const latencyScore = stats.totalLatency / Math.max(stats.successCount, 1);
      const successRate = stats.successCount / Math.max(stats.successCount + stats.failureCount, 1);
      
      // Trọng số: ưu tiên latency thấp, success rate cao, chi phí thấp
      const score = 
        (successRate * 40) +
        ((1000 - Math.min(latencyScore, 1000)) / 10) +
        ((20 - model.costPerMToken) * 2) +
        (model.priority * 5);

      return { model, score };
    });

    scoredModels.sort((a, b) => b.score - a.score);
    return scoredModels[0].model;
  }

  private checkRateLimit(modelId: string): boolean {
    const current = this.requestCount.get(modelId) || 0;
    const model = this.models.get(modelId)!;
    
    if (current >= model.maxRPM) {
      return false;
    }
    
    this.requestCount.set(modelId, current + 1);
    return true;
  }

  recordSuccess(modelId: string, latency: number): void {
    const stats = this.stats.get(modelId);
    if (stats) {
      stats.successCount++;
      stats.totalLatency += latency;
      stats.lastSuccess = new Date();
    }
  }

  recordFailure(modelId: string): void {
    const stats = this.stats.get(modelId);
    if (stats) {
      stats.failureCount++;
      stats.lastFailure = new Date();
      
      // Auto-disable nếu failure rate > 50% trong 10 request gần nhất
      const recentRequests = stats.successCount + stats.failureCount;
      if (recentRequests >= 10) {
        const failureRate = stats.failureCount / recentRequests;
        const model = this.models.get(modelId);
        if (model && failureRate > 0.5) {
          model.enabled = false;
          console.log(Model ${modelId} auto-disabled due to high failure rate);
        }
      }
    }
  }

  resetRateLimits(): void {
    // Reset mỗi phút
    this.requestCount.clear();
  }
}

HolySheep AI Provider Implementation

Đây là phần quan trọng nhất — kết nối với HolySheep AI. Provider này hỗ trợ đầy đủ các model với chi phí cực kỳ cạnh tranh:

// src/providers/holysheep.ts

import axios, { AxiosInstance } from 'axios';
import { AIModel, ProxyRequest, ProxyResponse } from '../types';

const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';

export class HolySheepProvider {
  private apiKey: string;
  private client: AxiosInstance;

  constructor(apiKey: string) {
    this.apiKey = apiKey;
    this.client = axios.create({
      baseURL: HOLYSHEEP_BASE_URL,
      timeout: 30000,
      headers: {
        'Authorization': Bearer ${this.apiKey},
        'Content-Type': 'application/json'
      }
    });
  }

  async chat(request: ProxyRequest): Promise {
    const startTime = Date.now();
    
    try {
      const response = await this.client.post('/chat/completions', {
        model: request.model,
        messages: request.messages,
        temperature: request.temperature || 0.7,
        max_tokens: request.max_tokens || 2048,
        stream: request.stream || false
      });

      const latency = Date.now() - startTime;
      const data = response.data;

      // Tính chi phí
      const promptCost = (data.usage.prompt_tokens / 1000000) * this.getModelCost(request.model);
      const completionCost = (data.usage.completion_tokens / 1000000) * this.getModelCost(request.model);
      const totalCost = promptCost + completionCost;

      return {
        id: data.id,
        model: data.model,
        provider: 'holysheep',
        choices: data.choices,
        usage: data.usage,
        latency_ms: latency,
        cost_usd: totalCost
      };
    } catch (error: any) {
      const latency = Date.now() - startTime;
      
      // Xử lý các loại lỗi cụ thể
      if (error.response) {
        const status = error.response.status;
        const message = error.response.data?.error?.message || 'Unknown error';
        
        if (status === 401) {
          throw new Error('INVALID_API_KEY: Vui lòng kiểm tra API key của bạn tại https://www.holysheep.ai/register');
        } else if (status === 429) {
          throw new Error('RATE_LIMIT_EXCEEDED: Đã vượt quá giới hạn request. Vui lòng thử lại sau.');
        } else if (status === 500) {
          throw new Error('PROVIDER_ERROR: Lỗi từ phía server HolySheep. Đang thử provider dự phòng.');
        }
        
        throw new Error(HolySheep API Error (${status}): ${message});
      }
      
      throw new Error(Connection Error: ${error.message});
    }
  }

  async *streamChat(request: ProxyRequest): AsyncGenerator {
    const response = await this.client.post('/chat/completions', {
      model: request.model,
      messages: request.messages,
      temperature: request.temperature || 0.7,
      max_tokens: request.max_tokens || 2048,
      stream: true
    }, {
      responseType: 'stream'
    });

    const stream = response.data;
    const decoder = new TextDecoder();

    for await (const chunk of stream) {
      const lines = decoder.decode(chunk).split('\n');
      
      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const data = line.slice(6);
          
          if (data === '[DONE]') {
            return;
          }
          
          try {
            const parsed = JSON.parse(data);
            const content = parsed.choices?.[0]?.delta?.content;
            
            if (content) {
              yield content;
            }
          } catch {
            // Skip invalid JSON
          }
        }
      }
    }
  }

  private getModelCost(modelId: string): number {
    const costs: Record = {
      'gpt-4.1': 8.0,
      'claude-sonnet-4.5': 15.0,
      'gemini-2.5-flash': 2.50,
      'deepseek-v3.2': 0.42
    };
    
    return costs[modelId] || 1.0;
  }

  async healthCheck(): Promise {
    try {
      await this.client.get('/models', { timeout: 5000 });
      return true;
    } catch {
      return false;
    }
  }
}

Proxy Server — Điểm đến trung tâm

// src/server.ts

import express, { Request, Response } from 'express';
import cors from 'cors';
import { LoadBalancer } from './loadBalancer';
import { HolySheepProvider } from './providers/holysheep';
import { ProxyRequest } from './types';
import dotenv from 'dotenv';

dotenv.config();

const app = express();
const PORT = process.env.PORT || 3000;

// Middleware
app.use(cors());
app.use(express.json());

// Khởi tạo các thành phần
const loadBalancer = new LoadBalancer();
const holysheepProvider = new HolySheepProvider(
  process.env.HOLYSHEEP_API_KEY || 'YOUR_HOLYSHEEP_API_KEY'
);

// Reset rate limits mỗi phút
setInterval(() => {
  loadBalancer.resetRateLimits();
}, 60000);

// Health check endpoint
app.get('/health', (_req: Request, res: Response) => {
  res.json({
    status: 'healthy',
    timestamp: new Date().toISOString(),
    providers: {
      holysheep: 'active'
    }
  });
});

// Model stats endpoint
app.get('/models/stats', (_req: Request, res: Response) => {
  const models = Array.from(loadBalancer['models'].values()).map(m => ({
    id: m.id,
    name: m.name,
    provider: m.provider,
    costPerMToken: m.costPerMToken,
    enabled: m.enabled,
    priority: m.priority
  }));
  
  res.json({ models });
});

// Main chat completion endpoint
app.post('/v1/chat/completions', async (req: Request, res: Response) => {
  const request: ProxyRequest = req.body;
  const startTime = Date.now();

  // Validation
  if (!request.messages || !Array.isArray(request.messages)) {
    return res.status(400).json({
      error: {
        message: 'Invalid request: messages array is required',
        type: 'invalid_request_error'
      }
    });
  }

  // Chọn model tối ưu
  let selectedModel;
  try {
    selectedModel = loadBalancer.selectModel(request);
  } catch (error: any) {
    return res.status(503).json({
      error: {
        message: error.message || 'No available models',
        type: 'service_unavailable'
      }
    });
  }

  // Cập nhật request với model đã chọn
  const finalRequest = { ...request, model: selectedModel.id };

  try {
    // Gửi request đến HolySheep
    const response = await holysheepProvider.chat(finalRequest);
    
    // Ghi nhận thành công
    const latency = Date.now() - startTime;
    loadBalancer.recordSuccess(selectedModel.id, latency);

    // Log request
    console.log([${new Date().toISOString()}] ${selectedModel.name} | Latency: ${latency}ms | Cost: $${response.cost_usd.toFixed(4)});

    return res.json(response);
  } catch (error: any) {
    // Ghi nhận thất bại
    loadBalancer.recordFailure(selectedModel.id);

    console.error([ERROR] ${selectedModel.name}: ${error.message});

    // Thử failover sang model khác (tối đa 2 lần)
    let attempts = 0;
    while (attempts < 2) {
      attempts++;
      try {
        selectedModel = loadBalancer.selectModel(request);
        finalRequest.model = selectedModel.id;
        
        const response = await holysheepProvider.chat(finalRequest);
        loadBalancer.recordSuccess(selectedModel.id, Date.now() - startTime);
        
        return res.json(response);
      } catch (retryError: any) {
        loadBalancer.recordFailure(selectedModel.id);
        console.error([RETRY ${attempts}] Failed: ${retryError.message});
      }
    }

    // Tất cả đều thất bại
    return res.status(500).json({
      error: {
        message: 'All AI providers failed. Please try again later.',
        type: 'service_error'
      }
    });
  }
});

// Streaming endpoint
app.post('/v1/chat/streaming', async (req: Request, res: Response) => {
  const request: ProxyRequest = req.body;
  
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  try {
    const model = loadBalancer.selectModel(request);
    request.model = model.id;

    res.write(data: ${JSON.stringify({ model: model.name, provider: 'holysheep' })}\n\n);

    for await (const chunk of holysheepProvider.streamChat(request)) {
      res.write(data: ${JSON.stringify({ content: chunk })}\n\n);
    }

    res.write('data: [DONE]\n\n');
    res.end();
  } catch (error: any) {
    res.write(data: ${JSON.stringify({ error: error.message })}\n\n);
    res.end();
  }
});

// Error handling middleware
app.use((err: Error, _req: Request, res: Response, _next: express.NextFunction) => {
  console.error([FATAL] ${err.message});
  res.status(500).json({
    error: {
      message: err.message,
      type: 'internal_error'
    }
  });
});

app.listen(PORT, () => {
  console.log(`
╔══════════════════════════════════════════════════════════╗
║         Multi-Model AI Proxy Server Started               ║
╠══════════════════════════════════════════════════════════╣
║  Port: ${PORT}                                              ║
║  Provider: HolySheep AI                                   ║
║  Base URL: https://api.holysheep.ai/v1                    ║
║  Register: https://www.holysheep.ai/register              ║
╚══════════════════════════════════════════════════════════╝
  `);
});

export default app;

Client Usage Example

// client-example.ts

const PROXY_BASE_URL = 'http://localhost:3000';
const API_KEY = 'YOUR_HOLYSHEEP_API_KEY';

interface ChatMessage {
  role: 'system' | 'user' | 'assistant';
  content: string;
}

async function chatWithAutoBalance(messages: ChatMessage[]) {
  const response = await fetch(${PROXY_BASE_URL}/v1/chat/completions, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': Bearer ${API_KEY}
    },
    body: JSON.stringify({
      messages,
      temperature: 0.7,
      max_tokens: 2048
    })
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.error?.message || 'Request failed');
  }

  return response.json();
}

// Ví dụ sử dụng cho chatbot thương mại điện tử
async function handleCustomerQuery(query: string) {
  const messages: ChatMessage[] = [
    {
      role: 'system',
      content: 'Bạn là trợ lý chăm sóc khách hàng cho cửa hàng thời trang trực tuyến.'
    },
    {
      role: 'user',
      content: query
    }
  ];

  try {
    const result = await chatWithAutoBalance(messages);
    
    console.log('Model used:', result.model);
    console.log('Provider:', result.provider);
    console.log('Latency:', result.latency_ms, 'ms');
    console.log('Cost:', $${result.cost_usd.toFixed(4)});
    console.log('Response:', result.choices[0].message.content);
    
    return result;
  } catch (error) {
    console.error('Error:', error);
  }
}

// Streaming example cho real-time chat
async function chatStreaming(messages: ChatMessage[]) {
  const response = await fetch(${PROXY_BASE_URL}/v1/chat/streaming, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ messages })
  });

  const reader = response.body?.getReader();
  const decoder = new TextDecoder();
  let fullResponse = '';

  while (reader) {
    const { done, value } = await reader.read();
    if (done) break;

    const chunk = decoder.decode(value);
    const lines = chunk.split('\n');

    for (const line of lines) {
      if (line.startsWith('data: ')) {
        const data = line.slice(6);
        if (data === '[DONE]') {
          console.log('Stream completed');
          return fullResponse;
        }
        
        try {
          const parsed = JSON.parse(data);
          if (parsed.content) {
            fullResponse += parsed.content;
            process.stdout.write(parsed.content);
          }
          if (parsed.error) {
            console.error('Stream error:', parsed.error);
          }
        } catch {
          // Skip
        }
      }
    }
  }

  return fullResponse;
}

// Test
handleCustomerQuery('Cho tôi biết về chương trình khuyến mãi đang có');

Bảng so sánh chi phí: HolySheep vs Providers khác

Model HolySheep AI OpenAI Tiết kiệm
GPT-4.1 $8.00/MTok $15.00/MTok 47%
Claude Sonnet 4.5 $15.00/MTok $18.00/MTok 17%
Gemini 2.5 Flash $2.50/MTok $1.25/MTok -100%
DeepSeek V3.2 $0.42/MTok N/A Best value

DeepSeek V3.2 chỉ $0.42/MTok — tiết kiệm đến 85%+ so với các provider phổ biến khác!

So sánh tính năng thanh toán

Docker Deployment

# Dockerfile
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY dist ./dist
COPY src ./src

ENV NODE_ENV=production
ENV PORT=3000

EXPOSE 3000

CMD ["node", "dist/server.js"]

docker-compose.yml

version: '3.8' services: ai-proxy: build: . ports: - "3000:3000" environment: - HOLYSHEEP_API_KEY=${HOLYSHEEP_API_KEY} - PORT=3000 restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 # Nginx load balancer (optional) nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - ai-proxy restart: unless-stopped

Lỗi thường gặp và cách khắc phục

1. Lỗi 401 Unauthorized — API Key không hợp lệ

// ❌ Sai: Dùng API key từ OpenAI/Anthropic
const provider = new HolySheepProvider('sk-openai-xxxxx');

// ✅ Đúng: Sử dụng API key từ HolySheep AI
// Lấy key tại: https://www.holysheep.ai/register
const provider = new HolySheepProvider(process.env.HOLYSHEEP_API_KEY);

// Hoặc hardcode để test (KHÔNG khuyến nghị cho production)
const provider = new HolySheepProvider('YOUR_HOLYSHEEP_API_KEY');

Nguyên nhân: Bạn đang dùng API key từ provider khác (OpenAI, Anthropic) cho HolySheep provider.

Khắc phục: Truy cập đăng ký HolySheep AI để lấy API key mới.

2. Lỗi ECONNREFUSED — Server không khởi động được

// ❌ Sai: Dùng URL sai hoặc thiếu version
const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai'; // Thiếu /v1

// ✅ Đúng: Luôn dùng /v1 endpoint
const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';

// Kiểm tra kết nối trước khi khởi động server
async function verifyConnection() {
  try {
    const response = await axios.get(${HOLYSHEEP_BASE_URL}/models, {
      headers: { Authorization: Bearer ${process.env.HOLYSHEEP_API_KEY} }
    });
    console.log('Connection verified:', response.status);
  } catch (error) {
    console.error('Connection failed:', error.message);
    process.exit(1);
  }
}

verifyConnection().then(() => {
  app.listen(PORT, () => {
    console.log('Server started successfully');
  });
});

Nguyên nhân: Endpoint không đúng format hoặc server chưa khởi động.

Khắc phục: Luôn dùng base URL đầy đủ https://api.holysheep.ai/v1. Kiểm tra firewall và network settings.

3. Lỗi 429 Rate Limit — Vượt quá giới hạn request

// ❌ Sai: Gửi request liên tục không kiểm soát
async function sendManyRequests() {
  const promises = [];
  for (let i = 0; i < 1000; i++) {
    promises.push(provider.chat(request)); // Sẽ bị rate limit ngay
  }
  await Promise.all(promises);
}

// ✅ Đúng: Implement rate limiter với exponential backoff
class RateLimiter {
  private queue: Array<() => Promise> = [];
  private processing = false;
  private requestsPerSecond = 50; // Giới hạn 50 req/s

  async execute(fn: () => Promise): Promise {
    return new Promise((resolve, reject) => {
      this.queue.push(async () => {
        try {
          const result = await fn();
          resolve(result);
        } catch (error) {
          reject(error);
        }
      });
      
      if (!this.processing) {
        this.processQueue();
      }
    });
  }

  private async processQueue(): Promise {
    this.processing = true;
    
    while (this.queue.length > 0) {
      const batch = this.queue.splice(0, this.requestsPerSecond);
      await Promise.all(batch.map(fn => fn()));
      
      // Delay giữa các batch
      if (this.queue.length > 0) {
        await new Promise(resolve => setTimeout(resolve, 1000));
      }
    }
    
    this.processing = false;
  }
}

// Exponential backoff cho retry
async function fetchWithRetry(request: ProxyRequest, maxRetries = 3): Promise {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await holysheepProvider.chat(request);
    } catch (error: any) {
      if (error.message.includes('429') && attempt < maxRetries - 1) {
        const delay = Math.pow(2, attempt) * 1000; // 1s, 2s, 4s...
        console.log(Rate limited. Retrying in ${delay}ms...);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
  throw new Error('Max retries exceeded');
}

Nguyên nhân: Gửi quá nhiều request trong thời gian ngắn, vượt qua RPM limit của model.

Khắc phục: Implement rate limiter, sử dụng queue system, và exponential backoff cho retry.

4. Lỗi Timeout — Request mất quá lâu

// ❌ Sai: Timeout quá ngắn hoặc không có retry
const client = axios.create({
  timeout: 5000 // 5 giây có thể không đủ
});

// ✅ Đúng: Cấu hình timeout hợp lý và circuit breaker
class CircuitBreaker {
  private failures = 0;
  private lastFailureTime = 0;
  private state: 'closed' | 'open