Khi xây dựng AI Agent phục vụ nghiệp vụ tài chính, chi phí gọi API bên ngoài có thể tăng vọt không kiểm soát nếu không có chiến lược tối ưu rõ ràng. Bài viết này chia sẻ kinh nghiệm thực chiến của đội ngũ kỹ sư HolySheep trong việc xây dựng hệ thống cost guardrail với Tardis Data, tối ưu model inference và đồng bộ task queue để đạt hiệu suất tối đa với chi phí tối thiểu.

Vấn Đề Thực Tế: Khi Chi Phí API Bùng Nổ Không Kiểm Soát

Trong dự án triển khai AI Agent phân tích danh mục đầu tư cho khách hàng doanh nghiệp, đội ngũ của tôi từng đối mặt với tình trạng chi phí gọi API tăng 300% chỉ trong 2 tuần. Nguyên nhân chính bao gồm:

Sau 3 tháng tinh chỉnh, chúng tôi giảm được 78% chi phí API trong khi vẫn duy trì độ trễ dưới 200ms cho 95% request. Bài viết dưới đây là tổng hợp toàn bộ best practices mà đội ngũ đã đúc kết.

Kiến Trúc Cost Guardrail Tổng Quan

Kiến trúc cost guardrail cho AI Agent tài chính cần đảm bảo 4 tầng bảo vệ:

+------------------+     +------------------+     +------------------+
|   Task Queue     | --> |   Cost Budget    | --> |  Rate Limiter   |
|   (Priority)     |     |   Controller     |     |  (Per-minute)   |
+------------------+     +------------------+     +------------------+
                                |
                                v
+------------------+     +------------------+     +------------------+
|   Cache Layer    | <-- |  Tardis Data     | <-- |  External API   |
|   (LRU + TTL)    |     |  Transformer     |     |  (Financial)    |
+------------------+     +------------------+     +------------------+
                                |
                                v
                        +------------------+
                        |  Model Inference |
                        |  (Batch Optimize)|
                        +------------------+

Tầng 1: Task Queue Với Priority và Cancellation

Task queue là lớp quan trọng nhất để kiểm soát chi phí. Chúng tôi sử dụng Redis-backed priority queue với khả năng cancel task theo correlation ID.

import asyncio
import redis.asyncio as redis
import json
import hashlib
from typing import Optional, List, Dict, Any
from dataclasses import dataclass, field
from enum import IntEnum

class TaskPriority(IntEnum):
    CRITICAL = 1  # Real-time trading signals
    HIGH = 2      # Portfolio rebalancing
    NORMAL = 3    # Daily reports
    LOW = 4       # Historical analysis
    BATCH = 5     # Non-urgent data sync

@dataclass
class CostTrackedTask:
    task_id: str
    correlation_id: str
    priority: TaskPriority
    estimated_cost_usd: float
    actual_cost_usd: float = 0.0
    status: str = "pending"
    created_at: float = field(default_factory=lambda: asyncio.get_event_loop().time())
    api_calls: List[Dict[str, Any]] = field(default_factory=list)

