Bắt đầu bằng một kịch bản thực tế

Một ngày thứ Hai đẹp trời, hệ thống của tôi đột nhiên trả về lỗi:
ConnectionError: timeout after 30000ms
  at HTTPSRequestHandler.finishRequest (/app/node_modules/holysheep-sdk/dist/index.js:142:15)
  at ClientRequest. (/app/node_modules/holysheep-sdk/dist/index.js:98:23)
  at Socket.socketErrorListener (_http_client.js:1267:16)

Response: {
  "error": {
    "code": "INVALID_REQUEST_PARAM",
    "message": "Parameter 'model' has changed type from string to enum",
    "details": "Allowed values: ['gpt-4o', 'claude-3.5-sonnet', 'deepseek-v3']"
  }
}
Hóa ra nhà cung cấp AI đã thay đổi API mà không thông báo. Đó là lúc tôi nhận ra: **contract testing không chỉ là best practice, mà là bắt buộc** khi làm việc với các API AI. Trong bài viết này, tôi sẽ chia sẻ cách tôi xây dựng hệ thống contract testing để bắt những thay đổi này trước khi chúng gây ra sự cố production.

Contract Testing là gì và tại sao cần thiết với AI API

Contract testing là phương pháp kiểm tra để đảm bảo: Với [HolySheep AI](https://www.holysheep.ai/register) - nền tảng API AI có tỷ giá **¥1 = $1** (tiết kiệm 85%+), việc implement contract testing giúp bạn:

Triển khai Contract Testing với HolySheep AI

Cài đặt môi trường

npm init -y
npm install --save-dev jest @pact-foundation/pact axios

Bước 1: Định nghĩa Contract (Provider State)

// contracts/holysheep-ai-contract.spec.js
const { Pact } = require('@pact-foundation/pact');
const path = require('path');

const provider = new Pact({
  consumer: 'my-ai-app',
  provider: 'holysheep-ai',
  port: 1234,
  dir: path.resolve(__dirname, '../pacts'),
  spec: 3,
});

describe('HolySheep AI Contract Tests', () => {
  describe('Chat Completion API', () => {
    beforeAll(() => provider.setup());
    afterAll(() => provider.finalize());

    it('should accept valid chat completion request', async () => {
      // Arrange: Định nghĩa expected contract
      await provider.addInteraction({
        states: [{ description: 'API is available' }],
        uponReceiving: 'a valid chat completion request',
        withRequest: {
          method: 'POST',
          path: '/v1/chat/completions',
          headers: {
            'Authorization': 'Bearer YOUR_HOLYSHEEP_API_KEY',
            'Content-Type': 'application/json'
          },
          body: {
            model: 'gpt-4o',
            messages: [
              { role: 'user', content: 'Hello' }
            ],
            temperature: 0.7,
            max_tokens: 100
          }
        },
        willRespondWith: {
          status: 200,
          headers: { 'Content-Type': 'application/json' },
          body: {
            id: 'chatcmpl-xxx',
            object: 'chat.completion',
            created: 1700000000,
            model: 'gpt-4o',
            choices: [
              {
                index: 0,
                message: {
                  role: 'assistant',
                  content: 'Hello! How can I help you?'
                },
                finish_reason: 'stop'
              }
            ],
            usage: {
              prompt_tokens: 10,
              completion_tokens: 20,
              total_tokens: 30
            }
          }
        }
      });

      // Act: Gửi request thực tế
      const axios = require('axios');
      const response = await axios.post('https://api.holysheep.ai/v1/chat/completions', {
        model: 'gpt-4o',
        messages: [{ role: 'user', content: 'Hello' }],
        temperature: 0.7,
        max_tokens: 100
      }, {
        headers: {
          'Authorization': 'Bearer YOUR_HOLYSHEEP_API_KEY',
          'Content-Type': 'application/json'
        }
      });

      // Assert: Verify response match contract
      expect(response.data).toMatchObject({
        id: expect.any(String),
        object: 'chat.completion',
        model: 'gpt-4o',
        choices: expect.arrayContaining([
          expect.objectContaining({
            message: expect.objectContaining({
              role: 'assistant',
              content: expect.any(String)
            })
          })
        ])
      });
    });
  });
});

Bước 2: Chạy Consumer Contract Test

// consumer-contract.test.js
const axios = require('axios');

const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';
const API_KEY = process.env.YOUR_HOLYSHEEP_API_KEY;

// Schema validation với Zod
const { z } = require('zod');

const ChatCompletionResponseSchema = z.object({
  id: z.string(),
  object: z.literal('chat.completion'),
  created: z.number(),
  model: z.string(),
  choices: z.array(z.object({
    index: z.number(),
    message: z.object({
      role: z.enum(['assistant', 'user', 'system']),
      content: z.string()
    }),
    finish_reason: z.string()
  })),
  usage: z.object({
    prompt_tokens: z.number(),
    completion_tokens: z.number(),
    total_tokens: z.number()
  })
});

describe('Consumer Contract Validation', () => {
  test('should validate response against expected schema', async () => {
    try {
      const response = await axios.post(
        ${HOLYSHEEP_BASE_URL}/chat/completions,
        {
          model: 'gpt-4o',
          messages: [{ role: 'user', content: 'Validate this response' }],
          max_tokens: 50
        },
        {
          headers: {
            'Authorization': Bearer ${API_KEY},
            'Content-Type': 'application/json'
          },
          timeout: 10000
        }
      );

      // Validate response structure
      const result = ChatCompletionResponseSchema.safeParse(response.data);
      
      if (!result.success) {
        console.error('Contract Violation:', result.error.issues);
        throw new Error(Contract violated: ${result.error.issues.map(i => i.message).join(', ')});
      }

      console.log('✅ Contract validated successfully');
      console.log('Latency:', response.headers['x-response-time'] || 'N/A', 'ms');
      
    } catch (error) {
      if (error.code === 'ECONNABORTED') {
        throw new Error('Contract test failed: Request timeout (>10s)');
      }
      if (error.response?.status === 401) {
        throw new Error('Contract test failed: Invalid API key');
      }
      throw error;
    }
  });

  test('should handle rate limit gracefully', async () => {
    const errors = [];
    
    // Send 100 rapid requests
    for (let i = 0; i < 100; i++) {
      try {
        await axios.post(
          ${HOLYSHEEP_BASE_URL}/chat/completions,
          { model: 'gpt-4o', messages: [{ role: 'user', content: 'test' }], max_tokens: 1 },
          { headers: { 'Authorization': Bearer ${API_KEY} } }
        );
      } catch (e) {
        errors.push({ status: e.response?.status, code: e.code });
      }
    }

    const rateLimited = errors.filter(e => e.status === 429);
    console.log(Rate limited: ${rateLimited.length}/100 requests);
    
    // Verify rate limit is properly communicated
    expect(rateLimited.length).toBeGreaterThan(0);
  });
});

Bước 3: Continuous Monitoring với Health Check

// health-check-contract-monitor.js
const axios = require('axios');

const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';
const API_KEY = process.env.YOUR_HOLYSHEEP_API_KEY;

class ContractMonitor {
  constructor() {
    this.failures = [];
    this.lastCheck = null;
  }

  async checkContractCompliance() {
    const checks = [
      this.testChatCompletionsEndpoint(),
      this.testModelListEndpoint(),
      this.testEmbeddingEndpoint(),
      this.testTokenCountEndpoint()
    ];

    const results = await Promise.allSettled(checks);
    
    return {
      timestamp: new Date().toISOString(),
      passed: results.filter(r => r.status === 'fulfilled').length,
      failed: results.filter(r => r.status === 'rejected').length,
      details: results.map((r, i) => ({
        endpoint: ['chat/completions', 'models', 'embeddings', 'embeddings/token'][i],
        status: r.status,
        error: r.status === 'rejected' ? r.reason.message : null
      }))
    };
  }

  async testChatCompletionsEndpoint() {
    const start = Date.now();
    const response = await axios.post(
      ${HOLYSHEEP_BASE_URL}/chat/completions,
      {
        model: 'gpt-4o',
        messages: [{ role: 'user', content: 'Health check test' }],
        max_tokens: 10
      },
      {
        headers: { 'Authorization': Bearer ${API_KEY} },
        timeout: 5000
      }
    );

    const latency = Date.now() - start;

    // Verify contract compliance
    if (!response.data.id || !response.data.choices) {
      throw new Error('Missing required response fields');
    }

    return { latency, model: response.data.model };
  }

  async testModelListEndpoint() {
    const response = await axios.get(
      ${HOLYSHEEP_BASE_URL}/models,
      { headers: { 'Authorization': Bearer ${API_KEY} } }
    );

    const expectedModels = ['gpt-4o', 'claude-3.5-sonnet', 'deepseek-v3'];
    const availableModels = response.data.data.map(m => m.id);
    
    const missing = expectedModels.filter(m => !availableModels.includes(m));
    if (missing.length > 0) {
      throw new Error(Missing expected models: ${missing.join(', ')});
    }

    return { availableModels };
  }
}

async function runMonitor() {
  const monitor = new ContractMonitor();
  
  console.log('🔍 Starting Contract Monitoring...\n');
  
  const result = await monitor.checkContractCompliance();
  
  console.log(JSON.stringify(result, null, 2));
  
  if (result.failed > 0) {
    console.error('\n❌ Contract violations detected!');
    process.exit(1);
  }
  
  console.log('\n✅ All contract checks passed!');
}

runMonitor().catch(console.error);

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

Lỗi 1: Connection Timeout khi gọi API

**Triệu chứng:**
Error: ConnectTimeoutError: Connection timeout after 30000ms
    at ClientRequest. (/app/node_modules/holysheep-sdk/dist/index.js:142:15)
    
Nguyên nhân: Network latency cao hoặc firewall block request
**Mã khắc phục:**
const axios = require('axios');

const config = {
  baseURL: 'https://api.holysheep.ai/v1',
  timeout: 30000,
  retryConfig: {
    retries: 3,
    retryDelay: 1000,
    retryCondition: (error) => {
      return error.code === 'ECONNABORTED' || 
             error.code === 'ETIMEDOUT' ||
             (error.response?.status >= 500 && error.response?.status < 600);
    }
  }
};

async function resilientRequest(endpoint, payload) {
  const axiosInstance = axios.create({
    timeout: config.timeout,
    headers: {
      'Authorization': Bearer ${process.env.YOUR_HOLYSHEEP_API_KEY},
      'Content-Type': 'application/json'
    }
  });

  let lastError;
  
  for (let attempt = 1; attempt <= config.retryConfig.retries; attempt++) {
    try {
      const response = await axiosInstance.post(endpoint, payload);
      return response.data;
    } catch (error) {
      lastError = error;
      console.warn(Attempt ${attempt} failed: ${error.message});
      
      if (attempt < config.retryConfig.retries) {
        await new Promise(r => setTimeout(r, config.retryConfig.retryDelay * attempt));
      }
    }
  }
  
  throw new Error(All ${config.retryConfig.retries} attempts failed: ${lastError.message});
}

// Usage
const response = await resilientRequest('/chat/completions', {
  model: 'gpt-4o',
  messages: [{ role: 'user', content: 'Hello' }]
});

Lỗi 2: Invalid API Key / 401 Unauthorized

**Triệu chứng:**
{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid API key provided",
    "param": null,
    "type": "invalid_request_error"
  }
}

