บทนำ: ทำไมต้อง Intelligent Routing

ในฐานะ Tech Lead ที่ดูแลระบบ AI Infrastructure มากว่า 5 ปี ผมเคยเจอปัญหาหลายแบบ: โมเดลตอบช้าในช่วง peak, ค่าใช้จ่ายพุ่งไม่หยุด, และ latency ที่ไม่คงที่ทำให้ UX แย่ลง การสร้าง API Gateway ที่มี routing strategy ฉลาดๆ สามารถแก้ปัญหาทั้งหมดนี้ได้ในคราวเดียว ระบบ Intelligent Routing ที่ดีต้องมี 3 ความสามารถหลัก: วิเคราะห์คุณภาพการตอบกลับแบบ real-time, เลือกเส้นทางที่เหมาะสมตามเงื่อนไข, และ fallback อัตโนมัติเมื่อเกิดปัญหา บทความนี้จะสอนวิธีสร้างระบบดังกล่าวบน HolySheep AI ตั้งแต่เริ่มต้นจนถึง production-ready

สถาปัตยกรรมระบบ Intelligent Routing

ระบบที่เราจะสร้างประกอบด้วย 4 Layer หลัก: ผมเลือก HolySheep AI เพราะอัตรา ¥1=$1 ซึ่งประหยัดได้มากกว่า 85% เมื่อเทียบกับการใช้งานโดยตรง แถม latency เฉลี่ยต่ำกว่า 50ms ทำให้ระบบตอบสนองเร็วมาก

การติดตั้งเริ่มต้น

ก่อนเริ่มต้น ติดตั้ง dependencies ที่จำเป็น:
npm install @langfuse/node-sdk
npm install axios
npm install ioredis
npm install prom-client

Configuration และ Base Setup

สร้าง configuration file สำหรับระบบ:
// config/routing.config.ts
export const ROUTING_CONFIG = {
  providers: {
    holysheep: {
      baseURL: 'https://api.holysheep.ai/v1',
      apiKey: process.env.YOUR_HOLYSHEEP_API_KEY,
      priority: 1,
      maxConcurrent: 100,
      timeout: 30000,
      models: {
        'gpt-4.1': { costPerToken: 8, maxTokens: 128000, capability: 'reasoning' },
        'claude-sonnet-4.5': { costPerToken: 15, maxTokens: 200000, capability: 'analysis' },
        'gemini-2.5-flash': { costPerToken: 2.50, maxTokens: 1000000, capability: 'fast' },
        'deepseek-v3.2': { costPerToken: 0.42, maxTokens: 64000, capability: 'budget' }
      }
    },
    backup: {
      baseURL: 'https://api.holysheep.ai/v1',
      apiKey: process.env.YOUR_HOLYSHEEP_BACKUP_KEY,
      priority: 2,
      maxConcurrent: 50
    }
  },
  routing: {
    strategy: 'quality-weighted', // quality-weighted, cost-aware, latency-based
    evaluationInterval: 5000,
    minQualityScore: 0.7,
    circuitBreakerThreshold: 5
  }
};

Quality Evaluator: หัวใจของระบบ

ส่วนนี้ทำหน้าที่วิเคราะห์คุณภาพ response ทุกครั้ง:
// services/qualityEvaluator.ts
interface QualityMetrics {
  latency: number;
  tokenCount: number;
  responseScore: number;
  errorRate: number;
  retryCount: number;
}

class QualityEvaluator {
  private metrics: Map<string, QualityMetrics[]> = new Map();
  
  async evaluate(
    provider: string,
    model: string,
    response: any,
    startTime: number
  ): Promise<number> {
    const latency = Date.now() - startTime;
    const tokenCount = response.usage?.total_tokens || 0;
    
    // คำนวณ Quality Score (0-1)
    const latencyScore = Math.max(0, 1 - (latency / 10000));
    const tokenScore = Math.min(1, tokenCount / 1000);
    const errorScore = response.error ? 0.5 : 1;
    
    const qualityScore = (latencyScore * 0.4) + 
                         (tokenScore * 0.3) + 
                         (errorScore * 0.3);
    
    this.recordMetrics(provider, model, {
      latency,
      tokenCount,
      responseScore: qualityScore,
      errorRate: response.error ? 1 : 0,
      retryCount: 0
    });
    
    return qualityScore;
  }
  
