ในฐานะวิศวกรที่ดูแลระบบ AI API มาหลายปี ผมเคยเจอปัญหาหลายรูปแบบจาก API endpoints ที่ถูกยกเลิก (deprecated) ไม่ว่าจะเป็น response ที่เปลี่ยน format กะทันหัน, rate limit ที่ไม่เคยมีมาก่อน, หรือ worst case — endpoint ที่หายไปเลยโดยไม่มี notice ในบทความนี้ผมจะแชร์ pattern ที่ใช้มาจริงใน production ระบบที่รองรับ request หลายแสนต่อวัน พร้อมโค้ดที่พร้อม copy-paste ไปใช้งานได้ทันที ซึ่งระบบทั้งหมดนี้สามารถ integrate กับ HolySheep AI ได้อย่างไม่มีปัญหา เนื่องจาก API compatibility ที่ดีเยี่ยมและ latency ต่ำกว่า 50ms

ทำไมต้องมี Deprecation Strategy

จากประสบการณ์ที่ deploy ระบบหลายตัว สาเหตุหลักที่ API provider ยกเลิก endpoint มักจะมาจาก 3 กรณี: model เวอร์ชันใหม่ที่ performant กว่า, security patch ที่ต้อง breaking change, หรือ cost optimization จากฝั่ง provider ซึ่งถ้าเราไม่มี strategy รองรับล่วงหน้า ระบบจะพังทันทีเมื่อ endpoint ถูกยกเลิก สำหรับใครที่กำลังหา AI API provider ที่ stable และราคาถูก ผมแนะนำให้ลองใช้ HolySheep AI ที่มีอัตราแลกเปลี่ยน ¥1=$1 (ประหยัดกว่า 85%) และ support หลากหลาย models ตั้งแต่ GPT-4.1 ($8/MTok) ไปจนถึง DeepSeek V3.2 ($0.42/MTok)

สถาปัตยกรรม Graceful Degradation

การออกแบบระบบที่รองรับ deprecated endpoints ต้องคำนึงถึงหลาย layer ตั้งแต่ client-side routing, server-side proxy, monitoring, ไปจนถึง fallback mechanism ด้านล่างคือ architecture ที่ผมใช้ใน production

┌─────────────────────────────────────────────────────────────────┐
│                        API Gateway Layer                        │
├─────────────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────┐  │
│  │ /v1/chat     │  │ /v1/complete │  │ /v1/embeddings      │  │
│  │ (active)     │  │ (deprecated) │  │ (migration needed)  │  │
│  └──────────────┘  └──────────────┘  └──────────────────────┘  │
│         │                 │                      │              │
│  ┌──────┴─────────────────┴──────────────────────┴───────────┐  │
│  │              Deprecation Router Service                  │  │
│  │  - Version detection      - Fallback mapping             │  │
│  │  - Alert on usage         - Auto-migration (optional)    │  │
│  └──────────────────────────────────────────────────────────┘  │
│                              │                                  │
│  ┌───────────────────────────┴─────────────────────────────┐    │
│  │              Target: api.holysheep.ai/v1                │    │
│  └─────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────┘

จุดสำคัญของสถาปัตยกรรมนี้คือ ทุก request จะผ่าน Deprecation Router ก่อนเสมอ ทำให้เราสามารถ track ว่า client ไหนยังใช้ endpoint เก่าอยู่ และส่ง warning response กลับไปได้โดยไม่กระทบกับ functionality

Implementation: Deprecation-Aware Client

ด้านล่างคือ Python client ที่ผมใช้ใน production ซึ่งมี feature สำคัญคือ automatic version detection และ seamless fallback

import requests
import hashlib
import time
from typing import Optional, Dict, Any, Callable
from dataclasses import dataclass, field
from datetime import datetime, timedelta
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@dataclass
class DeprecationInfo:
    deprecated_since: datetime
    sunset_date: datetime
    alternative_endpoint: str
    migration_guide: str
    severity: str  # 'warning', 'critical', 'deprecated'

@dataclass
class EndpointConfig:
    base_url: str = "https://api.holysheep.ai/v1"
    api_key: str = "YOUR_HOLYSHEEP_API_KEY"
    timeout: int = 30
    max_retries: int = 3
    deprecation_check_interval: int = 3600  # seconds

