Mở Đầu: Câu Chuyện Thực Tế Từ Dự Án RAG Thương Mại Điện Tử

Tháng 9 năm ngoái, tôi nhận được một cuộc gọi từ CTO của một startup thương mại điện tử quy mô 500 nghìn người dùng. Họ đang gặp vấn đề nghiêm trọng: chi phí API GPT-4o tiêu tốn 12.000 USD mỗi tháng chỉ để phục vụ hệ thống RAG tìm kiếm sản phẩm. Đó là lúc tôi bắt đầu hành trình triển khai MCP Server với OpenAI-compatible gateway, và kết quả cuối cùng khiến tôi phải chia sẻ lại. Sau 3 tháng tối ưu hóa với kiến trúc mới, chi phí giảm xuống còn 1.800 USD - tiết kiệm 85% - trong khi độ trễ trung bình chỉ tăng thêm 23ms. Điều kỳ diệu đó đến từ việc kết hợp đúng cách MCP Server, tool calling thông minh và rate limiting linh hoạt.

MCP Server Là Gì và Tại Sao Nó Quan Trọng

MCP (Model Context Protocol) Server là một protocol cho phép các mô hình AI gọi các công cụ bên ngoài một cách có cấu trúc. Thay vì chỉ trả lời text thuần túy, MCP Server mở ra khả năng tương tác với cơ sở dữ liệu, API bên thứ ba, hệ thống file và nhiều nguồn dữ liệu khác. Với kiến trúc OpenAI-compatible gateway, bạn có thể tận dụng sức mạnh của MCP trong khi đồng thời tối ưu chi phí thông qua các nhà cung cấp có giá cạnh tranh như HolySheep AI.

Kiến Trúc Tổng Quan

┌─────────────────────────────────────────────────────────────┐
│                    Ứng Dụng Client                          │
├─────────────────────────────────────────────────────────────┤
│  MCP Client ──► MCP Server ──► Tool Registry                │
│       │                  │                                   │
│       ▼                  ▼                                   │
│  OpenAI SDK      OpenAI-Compatible Gateway                  │
│                      │                                      │
│                      ▼                                      │
│              HolySheep AI API                               │
│              (base_url: api.holysheep.ai/v1)                │
└─────────────────────────────────────────────────────────────┘

Cài Đặt và Cấu Hình Cơ Bản

1. Thiết Lập Environment

# Cài đặt các thư viện cần thiết
pip install mcp openai python-dotenv httpx

Tạo file .env với API key của bạn

cat > .env << 'EOF' HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1 OPENAI_ORGANIZATION=optional-org-id EOF

Xác minh cấu hình

cat .env

2. Khởi Tạo MCP Server Với Tool Definitions

import os
from mcp.server import MCPServer
from mcp.types import Tool, ToolInputSchema
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()

class ProductSearchServer(MCPServer):
    def __init__(self):
        super().__init__(name="product-search")
        self.client = OpenAI(
            api_key=os.getenv("HOLYSHEEP_API_KEY"),
            base_url=os.getenv("HOLYSHEEP_BASE_URL")
        )
        self._register_tools()
    
    def _register_tools(self):
        # Tool tìm kiếm sản phẩm
        self.add_tool(
            Tool(
                name="search_products",
                description="Tìm kiếm sản phẩm trong database thương mại điện tử",
                input_schema=ToolInputSchema(
                    type="object",
                    properties={
                        "query": {"type": "string", "description": "Từ khóa tìm kiếm"},
                        "category": {"type": "string", "description": "Danh mục sản phẩm"},
                        "max_price": {"type": "number", "description": "Giá tối đa (VND)"},
                        "limit": {"type": "integer", "description": "Số lượng kết quả", "default": 10}
                    },
                    required=["query"]
                )
            )
        )
        
        # Tool lấy chi tiết sản phẩm
        self.add_tool(
            Tool(
                name="get_product_details",
                description="Lấy thông tin chi tiết của sản phẩm theo ID",
                input_schema=ToolInputSchema(
                    type="object",
                    properties={
                        "product_id": {"type": "string", "description": "ID sản phẩm"},
                        "include_inventory": {"type": "boolean", "description": "Bao gồm tồn kho", "default": False}
                    },
                    required=["product_id"]
                )
            )
        )
    
    def execute_tool(self, tool_name: str, arguments: dict):
        if tool_name == "search_products":
            return self._search_products(**arguments)
        elif tool_name == "get_product_details":
            return self._get_product_details(**arguments)
        raise ValueError(f"Unknown tool: {tool_name}")
    
    def _search_products(self, query: str, category: str = None, 
                         max_price: float = None, limit: int = 10):
        # Logic tìm kiếm thực tế - kết nối database
        results = [
            {"id": "SP001", "name": "Laptop Gaming XYZ", "price": 25000000, "stock": 45},
            {"id": "SP002", "name": "Chuột không dây Pro", "price": 890000, "stock": 120}
        ]
        return {"results": results, "total": 2}
    
    def _get_product_details(self, product_id: str, include_inventory: bool = False):
        return {
            "id": product_id,
            "name": "Laptop Gaming XYZ",
            "price": 25000000,
            "specs": {"cpu": "Intel i7-12700H", "ram": "16GB", "ssd": "512GB"},
            "inventory": 45 if include_inventory else None
        }