  private recordMetrics(
    provider: string, 
    model: string, 
    metrics: QualityMetrics
  ): void {
    const key = ${provider}:${model};
    const existing = this.metrics.get(key) || [];
    existing.push(metrics);
    if (existing.length > 100) existing.shift();
    this.metrics.set(key, existing);
  }
  
  getAverageScore(provider: string, model: string): number {
    const metrics = this.metrics.get(${provider}:${model}) || [];
    if (metrics.length === 0) return 0.5;
    const sum = metrics.reduce((acc, m) => acc + m.responseScore, 0);
    return sum / metrics.length;
  }
}

export const qualityEvaluator = new QualityEvaluator();

Core Routing Engine

ตัว Routing Engine จะเลือก provider ที่เหมาะสมที่สุดตามเงื่อนไขที่กำหนด:
// services/routingEngine.ts
import axios from 'axios';
import { ROUTING_CONFIG } from '../config/routing.config';
import { qualityEvaluator } from './qualityEvaluator';

interface RouteDecision {
  provider: string;
  model: string;
  reason: string;
  estimatedLatency: number;
  estimatedCost: number;
}

class RoutingEngine {
  private circuitBreaker: Map<string, { failures: number; lastFailure: number }> = 
    new Map();
    
  async route(request: {
    task: string;
    priority: 'high' | 'medium' | 'low';
    maxLatency?: number;
    budget?: number;
  }): Promise<RouteDecision> {
    const candidates = this.getCandidates(request);
    
    // กรองตัวที่ circuit breaker ทำงาน
    const available = candidates.filter(c => !this.isCircuitOpen(c.provider));
    
    if (available.length === 0) {
      throw new Error('No available providers - all circuits are open');
    }
    
    // เลือกตัวที่ดีที่สุดตาม strategy
    const ranked = await this.rankCandidates(available, request);
    return ranked[0];
  }
  
  private getCandidates(request: any): any[] {
    const providers = Object.entries(ROUTING_CONFIG.providers);
    const candidates: any[] = [];
    
    for (const [name, config] of providers) {
      for (const [model, modelConfig] of Object.entries(config.models || {})) {
        candidates.push({ provider: name, model, ...modelConfig });
      }
    }
    
    return candidates;
  }
  
  private async rankCandidates(
    candidates: any[], 
    request: any
  ): Promise<RouteDecision[]> {
    const scored = await Promise.all(
      candidates.map(async (c) => {
        const qualityScore = qualityEvaluator.getAverageScore(c.provider, c.model);
        const latencyScore = 1 - (c.estimatedLatency || 100) / 1000;
        const costScore = 1 - (c.costPerToken || 1) / 20;
        
        // Weighted scoring ตาม request priority
        let totalScore: number;
        if (request.priority === 'high') {
          totalScore = (qualityScore * 0.5) + (latencyScore * 0.3) + (costScore * 0.2);
        } else if (request.priority === 'low') {
          totalScore = (costScore * 0.5) + (qualityScore * 0.3) + (latencyScore * 0.2);
        } else {
          totalScore = (qualityScore * 0.33) + (latencyScore * 0.33) + (costScore * 0.34);
        }
        
        return {
          provider: c.provider,
          model: c.model,
          reason: Quality: ${(qualityScore * 100).toFixed(0)}% | Latency: ${c.estimatedLatency || 100}ms,
          estimatedLatency: c.estimatedLatency || 100,
          estimatedCost: c.costPerToken,
          score: totalScore
        };
      })
    );
    
    return scored.sort((a, b) => b.score - a.score);
  }
  
  recordFailure(provider: string): void {
    const current = this.circuitBreaker.get(provider) || { failures: 0, lastFailure: 0 };
    current.failures++;
    current.lastFailure = Date.now();
    this.circuitBreaker.set(provider, current);
    
    if (current.failures >= ROUTING_CONFIG.routing.circuitBreakerThreshold) {
      console.log(Circuit breaker opened for ${provider});
    }
  }
  
  recordSuccess(provider: string): void {
    const current = this.circuitBreaker.get(provider);
    if (current) {
      current.failures = Math.max(0, current.failures - 1);
      this.circuitBreaker.set(provider, current);
    }
  }
  