Status Code: 401 Unauthorized
**Mã khắc phục:**
class HolySheepAuthManager {
  constructor() {
    this.apiKey = process.env.YOLYSHEEP_API_KEY;
    this.keyPrefix = 'hsa-';
    this.validateKey();
  }

  validateKey() {
    if (!this.apiKey) {
      throw new Error('HOLYSHEEP_API_KEY environment variable is not set');
    }
    
    if (!this.apiKey.startsWith(this.keyPrefix)) {
      console.warn('⚠️ API key format may be incorrect. Expected prefix: "hsa-"');
    }
    
    if (this.apiKey.length < 32) {
      throw new Error('API key appears to be truncated or invalid');
    }
  }

  getAuthHeader() {
    return Bearer ${this.apiKey};
  }

  async testConnection() {
    const axios = require('axios');
    try {
      const response = await axios.get('https://api.holysheep.ai/v1/models', {
        headers: { 'Authorization': this.getAuthHeader() }
      });
      console.log('✅ API Key validated successfully');
      console.log('Available models:', response.data.data.map(m => m.id).join(', '));
      return true;
    } catch (error) {
      if (error.response?.status === 401) {
        throw new Error('❌ Invalid API Key. Please check your credentials at https://www.holysheep.ai/register');
      }
      throw error;
    }
  }
}