Khởi chạy server

server = ProductSearchServer() print("MCP Server khởi động thành công!") print(f"Base URL: {os.getenv('HOLYSHEEP_BASE_URL')}")

Tool Calling Với Streaming Response

Một trong những điểm mạnh của kiến trúc này là khả năng xử lý streaming trong khi vẫn hỗ trợ tool calling. Dưới đây là implementation hoàn chỉnh:
import json
from openai import OpenAI
from typing import Iterator, List, Dict, Any
import time

class StreamingToolCaller:
    def __init__(self, api_key: str, base_url: str):
        self.client = OpenAI(api_key=api_key, base_url=base_url)
        self.tools = [
            {
                "type": "function",
                "function": {
                    "name": "search_products",
                    "description": "Tìm kiếm sản phẩm trong kho",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "query": {"type": "string"},
                            "max_price": {"type": "number"},
                            "category": {"type": "string"}
                        },
                        "required": ["query"]
                    }
                }
            },
            {
                "type": "function", 
                "function": {
                    "name": "calculate_shipping",
                    "description": "Tính phí vận chuyển dựa trên địa chỉ",
                    "parameters": {
                        "type": "object",
                        "properties": {
                            "province": {"type": "string"},
                            "weight_kg": {"type": "number"},
                            "express": {"type": "boolean", "default": False}
                        },
                        "required": ["province", "weight_kg"]
                    }
                }
            }
        ]
        # Rate limiting state
        self.request_timestamps: List[float] = []
        self.max_requests_per_minute = 60
    
    def _check_rate_limit(self) -> bool:
        """Kiểm tra và duy trì rate limit"""
        current_time = time.time()
        # Loại bỏ các request cũ hơn 60 giây
        self.request_timestamps = [
            ts for ts in self.request_timestamps 
            if current_time - ts < 60
        ]
        
        if len(self.request_timestamps) >= self.max_requests_per_minute:
            oldest = self.request_timestamps[0]
            wait_time = 60 - (current_time - oldest)
            if wait_time > 0:
                print(f"Rate limit reached. Waiting {wait_time:.2f}s...")
                time.sleep(wait_time)
                self.request_timestamps.pop(0)
        
        self.request_timestamps.append(time.time())
        return True
    
    def execute_tools(self, tool_calls: List[Dict]) -> Dict[str, Any]:
        """Thực thi các tool calls và trả về kết quả"""
        results = {}
        
        for call in tool_calls:
            tool_name = call["function"]["name"]
            arguments = json.loads(call["function"]["arguments"])
            
            print(f"Executing tool: {tool_name} with args: {arguments}")
            
            # Simulate tool execution với latency tracking
            start = time.time()
            
            if tool_name == "search_products":
                results[call["id"]] = {
                    "role": "tool",
                    "content": json.dumps({
                        "products": [
                            {"id": "P001", "name": "Bàn phím cơ RGB", "price": 1950000},
                            {"id": "P002", "name": "Tai nghe gaming 7.1", "price": 1250000}
                        ]
                    }),
                    "tool_call_id": call["id"]
                }
            elif tool_name == "calculate_shipping":
                province = arguments.get("province", "")
                weight = arguments.get("weight_kg", 1)
                base_fee = 30000
                
                if "HCM" in province or "Hà Nội" in province:
                    shipping = base_fee + weight * 15000
                else:
                    shipping = base_fee + weight * 25000
                
                results[call["id"]] = {
                    "role": "tool",
                    "content": json.dumps({
                        "province": province,
                        "weight_kg": weight,
                        "shipping_fee": shipping,
                        "estimated_days": 2 if arguments.get("express") else 4
                    }),
                    "tool_call_id": call["id"]
                }
            
            elapsed = (time.time() - start) * 1000
            print(f"Tool {tool_name} executed in {elapsed:.2f}ms")
        
        return results
    
    def chat_stream(self, messages: List[Dict], 
                    model: str = "gpt-4.1") -> Iterator[str]:
        """Gửi request với streaming và xử lý tool calls tự động"""
        self._check_rate_limit()
        
        start_time = time.time()
        
        response = self.client.chat.completions.create(
            model=model,
            messages=messages,
            tools=self.tools,
            stream=True,
            temperature=0.7
        )
        
        tool_calls_buffer = []
        content_buffer = ""
        
        for chunk in response:
            delta = chunk.choices[0].delta
            
            # Xử lý content
            if delta.content:
                content_buffer += delta.content
                yield delta.content
            
            # Thu thập tool calls
            if delta.tool_calls:
                for tool_call in delta.tool_calls:
                    if tool_call.id:
                        tool_calls_buffer.append({
                            "id": tool_call.id,
                            "type": "function",
                            "function": {
                                "name": tool_call.function.name,
                                "arguments": tool_call.function.arguments or ""
                            }
                        })
        
        total_time = (time.time() - start_time) * 1000
        print(f"Streaming completed in {total_time:.2f}ms")
        
        # Nếu có tool calls, thực thi và tiếp tục
        if tool_calls_buffer:
            print(f"Found {len(tool_calls_buffer)} tool calls to execute")
            
            # Gộp arguments string nếu bị chia nhỏ
            merged_calls = {}
            for call in tool_calls_buffer:
                call_id = call["id"]
                if call_id not in merged_calls:
                    merged_calls[call_id] = call
                else:
                    merged_calls[call_id]["function"]["arguments"] += call["function"]["arguments"]
            
            tool_results = self.execute_tools(list(merged_calls.values()))
            
            # Thêm kết quả tool vào messages
            messages.append({"role": "assistant", "content": content_buffer})
            for result in tool_results.values():
                messages.append(result)
            
            # Tiếp tục với kết quả tool
            yield from self.chat_stream(messages, model)