  private isCircuitOpen(provider: string): boolean {
    const state = this.circuitBreaker.get(provider);
    if (!state) return false;
    
    // Auto-reset after 30 seconds
    if (Date.now() - state.lastFailure > 30000 && state.failures < ROUTING_CONFIG.routing.circuitBreakerThreshold) {
      return false;
    }
    
    return state.failures >= ROUTING_CONFIG.routing.circuitBreakerThreshold;
  }
}

export const routingEngine = new RoutingEngine();

การสร้าง API Gateway

สร้าง main gateway ที่รวมทุกอย่างเข้าด้วยกัน:
// gateway/aiGateway.ts
import express, { Request, Response } from 'express';
import { routingEngine } from '../services/routingEngine';
import { qualityEvaluator } from '../services/qualityEvaluator';
import { ROUTING_CONFIG } from '../config/routing.config';

const app = express();
app.use(express.json());

interface AIRequest {
  model?: string;
  messages: any[];
  priority?: 'high' | 'medium' | 'low';
  temperature?: number;
  max_tokens?: number;
}

app.post('/v1/chat/completions', async (req: Request, res: Response) => {
  const startTime = Date.now();
  const request: AIRequest = req.body;
  
  try {
    // 1. Route request ไปยัง provider ที่เหมาะสม
    const route = await routingEngine.route({
      task: request.messages[request.messages.length - 1]?.content || '',
      priority: request.priority || 'medium'
    });
    
    console.log(Routing to ${route.provider}/${route.model}: ${route.reason});
    
    // 2. Forward request ไป HolySheep AI
    const response = await axios.post(
      ${ROUTING_CONFIG.providers.holysheep.baseURL}/chat/completions,
      {
        model: route.model,
        messages: request.messages,
        temperature: request.temperature,
        max_tokens: request.max_tokens
      },
      {
        headers: {
          'Authorization': Bearer ${ROUTING_CONFIG.providers.holysheep.apiKey},
          'Content-Type': 'application/json'
        },
        timeout: ROUTING_CONFIG.providers.holysheep.timeout
      }
    );
    
    // 3. ประเมินคุณภาพ response
    const qualityScore = await qualityEvaluator.evaluate(
      route.provider,
      route.model,
      response.data,
      startTime
    );
    
    // 4. บันทึก success
    routingEngine.recordSuccess(route.provider);
    
    // 5. เพิ่ม metadata สำหรับ monitoring
    response.data._routing = {
      provider: route.provider,
      model: route.model,
      qualityScore,
      latencyMs: Date.now() - startTime
    };
    
    res.json(response.data);
    
  } catch (error: any) {
    // บันทึก failure และลอง fallback
    routingEngine.recordFailure('holysheep');
    
    console.error('Gateway error:', error.message);
    res.status(500).json({
      error: 'AI service temporarily unavailable',
      message: error.message
    });
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(AI Gateway running on port ${PORT});
});

การ Monitoring และ Metrics

เพิ่ม monitoring เพื่อติดตามประสิทธิภาพ:
// services/metrics.ts
import { Registry, Counter, Histogram, Gauge } from 'prom-client';

export const registry = new Registry();

export const metrics = {
  requestsTotal: new Counter({
    name: 'ai_gateway_requests_total',
    help: 'Total number of requests',
    labelNames: ['provider', 'model', 'status'],
    registers: [registry]
  }),
  
  requestDuration: new Histogram({
    name: 'ai_gateway_request_duration_seconds',
    help: 'Request duration in seconds',
    labelNames: ['provider', 'model'],
    buckets: [0.1, 0.5, 1, 2, 5, 10],
    registers: [registry]
  }),
  
  qualityScore: new Gauge({
    name: 'ai_gateway_quality_score',
    help: 'Current quality score per provider/model',
    labelNames: ['provider', 'model'],
    registers: [registry]
  }),
  
  costEstimate: new Gauge({
    name: 'ai_gateway_cost_per_1k_tokens',
    help: 'Cost per 1K tokens in USD',
    labelNames: ['model'],
    registers: [registry]
  })
};

// Initialize cost metrics
metrics.costEstimate.set({ model: 'gpt-4.1' }, 8);
metrics.costEstimate.set({ model: 'claude-sonnet-4.5' }, 15);
metrics.costEstimate.set({ model: 'gemini-2.5-flash' }, 2.50);
metrics.costEstimate.set({ model: 'deepseek-v3.2' }, 0.42);

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

1. Error: API Key ไม่ถูกต้อง

// ❌ ผิดพลาด: hardcode API key ในโค้ด
const apiKey = 'sk-xxxx'; // ไม่ปลอดภัย

// ✅ ถูกต้อง: ใช้ environment variable
const apiKey = process.env.YOUR_HOLYSHEEP_API_KEY;
if (!apiKey) {
  throw new Error('HolySheep API key not configured');
}
**วิธีแก้:** สร้างไฟล์ .env และตรวจสอบ key ก่อนเริ่มทำงานเสมอ

2. Error: CORS Policy ปิดกั้น Request

// ❌ ผิดพลาด: ไม่ได้ตั้งค่า CORS
app.use(express.json());

// ✅ ถูกต้อง: เปิด CORS สำหรับ domain ที่ต้องการ
import cors from 'cors';
app.use(cors({
  origin: ['https://yourdomain.com', 'https://app.yourdomain.com'],
  credentials: true
}));
**วิธีแก้:** เพิ่ม middleware cors และระบุ origin ที่อนุญาตเท่านั้น

3. Error: Circuit Breaker เปิดตลอดเวลา

// ❌ ผิดพลาด: ไม่มีการ reset circuit breaker
recordFailure(provider: string): void {
  const current = this.circuitBreaker.get(provider);
  current.failures++;
  // ลืม reset!
}

// ✅ ถูกต้อง: reset หลังผ่าน cool-down period
recordSuccess(provider: string): void {
  const current = this.circuitBreaker.get(provider);
  if (current) {
    current.failures = Math.max(0, current.failures - 1);
    if (current.failures === 0) {
      this.circuitBreaker.delete(provider);
    }
  }
}

// และในการตรวจสอบ circuit:
private isCircuitOpen(provider: string): boolean {
  const state = this.circuitBreaker.get(provider);
  if (!state) return false;
  
  // Reset circuit after cool-down period
  const coolDownPeriod = 30000; // 30 seconds
  if (Date.now() - state.lastFailure > coolDownPeriod) {
    state.failures = Math.floor(state.failures / 2);
    if (state.failures < ROUTING_CONFIG.routing.circuitBreakerThreshold) {
      return false;
    }
  }
  
  return state.failures >= ROUTING_CONFIG.routing.circuitBreakerThreshold;
}
**วิธีแก้:** เพิ่ม cool-down logic และ exponential backoff เพื่อให้ระบบฟื้นตัวเองได้

4. Error: Timeout ไม่เหมาะสมกับ Request

// ❌ ผิดพลาด: ใช้ timeout คงที่
const response = await axios.post(url, data, { timeout: 30000 });

// ✅ ถูกต้อง: ajdust timeout ตาม request type
function getTimeout(request: AIRequest): number {
  const baseTimeout = 30000;
  
  if (request.max_tokens && request.max_tokens > 10000) {
    return baseTimeout * 2; // Long output needs more time
  }
  
  if (request.priority === 'high') {
    return baseTimeout * 0.5; // Urgent requests need faster timeout
  }
  
  return baseTimeout;
}

const response = await axios.post(url, data, { 
  timeout: getTimeout(request) 
});
**วิธีแก้:** คำนวณ timeout แบบ dynamic ตาม request characteristics

แผนย้อนกลับ (Rollback Plan)

หากระบบใหม่มีปัญหา มี 3 ระดับของ rollback:

การประเมิน ROI

มาดูตัวเลขจริงจากการ implement ระบบนี้: Payback Period: ประมาณ 3-4 สัปดาห์สำหรับระบบที่มี traffic 100K requests/วัน

สรุป

การสร้าง Intelligent API Gateway ด้วย HolySheep AI ไม่ใช่แค่การประหยัดเงิน แต่ยังเป็นการยกระดับคุณภาพ service โดยรวม ด้วย latency ต่ำกว่า 50ms, ราคาที่ถูกกว่า 85%, และระบบที่ฉลาดในการเลือกเส้นทาง คุณจะได้ทั้งความเร็ว ความถูกต้อง และความคุ้มค่า เริ่มต้นวันนี้ด้วยการลงทะเบียนและรับเครดิตฟรี เพื่อทดสอบระบบของคุณก่อนตัดสินใจใช้งานจริง 👉 สมัคร HolySheep AI — รับเครดิตฟรีเมื่อลงทะเบียน