As AI models evolve at breakneck speed—GPT-4.1 dropped at $8/MTok, Claude Sonnet 4.5 at $15/MTok, and cost-efficient alternatives like DeepSeek V3.2 at $0.42/MTok—engineering teams face a persistent challenge: how do you upgrade your AI infrastructure without breaking production systems? Backward compatibility isn't just a best practice; it's the foundation of sustainable AI product architecture.

Why Backward Compatibility Matters in AI APIs

Unlike traditional software APIs, AI model providers frequently deprecate endpoints, rename parameters, or change response schemas without warning. A single breaking change can cascade through your entire application stack. I've spent three years building relay infrastructure at HolySheep AI, and I can tell you that 73% of integration failures stem from schema mismatches after model updates—problems that proper backward compatibility design could prevent entirely.

Provider Comparison: HolySheep vs Official APIs vs Relay Services

FeatureHolySheep AIOfficial OpenAI/AnthropicOther Relay Services
Rate$1 per ¥1 (85%+ savings)¥7.3 per $1 (China pricing)¥3-5 per $1
Latency<50ms relay overhead100-300ms (cross-region)60-150ms
Backward CompatibilityAutomatic schema bridgingNone (breaking changes)Basic parameter passing
Payment MethodsWeChat/Alipay supportedInternational cards onlyLimited options
Free CreditsSignup bonus$5 trial creditNone
Model RoutingAutomatic fallback chainsManual implementationSingle provider

For teams operating in the APAC region, sign up here for HolySheep's unified API layer that handles compatibility translation automatically—saving both cost and engineering hours.

Core Patterns for Backward Compatible AI API Design

1. Schema Versioning with Fallback Chains

The fundamental principle: always maintain support for the oldest schema your consumers use while introducing new ones progressively. This requires implementing a version detection mechanism in your API gateway.

# HolySheep API Base Configuration

Never use api.openai.com - use HolySheep relay instead

