Câu chuyện thực tế: Khi hệ thống AI thương mại điện tử bị "quá tải" và cách tôi giải cứu bằng Kubernetes
Tháng 11 năm 2025, tôi nhận được cuộc gọi khẩn cấp từ một startup thương mại điện tử lớn tại Việt Nam. Hệ thống chatbot AI chăm sóc khách hàng của họ vừa "chết" ngay giữa đợt flash sale với 50,000 người dùng đồng thời. Mỗi phút downtime ước tính thiệt hại 200 triệu đồng.
Vấn đề cốt lõi: Kiến trúc monolith cũ chỉ có 3 server, không có load balancing, retry logic hay circuit breaker. Khi API của nhà cung cấp AI chậm 2 giây, toàn bộ hệ thống bị nghẽn.
Sau 72 giờ không ngủ, tôi triển khai một kiến trúc AI gateway hoàn chỉnh trên Kubernetes với khả năng tự phục hồi, scale linh hoạt và chi phí tối ưu nhờ
HolySheep AI. Bài viết này sẽ hướng dẫn bạn từng bước cách xây dựng hệ thống tương tự.
1. Tại sao cần AI Gateway trên Kubernetes?
Trước khi đi vào chi tiết, hãy hiểu rõ vấn đề:
- Không kiểm soát được chi phí: Không có rate limiting, một request bị loop có thể gây ra hàng ngàn cuộc gọi API không cần thiết
- Không có khả năng chịu lỗi: Khi provider AI gặp sự cố, toàn bộ service "chết" theo
- Khó scale: Kiến trúc đơn lẻ không tận dụng được Kubernetes auto-scaling
- Không có monitoring: Không biết latency thực, không phát hiện được bottleneck
Với HolySheep AI, bạn được hưởng tỷ giá ưu đãi ¥1=$1 (tiết kiệm 85%+), thanh toán qua WeChat/Alipay, độ trễ trung bình dưới 50ms, và tín dụng miễn phí khi đăng ký. Nhưng quan trọng hơn, bạn cần một gateway thông minh để tận dụng tối đa nguồn lực này.
2. Kiến trúc tổng quan
┌─────────────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Ingress │───▶│ AI Gateway │───▶│ Backend │ │
│ │ (NGINX) │ │ (Python) │ │ Services │ │
│ └─────────────┘ └──────┬──────┘ └─────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Redis │ │ Prometheus │ │ Grafana │ │
│ │ Cache │ │ Metrics │ │ Dashboard │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────┐
│ HolySheep API │
│ https://api. │
│ holysheep.ai/v1 │
└─────────────────┘
3. Triển khai AI Gateway với Python FastAPI
3.1 Cài đặt dependencies
# Tạo project structure
mkdir -p ai-gateway/src
cd ai-gateway
requirements.txt
cat > requirements.txt << 'EOF'
fastapi==0.109.0
uvicorn[standard]==0.27.0
httpx==0.26.0
redis==5.0.1
pydantic==2.5.3
tenacity==8.2.3
prometheus-client==0.19.0
kubernetes==29.0.0
PyJWT==2.8.0
python-dotenv==1.0.0
EOF
pip install -r requirements.txt
3.2 Cấu hình core gateway service
# src/gateway.py
import os
import time
import hashlib
from typing import Optional, Dict, Any
from datetime import datetime, timedelta
import httpx
from fastapi import FastAPI, HTTPException, Request, Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import redis
from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST
import kubernetes.client
from kubernetes.client.rest import ApiException
============== CONFIGURATION ==============
class Config:
# HolySheep API Configuration - KHÔNG BAO GIỜ dùng api.openai.com
HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY")
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1" # Luôn dùng HolySheep endpoint
HOLYSHEEP_MODEL = os.getenv("HOLYSHEEP_MODEL", "gpt-4.1")
# Redis Configuration
REDIS_HOST = os.getenv("REDIS_HOST", "redis.default.svc.cluster.local")
REDIS_PORT = int(os.getenv("REDIS_PORT", "6379"))
REDIS_DB = int(os.getenv("REDIS_DB", "0"))
# Rate Limiting
RATE_LIMIT_REQUESTS = int(os.getenv("RATE_LIMIT_REQUESTS", "100"))
RATE_LIMIT_WINDOW = int(os.getenv("RATE_LIMIT_WINDOW", "60"))
# Circuit Breaker
CIRCUIT_BREAKER_THRESHOLD = int(os.getenv("CIRCUIT_BREAKER_THRESHOLD", "5"))
CIRCUIT_BREAKER_TIMEOUT = int(os.getenv("CIRCUIT_BREAKER_TIMEOUT", "60"))
config = Config()
============== METRICS ==============
REQUEST_COUNT = Counter(
'ai_gateway_requests_total',
'Total requests to AI gateway',
['model', 'status']
)
REQUEST_LATENCY = Histogram(
'ai_gateway_request_latency_seconds',
'Request latency in seconds',
['model']
)
CACHE_HIT = Counter('ai_gateway_cache_hits_total', 'Cache hits')
CIRCUIT_BREAKER_STATE = Counter(
'ai_gateway_circuit_breaker_events_total',
'Circuit breaker events',
['state']
)
============== REDIS CLIENT ==============
redis_client = redis.Redis(
host=config.REDIS_HOST,
port=config.REDIS_PORT,
db=config.REDIS_DB,
decode_responses=True
)
============== CIRCUIT BREAKER ==============
class CircuitBreaker:
def __init__(self, failure_threshold: int = 5, timeout: int = 60):
self.failure_threshold = failure_threshold
self.timeout = timeout
self.failures = 0
self.last_failure_time = None
self.state = "CLOSED" # CLOSED, OPEN, HALF_OPEN
def record_success(self):
self.failures = 0
self.state = "CLOSED"
def record_failure(self):
self.failures += 1
self.last_failure_time = time.time()
if self.failures >= self.failure_threshold:
self.state = "OPEN"
CIRCUIT_BREAKER_STATE.labels(state="OPEN").inc()
def can_attempt(self) -> bool:
if self.state == "CLOSED":
return True
if self.state == "OPEN":
if time.time() - self.last_failure_time > self.timeout:
self.state = "HALF_OPEN"
CIRCUIT_BREAKER_STATE.labels(state="HALF_OPEN").inc()
return True
return False
return True
circuit_breaker = CircuitBreaker(
failure_threshold=config.CIRCUIT_BREAKER_THRESHOLD,
timeout=config.CIRCUIT_BREAKER_TIMEOUT
)
============== MODELS ==============
class ChatRequest(BaseModel):
model: str = Field(default="gpt-4.1", description="Model name")
messages: list = Field(..., description="Chat messages")
temperature: float = Field(default=0.7, ge=0, le=2)
max_tokens: int = Field(default=2048, ge=1, le=128000)
stream: bool = Field(default=False)
class ChatResponse(BaseModel):
id: str
model: str
created: int
content: str
usage: Dict[str, int]
cached: bool = False
============== CACHE KEY GENERATOR ==============
def generate_cache_key(messages: list, model: str, temperature: float) -> str:
content = f"{model}:{temperature}:{str(messages)}"
return f"ai:cache:{hashlib.sha256(content.encode()).hexdigest()}"
============== RATE LIMITING ==============
async def check_rate_limit(client_id: str) -> bool:
key = f"ratelimit:{client_id}"
current = redis_client.get(key)
if current is None:
redis_client.setex(key, config.RATE_LIMIT_WINDOW, 1)
return True
if int(current) >= config.RATE_LIMIT_REQUESTS:
return False
redis_client.incr(key)
return True
============== HOLYSHEEP API CALL ==============
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10),
retry=retry_if_exception_type((httpx.TimeoutException, httpx.ConnectError))
)
async def call_holysheep_api(messages: list, model: str, temperature: float, max_tokens: int):
if not circuit_breaker.can_attempt():
raise HTTPException(status_code=503, detail="Service temporarily unavailable (circuit breaker open)")
headers = {
"Authorization": f"Bearer {config.HOLYSHEEP_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
start_time = time.time()
try:
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(
f"{config.HOLYSHEEP_BASE_URL}/chat/completions",
headers=headers,
json=payload
)
response.raise_for_status()
circuit_breaker.record_success()
return response.json()
except Exception as e:
circuit_breaker.record_failure()
raise HTTPException(status_code=500, detail=f"HolySheep API error: {str(e)}")
finally:
latency = time.time() - start_time
REQUEST_LATENCY.labels(model=model).observe(latency)
============== FASTAPI APP ==============
app = FastAPI(title="AI Gateway", version="1.0.0")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/health")
async def health_check():
return {
"status": "healthy",
"circuit_breaker": circuit_breaker.state,
"redis": redis_client.ping()
}
@app.get("/metrics")
async def metrics():
return generate_latest()
@app.post("/v1/chat/completions", response_model=ChatResponse)
async def chat_completions(
request: ChatRequest,
req: Request
):
client_id = req.headers.get("X-Client-ID", req.client.host)
# Rate limiting check
if not await check_rate_limit(client_id):
raise HTTPException(status_code=429, detail="Rate limit exceeded")
# Cache check (chỉ cho non-streaming)
if not request.stream:
cache_key = generate_cache_key(
request.messages,
request.model,
request.temperature
)
cached = redis_client.get(cache_key)
if cached:
CACHE_HIT.inc()
data = eval(cached) # Safe vì data từ Redis của chúng ta
REQUEST_COUNT.labels(model=request.model, status="cache_hit").inc()
return ChatResponse(cached=True, **data)
# Call HolySheep API
start_time = time.time()
result = await call_holysheep_api(
messages=request.messages,
model=request.model,
temperature=request.temperature,
max_tokens=request.max_tokens
)
# Cache result
if not request.stream:
cache_ttl = 3600 # 1 hour
redis_client.setex(cache_key, cache_ttl, str(result))
REQUEST_COUNT.labels(model=request.model, status="success").inc()
return ChatResponse(
id=result.get("id", "unknown"),
model=result.get("model", request.model),
created=result.get("created", int(time.time())),
content=result["choices"][0]["message"]["content"],
usage=result.get("usage", {}),
cached=False
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8080)
4. Kubernetes Manifests
4.1 Deployment với HPA (Horizontal Pod Autoscaler)
# kubernetes/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-gateway
namespace: ai-services
labels:
app: ai-gateway
version: v1
spec:
replicas: 3
selector:
matchLabels:
app: ai-gateway
template:
metadata:
labels:
app: ai-gateway
version: v1
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
prometheus.io/path: "/metrics"
spec:
containers:
- name: ai-gateway
image: holysheep/ai-gateway:v1.0.0
imagePullPolicy: Always
ports:
- containerPort: 8080
name: http
env:
- name: HOLYSHEEP_API_KEY
valueFrom:
secretKeyRef:
name: ai-gateway-secrets
key: holysheep-api-key
optional: false
- name: HOLYSHEEP_MODEL
value: "gpt-4.1"
- name: REDIS_HOST
value: "redis-master.ai-services.svc.cluster.local"
- name: REDIS_PORT
value: "6379"
- name: RATE_LIMIT_REQUESTS
value: "100"
- name: RATE_LIMIT_WINDOW
value: "60"
- name: CIRCUIT_BREAKER_THRESHOLD
value: "5"
- name: CIRCUIT_BREAKER_TIMEOUT
value: "60"
resources:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 2
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"]
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ai-gateway
topologyKey: kubernetes.io/hostname
terminationGracePeriodSeconds: 60
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-gateway-hpa
namespace: ai-services
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-gateway
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
- type: Pods
pods:
metric:
name: ai_gateway_request_latency_seconds_p99
target:
type: AverageValue
averageValue: "500m"
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
---
apiVersion: v1
kind: Service
metadata:
name: ai-gateway-service
namespace: ai-services
labels:
app: ai-gateway
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: ai-gateway
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ai-gateway-ingress
namespace: ai-services
annotations:
nginx.ingress.kubernetes.io/rate-limit: "100"
nginx.ingress.kubernetes.io/rate-limit-window: "60s"
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "10"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- api.yourdomain.com
secretName: ai-gateway-tls
rules:
- host: api.yourdomain.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: ai-gateway-service
port:
number: 80
- path: /health
pathType: Exact
backend:
service:
name: ai-gateway-service
port:
number: 80
- path: /metrics
pathType: Exact
backend:
service:
name: ai-gateway-service
port:
number: 80
4.2 Redis Cache Deployment
# kubernetes/redis.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
namespace: ai-services
data:
redis.conf: |
maxmemory 1gb
maxmemory-policy allkeys-lru
save ""
appendonly no
tcp-keepalive 60
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-master
namespace: ai-services
spec:
serviceName: redis-master
replicas: 3
selector:
matchLabels:
app: redis
role: master
template:
metadata:
labels:
app: redis
role: master
spec:
containers:
- name: redis
image: redis:7.2-alpine
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: redis-config
mountPath: /usr/local/etc/redis/
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "1Gi"
livenessProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
exec:
command: ["redis-cli", "ping"]
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: redis-config
configMap:
name: redis-config
volumeClaimTemplates:
- metadata:
name: redis-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "fast-ssd"
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: redis-master
namespace: ai-services
spec:
clusterIP: None
selector:
app: redis
role: master
ports:
- port: 6379
targetPort: 6379
5. Monitoring với Prometheus và Grafana
# kubernetes/monitoring.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: []
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: 'ai-gateway'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
---
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-alerts
namespace: monitoring
data:
alerts.yml: |
groups:
- name: ai-gateway-alerts
rules:
- alert: HighErrorRate
expr: |
rate(ai_gateway_requests_total{status=~"5.."}[5m])
/ rate(ai_gateway_requests_total[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "AI Gateway high error rate"
description: "Error rate is {{ $value | humanizePercentage }}"
- alert: CircuitBreakerOpen
expr: increase(ai_gateway_circuit_breaker_events_total{state="OPEN"}[5m]) > 0
for: 1m
labels:
severity: warning
annotations:
summary: "Circuit breaker is OPEN"
description: "HolySheep API may be experiencing issues"
- alert: HighLatency
expr: |
histogram_quantile(0.99,
rate(ai_gateway_request_latency_seconds_bucket[5m])
) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "High API latency detected"
description: "P99 latency is {{ $value | humanizeDuration }}"
- alert: HighMemoryUsage
expr: |
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is {{ $value | humanizePercentage }}"
- alert: PodRestartingTooMuch
expr: |
rate(kube_pod_container_status_restarts_total[1h]) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.pod }} restarting frequently"
description: "Container restart rate is {{ $value }} per second"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: monitoring
spec:
replicas: 2
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus:v2.48.0
args:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
- '--storage.tsdb.path=/prometheus'
ports:
- containerPort: 9090
volumeMounts:
- name: prometheus-config
mountPath: /etc/prometheus/
- name: prometheus-rules
mountPath: /etc/prometheus/rules/
- name: prometheus-storage
mountPath: /prometheus
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
volumes:
- name: prometheus-config
configMap:
name: prometheus-config
- name: prometheus-rules
configMap:
name: prometheus-alerts
- name: prometheus-storage
emptyDir: {}
6. Triển khai hoàn chỉnh
#!/bin/bash
deploy.sh - Script triển khai hoàn chỉnh
set -e
NAMESPACE="ai-services"
MONITORING_NS="monitoring"
echo "=== Bắt đầu triển khai AI Gateway ==="
Tạo namespaces
kubectl create namespace $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
kubectl create namespace $MONITORING_NS --dry-run=client -o yaml | kubectl apply -f -
Tạo secrets (thay YOUR_HOLYSHEEP_API_KEY bằng API key thực tế)
kubectl create secret generic ai-gateway-secrets \
--namespace=$NAMESPACE \
--from-literal=holysheep-api-key="YOUR_HOLYSHEEP_API_KEY" \
--dry-run=client -o yaml | kubectl apply -f -
Triển khai Redis
echo ">>> Triển khai Redis..."
kubectl apply -f kubernetes/redis.yaml
Đợi Redis sẵn sàng
echo ">>> Đợi Redis..."
kubectl wait --for=condition=ready pod \
-l app=redis,role=master \
--namespace=$NAMESPACE \
--timeout=300s
Triển khai AI Gateway
echo ">>> Triển khai AI Gateway..."
kubectl apply -f kubernetes/deployment.yaml
Đợi pods sẵn sàng
echo ">>> Đợi AI Gateway pods..."
kubectl wait --for=condition=ready pod \
-l app=ai-gateway \
--namespace=$NAMESPACE \
--timeout=300s
Triển khai Monitoring
echo ">>> Triển khai Monitoring..."
kubectl apply -f kubernetes/monitoring.yaml
Kiểm tra trạng thái
echo ">>> Kiểm tra trạng thái..."
kubectl get pods -n $NAMESPACE
kubectl get pods -n $MONITORING_NS
kubectl get svc -n $NAMESPACE
Test health endpoint
echo ">>> Test health endpoint..."
sleep 10
GATEWAY_POD=$(kubectl get pod -l app=ai-gateway -n $NAMESPACE -o jsonpath='{.items[0].metadata.name}')
kubectl exec $GATEWAY_POD -n $NAMESPACE -- curl -s http://localhost:8080/health
echo "=== Triển khai hoàn tất ==="
7. Tối ưu chi phí với HolySheep AI
Với kiến trúc gateway này, bạn hoàn toàn kiểm soát được chi phí API. Dưới đây là so sánh chi phí thực tế khi xử lý 10 triệu tokens mỗi tháng:
| Provider | Model | Giá/MTok | Chi phí 10M tokens |
| OpenAI | GPT-4 | $60 | $600 |
| Anthropic | Claude Sonnet 4.5 | $15 | $150 |
| Google | Gemini 2.5 Flash | $2.50 | $25 |
| HolySheep | GPT-4.1 | $8 | $80 |
| HolySheep | DeepSeek V3.2 | $0.42 | $4.20 |
Với HolySheep AI, bạn tiết kiệm 85%+ so với OpenAI trực tiếp, trong khi vẫn có độ trễ dưới 50ms và thanh toán qua WeChat/Alipay thuận tiện.
8. Client SDK cho các ngôn ngữ khác nhau
// typescript-client/src/ai-client.ts
interface AIConfig {
apiKey: string;
baseUrl?: string; // Mặc định: https://api.holysheep.ai/v1
timeout?: number;
maxRetries?: number;
}
interface ChatMessage {
role: 'system' | 'user' | 'assistant';
content: string;
}
interface ChatCompletionRequest {
model: string;
messages: ChatMessage[];
temperature?: number;
max_tokens?: number;
stream?: boolean;
}
interface ChatCompletionResponse {
id: string;
model: string;
created: number;
choices: {
message: ChatMessage;
finish_reason: string;
}[];
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
}
class AIClient {
private apiKey: string;
private baseUrl: string;
private timeout: number;
private maxRetries: number;
constructor(config: AIConfig) {
this.apiKey = config.apiKey;
this.baseUrl = config.baseUrl || 'https://api.holysheep.ai/v1';
this.timeout = config.timeout || 30000;
this.maxRetries = config.maxRetries || 3;
}
private async request(
endpoint: string,
options: RequestInit = {}
): Promise {
const url = ${this.baseUrl}${endpoint};
const headers = {
'Authorization': Bearer ${this.apiKey},
'Content-Type': 'application/json',
...options.headers,
};
for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
const response = await fetch(url, {
...options,
headers,
signal: controller.signal,
});
clearTimeout(timeoutId);
if (!response.ok) {
const error = await response.json().catch(() => ({}));
throw new AIError(
response.status,
error.error?.message || HTTP ${response.status}
);
}
return await response.json();
} catch (error) {
if (attempt === this.maxRetries) throw error;
await this.delay(Math.pow(2, attempt) * 1000);
}
}
throw new Error('Max retries exceeded');
}
private delay(ms: number): Promise {
return new Promise(resolve => setTimeout(resolve, ms));
}
async chatCompletion(request: ChatCompletionRequest): Promise {
return this.request('/chat/completions', {
method: 'POST',
body: JSON.stringify(request),
});
}
async *streamChatCompletion(
request: ChatCompletionRequest
): AsyncGenerator {
const response = await fetch(${this.baseUrl}/chat/completions, {
method: 'POST
Tài nguyên liên quan
Bài viết liên quan