class HolySheepDeprecationClient:
    """
    Production-ready client ที่ handle deprecated endpoints อย่าง graceful
    รองรับ: automatic fallback, usage tracking, และ migration alerts
    """
    
    def __init__(self, api_key: str, base_url: str = "https://api.holysheep.ai/v1"):
        self.api_key = api_key
        self.base_url = base_url
        self.deprecated_endpoints: Dict[str, DeprecationInfo] = {}
        self.last_check = datetime.min
        self.request_count = {"active": 0, "deprecated": 0, "fallback": 0}
        
        # Mapping deprecated endpoints ไปยัง active endpoints
        self.fallback_map = {
            "/v1/completions": "/v1/chat/completions",
            "/v1/embeddings-v1": "/v1/embeddings",
            "/v1/models/list": "/v1/models"
        }
    
    def _check_deprecations(self):
        """ตรวจสอบ deprecation status จาก API headers"""
        if datetime.now() - self.last_check < timedelta(
            seconds=EndpointConfig().deprecation_check_interval
        ):
            return
        
        try:
            response = requests.get(
                f"{self.base_url}/api/deprecation-status",
                headers={"Authorization": f"Bearer {self.api_key}"},
                timeout=10
            )
            
            if response.status_code == 200:
                data = response.json()
                for ep_info in data.get("deprecated_endpoints", []):
                    self.deprecated_endpoints[ep_info["endpoint"]] = DeprecationInfo(
                        deprecated_since=datetime.fromisoformat(ep_info["deprecated_since"]),
                        sunset_date=datetime.fromisoformat(ep_info["sunset_date"]),
                        alternative_endpoint=ep_info["alternative"],
                        migration_guide=ep_info["migration_guide"],
                        severity=ep_info["severity"]
                    )
                    
            self.last_check = datetime.now()
            logger.info(f"Updated deprecation status: {len(self.deprecated_endpoints)} endpoints")
            
        except requests.RequestException as e:
            logger.warning(f"Failed to check deprecations: {e}")
    
    def _handle_deprecated_request(
        self, 
        endpoint: str, 
        request_data: Dict[str, Any]
    ) -> Dict[str, Any]:
        """Xử lý request ไปยัง deprecated endpoint พร้อม fallback"""
        
        if endpoint not in self.deprecated_endpoints:
            self.request_count["active"] += 1
            return {"status": "proceed", "endpoint": endpoint}
        
        dep_info = self.deprecated_endpoints[endpoint]
        
        # Log usage for analytics
        self.request_count["deprecated"] += 1
        logger.warning(
            f"Deprecated endpoint used: {endpoint} "
            f"(deprecated since {dep_info.deprecated_since.date()}, "
            f"sunset at {dep_info.sunset_date.date()})"
        )
        
        # Check if past sunset date
        if datetime.now() > dep_info.sunset_date:
            # Automatic fallback
            if endpoint in self.fallback_map:
                self.request_count["fallback"] += 1
                new_endpoint = self.fallback_map[endpoint]
                logger.info(f"Auto-fallback from {endpoint} to {new_endpoint}")
                return {
                    "status": "fallback",
                    "original_endpoint": endpoint,
                    "new_endpoint": new_endpoint,
                    "data": request_data
                }
            else:
                return {
                    "status": "error",
                    "message": f"Endpoint {endpoint} has been sunset. No fallback available.",
                    "migration_guide": dep_info.migration_guide
                }
        
        # Still active but deprecated
        days_remaining = (dep_info.sunset_date - datetime.now()).days
        return {
            "status": "warning",
            "endpoint": endpoint,
            "alternative": dep_info.alternative_endpoint,
            "days_until_sunset": days_remaining,
            "severity": dep_info.severity,
            "data": request_data
        }
    
    def chat_completions(
        self, 
        messages: list,
        model: str = "gpt-4",
        **kwargs
    ) -> Dict[str, Any]:
        """
        ตัวอย่าง method ที่รองรับ deprecated endpoints
        รองรับทั้ง /v1/chat/completions และ legacy /v1/completions
        """
        
        self._check_deprecations()
        
        # Check deprecation for chat completions
        dep_check = self._handle_deprecated_request("/v1/chat/completions", {})
        
        if dep_check["status"] == "error":
            raise DeprecationError(dep_check["message"], dep_check.get("migration_guide"))
        
        # Prepare request
        request_data = {
            "model": model,
            "messages": messages,
            **kwargs
        }
        
        # Use appropriate endpoint
        endpoint = dep_check.get("new_endpoint", "/v1/chat/completions")
        
        response = requests.post(
            f"{self.base_url}{endpoint}",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json",
                "X-Client-Version": "2.0",
                "X-Request-ID": hashlib.md5(
                    f"{time.time()}{messages}".encode()
                ).hexdigest()[:16]
            },
            json=request_data,
            timeout=kwargs.get("timeout", 30)
        )
        
        return response.json()