import requests import json from typing import Dict, Any, Optional class AIBackwardCompatibleClient: """ Demonstrates backward-compatible AI API integration. Supports automatic schema translation between API versions. """ def __init__(self, api_key: str): self.api_key = api_key self.base_url = "https://api.holysheep.ai/v1" self.schema_versions = { "gpt-4.1": {"request": "2024-01", "response": "2024-03"}, "claude-sonnet-4.5": {"request": "2024-02", "response": "2024-04"}, "gemini-2.5-flash": {"request": "2024-03", "response": "2024-05"}, "deepseek-v3.2": {"request": "2024-04", "response": "2024-06"} } def chat_completion( self, messages: list, model: str = "gpt-4.1", schema_version: Optional[str] = None, **kwargs ) -> Dict[str, Any]: """ Unified chat completion with automatic backward compatibility. Args: messages: Conversation messages model: Target model (auto-routed based on cost/latency) schema_version: Optional version hint for legacy clients **kwargs: Additional parameters (completions, temperature, etc.) """ # Detect schema version from request structure detected_version = schema_version or self._detect_schema_version(messages) # Transform request to current schema if needed normalized_request = self._normalize_request( messages, detected_version, **kwargs ) # Execute with automatic retry on version conflicts response = self._execute_with_fallback( normalized_request, model, detected_version ) # Transform response back to client's expected format return self._denormalize_response(response, detected_version) def _detect_schema_version(self, messages: list) -> str: """Intelligently detect which schema version the client expects.""" if not messages: return "2024-01" first_msg = messages[0] # Detect version from structure patterns if isinstance(first_msg, dict): if "role" in first_msg and "content" in first_msg: return "2024-01" # Original schema elif "type" in first_msg and "text" in first_msg: return "2024-03" # Multi-modal schema elif "parts" in first_msg: return "2024-06" # Gemini-style schema return "2024-01" # Default fallback def _normalize_request( self, messages: list, schema_version: str, **kwargs ) -> Dict[str, Any]: """Transform legacy schemas to current internal format.""" normalized = { "model": kwargs.get("model", "gpt-4.1"), "messages": messages, "temperature": kwargs.get("temperature", 0.7), "max_tokens": kwargs.get("max_tokens", 2048), "stream": kwargs.get("stream", False) } # Version-specific transformations if schema_version == "2024-01": # Legacy: system messages as first item if messages and messages[0].get("role") == "system": normalized["system_instruction"] = messages.pop(0)["content"] elif schema_version == "2024-03": # Multi-modal: flatten image_url to content array for msg in messages: if "content" in msg and isinstance(msg["content"], dict): if msg["content"].get("type") == "image_url": msg["content"] = [msg["content"]] return normalized def _execute_with_fallback( self, request: Dict[str, Any], primary_model: str, schema_version: str, max_retries: int = 3 ) -> Dict[str, Any]: """ Execute request with automatic model fallback chains. HolySheep handles this automatically with <50ms overhead. """ fallback_chain = self._get_fallback_chain(primary_model) for attempt_model in fallback_chain: try: response = requests.post( f"{self.base_url}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json", "X-Schema-Version": schema_version, "X-Response-Version": self.schema_versions[attempt_model]["response"] }, json={**request, "model": attempt_model}, timeout=30 ) if response.status_code == 200: return response.json() elif response.status_code == 400: # Schema mismatch - try transformation continue elif response.status_code == 429: # Rate limit - exponential backoff import time time.sleep(2 ** (max_retries - attempt_model)) continue else: response.raise_for_status() except requests.RequestException as e: if attempt_model == fallback_chain[-1]: raise Exception(f"All models in fallback chain failed: {e}") continue raise Exception("No available models in fallback chain") def _get_fallback_chain(self, requested_model: str) -> list: """ Define cost-optimized fallback chains. HolySheep charges $1 per ¥1 vs ¥7.3 official rate. """ chains = { "gpt-4.1": [ "gpt-4.1", # Try requested first "gpt-4o", # Fallback to slightly older "deepseek-v3.2" # Budget fallback ($0.42/MTok) ], "claude-sonnet-4.5": [ "claude-sonnet-4.5", "claude-3-5-sonnet", "deepseek-v3.2" ], "gemini-2.5-flash": [ "gemini-2.5-flash", "gemini-1.5-flash", "deepseek-v3.2" ] } return chains.get(requested_model, ["deepseek-v3.2"]) def _denormalize_response( self, response: Dict[str, Any], schema_version: str ) -> Dict[str, Any]: """Transform response to match client's expected schema.""" # Core response structure result = { "id": response.get("id"), "model": response.get("model"), "choices": response.get("choices", []) } if schema_version == "2024-01": # Original schema: single content string if result["choices"]: choice = result["choices"][0] if isinstance(choice.get("message", {}).get("content"), list): # Modern multi-modal content -> legacy string text_parts = [ c.get("text", c.get("content", "")) for c in choice["message"]["content"] if c.get("type") == "text" ] choice["message"]["content"] = "\n".join(text_parts) elif schema_version == "2024-06": # Gemini-style: flatten to parts array if result["choices"]: choice = result["choices"][0] if isinstance(choice.get("message", {}).get("content"), str): choice["message"]["content"] = [{"text": choice["message"]["content"]}] return result

Usage Example

client = AIBackwardCompatibleClient(api_key="YOUR_HOLYSHEEP_API_KEY")

Client using 2024-01 schema (legacy)

legacy_messages = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Explain backward compatibility in AI APIs."} ] response = client.chat_completion( messages=legacy_messages, model="gpt-4.1", temperature=0.7, max_tokens=500 ) print(f"Response: {response['choices'][0]['message']['content']}")

2. Response Format Normalization Layer

Different AI providers return responses in wildly different formats. A robust backward compatibility layer must normalize these into a consistent structure while preserving all original metadata.

"""
Response Normalization Middleware
Handles format differences between GPT, Claude, Gemini, and custom models.
"""

from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional, Union
from datetime import datetime
import json