class FinancialTaskQueue:
    """
    Priority queue với cost tracking và cancellation support.
    Priority càng thấp (1=CRITICAL) càng được xử lý trước.
    """
    
    def __init__(
        self,
        redis_url: str = "redis://localhost:6379",
        cost_budget_per_minute: float = 10.0,
        cost_budget_per_day: float = 500.0
    ):
        self.redis = redis.from_url(redis_url)
        self.cost_budget_per_minute = cost_budget_per_minute
        self.cost_budget_per_day = cost_budget_per_day
        self._daily_cost_key = "daily_cost:total"
        self._minute_cost_key = "minute_cost:total"
        
    async def enqueue(
        self,
        correlation_id: str,
        payload: Dict[str, Any],
        priority: TaskPriority = TaskPriority.NORMAL,
        max_cost_estimate: float = 0.50
    ) -> str:
        """Enqueue task với cost guard check."""
        
        # Check cost budget trước khi enqueue
        can_proceed = await self._check_cost_budget(max_cost_estimate)
        if not can_proceed:
            raise RuntimeError(
                f"Cost budget exceeded. Estimated: ${max_cost_estimate:.4f}"
            )
        
        task_id = hashlib.sha256(
            f"{correlation_id}:{asyncio.get_event_loop().time()}".encode()
        ).hexdigest()[:16]
        
        task = CostTrackedTask(
            task_id=task_id,
            correlation_id=correlation_id,
            priority=priority,
            estimated_cost_usd=max_cost_estimate
        )
        
        # Store task data
        await self.redis.hset(
            f"task:{task_id}",
            mapping={
                "data": json.dumps(payload),
                "task": json.dumps({
                    "task_id": task.task_id,
                    "correlation_id": task.correlation_id,
                    "priority": int(task.priority),
                    "estimated_cost_usd": task.estimated_cost_usd,
                    "status": task.status,
                    "created_at": task.created_at
                })
            }
        )
        await self.redis.expire(f"task:{task_id}", 86400)  # 24h TTL
        
        # Add to priority sorted set (score = priority + timestamp for FIFO within same priority)
        score = int(priority) + (asyncio.get_event_loop().time() / 1e6)
        await self.redis.zadd("task_queue", {task_id: score})
        
        # Track correlation for cancellation
        await self.redis.sadd(f"correlation:{correlation_id}", task_id)
        
        return task_id
    
    async def cancel_by_correlation(self, correlation_id: str) -> int:
        """Cancel all tasks for a correlation ID (VD: user hủy request cũ)."""
        task_ids = await self.redis.smembers(f"correlation:{correlation_id}")
        cancelled = 0
        
        for task_id in task_ids:
            task_id = task_id.decode() if isinstance(task_id, bytes) else task_id
            # Check if task chưa chạy
            task_data = await self.redis.hget(f"task:{task_id}", "task")
            if task_data:
                task_info = json.loads(task_data)
                if task_info["status"] == "pending":
                    await self.redis.zrem("task_queue", task_id)
                    await self.redis.hset(f"task:{task_id}", "status", "cancelled")
                    cancelled += 1
        
        # Cleanup correlation tracking
        await self.redis.delete(f"correlation:{correlation_id}")
        
        return cancelled
    
    async def _check_cost_budget(self, additional_cost: float) -> bool:
        """Kiểm tra xem có đủ budget để chạy task không."""
        minute_cost = float(await self.redis.get(self._minute_cost_key) or 0)
        daily_cost = float(await self.redis.get(self._daily_cost_key) or 0)
        
        return (minute_cost + additional_cost <= self.cost_budget_per_minute and
                daily_cost + additional_cost <= self.cost_budget_per_day)
    
    async def record_cost(self, task_id: str, cost_usd: float, api_endpoint: str):
        """Record actual cost sau khi task hoàn thành."""
        await self.redis.incrbyfloat(self._minute_cost_key, cost_usd)
        await self.redis.incrbyfloat(self._daily_cost_key, cost_usd)
        await self.redis.expire(self._minute_cost_key, 60)  # Reset per minute
        
        # Update task record
        await self.redis.hincrbyfloat(f"task:{task_id}", "actual_cost_usd", cost_usd)

Usage example