// Usage
const auth = new HolySheepAuthManager();
await auth.testConnection();

Lỗi 3: Model Parameter Changed / Breaking API Change

**Triệu chứng:**
{
  "error": {
    "code": "INVALID_REQUEST_PARAM",
    "message": "Parameter 'model' has changed type",
    "details": "Expected: string, Received: enum"
  }
}

Breaking change detected: Response schema mismatch
Expected: { ..., "usage": { "prompt_tokens": number } }
Actual:   { ..., "usage": { "prompt_tokens": { "value": number } } }
**Mã khắc phục:**
class ContractVersionManager {
  constructor() {
    this.currentContract = {
      version: '2024.12',
      requestSchema: {
        model: 'string',
        messages: 'array',
        temperature: 'number',
        max_tokens: 'number'
      },
      responseSchema: {
        id: 'string',
        model: 'string',
        choices: 'array',
        usage: {
          prompt_tokens: 'number',
          completion_tokens: 'number',
          total_tokens: 'number'
        }
      }
    };
    this.deprecatedModels = ['gpt-3.5-turbo-0301'];
  }

  validateRequest(payload) {
    const { model, messages, temperature, max_tokens } = payload;

    if (!model || typeof model !== 'string') {
      throw new ContractViolationError('model must be a string');
    }

    if (this.deprecatedModels.includes(model)) {
      console.warn(⚠️ Model ${model} is deprecated. Consider migrating to gpt-4o);
    }

    if (!Array.isArray(messages) || messages.length === 0) {
      throw new ContractViolationError('messages must be a non-empty array');
    }

    return true;
  }