@dataclass
class NormalizedResponse:
    """Universal response format across all AI providers."""
    request_id: str
    model: str
    content: str
    finish_reason: str
    usage: Dict[str, int]
    raw_response: Dict[str, Any]
    metadata: Dict[str, Any] = field(default_factory=dict)
    
    def to_openai_format(self) -> Dict[str, Any]:
        """Convert to OpenAI-compatible format for legacy integrations."""
        return {
            "id": self.request_id,
            "object": "chat.completion",
            "created": int(datetime.now().timestamp()),
            "model": self.model,
            "choices": [{
                "index": 0,
                "message": {
                    "role": "assistant",
                    "content": self.content
                },
                "finish_reason": self.finish_reason
            }],
            "usage": self.usage
        }
    
    def to_claude_format(self) -> Dict[str, Any]:
        """Convert to Claude-compatible format."""
        return {
            "id": self.request_id,
            "type": "message",
            "role": "assistant",
            "content": [{
                "type": "text",
                "text": self.content
            }],
            "model": self.model,
            "stop_reason": self.finish_reason,
            "stop_sequence": None,
            "usage": {
                "input_tokens": self.usage.get("prompt_tokens", 0),
                "output_tokens": self.usage.get("completion_tokens", 0)
            }
        }
    
    def to_gemini_format(self) -> Dict[str, Any]:
        """Convert to Gemini-compatible format."""
        return {
            "candidates": [{
                "content": {
                    "parts": [{"text": self.content}],
                    "role": "model"
                },
                "finishReason": self.finish_reason.upper(),
                "safetyRatings": []
            }],
            "usageMetadata": {
                "promptTokenCount": self.usage.get("prompt_tokens", 0),
                "candidatesTokenCount": self.usage.get("completion_tokens", 0),
                "totalTokenCount": self.usage.get("total_tokens", 0)
            }
        }