async def main(): queue = FinancialTaskQueue( redis_url="redis://localhost:6379", cost_budget_per_minute=5.0, # $5/phút max cost_budget_per_day=200.0 # $200/ngày max ) # Enqueue với priority task_id = await queue.enqueue( correlation_id="user:123:portfolio:refresh", payload={"symbols": ["AAPL", "GOOGL", "MSFT"]}, priority=TaskPriority.HIGH, max_cost_estimate=0.15 ) print(f"Enqueued task: {task_id}") # Cancel outdated requests (VD: user spam click) cancelled = await queue.cancel_by_correlation("user:123:portfolio:refresh") print(f"Cancelled {cancelled} outdated tasks") if __name__ == "__main__": asyncio.run(main())

Tầng 2: Tardis Data Integration Với Smart Caching

Tardis Data là nguồn dữ liệu tài chính quan trọng, nhưng gọi API liên tục sẽ tốn kém. Chúng tôi xây dựng caching layer với 3 chiến lược:

import asyncio
import hashlib
import json
import time
from typing import Optional, Dict, Any, Tuple
from dataclasses import dataclass
from enum import Enum
import redis.asyncio as redis

class DataFreshness(Enum):
    REALTIME = ("realtime", 5)      # 5 seconds TTL
    INTRA_DAY = ("intraday", 60)    # 1 minute TTL
    EOD = ("eod", 3600)            # 1 hour TTL
    HISTORICAL = ("historical", 86400)  # 24 hours TTL
    
    def __init__(self, label: str, ttl_seconds: int):
        self.label = label
        self.ttl_seconds = ttl_seconds

@dataclass
class CachedResponse:
    data: Dict[str, Any]
    cached_at: float
    freshness: DataFreshness
    api_cost_saved: float  # Estimated cost saved by caching
    hit_count: int = 1

class TardisDataCache:
    """
    Multi-layer cache cho Tardis financial data.
    Layer 1: Redis (distributed)
    Layer 2: Local LRU (per-instance)
    """
    
    def __init__(
        self,
        redis_url: str = "redis://localhost:6379",
        local_cache_size: int = 1000,
        tardis_api_base: str = "https://api.tardis.daily/v1"
    ):
        self.redis = redis.from_url(redis_url)
        self.tardis_base = tardis_api_base
        self.local_cache: Dict[str, CachedResponse] = {}
        self.local_cache_size = local_cache_size
        self._lru_order: list = []
        
    def _generate_cache_key(
        self,
        endpoint: str,
        params: Dict[str, Any],
        freshness: DataFreshness
    ) -> str:
        """Tạo deterministic cache key."""
        param_str = json.dumps(params, sort_keys=True)
        key_material = f"{endpoint}:{param_str}:{freshness.label}"
        return f"tardis:{hashlib.sha256(key_material.encode()).hexdigest()[:32]}"
    
    async def get_or_fetch(
        self,
        endpoint: str,
        params: Dict[str, Any],
        freshness: DataFreshness = DataFreshness.INTRA_DAY,
        api_key: str = None,
        fallback_to_stale: bool = True
    ) -> Tuple[Dict[str, Any], bool]:
        """
        Get data từ cache hoặc fetch từ API.
        Returns: (data, is_cache_hit)
        """
        cache_key = self._generate_cache_key(endpoint, params, freshness)
        
        # Layer 1: Local cache check
        local_hit = self._check_local_cache(cache_key, freshness)
        if local_hit:
            self._update_lru(cache_key)
            return local_hit.data, True
        
        # Layer 2: Redis cache check
        redis_data = await self.redis.get(cache_key)
        if redis_data:
            cached = json.loads(redis_data)
            response = CachedResponse(
                data=cached["data"],
                cached_at=cached["cached_at"],
                freshness=freshness,
                api_cost_saved=cached.get("api_cost_saved", 0.001),
                hit_count=cached.get("hit_count", 1) + 1
            )
            self._store_local_cache(cache_key, response)
            return response.data, True
        
        # Cache miss: fetch from API
        data = await self._fetch_from_tardis(endpoint, params, api_key)
        cost_saved = self._estimate_api_cost(endpoint, params)
        
        # Store in both layers
        response = CachedResponse(
            data=data,
            cached_at=time.time(),
            freshness=freshness,
            api_cost_saved=cost_saved
        )
        
        await self._store_redis(cache_key, response)
        self._store_local_cache(cache_key, response)
        
        # Handle stale-while-revalidate cho non-critical data
        if fallback_to_stale and freshness != DataFreshness.REALTIME:
            asyncio.create_task(self._refresh_stale(cache_key, endpoint, params, freshness, api_key))
        
        return data, False
    
    async def _fetch_from_tardis(
        self,
        endpoint: str,
        params: Dict[str, Any],
        api_key: str
    ) -> Dict[str, Any]:
        """Fetch data từ Tardis API (implementation dependent on provider)."""
        # Implementation sẽ gọi actual Tardis API
        # Ví dụ: https://api.tardis.daily/v1/quotes
        pass
    
    def _check_local_cache(
        self,
        cache_key: str,
        freshness: DataFreshness
    ) -> Optional[CachedResponse]:
        """Check local LRU cache với TTL validation."""
        if cache_key not in self.local_cache:
            return None
        
        cached = self.local_cache[cache_key]
        age = time.time() - cached.cached_at
        
        if age > cached.freshness.ttl_seconds:
            del self.local_cache[cache_key]
            self._lru_order.remove(cache_key)
            return None
        
        return cached
    
    def _store_local_cache(self, cache_key: str, response: CachedResponse):
        """Store in local LRU cache với eviction."""
        if cache_key in self.local_cache:
            self._lru_order.remove(cache_key)
        elif len(self.local_cache) >= self.local_cache_size:
            # Evict least recently used
            oldest = self._lru_order.pop(0)
            del self.local_cache[oldest]
        
        self.local_cache[cache_key] = response
        self._lru_order.append(cache_key)
    
    def _update_lru(self, cache_key: str):
        """Update LRU order khi có cache hit."""
        self._lru_order.remove(cache_key)
        self._lru_order.append(cache_key)
    
    async def _store_redis(self, cache_key: str, response: CachedResponse):
        """Store in Redis với TTL."""
        data = {
            "data": response.data,
            "cached_at": response.cached_at,
            "api_cost_saved": response.api_cost_saved,
            "hit_count": response.hit_count
        }
        await self.redis.setex(
            cache_key,
            response.freshness.ttl_seconds,
            json.dumps(data)
        )
    
    async def _refresh_stale(
        self,
        cache_key: str,
        endpoint: str,
        params: Dict[str, Any],
        freshness: DataFreshness,
        api_key: str
    ):
        """Background refresh cho stale data (staleness <= 2x TTL)."""
        await asyncio.sleep(freshness.ttl_seconds)  # Wait for staleness
        
        try:
            new_data = await self._fetch_from_tardis(endpoint, params, api_key)
            response = CachedResponse(
                data=new_data,
                cached_at=time.time(),
                freshness=freshness,
                api_cost_saved=self._estimate_api_cost(endpoint, params)
            )
            await self._store_redis(cache_key, response)
        except Exception:
            pass  # Silent fail cho background refresh
    
    def _estimate_api_cost(self, endpoint: str, params: Dict[str, Any]) -> float:
        """Estimate API cost dựa trên endpoint type."""
        cost_map = {
            "quotes": 0.001,
            "historical": 0.005,
            "options": 0.002,
            "forex": 0.0005,
            "news": 0.001
        }
        return cost_map.get(endpoint.split("/")[-1], 0.001)
    
    async def get_cache_stats(self) -> Dict[str, Any]:
        """Get cache performance statistics."""
        local_hits = sum(c.hit_count for c in self.local_cache.values())
        
        # Get Redis stats
        keys = await self.redis.keys("tardis:*")
        
        total_cost_saved = 0.0
        for key in keys[:100]:  # Sample first 100
            data = await self.redis.get(key)
            if data:
                parsed = json.loads(data)
                total_cost_saved += parsed.get("api_cost_saved", 0) * parsed.get("hit_count", 1)
        
        return {
            "local_cache_size": len(self.local_cache),
            "redis_keys": len(keys),
            "estimated_cost_saved": total_cost_saved
        }

Usage với HolySheep AI cho intelligent caching decisions

async def intelligent_caching_demo(): """ Demo: Sử dụng HolySheep AI để quyết định freshness tier thay vì hard-code. """ import aiohttp cache = TardisDataCache() async with aiohttp.ClientSession() as session: # Dùng AI để classify request type classification_prompt = """ Classify this financial data request: - Symbol: {} - Requested at: {} (market hours: {}) - Use case: {} Return JSON: {{"freshness": "realtime|intraday|eod|historical", "reason": "..."}} """.format( "AAPL", time.strftime("%H:%M"), 9 <= int(time.strftime("%H")) <= 16, "intraday_trading" ) headers = { "Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY", "Content-Type": "application/json" } # Call HolySheep API async with session.post( "https://api.holysheep.ai/v1/chat/completions", headers=headers, json={ "model": "deepseek-v3.2", # $0.42/MTok - cheap for classification "messages": [{"role": "user", "content": classification_prompt}], "temperature": 0.1, "max_tokens": 100 } ) as resp: result = await resp.json() # Parse AI response và set appropriate TTL pass # Fetch với AI-determined freshness data, cached = await cache.get_or_fetch( endpoint="quotes", params={"symbol": "AAPL"}, freshness=DataFreshness.REALTIME # AI decided this ) return data if __name__ == "__main__": asyncio.run(intelligent_caching_demo())

Tầng 3: Model Inference Optimization - Batch Processing

Việc gọi LLM cho từng request riêng lẻ cực kỳ lãng phí. Với workload tài chính, chúng tôi áp dụng 3 kỹ thuật tối ưu:

import asyncio
import aiohttp
import json
import time
from typing import List, Dict, Any, Optional, Callable
from dataclasses import dataclass, field
from collections import defaultdict
import hashlib

@dataclass
class InferenceRequest:
    request_id: str
    prompt: str
    system_prompt: str = ""
    max_tokens: int = 500
    temperature: float = 0.7
    metadata: Dict[str, Any] = field(default_factory=dict)

@dataclass
class InferenceResponse:
    request_id: str
    content: str
    model: str
    tokens_used: int
    latency_ms: float
    cost_usd: float
    cached: bool = False

class InferenceOptimizer:
    """
    Optimizer cho LLM inference với batching và routing.
    Hỗ trợ HolySheep AI với giá cực rẻ và latency thấp.
    """
    
    # Model pricing (USD per 1M tokens) - HolySheep 2026
    MODEL_PRICING = {
        "deepseek-v3.2": {"input": 0.14, "output": 0.28, "latency_p50": 45},
        "gpt-4.1": {"input": 2.67, "output": 8.00, "latency_p50": 180},
        "claude-sonnet-4.5": {"input": 3.00, "output": 15.00, "latency_p50": 250},
        "gemini-2.5-flash": {"input": 0.35, "output": 2.50, "latency_p50": 60},
    }
    
    # Model routing rules
    TASK_MODEL_MAP = {
        "classification": "deepseek-v3.2",
        "sentiment": "gemini-2.5-flash",
        "analysis": "gpt-4.1",
        "summarization": "gemini-2.5-flash",
        "extraction": "deepseek-v3.2",
        "reasoning": "claude-sonnet-4.5",
    }
    
    def __init__(
        self,
        api_key: str,
        base_url: str = "https://api.holysheep.ai/v1",
        batch_size: int = 10,
        batch_timeout_ms: int = 500,
        max_concurrent: int = 20
    ):
        self.api_key = api_key
        self.base_url = base_url
        self.batch_size = batch_size
        self.batch_timeout = batch_timeout_ms / 1000
        self.semaphore = asyncio.Semaphore(max_concurrent)
        
        # Batch queues per model
        self.batches: Dict[str, List[InferenceRequest]] = defaultdict(list)
        self.batch_futures: Dict[str, List[asyncio.Future]] = defaultdict(list)
        
        # Cache for prompt prefix
        self.prompt_cache: Dict[str, str] = {}
        self.prompt_cache_hits = 0
        
        # Metrics
        self.metrics = {
            "total_requests": 0,
            "batched_requests": 0,
            "cache_hits": 0,
            "total_cost": 0.0,
            "total_latency_ms": 0.0
        }
    
    async def infer(
        self,
        prompt: str,
        task_type: str = "analysis",
        system_prompt: str = "",
        use_cache: bool = True,
        **kwargs
    ) -> InferenceResponse:
        """Single inference request với automatic routing."""
        
        # Generate request ID
        request_id = hashlib.sha256(
            f"{prompt}:{time.time()}".encode()
        ).hexdigest()[:12]
        
        request = InferenceRequest(
            request_id=request_id,
            prompt=prompt,
            system_prompt=system_prompt,
            **kwargs
        )
        
        # Check prompt cache
        cache_key = self._get_cache_key(system_prompt)
        if use_cache and cache_key in self.prompt_cache:
            request.system_prompt = self.prompt_cache[cache_key]
            self.prompt_cache_hits += 1
            self.metrics["cache_hits"] += 1
        elif use_cache:
            self.prompt_cache[cache_key] = system_prompt
        
        # Route to appropriate model
        model = self.TASK_MODEL_MAP.get(task_type, "deepseek-v3.2")
        
        # Try to batch with similar requests
        batched = await self._try_batch(request, model)
        if batched:
            return batched
        
        # Direct inference if batching not beneficial
        return await self._direct_inference(request, model)
    
    async def _try_batch(
        self,
        request: InferenceRequest,
        model: str
    ) -> Optional[InferenceResponse]:
        """Attempt to batch request with similar ones."""
        
        self.batches[model].append(request)
        future = asyncio.get_event_loop().create_future()
        self.batch_futures[model].append(future)
        
        # If batch is full, process immediately
        if len(self.batches[model]) >= self.batch_size:
            return await self._process_batch(model)
        
        # Otherwise wait for timeout or more requests
        asyncio.create_task(self._batch_timeout_handler(model))
        
        # Wait for result
        return await asyncio.wait_for(future, timeout=self.batch_timeout)
    
    async def _batch_timeout_handler(self, model: str):
        """Process batch after timeout."""
        await asyncio.sleep(self.batch_timeout)
        if self.batches[model]:
            await self._process_batch(model)
    
    async def _process_batch(self, model: str) -> Optional[InferenceResponse]:
        """Process a batch of requests."""
        if not self.batches[model]:
            return None
        
        requests = self.batches[model]
        futures = self.batch_futures[model]
        
        self.batches[model] = []
        self.batch_futures[model] = []
        
        # Combine prompts with separators
        combined_prompt = self._combine_batch_prompts(requests)
        
        start_time = time.time()
        
        async with self.semaphore:
            try:
                response = await self._call_api(
                    model=model,
                    messages=[
                        {"role": "system", "content": requests[0].system_prompt or "You are a helpful assistant."},
                        {"role": "user", "content": combined_prompt}
                    ],
                    max_tokens=max(r.max_tokens for r in requests)
                )
            except Exception as e:
                # Fail all futures in batch
                for f in futures:
                    if not f.done():
                        f.set_exception(e)
                return None
        
        # Parse combined response
        responses = self._parse_batch_response(response, requests)
        
        latency_ms = (time.time() - start_time) * 1000
        total_cost = self._calculate_cost(model, response)
        
        # Resolve futures
        for req, resp in zip(requests, responses):
            cost = total_cost / len(requests)  # Proportional cost
            full_response = InferenceResponse(
                request_id=req.request_id,
                content=resp,
                model=model,
                tokens_used=response.get("usage", {}).get("total_tokens", 0) // len(requests),
                latency_ms=latency_ms,
                cost_usd=cost,
                cached=False
            )
            
            self.metrics["total_requests"] += 1
            self.metrics["batched_requests"] += 1
            self.metrics["total_cost"] += cost
            self.metrics["total_latency_ms"] += latency_ms
            
            # Find and resolve corresponding future
            for i, r in enumerate(requests):
                if r.request_id == req.request_id:
                    futures[i].set_result(full_response)
                    break
        
        return responses[0] if responses else None
    
    async def _direct_inference(
        self,
        request: InferenceRequest,
        model: str
    ) -> InferenceResponse:
        """Direct inference without batching."""
        
        start_time = time.time()
        
        async with self.semaphore:
            response = await self._call_api(
                model=model,
                messages=[
                    {"role": "system", "content": request.system_prompt or "You are a helpful assistant."},
                    {"role": "user", "content": request.prompt}
                ],
                max_tokens=request.max_tokens,
                temperature=request.temperature
            )
        
        latency_ms = (time.time() - start_time) * 1000
        cost = self._calculate_cost(model, response)
        
        self.metrics["total_requests"] += 1
        self.metrics["total_cost"] += cost
        self.metrics["total_latency_ms"] += latency_ms
        
        return InferenceResponse(
            request_id=request.request_id,
            content=response["choices"][0]["message"]["content"],
            model=model,
            tokens_used=response.get("usage", {}).get("total_tokens", 0),
            latency_ms=latency_ms,
            cost_usd=cost,
            cached=False
        )
    
    async def _call_api(
        self,
        model: str,
        messages: List[Dict],
        **kwargs
    ) -> Dict[str, Any]:
        """Call HolySheep AI API."""
        
        async with aiohttp.ClientSession() as session:
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            }
            
            payload = {
                "model": model,
                "messages": messages,
                **kwargs
            }
            
            async with session.post(
                f"{self.base_url}/chat/completions",
                headers=headers,
                json=payload
            ) as resp:
                if resp.status != 200:
                    error = await resp.text()
                    raise RuntimeError(f"API error: {error}")
                return await resp.json()
    
    def _combine_batch_prompts(self, requests: List[InferenceRequest]) -> str:
        """Combine multiple prompts into one with separators."""
        combined = []
        for i, req in enumerate(requests):
            combined.append(f"--- Request {i+1} ---\n{req.prompt}")
        return "\n\n".join(combined)
    
    def _parse_batch_response(
        self,
        response: Dict[str, Any],
        requests: List[InferenceRequest]
    ) -> List[str]:
        """Parse combined response back into individual responses."""
        content = response["choices"][0]["message"]["content"]
        
        # Simple parsing - assume delimiter-based
        parts = content.split("--- Request ")
        results = []
        
        for i, req in enumerate(requests):
            if i == 0 and parts[0].strip():
                results.append(parts[0].strip())
            elif len(parts) > i:
                # Extract response after delimiter
                section = parts[i].split("---")[0].strip()
                results.append(section)
            else:
                results.append("")
        
        return results[:len(requests)]
    
    def _calculate_cost(self, model: str, response: Dict[str, Any]) -> float:
        """Calculate cost for API call."""
        pricing = self.MODEL_PRICING.get(model, {"input": 0.5, "output": 1.0})
        usage = response.get("usage", {})
        
        input_tokens = usage.get("prompt_tokens", 0)
        output_tokens = usage.get("completion_tokens", 0)
        
        cost = (input_tokens / 1_000_000) * pricing["input"]
        cost += (output_tokens / 1_000_000) * pricing["output"]
        
        return cost
    
    def _get_cache_key(self, system_prompt: str) -> str:
        """Generate cache key for system prompt."""
        return hashlib.sha256(system_prompt.encode()).hexdigest()[:32]
    
    def get_metrics(self) -> Dict[str, Any]:
        """Get optimizer metrics."""
        avg_latency = (
            self.metrics["total_latency_ms"] / self.metrics["total_requests"]
            if self.metrics["total_requests"] > 0 else 0
        )
        
        return {
            **self.metrics,
            "cache_hit_rate": self.prompt_cache_hits / max(1, self.metrics["total_requests"]),
            "avg_latency_ms": avg_latency,
            "cost_per_request": self.metrics["total_cost"] / max(1, self.metrics["total_requests"])
        }

Benchmark comparison

async def benchmark_inference(): """Benchmark: Batch vs Direct inference cost comparison.""" optimizer = InferenceOptimizer( api_key="YOUR_HOLYSHEEP_API_KEY", batch_size=5, batch_timeout_ms=100 ) test_prompts = [ f"Analyze AAPL stock performance for day {i}: trends, volume, key indicators" for i in range(20) ] # Direct inference simulation direct_start = time