  validateResponse(response) {
    const expected = this.currentContract.responseSchema;

    if (typeof response.usage?.prompt_tokens !== 'number') {
      throw new ContractViolationError(
        Contract violation: usage.prompt_tokens should be number, got ${typeof response.usage?.prompt_tokens}
      );
    }

    return true;
  }

  async checkForBreakingChanges() {
    const axios = require('axios');
    
    // Test with minimal request
    const testResponse = await axios.post(
      'https://api.holysheep.ai/v1/chat/completions',
      { model: 'gpt-4o', messages: [{ role: 'user', content: 'test' }], max_tokens: 1 },
      { headers: { 'Authorization': Bearer ${process.env.YOUR_HOLYSHEEP_API_KEY} } }
    );

    try {
      this.validateResponse(testResponse.data);
      console.log('✅ No breaking changes detected');
    } catch (e) {
      console.error('🚨 BREAKING CHANGE DETECTED!');
      console.error(e.message);
      // Alert team via Slack/Email
      await this.notifyTeam(e.message);
    }
  }
}

class ContractViolationError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ContractViolationError';
  }
}

Lỗi 4: Rate Limit Exceeded

**Triệu chứng:**
Status Code: 429 Too Many Requests
{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Rate limit exceeded. Retry after 60 seconds.",
    "retry_after": 60
  }
}
**Mã khắc phục:**
class RateLimitHandler {
  constructor() {
    this.requestsInWindow = 0;
    this.windowStart = Date.now();
    this.maxRequestsPerMinute = 60;
    this.queue = [];
    this.processing = false;
  }

  async throttledRequest(requestFn) {
    return new Promise((resolve, reject) => {
      this.queue.push({ requestFn, resolve, reject });
      if (!this.processing) this.processQueue();
    });
  }

  async processQueue() {
    if (this.queue.length === 0) {
      this.processing = false;
      return;
    }

    this.processing = true;
    const now = Date.now();
    
    // Reset window if expired
    if (now - this.windowStart > 60000) {
      this.requestsInWindow = 0;
      this.windowStart = now;
    }

    if (this.requestsInWindow >= this.maxRequestsPerMinute) {
      const waitTime = 60000 - (now - this.windowStart);
      console.log(⏳ Rate limit reached. Waiting ${waitTime}ms...);
      await new Promise(r => setTimeout(r, waitTime));
      this.requestsInWindow = 0;
      this.windowStart = Date.now();
    }

    const item = this.queue.shift();
    this.requestsInWindow++;

    try {
      const result = await item.requestFn();
      item.resolve(result);
    } catch (e) {
      if (e.response?.status === 429) {
        // Re-add to queue with delay
        this.queue.unshift(item);
        await new Promise(r => setTimeout(r, e.response?.data?.retry_after * 1000 || 60000));
      } else {
        item.reject(e);
      }
    }

    this.processQueue();
  }
}

// Usage với HolySheep AI
const rateLimiter = new RateLimitHandler();

async function callWithRateLimiting(payload) {
  return rateLimiter.throttledRequest(async () => {
    const axios = require('axios');
    return axios.post('https://api.holysheep.ai/v1/chat/completions', payload, {
      headers: { 'Authorization': Bearer ${process.env.YOUR_HOLYSHEEP_API_KEY} }
    });
  });
}

Best Practices từ kinh nghiệm thực chiến

Qua 3 năm làm việc với các API AI provider, tôi đã rút ra những lessons quan trọng:

Kết luận

Contract testing không phải là overhead - đó là **insurance policy** cho hệ thống của bạn. Với HolySheep AI, nơi tỷ giá chỉ **¥1 = $1** và chi phí thấp hơn 85% so với provider khác, việc đầu tư vào testing infrastructure giúp bạn: Đừng đợi đến khi production crash mới implement contract testing. Bắt đầu hôm nay. 👉 [Đăng ký HolySheep AI — nhận tín dụng miễn phí khi đăng ký](https://www.holysheep.ai/register)