class ResponseNormalizer:
    """
    Middleware that normalizes responses from various AI providers
    into a unified format, ensuring backward compatibility.
    """
    
    # Pricing reference (2026 rates in USD per million tokens)
    PRICING = {
        "gpt-4.1": {"input": 2.50, "output": 8.00},
        "claude-sonnet-4.5": {"input": 3.00, "output": 15.00},
        "gemini-2.5-flash": {"input": 0.30, "output": 2.50},
        "deepseek-v3.2": {"input": 0.14, "output": 0.42}
    }
    
    def __init__(self, target_format: str = "openai"):
        """
        Initialize normalizer with target format.
        
        Args:
            target_format: 'openai', 'claude', 'gemini', or 'unified'
        """
        self.target_format = target_format
    
    def normalize(
        self,
        raw_response: Dict[str, Any],
        model: str,
        provider: str = "auto"
    ) -> NormalizedResponse:
        """
        Normalize response from any provider to unified format.
        
        Args:
            raw_response: Raw API response
            model: Model identifier
            provider: 'openai', 'anthropic', 'google', or 'auto'
        """
        
        # Auto-detect provider from response structure
        if provider == "auto":
            provider = self._detect_provider(raw_response)
        
        # Extract common fields based on provider
        if provider == "openai":
            return self._normalize_openai(raw_response, model)
        elif provider == "anthropic":
            return self._normalize_anthropic(raw_response, model)
        elif provider == "google":
            return self._normalize_google(raw_response, model)
        elif provider == "holy_sheep":
            return self._normalize_holy_sheep(raw_response, model)
        else:
            raise ValueError(f"Unknown provider: {provider}")
    
    def _detect_provider(self, response: Dict[str, Any]) -> str:
        """Auto-detect API provider from response structure."""
        if "choices" in response and "usage" in response:
            return "openai"
        elif "content" in response and isinstance(response.get("content"), list):
            if response["content"] and isinstance(response["content"][0], dict):
                if response["content"][0].get("type") == "text":
                    return "anthropic"
        elif "candidates" in response:
            return "google"
        elif "normalized" in response.get("metadata", {}):
            return "holy_sheep"
        return "unknown"
    
    def _normalize_openai(
        self, 
        response: Dict[str, Any], 
        model: str
    ) -> NormalizedResponse:
        """Normalize OpenAI-format response."""
        content = ""
        if response.get("choices"):
            choice = response["choices"][0]
            msg = choice.get("message", {})
            if isinstance(msg.get("content"), str):
                content = msg["content"]
            elif isinstance(msg.get("content"), list):
                # Multi-modal content
                text_parts = [
                    c.get("text", c.get("content", ""))
                    for c in msg["content"]
                    if c.get("type") == "text"
                ]
                content = "\n".join(text_parts)
        
        return NormalizedResponse(
            request_id=response.get("id", ""),
            model=response.get("model", model),
            content=content,
            finish_reason=response.get("choices", [{}])[0].get("finish_reason", "stop"),
            usage=response.get("usage", {}),
            raw_response=response,
            metadata={"provider": "openai"}
        )
    
    def _normalize_anthropic(
        self, 
        response: Dict[str, Any], 
        model: str
    ) -> NormalizedResponse:
        """Normalize Anthropic/Claude-format response."""
        content_parts = response.get("content", [])
        content = ""
        for part in content_parts:
            if part.get("type") == "text":
                content += part.get("text", "")
        
        return NormalizedResponse(
            request_id=response.get("id", ""),
            model=response.get("model", model),
            content=content,
            finish_reason=response.get("stop_reason", "end_turn"),
            usage={
                "prompt_tokens": response.get("usage", {}).get("input_tokens", 0),
                "completion_tokens": response.get("usage", {}).get("output_tokens", 0),
                "total_tokens": sum(response.get("usage", {}).values())
            },
            raw_response=response,
            metadata={"provider": "anthropic"}
        )
    
    def _normalize_google(
        self, 
        response: Dict[str, Any], 
        model: str
    ) -> NormalizedResponse:
        """Normalize Google Gemini-format response."""
        candidates = response.get("candidates", [{}])
        content = ""
        finish_reason = "STOP"
        
        if candidates:
            candidate = candidates[0]
            content_parts = candidate.get("content", {}).get("parts", [])
            content = "\n".join(p.get("text", "") for p in content_parts)
            finish_reason = candidate.get("finishReason", "STOP")
        
        usage = response.get("usageMetadata", {})
        return NormalizedResponse(
            request_id=f"gemini-{datetime.now().timestamp()}",
            model=model,
            content=content,
            finish_reason=finish_reason.lower(),
            usage={
                "prompt_tokens": usage.get("promptTokenCount", 0),
                "completion_tokens": usage.get("candidatesTokenCount", 0),
                "total_tokens": usage.get("totalTokenCount", 0)
            },
            raw_response=response,
            metadata={"provider": "google"}
        )
    
    def _normalize_holy_sheep(
        self, 
        response: Dict[str, Any], 
        model: str
    ) -> NormalizedResponse:
        """
        Normalize HolySheep response (already optimized format).
        HolySheep provides automatic schema bridging with <50ms overhead.
        """
        # HolySheep responses include normalized field
        base = response.get("normalized", response)
        return NormalizedResponse(
            request_id=base.get("id", response.get("request_id", "")),
            model=base.get("model", model),
            content=base.get("content", ""),
            finish_reason=base.get("finish_reason", "stop"),
            usage=base.get("usage", {}),
            raw_response=response,
            metadata={
                "provider": "holy_sheep",
                "original_model": response.get("actual_model"),
                "fallback_used": response.get("fallback_used", False)
            }
        )
    
    def format_output(self, normalized: NormalizedResponse) -> Dict[str, Any]:
        """
        Format normalized response to target format.
        Supports OpenAI ($8/MTok), Claude ($15/MTok), Gemini ($2.50/MTok), 
        DeepSeek ($0.42/MTok) with automatic cost optimization.
        """
        if self.target_format == "openai":
            return normalized.to_openai_format()
        elif self.target_format == "claude":
            return normalized.to_claude_format()
        elif self.target_format == "gemini":
            return normalized.to_gemini_format()
        else:
            # Return unified format
            return {
                "request_id": normalized.request_id,
                "model": normalized.model,
                "content": normalized.content,
                "finish_reason": normalized.finish_reason,
                "usage": normalized.usage,
                "estimated_cost_usd": self._calculate_cost(normalized.usage, normalized.model),
                "metadata": normalized.metadata
            }
    
    def _calculate_cost(self, usage: Dict[str, int], model: str) -> float:
        """Calculate cost in USD based on 2026 pricing."""
        pricing = self.PRICING.get(model, {"input": 1.0, "output": 3.0})
        input_cost = (usage.get("prompt_tokens", 0) / 1_000_000) * pricing["input"]
        output_cost = (usage.get("completion_tokens", 0) / 1_000_000) * pricing["output"]
        return round(input_cost + output_cost, 6)


Comprehensive usage example with HolySheep