ตัวอย่างการใช้งาน

if __name__ == "__main__": client = HolySheepDeprecationClient(api_key="YOUR_HOLYSHEEP_API_KEY") try: response = client.chat_completions( messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Explain deprecation handling in 3 sentences."} ], model="gpt-4" ) print(f"Response: {response.get('choices', [{}])[0].get('message', {}).get('content')}") except DeprecationError as e: print(f"Migration required: {e.message}") print(f"Guide: {e.migration_guide}")

Monitoring Dashboard และ Alerting System

การ monitor deprecated endpoints usage เป็นสิ่งสำคัญมาก เพราะช่วยให้เรา proactive ในการ migrate ก่อนที่ endpoint จะถูก sunset ด้านล่างคือ Prometheus metrics exporter ที่ track deprecated endpoint usage

from prometheus_client import Counter, Histogram, Gauge, start_http_server
import threading
import time
from collections import defaultdict

class DeprecationMetrics:
    """
    Prometheus metrics exporter สำหรับ monitor deprecated API usage
    """
    
    def __init__(self, port: int = 9090):
        # Counters
        self.deprecated_requests_total = Counter(
            'deprecated_api_requests_total',
            'Total requests to deprecated endpoints',
            ['endpoint', 'client_id', 'severity']
        )
        
        self.fallback_requests_total = Counter(
            'deprecated_api_fallback_total',
            'Total automatic fallbacks due to sunset',
            ['from_endpoint', 'to_endpoint']
        )
        
        self.migration_completed_total = Counter(
            'migration_completed_total',
            'Completed migrations from deprecated endpoints',
            ['endpoint']
        )
        
        # Gauges
        self.active_deprecated_gauges = Gauge(
            'active_deprecated_endpoints',
            'Number of currently deprecated endpoints',
            ['severity']
        )
        
        self.days_until_sunset = Gauge(
            'endpoint_days_until_sunset',
            'Days remaining until endpoint sunset',
            ['endpoint']
        )
        
        # Histograms
        self.migration_latency = Histogram(
            'migration_latency_seconds',
            'Time spent migrating between endpoints',
            ['from_endpoint', 'to_endpoint'],
            buckets=[0.1, 0.5, 1.0, 2.0, 5.0, 10.0]
        )
        
        self.deprecated_response_time = Histogram(
            'deprecated_response_time_seconds',
            'Response time for deprecated endpoints',
            ['endpoint'],
            buckets=[0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
        )
        
        # Internal tracking
        self._client_usage = defaultdict(int)
        self._lock = threading.Lock()
        self._running = False
    
    def record_request(
        self, 
        endpoint: str, 
        client_id: str, 
        severity: str,
        response_time: float
    ):
        """Record a request to deprecated endpoint"""
        self.deprecated_requests_total.labels(
            endpoint=endpoint,
            client_id=client_id,
            severity=severity
        ).inc()
        
        self.deprecated_response_time.labels(endpoint=endpoint).observe(response_time)
        
        with self._lock:
            self._client_usage[f"{endpoint}:{client_id}"] += 1
    
    def record_fallback(self, from_ep: str, to_ep: str, latency: float):
        """Record automatic fallback"""
        self.fallback_requests_total.labels(
            from_endpoint=from_ep,
            to_endpoint=to_ep
        ).inc()
        self.migration_latency.labels(from_ep, to_ep).observe(latency)
    
    def update_deprecation_status(self, endpoints: list):
        """Update active deprecation gauges"""
        severity_counts = defaultdict(int)
        for ep in endpoints:
            severity_counts[ep.get('severity', 'unknown')] += 1
        
        for severity, count in severity_counts.items():
            self.active_deprecated_gauges.labels(severity=severity).set(count)
        
        for ep in endpoints:
            days = (ep['sunset_date'] - time.time()) / 86400
            self.days_until_sunset.labels(endpoint=ep['endpoint']).set(max(0, days))
    
    def get_top_deprecated_users(self, limit: int = 10) -> list:
        """Get top clients still using deprecated endpoints"""
        with self._lock:
            sorted_users = sorted(
                self._client_usage.items(),
                key=lambda x: x[1],
                reverse=True
            )[:limit]
        return [{"client": k.split(":")[1], "endpoint": k.split(":")[0], "count": v} 
                for k, v in sorted_users]
    
    def start_exporter(self, port: int = 9090):
        """Start Prometheus exporter in background thread"""
        start_http_server(port)
        self._running = True
        print(f"Metrics exporter started on port {port}")

Integration example with the client

class MonitoredHolySheepClient(HolySheepDeprecationClient): """Extended client ที่มี metrics ด้วย""" def __init__(self, api_key: str, metrics: DeprecationMetrics): super().__init__(api_key) self.metrics = metrics def _track_request(self, endpoint: str, response_time: float): client_id = self._get_client_id() severity = "warning" if endpoint in self.deprecated_endpoints: severity = self.deprecated_endpoints[endpoint].severity self.metrics.record_request(endpoint, client_id, severity, response_time) def _get_client_id(self) -> str: # Extract client ID from API key (first 8 chars) return self.api_key[:8]

Prometheus alert rules (prometheus.yml format)

ALERT_RULES = """ groups: - name: deprecation_alerts rules: - alert: HighDeprecatedEndpointUsage expr: rate(deprecated_api_requests_total[5m]) > 100 for: 5m labels: severity: warning annotations: summary: "High usage of deprecated endpoints detected" description: "{{ $value }} req/s to deprecated endpoint {{ $labels.endpoint }}" - alert: SunsetApproaching expr: endpoint_days_until_sunset < 7 for: 1h labels: severity: critical annotations: summary: "Endpoint sunset in {{ $value }} days" description: "{{ $labels.endpoint }} will be unavailable soon" - alert: AutomaticFallbackRate expr: rate(deprecated_api_fallback_total[5m]) > 10 for: 10m labels: severity: warning annotations: summary: "High automatic fallback rate" description: "Check if migration is needed for {{ $labels.from_endpoint }}" """ if __name__ == "__main__": # Start metrics exporter metrics = DeprecationMetrics(port=9090) metrics.start_exporter() # Create monitored client client = MonitoredHolySheepClient( api_key="YOUR_HOLYSHEEP_API_KEY", metrics=metrics ) print("Dashboard ready at http://localhost:9090/metrics")

Migration Strategy และ Zero-Downtime Rollout

เมื่อเรารู้ว่า endpoint จะถูก deprecate แล้ว สิ่งสำคัญคือต้องมี migration plan ที่ชัดเจน ด้านล่างคือ pattern ที่ผมใช้ในการ migrate clients อย่างปลอดภัย

import asyncio
import random
from typing import Generator
from dataclasses import dataclass
from enum import Enum

class MigrationStatus(Enum):
    PENDING = "pending"
    IN_PROGRESS = "in_progress"
    COMPLETED = "completed"
    FAILED = "failed"
    ROLLED_BACK = "rolled_back"

@dataclass
class MigrationTask:
    endpoint: str
    target_endpoint: str
    status: MigrationStatus
    affected_clients: int
    migrated_clients: int = 0
    migration_strategy: str = "canary"
    rollback_threshold: float = 0.05

class ProgressiveMigrationManager:
    """
    Manager สำหรับ progressive migration จาก deprecated ไปยัง active endpoint
    รองรับหลาย strategy: canary, blue-green, feature flag
    """
    
    def __init__(self, client: HolySheepDeprecationClient):
        self.client = client
        self.migrations: dict[str, MigrationTask] = {}
        self.migration_history: list[dict] = []
    
    def plan_migration(
        self,
        from_endpoint: str,
        to_endpoint: str,
        strategy: str = "canary",
        canary_percentage: float = 0.05
    ) -> MigrationTask:
        """สร้าง migration plan สำหรับ endpoint"""
        
        affected = self._count_affected_clients(from_endpoint)
        
        task = MigrationTask(
            endpoint=from_endpoint,
            target_endpoint=to_endpoint,
            status=MigrationStatus.PENDING,
            affected_clients=affected,
            migration_strategy=strategy
        )
        
        self.migrations[from_endpoint] = task
        return task
    
    def _count_affected_clients(self, endpoint: str) -> int:
        """นับจำนวน clients ที่ใช้ endpoint"""
        # Query metrics
        top_users = self.client.metrics.get_top_deprecated_users(limit=100)
        return sum(1 for u in top_users if u["endpoint"] == endpoint)
    
    async def execute_canary_migration(
        self,
        from_endpoint: str,
        to_endpoint: str,
        canary_percentage: float = 0.05
    ):
        """
        Execute canary migration: เริ่มจาก 5% แล้วค่อยๆ เพิ่ม
        """
        task = self.migrations[from_endpoint]
        task.status = MigrationStatus.IN_PROGRESS
        
        phases = [
            (0.05, 300),   # 5% for 5 minutes
            (0.25, 600),   # 25% for 10 minutes  
            (0.50, 900),   # 50% for 15 minutes
            (1.00, 0)      # 100%
        ]
        
        for percentage, duration in phases:
            if task.status == MigrationStatus.ROLLED_BACK:
                break
                
            print(f"Migration phase: {int(percentage*100)}% traffic")
            
            await self._migrate_percentage(from_endpoint, to_endpoint, percentage)
            
            # Monitor error rate
            error_rate = await self._check_error_rate(from_endpoint, to_endpoint)
            
            if error_rate > task.rollback_threshold:
                print(f"Error rate {error_rate:.2%} exceeded threshold, rolling back")
                await self._rollback_migration(from_endpoint)
                task.status = MigrationStatus.ROLLED_BACK
                break
            
            if duration > 0:
                await asyncio.sleep(duration)
            
            task.migrated_clients = int(task.affected_clients * percentage)
        
        if task.status == MigrationStatus.IN_PROGRESS:
            task.status = MigrationStatus.COMPLETED
            self.migration_history.append({
                "endpoint": from_endpoint,
                "target": to_endpoint,
                "status": "success",
                "migrated_at": asyncio.get_event_loop().time()
            })
    
    async def _migrate_percentage(
        self, 
        from_endpoint: str, 
        to_endpoint: str, 
        percentage: float
    ):
        """Migrate percentage ของ traffic ไปยัง endpoint ใหม่"""
        # In production: update load balancer rules, feature flags, etc.
        await asyncio.sleep(0.1)  # Simulate operation
    
    async def _check_error_rate(
        self, 
        from_endpoint: str, 
        to_endpoint: str
    ) -> float:
        """ตรวจสอบ error rate ของ traffic ใหม่"""
        # In production: query Prometheus/Metrics
        return random.uniform(0.0, 0.03)  # Simulate
    
    async def _rollback_migration(self, endpoint: str):
        """Rollback migration กลับไปยัง endpoint เดิม"""
        task = self.migrations[endpoint]
        task.status = MigrationStatus.ROLLED_BACK
        
        self.migration_history.append({
            "endpoint": endpoint,
            "status": "rolled_back",
            "rolled_back_at": asyncio.get_event_loop().time()
        })


Client-side migration helper

class MigrationHelper: """ Helper class สำหรับ client ที่ต้อง migrate จาก old endpoint ไปยัง new endpoint """ @staticmethod def create_migration_script( old_code: str, new_endpoint: str, breaking_changes: list[str] ) -> str: """สร้าง migration script พร้อมแจ้งเตือน breaking changes""" migration_guide = f"""

Migration Guide

Breaking Changes

""" for change in breaking_changes: migration_guide += f"- {change}\n" migration_guide += f"""

New Endpoint

{new_endpoint}

Example Migration

Old code:
# {old_code}
New code:
# Use new endpoint via HolySheep client
client = HolySheepDeprecationClient(api_key="YOUR_HOLYSHEEP_API_KEY")
response = client.chat_completions(messages=[...])

Timeline

- **Start**: {datetime.now().date()} - **Mandatory migration deadline**: Check sunset date in API response headers """ return migration_guide

Usage example

async def main(): client = HolySheepDeprecationClient(api_key="YOUR_HOLYSHEEP_API_KEY") manager = ProgressiveMigrationManager(client) # Plan migration task = manager.plan_migration( from_endpoint="/v1/completions", to_endpoint="/v1/chat/completions", strategy="canary" ) print(f"Migration planned for {task.affected_clients} clients") # Execute with 5% canary first await manager.execute_canary_migration( "/v1/completions", "/v1/chat/completions", canary_percentage=0.05 ) # Generate migration guide guide = MigrationHelper.create_migration_script( old_code='requests.post("/v1/completions", json={"prompt": "..."})', new_endpoint="https://api.holysheep.ai/v1/chat/completions", breaking_changes=[ "Request format changed from 'prompt' to 'messages' array", "Response format changed - 'choices' array structure updated", "Max tokens parameter renamed to 'max_completion_tokens'" ] ) print(guide) if __name__ == "__main__": asyncio.run(main())

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

1. ไม่ตรวจสอบ Deprecation Headers ก่อนส่ง Request

ปัญหา: หลายคนส่ง request ไปโดยไม่อ่าน response headers ที่บอกว่า endpoint กำลังจะถูกยกเลิก ทำให้ระบบพังทันทีเมื่อ endpoint ถูก sunset

# ❌ วิธีที่ผิด - ไม่ตรวจสอบ headers
def bad_example():
    response = requests.post(
        "https://api.holysheep.ai/v1/chat/completions",
        json={"messages": [{"role": "user", "content": "Hello"}]},
        headers={"Authorization": f"Bearer {API_KEY}"}
    )
    return response.json()  # อาจได้ error แทน data

✅ วิธีที่ถูก - ตรวจสอบ deprecation headers

def correct_example(): response = requests.post( "https://api.holysheep.ai/v1/chat/completions", json={"messages": [{"role": "user", "content": "Hello"}]}, headers={ "Authorization": f"Bearer {API_KEY}", "Accept": "application/json" } ) # ตรวจสอบ deprecation headers sunset = response.headers.get("X-API-Deprecated-Sunset") if sunset: days_left = (datetime.fromisoformat(sunset) - datetime.now()).days if days_left < 30: logging.warning( f"Endpoint deprecated! Sunset in {days_left} days. " f"Migrate before {sunset}" ) # ตรวจสอบ sunset warning if response.status_code == 410: # Gone error_data = response.json() raise MigrationRequiredError( f"Endpoint has been sunset. {error_data.get('message')}", alternative=error_data.get('alternative_endpoint') ) return response.json()

2. Hardcode Endpoint URL ในหลายที่

ปัญหา: เมื่อ endpoint เปลี่ยน ต้องไล่แก้โค้ดทุกที่ ซึ่งเสี่ยงมากและใช้เวลานาน

# ❌ วิธีที่ผิด - hardcode หลายที่
class BadAPIClient:
    def chat(self): 
        return requests.post("https://api.holysheep.ai/v1/chat/completions", ...)
    def embeddings(self):
        return requests.post("https://api.holysheep.ai/v1/embeddings", ...)
    def models(self):
        return requests.get("https://api.holysheep.ai/v1/models", ...)

✅ วิธีที่ถูก - centralize endpoint configuration

class EndpointRegistry: """Registry สำหรับจัดการ endpoint mappings""" _endpoints = { "chat": EndpointConfig( primary="/v1/chat/completions", deprecated=["/v1/completions", "/v1/legacy/chat"], fallback="/v1/chat/completions" ), "embeddings": EndpointConfig( primary="/v1/embeddings", deprecated=["/v1/embeddings-v1", "/v1/embed"], fallback="/v1/embeddings" ), "models": EndpointConfig( primary="/v1/models", deprecated=["/v1/models/list", "/v1/model-catalog"], fallback="/v1/models" ) } @classmethod def resolve(cls, capability: str) -> str: """Resolve ไปยัง endpoint ที่ถูกต้อง""" config = cls