Sử dụng

if __name__ == "__main__": caller = StreamingToolCaller( api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1" ) messages = [ {"role": "system", "content": "Bạn là trợ lý bán hàng thông minh."}, {"role": "user", "content": "Tìm bàn phím dưới 2 triệu và tính phí ship về HCM cho đơn 0.5kg"} ] print("Streaming response:") for token in caller.chat_stream(messages, model="gpt-4.1"): print(token, end="", flush=True)

Rate Limiting Nâng Cao

Trong thực tế triển khai, tôi đã phát triển một hệ thống rate limiting đa tầng để đảm bảo:

Tiered Rate Limiting

import time
import threading
from collections import defaultdict
from dataclasses import dataclass
from typing import Dict, Optional
import hashlib

@dataclass
class RateLimitConfig:
    """Cấu hình rate limit cho từng tier người dùng"""
    requests_per_minute: int
    tokens_per_minute: int
    concurrent_requests: int
    
    TIER_LIMITS = {
        "free": RateLimitConfig(20, 100000, 2),
        "basic": RateLimitConfig(60, 500000, 5),
        "pro": RateLimitConfig(200, 2000000, 15),
        "enterprise": RateLimitConfig(1000, 10000000, 50)
    }

class AdvancedRateLimiter:
    """
    Rate limiter đa tầng với:
    - Token bucket algorithm
    - Concurrent request limiting
    - Automatic retry with backoff
    - Tiered pricing support
    """
    
    def __init__(self):
        self.buckets: Dict[str, Dict] = defaultdict(self._create_bucket)
        self.request_times: Dict[str, list] = defaultdict(list)
        self.concurrent_locks: Dict[str, threading.Semaphore] = {}
        self._lock = threading.Lock()
        
        # Pricing tiers (USD per 1M tokens)
        self.PRICING = {
            "gpt-4.1": 8.0,
            "claude-sonnet-4.5": 15.0,
            "gemini-2.5-flash": 2.50,
            "deepseek-v3.2": 0.42
        }
    
    def _create_bucket(self):
        return {
            "tokens": 1000000,
            "last_refill": time.time(),
            "refill_rate": 50000  # tokens per second
        }
    
    def get_tier(self, api_key: str) -> str:
        """Xác định tier dựa trên API key hash"""
        key_hash = hashlib.md5(api_key.encode()).hexdigest()
        tier_index = int(key_hash[:2], 16) % 100
        
        if tier_index < 10:
            return "free"
        elif tier_index < 40:
            return "basic"
        elif tier_index < 80:
            return "pro"
        return "enterprise"
    
    def check_limit(self, api_key: str, model: str, 
                    estimated_tokens: int = 1000) -> tuple[bool, Optional[float]]:
        """
        Kiểm tra rate limit
        Returns: (allowed, wait_time_seconds)
        """
        tier = self.get_tier(api_key)
        config = RateLimitConfig.TIER_LIMITS.get(tier, RateLimitConfig.TIER_LIMITS["free"])
        
        current_time = time.time()
        
        with self._lock:
            # 1. Kiểm tra request rate
            self.request_times[api_key] = [
                t for t in self.request_times[api_key]
                if current_time - t < 60
            ]
            
            if len(self.request_times[api_key]) >= config.requests_per_minute:
                oldest = self.request_times[api_key][0]
                wait_time = 60 - (current_time - oldest)
                return False, max(0, wait_time)
            
            # 2. Kiểm tra token bucket
            bucket = self.buckets[api_key]
            time_since_refill = current_time - bucket["last_refill"]
            bucket["tokens"] = min(
                1000000,
                bucket["tokens"] + time_since_refill * bucket["refill_rate"]
            )
            
            if bucket["tokens"] < estimated_tokens:
                wait_time = (estimated_tokens - bucket["tokens"]) / bucket["refill_rate"]
                return False, max(0, wait_time)
            
            # 3. Kiểm tra concurrent requests
            if api_key not in self.concurrent_locks:
                self.concurrent_locks[api_key] = threading.Semaphore(
                    config.concurrent_requests
                )
            
            if not self.concurrent_locks[api_key].acquire(blocking=False):
                return False, 0.5  # Retry after 0.5s
            
            # Cập nhật state
            bucket["tokens"] -= estimated_tokens
            self.request_times[api_key].append(current_time)
            
            return True, None
    
    def release(self, api_key: str):
        """Giải phóng semaphore sau khi request hoàn thành"""
        if api_key in self.concurrent_locks:
            self.concurrent_locks[api_key].release()
    
    def calculate_cost(self, model: str, input_tokens: int, 
                       output_tokens: int) -> dict:
        """Tính chi phí theo tier"""
        price_per_mtok = self.PRICING.get(model, 8.0)
        
        input_cost = (input_tokens / 1_000_000) * price_per_mtok
        output_cost = (output_tokens / 1_000_000) * price_per_mtok * 2  # Output thường đắt hơn
        
        return {
            "model": model,
            "input_tokens": input_tokens,
            "output_tokens": output_tokens,
            "input_cost_usd": round(input_cost, 6),
            "output_cost_usd": round(output_cost, 6),
            "total_cost_usd": round(input_cost + output_cost, 6),
            "price_per_mtok": price_per_mtok,
            "vnd_equivalent": round((input_cost + output_cost) * 25000)  # ~25000 VND/USD
        }

Demo usage

if __name__ == "__main__": limiter = AdvancedRateLimiter() api_key = "YOUR_HOLYSHEEP_API_KEY" tier = limiter.get_tier(api_key) print(f"User tier: {tier}") print(f"Tier config: {RateLimitConfig.TIER_LIMITS[tier]}") # Simulate requests for i in range(3): allowed, wait = limiter.check_limit(api_key, "gpt-4.1", 500) if allowed: print(f"Request {i+1}: ALLOWED") # Calculate cost cost = limiter.calculate_cost("gpt-4.1", 1000, 500) print(f" Cost: {cost['total_cost_usd']} USD = {cost['vnd_equivalent']} VND") limiter.release(api_key) else: print(f"Request {i+1}: BLOCKED (wait {wait:.2f}s)") # Cost comparison print("\n=== Cost Comparison (per 1M tokens) ===") for model, price in limiter.PRICING.items(): print(f"{model}: ${price}") # HolySheep advantage print("\n=== HolySheep Savings Calculator ===") gpt_cost = limiter.PRICING["gpt-4.1"] deepseek_cost = limiter.PRICING["deepseek-v3.2"] monthly_tokens = 10_000_000 # 10M tokens gpt_monthly = (monthly_tokens / 1_000_000) * gpt_cost deepseek_monthly = (monthly_tokens / 1_000_000) * deepseek_cost savings = gpt_monthly - deepseek_monthly savings_pct = (savings / gpt_monthly) * 100 print(f"GPT-4.1 monthly: ${gpt_monthly:.2f}") print(f"DeepSeek V3.2 monthly: ${deepseek_monthly:.2f}") print(f"Savings: ${savings:.2f} ({savings_pct:.1f}%)")

So Sánh Chi Phí Thực Tế

Dựa trên bảng giá HolySheep AI 2026, đây là phân tích chi phí cho dự án RAG quy mô trung bình:
Model Giá/MTok Input/Output Split Chi phí tháng (100M tokens)
GPT-4.1 $8.00 70/30 $760
Claude Sonnet 4.5 $15.00 70/30 $1,425
Gemini 2.5 Flash $2.50 70/30 $237.50
DeepSeek V3.2 $0.42 70/30 $39.90
Với tỷ giá ¥1 = $1 (tức 1 CNY = 1 USD) tại HolySheep AI, chi phí thực tế cho DeepSeek V3.2 chỉ khoảng 280 CNY cho 100 triệu tokens - mức giá không thể tin được so với $760 của GPT-4.1.

Lỗi Thường Gặp và Cách Khắc Phục

1. Lỗi "Invalid API Key" Hoặc Authentication Failed

Nguyên nhân: API key không đúng định dạng hoặc chưa được kích hoạt. Đặc biệt khi chuyển từ OpenAI sang HolySheep, nhiều developer quên thay đổi cả base_url lẫn api_key. Giải pháp:
# Sai - vẫn dùng OpenAI key với HolySheep endpoint
client = OpenAI(
    api_key="sk-proj-xxx",  # OpenAI key
    base_url="https://api.holysheep.ai/v1"  # Nhưng endpoint HolySheep
)

=> Lỗi: Authentication failed

Đúng - dùng HolySheep key với HolySheep endpoint

client = OpenAI( api_key="YOUR_HOLYSHEEP_API_KEY", # Key từ HolySheep dashboard base_url="https://api.holysheep.ai/v1" )

Verify key bằng cách gọi endpoint kiểm tra

import httpx def verify_api_key(api_key: str) -> dict: """Xác minh API key trước khi sử dụng""" with httpx.Client() as client: response = client.get( "https://api.holysheep.ai/v1/models", headers={"Authorization": f"Bearer {api_key}"} ) if response.status_code == 200: return {"status": "valid", "models": response.json()} elif response.status_code == 401: return {"status": "invalid", "error": "Invalid API key"} else: return {"status": "error", "code": response.status_code}

Test

result = verify_api_key("YOUR_HOLYSHEEP_API_KEY") print(result)

2. Lỗi Rate Limit 429 - Too Many Requests

Nguyên nhân: Vượt quá số request/phút cho phép. Thường xảy ra khi implement retry logic không đúng hoặc quá nhiều concurrent requests. Giải pháp:
import time
import httpx
from tenacity import retry, stop_after_attempt, wait_exponential

class HolySheepClient:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.max_retries = 5
    
    @retry(
        stop=stop_after_attempt(5),
        wait=wait_exponential(multiplier=1, min=2, max=60)
    )
    def _make_request(self, method: str, endpoint: str, **kwargs):
        """Request với automatic retry và exponential backoff"""
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        with httpx.Client(timeout=60.0) as client:
            url = f"{self.base_url}{endpoint}"
            response = client.request(method, url, headers=headers, **kwargs)
            
            if response.status_code == 429:
                # Parse retry-after header
                retry_after = int(response.headers.get("retry-after", 60))
                print(f"Rate limited. Waiting {retry_after}s...")
                time.sleep(retry_after)
                raise httpx.HTTPStatusError(
                    "Rate limited",
                    request=response.request,
                    response=response
                )
            
            response.raise_for_status()
            return response.json()
    
    def chat_completion(self, messages: list, model: str = "deepseek-v3.2"):
        """Gửi chat completion với retry logic"""
        payload = {
            "model": model,
            "messages": messages,
            "temperature": 0.7,
            "max_tokens": 2000
        }
        
        return self._make_request("POST", "/chat/completions", json=payload)

Sử dụng với batch processing

client = HolySheepClient("YOUR_HOLYSHEEP_API_KEY") requests_to_send = [ {"role": "user", "content": f"Tìm kiếm sản phẩm {i}"} for i in range(100) ] for i, req in enumerate(requests_to_send): try: result = client.chat_completion([req]) print(f"Request {i+1}/100: SUCCESS") except Exception as e: print(f"Request {i+1}/100: FAILED - {e}") time.sleep(5) # Additional delay on failure

3. Lỗi Tool Call Arguments Parsing

Nguyên nhân: Arguments từ tool call có thể đến trong nhiều chunks do streaming, dẫn đến JSON parse error khi arguments bị cắt đôi. Giải pháp:
import json
from typing import Dict, Any, Optional

class RobustToolCallParser:
    """Parser xử lý tool call arguments bị chunk trong streaming"""
    
    def __init__(self):
        self.pending_arguments: Dict[str, str] = {}
        self.pending_names: Dict[str, str] = {}
    
    def parse_delta(self, delta: Any) -> Optional[Dict[str, Any]]:
        """Parse từng delta chunk một cách an toàn"""
        result = {}
        
        # Xử lý function name
        if hasattr(delta, 'function') and delta.function:
            call_id = getattr(delta, 'id', None)
            if call_id:
                if hasattr(delta.function, 'name') and delta.function.name:
                    self.pending_names[call_id] = delta.function.name
                if hasattr(delta.function, 'arguments') and delta.function.arguments:
                    if call_id not in self.pending_arguments:
                        self.pending_arguments[call_id] = ""
                    self.pending_arguments[call_id] += delta.function.arguments
        
        # Kiểm tra và parse complete call
        call_id = getattr(delta, 'id', None)
        if call_id and call_id in self.pending_arguments:
            args_str = self.pending_arguments[call_id]
            
            # Thử parse JSON
            try:
                args = json.loads(args_str)
                result = {
                    "id": call_id,
                    "type": "function",
                    "function": {
                        "name": self.pending_names.get(call_id, ""),
                        "arguments": args
                    }
                }
                # Cleanup
                del self.pending_arguments[call_id]
                self.pending_names.pop(call_id, None)
                return result
            except json.JSONDecodeError as e:
                # Arguments chưa complete, tiếp tục chờ
                if self._is_json_complete(args_str):
                    # Có lỗi parse thực sự
                    print(f"JSON parse error for call {call_id}: {e}")
                    del self.pending_arguments[call_id]
                    self.pending_names.pop(call_id, None)
                # else: đang chờ thêm data
        
        return None if not result else result
    
    def _is_json_complete(self, s: str) -> bool:
        """Kiểm tra xem JSON string đã complete chưa"""
        s = s.strip()
        if not s:
            return False
        if s.startswith('{'):
            depth = 0
            in_string = False
            escape = False
            for char in s:
                if escape:
                    escape = False
                    continue
                if char == '\\':
                    escape = True
                    continue
                if char == '"':
                    in_string = not in_string
                    continue
                if in_string:
                    continue
                if char == '{':
                    depth += 1
                elif char == '}':
                    depth -= 1
                    if depth == 0:
                        return True
            return False
        return True

Usage trong streaming loop

parser = RobustToolCallParser() def process_streaming_response(response_stream): completed_calls = [] for chunk in response_stream: delta = chunk.choices[0].delta # Parse tool call nếu có parsed = parser.parse_delta(delta) if parsed: completed_calls.append(parsed)