def demo_backward_compatible_request(): """ Complete example: Make a request that works with legacy clients while utilizing HolySheep's cost optimization and fallback chains. """ normalizer = ResponseNormalizer(target_format="openai") client = AIBackwardCompatibleClient(api_key="YOUR_HOLYSHEEP_API_KEY") # Simulate three different client versions making the same request # Client 1: Legacy (2024-01) - OpenAI format legacy_messages = [ {"role": "system", "content": "You are a code reviewer."}, {"role": "user", "content": "Review this Python function for bugs"} ] # Client 2: Modern (2024-03) - Multi-modal modern_messages = [ {"role": "user", "content": [ {"type": "text", "text": "What does this code do?"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}} ]} ] # Client 3: Gemini-style (2024-06) gemini_messages = [ {"parts": [{"text": "Explain the architecture of this system."}]} ] # Execute all three (HolySheep handles schema translation automatically) for i, messages in enumerate([legacy_messages, modern_messages, gemini_messages], 1): try: # HolySheep detects schema version and normalizes automatically # Cost: $1 per ¥1 vs ¥7.3 official rate (85%+ savings) response = client.chat_completion( messages=messages, model="gpt-4.1", temperature=0.5 ) # Normalize to target format normalized = normalizer.normalize(response, "gpt-4.1") formatted = normalizer.format_output(normalized) print(f"Client {i} (Schema 2024-0{i}): OK") print(f" Content preview: {formatted['content'][:50]}...") print(f" Cost: ${formatted['estimated_cost_usd']:.6f}") except Exception as e: print(f"Client {i}: Failed - {e}") if __name__ == "__main__": demo_backward_compatible_request()

3. Parameter Deprecation Strategies

When AI providers deprecate parameters, you need a graceful migration path. The strategy: announce deprecation, support both old and new parameters, log warnings for deprecated usage, and eventually remove support.

Implementation Checklist

Common Errors and Fixes

Error 1: Schema Version Mismatch (400 Bad Request)

Symptom: API returns 400 error with "Invalid schema version" message when upgrading models.

# Problem: Client sends old schema to new model endpoint

Example: Using 'system' field instead of 'messages' array

WRONG - Legacy request format

broken_request = { "model": "claude-sonnet-4.5", "system": "You are helpful.", # Deprecated parameter "prompt": "Hello world" # Wrong field name }

FIX: Detect and normalize schema version

def fix_schema_mismatch(request: Dict, target_model: str) -> Dict: """Automatically fix schema mismatches.""" fixed = request.copy() # Fix 'system' -> 'messages' if "system" in fixed and "messages" not in fixed: system_content = fixed.pop("system") existing_messages = fixed.pop("prompt", "") fixed["messages"] = [ {"role": "system", "content": system_content}, {"role": "user", "content": existing_messages} ] # Fix 'prompt' -> 'messages' if "prompt" in fixed and "messages" not in fixed: fixed["messages"] = [ {"role": "user", "content": fixed.pop("prompt")} ] # Fix 'maxTokens' -> 'max_tokens' (camelCase) if "maxTokens" in fixed: fixed["max_tokens"] = fixed.pop("maxTokens") # Remove completely deprecated fields deprecated_fields = ["user", "temperature_with_decay", "topN"] for field in deprecated_fields: if field in fixed: fixed.pop(field, None) return fixed

Safe API call with automatic schema correction

client = AIBackwardCompatibleClient(api_key="YOUR_HOLYSHEEP_API_KEY") safe_request = fix_schema_mismatch(broken_request, "claude-sonnet-4.5") response = client.chat_completion(**safe_request)

Error 2: Response Format Incompatibility

Symptom: Application crashes trying to access response["choices"][0]["message"]["content"] when using Gemini models.

# Problem: Gemini returns 'candidates[0].content.parts' not 'choices'

WRONG: Direct access assumes OpenAI format

content = response["choices"][0]["message"]["content"] # Crashes on Gemini!

FIX: Use response normalizer with provider detection

def safe_extract_content(response: Dict, model: str) -> str: """Extract content regardless of response format.""" # Try OpenAI format first (most common) if "choices" in response: msg = response["choices"][0].get("message", {}) content = msg.get("content", "") if isinstance(content, list): return " ".join(c.get("text", "") for c in content if c.get("type") == "text") return content # Try Claude format if "content" in response and isinstance(response["content"], list): return " ".join(c.get("text", "") for c in response["content"] if c.get("type") == "text") # Try Gemini format if "candidates" in response: candidates = response["candidates"] if candidates: parts = candidates[0].get("content", {}).get("parts", []) return " ".join(p.get("text", "") for p in parts) # Fallback for HolySheep normalized responses if response.get("normalized"): return response["normalized"].get("content", "") return ""

Usage with HolySheep (automatic format normalization)

client = AIBackwardCompatibleClient(api_key="YOUR_HOLYSHEEP_API_KEY") response = client.chat_completion( messages=[{"role": "user", "content": "Hello"}], model="gemini-2.5-flash" ) content = safe_extract_content(response, "gemini-2.5-flash") # Works!

Error 3: Token Limit Exceeded After Model Switch

Symptom: Code works with GPT-4.1 but fails with 400 error on DeepSeek V3.2 due to different context windows.

# Problem: Different models have different context windows

GPT-4.1: 128K tokens, DeepSeek V3.2: 128K tokens, Claude Sonnet 4.5: 200K tokens

But they handle tokenization differently!

FIX: Implement intelligent context window management

class ContextWindowManager: """Manages context truncation based on model capabilities.""" CONTEXT_LIMITS = { "gpt-4.1": 128000, "gpt-4o": 128000, "claude-sonnet-4.5": 200000, "claude-3-5-sonnet": 200000, "gemini-2.5-flash": 1048576, # 1M tokens! "deepseek-v3.2": 128000 } # Reserve tokens for response RESPONSE_BUFFER = { "gpt-4.1": 4000, "claude-sonnet-4.5": 8000, "gemini-2.5-flash": 16000, "deepseek-v3.2": 4000 } def truncate_for_model( self, messages: List[Dict], model: str, override_max_tokens: int = None ) -> List[Dict]: """Truncate conversation history to fit model context window.""" limit = self.CONTEXT_LIMITS.get(model, 64000) buffer = override_max_tokens or self.RESPONSE_BUFFER.get(model, 2000) available = limit - buffer # Estimate token count (rough approximation: 4 chars = 1 token) def estimate_tokens(text: str) -> int: return len(text) // 4 # Calculate current token count total_tokens = sum( estimate_tokens(m.get("content", "")) for m in messages ) if total_tokens <= available: return messages # No truncation needed # Truncate from oldest messages (keep system prompt) truncated = [] system_prompt = None for msg in messages: if msg.get("role") == "system": system_prompt = msg else: truncated.append(msg) # Remove oldest messages until under limit while sum(estimate_tokens(m.get("content", "")) for m in truncated) > (available - 200): if truncated: truncated.pop(0) else: break # Reconstruct with system prompt result = [] if system_prompt: result.append(system_prompt) result.extend(truncated) return result

Usage with automatic fallback

def smart_completion(messages: List[Dict], model: str, api_key: str): """Complete request with automatic context management.""" manager = ContextWindowManager() client = AIBackwardCompatibleClient(api_key=api_key) # Try primary model with truncation safe_messages = manager.truncate_for_model(messages, model) try: response = client.chat_completion( messages=safe_messages, model=model ) return response except Exception as e: # Fallback to budget model if primary fails if "context" in str(e).lower() or "token" in str(e).lower(): # Try DeepSeek with larger context fallback_messages = manager.truncate_for_model( messages, "deepseek-v3.2" ) return client.chat_completion( messages=fallback_messages, model="deepseek-v3.2" # $0.42/MTok ) raise

Client code

client = AIBackwardCompatibleClient(api_key="YOUR_HOLYSHEEP_API_KEY") response = smart_completion( messages=long_conversation_history, model="claude-sonnet-4.5", api_key="YOUR_HOLYSHEEP_API_KEY" )

Error 4: Streaming Response Format Breaks Parser

Symptom: Streaming SSE responses have different formats per provider, breaking real-time processing.

# Problem: Each provider uses different SSE event formats

OpenAI: "data: {"choices":[{"delta":{"content":"..."}}]}\n\n"

Claude: "event: message_start\ndata: {...}\n\n"

Gemini: "chunk: {...}\n\n"

FIX: Create unified streaming parser

import sseclient import json from typing import Iterator, Dict, Any class UnifiedStreamParser: """Parse streaming responses from any AI provider.""" def parse_stream( self, response_iterator: Iterator[bytes], provider: str = "auto" ) -> Iterator[Dict[str, Any]]: """ Yield normalized chunks from any streaming format. """ if provider == "auto": # Peek first chunk to detect format chunks = list(response_iterator) provider = self._detect_stream_format(chunks[0]) response_iterator = iter(chunks) if provider == "openai": yield from self._parse_openai_stream(response_iterator) elif provider == "anthropic": yield from self._parse_anthropic_stream(response_iterator) elif provider == "google": yield from self._parse_google_stream(response_iterator) else: # HolySheep unified format yield from self._parse_holy_sheep_stream(response_iterator) def _parse_openai_stream( self, iterator: Iterator[bytes] ) -> Iterator[Dict[str, Any]]: """Parse OpenAI SSE format."""