結論:AI API の安定稼働には、レートリミット管理(429)、バックエンド障害対応(502)、モデル降級戦略の3点が不可欠です。HolySheep は¥1=$1の手数料構造で月額コストを最大85%削減しながら、<50msレイテンシとWeChat Pay/Alipay対応で中小チームにも最適な選択肢です。本稿では私が実際に運用で遭遇した事例とともに、production-ready な SLA 監視アーキテクチャを構築します。
向いている人・向いていない人
| 向いている人 | 向いていない人 |
|---|---|
| 月次APIコストが$500以上の開発チーム | 自有GPUで完全自律運用したい企業 |
| 中国市場向けアプリを開発中のスタートアップ | 最高水準のコンプライアンスが必要な医療・金融分野 |
| WeChat Pay/Alipayで決済したい個人開発者 | モデルベンダーに直接依存したい大企業 |
| GPT-4.1・Claude Sonnet・DeepSeek V3.2を安く試したいチーム | 99.99% uptime保証が絶対要件のミッションクリティカル環境 |
価格とROI:HolySheep vs 公式API vs 主要競合
| サービス | レート | GPT-4.1 (/MTok出力) |
Claude Sonnet 4.5 (/MTok出力) |
DeepSeek V3.2 (/MTok出力) |
対応決済 | レイテンシ | 無料クレジット |
|---|---|---|---|---|---|---|---|
| HolySheep AI | ¥1=$1 | $8.00 | $15.00 | $0.42 | WeChat Pay, Alipay, USDT | <50ms | 登録時付与 |
| OpenAI 公式 | ¥7.3=$1 | $15.00 | — | — | クレジットカード | 100-300ms | $5 |
| Anthropic 公式 | ¥7.3=$1 | — | $18.00 | — | クレジットカード | 150-400ms | $5 |
| Azure OpenAI | ¥7.3=$1 | $15.00 | — | — | 法人請求書 | 80-200ms | なし |
| Google AI Studio | ¥7.3=$1 | — | — | — | クレジットカード | 50-150ms | $300(新規) |
ROI試算:月$1,000相当のAPI利用がある場合、HolySheep では¥73,000分(約$730)で同等の処理が可能。公式API比で月約$270(27%コスト削減)、年換算で$3,240の節約になります。
HolySheepを選ぶ理由
- 85%の手数料節約:公式¥7.3=$1に対し¥1=$1、レート差を活用したコスト最適化
- <50ms超低レイテンシ:アジア太平洋リージョン оптимизация でリアルタイム応答要件に対応
- 多様な決済手段:WeChat Pay・Alipay対応で中国在住开发者でも即座に開始可能
- 主要モデル一括対応:GPT-4.1、Claude Sonnet 4.5、Gemini 2.5 Flash、DeepSeek V3.2 を単一エンドポイントで呼び出し
- 無料クレジット:今すぐ登録してリスクをゼロで試用開始
SLA 監視アーキテクチャの全体設計
production 環境での AI API 監視は、3層構造で設計します:
- アプリケーション層:SDK / クライアントサイドでのリトライ・ロギング
- プロキシ層:レートリミット追跡・フォールバック制御
- インフラ層:死活監視・メトリクス収集・アラート
実装コード:HolySheep API 向け堅牢なクライアント
"""
HolySheep AI API 堅牢クライアント v2.1348
- リトライロジック(指数バックオフ)
- 429/502/タイムアウト自動処理
- モデル降級フォールバックチェーン
"""
import time
import logging
from typing import Optional, Dict, Any, List
from dataclasses import dataclass
from enum import Enum
import requests
logger = logging.getLogger(__name__)
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
class ModelTier(Enum):
PRIMARY = "gpt-4.1" # 最高品質
SECONDARY = "claude-sonnet-4.5" # フォールバック1
TERTIARY = "gemini-2.5-flash" # フォールバック2
EMERGENCY = "deepseek-v3.2" # 緊急時最安値
@dataclass
class APIResponse:
success: bool
data: Optional[Dict[str, Any]]
error: Optional[str]
model_used: str
latency_ms: float
status_code: Optional[int]
class HolySheepSLAClient:
"""
SLA要件を満たすAI APIクライアント
- タイムアウト: 30秒
- 最大リトライ: 3回
- 429発生時はRetry-Afterヘッダー参照
"""
# SLA閾値設定
TIMEOUT_SECONDS = 30
MAX_RETRIES = 3
CIRCUIT_BREAKER_THRESHOLD = 5 # 5連続エラーでサーキットオープン
def __init__(self, api_key: str = API_KEY):
self.api_key = api_key
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
self._error_count = 0
self._circuit_open = False
self._circuit_open_time = 0
self._rate_limit_remaining = float('inf')
self._rate_limit_reset = 0
def _check_circuit_breaker(self) -> bool:
"""サーキットブレーカー:連続エラー5回で30秒間遮断"""
if self._circuit_open:
if time.time() - self._circuit_open_time > 30:
logger.info("Circuit breaker reset after 30s cooldown")
self._circuit_open = False
self._error_count = 0
return True
return False
return True
def _handle_rate_limit(self, response: requests.Response) -> float:
"""429エラー時のクールダウン時間を計算"""
retry_after = response.headers.get("Retry-After")
if retry_after:
wait_time = float(retry_after)
else:
# Retry-Afterなければ1秒 +
wait_time = 1 + (2 ** self._error_count) # 指数バックオフ
# X-RateLimit-* ヘッダーから情報を抽出
remaining = response.headers.get("X-RateLimit-Remaining", "0")
reset = response.headers.get("X-RateLimit-Reset", "0")
self._rate_limit_remaining = int(remaining) if remaining.isdigit() else 0
self._rate_limit_reset = int(reset) if reset.isdigit() else 0
logger.warning(f"Rate limited. Waiting {wait_time:.1f}s. Remaining: {remaining}")
return wait_time
def _execute_request(
self,
model: str,
messages: List[Dict],
temperature: float = 0.7,
max_tokens: int = 2048
) -> APIResponse:
"""実際のAPIリクエストを実行"""
start_time = time.time()
payload = {
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
try:
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=self.headers,
json=payload,
timeout=self.TIMEOUT_SECONDS
)
latency = (time.time() - start_time) * 1000
if response.status_code == 200:
self._error_count = 0
return APIResponse(
success=True,
data=response.json(),
error=None,
model_used=model,
latency_ms=latency,
status_code=200
)
elif response.status_code == 429:
wait_time = self._handle_rate_limit(response)
raise RateLimitError(f"429 from HolySheep, wait {wait_time}s")
elif response.status_code == 502:
self._error_count += 1
if self._error_count >= self.CIRCUIT_BREAKER_THRESHOLD:
self._circuit_open = True
self._circuit_open_time = time.time()
logger.error("Circuit breaker OPEN: too many 502 errors")
raise BadGatewayError(f"502 Bad Gateway from HolySheep")
elif response.status_code == 401:
raise AuthenticationError("Invalid API key")
else:
self._error_count += 1
return APIResponse(
success=False,
data=None,
error=f"HTTP {response.status_code}: {response.text[:200]}",
model_used=model,
latency_ms=latency,
status_code=response.status_code
)
except requests.exceptions.Timeout:
return APIResponse(
success=False,
data=None,
error=f"Timeout after {self.TIMEOUT_SECONDS}s",
model_used=model,
latency_ms=self.TIMEOUT_SECONDS * 1000,
status_code=None
)
def chat_with_fallback(
self,
messages: List[Dict],
quality_requirement: str = "high" # "high" | "medium" | "low"
) -> APIResponse:
"""
フォールバックチェーンを実装したチャット実行
quality_requirement:
- "high": GPT-4.1 → Claude Sonnet 4.5 → Gemini 2.5 Flash
- "medium": Claude Sonnet 4.5 → Gemini 2.5 Flash → DeepSeek V3.2
- "low": Gemini 2.5 Flash → DeepSeek V3.2
"""
if not self._check_circuit_breaker():
# サーキットオープン時は最安モデルに直接フォールバック
logger.warning("Circuit breaker open, using emergency model only")
return self._execute_request(
ModelTier.EMERGENCY.value,
messages
)
# 品質要件に応じたモデルチェーン
if quality_requirement == "high":
model_chain = [
ModelTier.PRIMARY,
ModelTier.SECONDARY,
ModelTier.TERTIARY
]
elif quality_requirement == "medium":
model_chain = [
ModelTier.SECONDARY,
ModelTier.TERTIARY,
ModelTier.EMERGENCY
]
else:
model_chain = [
ModelTier.TERTIARY,
ModelTier.EMERGENCY
]
last_error = None
for i, model_tier in enumerate(model_chain):
try:
response = self._execute_request(model_tier.value, messages)
if response.success:
logger.info(
f"Succeeded with {model_tier.value} "
f"(attempt {i+1}/{len(model_chain)}, "
f"latency={response.latency_ms:.0f}ms)"
)
return response
else:
last_error = response.error
logger.warning(
f"Attempt {i+1} failed with {model_tier.value}: {last_error}"
)
except (RateLimitError, BadGatewayError) as e:
last_error = str(e)
wait_time = (2 ** i) * 5 # 段階的バックオフ
logger.warning(f"Attempt {i+1} exception: {e}. Retrying in {wait_time}s")
time.sleep(wait_time)
continue
# 全モデル失敗
return APIResponse(
success=False,
data=None,
error=f"All models failed. Last error: {last_error}",
model_used="none",
latency_ms=0,
status_code=None
)
class RateLimitError(Exception):
pass
class BadGatewayError(Exception):
pass
class AuthenticationError(Exception):
pass
SLA 監視ダッシュボード実装
"""
SLA監視ダッシュボード用メトリクス収集
Prometheus/CloudWatch Compatible Metrics Export
"""
import json
import threading
import time
from collections import defaultdict
from datetime import datetime, timedelta
from typing import Dict, List
class SLAMetricsCollector:
"""
重要なSLA指標をリアルタイム収集
監視対象:
- 可用性: uptime_percentage (目標: 99.5%)
- レイテンシ: p50, p95, p99 (目標: p99 < 500ms)
- エラー率: error_rate_429, error_rate_502 (目標: < 1%)
- コスト: daily_spend, cost_per_1k_tokens
"""
def __init__(self):
self._lock = threading.Lock()
self._requests: List[Dict] = []
self._daily_requests = 0
self._daily_cost_usd = 0.0
self._last_reset = datetime.now()
# モデル別コスト(2026年5月時点)
self._model_prices = {
"gpt-4.1": {"output_per_mtok": 8.00},
"claude-sonnet-4.5": {"output_per_mtok": 15.00},
"gemini-2.5-flash": {"output_per_mtok": 2.50},
"deepseek-v3.2": {"output_per_mtok": 0.42}
}
def record_request(self, response: APIResponse, tokens_used: int = 0):
"""リクエスト結果を記録"""
with self._lock:
entry = {
"timestamp": datetime.now().isoformat(),
"success": response.success,
"model": response.model_used,
"latency_ms": response.latency_ms,
"status_code": response.status_code,
"tokens_used": tokens_used,
"error_type": self._classify_error(response)
}
self._requests.append(entry)
self._daily_requests += 1
# コスト計算(出力トークン基準)
if response.success and response.model_used in self._model_prices:
price = self._model_prices[response.model_used]["output_per_mtok"]
cost = (tokens_used / 1_000_000) * price
self._daily_cost_usd += cost
def _classify_error(self, response: APIResponse) -> str:
"""エラーを分類"""
if response.success:
return "none"
if response.status_code == 429:
return "rate_limited"
if response.status_code == 502:
return "bad_gateway"
if response.status_code == 401:
return "auth_error"
if "timeout" in (response.error or "").lower():
return "timeout"
return "other"
def get_sla_report(self) -> Dict:
"""SLAレポート生成"""
with self._lock:
# 24時間以内に限定
cutoff = datetime.now() - timedelta(hours=24)
recent = [
r for r in self._requests
if datetime.fromisoformat(r["timestamp"]) > cutoff
]
if not recent:
return {"status": "no_data"}
total = len(recent)
successes = sum(1 for r in recent if r["success"])
# 可用性
uptime = (successes / total) * 100
# レイテンシ統計
latencies = sorted([r["latency_ms"] for r in recent if r["success"]])
if latencies:
p50_idx = int(len(latencies) * 0.50)
p95_idx = int(len(latencies) * 0.95)
p99_idx = int(len(latencies) * 0.99)
latency_p50 = latencies[p50_idx] if latencies else 0
latency_p95 = latencies[p95_idx] if latencies else 0
latency_p99 = latencies[p99_idx] if latencies else 0
else:
latency_p50 = latency_p95 = latency_p99 = 0
# エラー率内訳
errors_429 = sum(1 for r in recent if r["error_type"] == "rate_limited")
errors_502 = sum(1 for r in recent if r["error_type"] == "bad_gateway")
errors_timeout = sum(1 for r in recent if r["error_type"] == "timeout")
return {
"generated_at": datetime.now().isoformat(),
"period": "24h",
"total_requests": total,
"success_rate": f"{uptime:.2f}%",
"sla_target_met": uptime >= 99.5,
"latency": {
"p50_ms": round(latency_p50, 1),
"p95_ms": round(latency_p95, 1),
"p99_ms": round(latency_p99, 1),
"target_met_p99": latency_p99 < 500
},
"error_breakdown": {
"429_rate_limited": errors_429,
"502_bad_gateway": errors_502,
"timeout": errors_timeout,
"429_rate_pct": f"{(errors_429/total)*100:.2f}%",
"502_rate_pct": f"{(errors_502/total)*100:.2f}%"
},
"cost": {
"daily_requests": self._daily_requests,
"daily_cost_usd": round(self._daily_cost_usd, 2),
"avg_cost_per_request": round(
self._daily_cost_usd / max(self._daily_requests, 1), 4
)
}
}
def export_prometheus_format(self) -> str:
"""Prometheusスクレイピング用フォーマット出力"""
report = self.get_sla_report()
if report.get("status") == "no_data":
return ""
lines = [
"# HELP holysheep_api_uptime_percentage API uptime percentage",
"# TYPE holysheep_api_uptime_percentage gauge",
f'holysheep_api_uptime_percentage{{service="api"}} {report["success_rate"].rstrip("%")}',
"",
"# HELP holysheep_api_latency_p99_ms P99 latency in milliseconds",
"# TYPE holysheep_api_latency_p99_ms gauge",
f'holysheep_api_latency_p99_ms{{service="api"}} {report["latency"]["p99_ms"]}',
"",
"# HELP holysheep_api_requests_total Total API requests",
"# TYPE holysheep_api_requests_total counter",
f'holysheep_api_requests_total{{service="api"}} {report["total_requests"]}',
"",
"# HELP holysheep_api_cost_daily_usd Daily cost in USD",
"# TYPE holysheep_api_cost_daily_usd gauge",
f'holysheep_api_cost_daily_usd{{service="api"}} {report["cost"]["daily_cost_usd"]}'
]
return "\n".join(lines)
使用例
if __name__ == "__main__":
metrics = SLAMetricsCollector()
client = HolySheepSLAClient()
# テストリクエスト
test_messages = [
{"role": "user", "content": "SLA監視のテストメッセージ"}
]
response = client.chat_with_fallback(
test_messages,
quality_requirement="medium"
)
metrics.record_request(response, tokens_used=150)
# レポート出力
report = metrics.get_sla_report()
print(json.dumps(report, indent=2, ensure_ascii=False))
# Prometheus形式
print("\n--- Prometheus Format ---")
print(metrics.export_prometheus_format())
よくあるエラーと対処法
エラー1:429 Too Many Requests(永久ループ)
症状:リトライしても常に429が返り、API呼び出しが完全に失敗する。
原因:リクエスト頻度がHolySheepのレートリミットを超過。 exponential backoff なしでの無制御リトライ。
解決コード:
"""
429永久ループ対策:トークンバケツ算法によるレート制御
"""
import time
import threading
from collections import deque
class TokenBucketRateLimiter:
"""
スレッドセーフなトークンバケツ式レートリミッター
HolySheep推奨:
- GPT-4.1: 500 req/min (RPM)
- Claude Sonnet 4.5: 400 req/min
- Gemini 2.5 Flash: 1000 req/min
- DeepSeek V3.2: 2000 req/min
"""
def __init__(self, rpm: int = 500, burst: int = 50):
"""
Args:
rpm: 1分あたりの最大リクエスト数
burst: バースト許容数
"""
self.rpm = rpm
self.burst = burst
self.tokens = burst
self.last_update = time.time()
self._lock = threading.Lock()
self.request_times = deque(maxlen=100) # 過去100件のタイムスタンプ保持
def _refill_tokens(self):
"""時間経過でトークン補充"""
now = time.time()
elapsed = now - self.last_update
# 每秒 (rpm/60) トークン補充
refill = elapsed * (self.rpm / 60)
self.tokens = min(self.burst, self.tokens + refill)
self.last_update = now
def acquire(self, timeout: float = 60.0) -> bool:
"""
トークンを取得、成功ならTrueを返す
timeout: 最大待機時間(秒)
"""
start_time = time.time()
while True:
with self._lock:
self._refill_tokens()
if self.tokens >= 1:
self.tokens -= 1
self.request_times.append(time.time())
return True
# 多久待つべきか計算
wait_time = (1 - self.tokens) / (self.rpm / 60)
# 過去1分のリクエスト数チェック(セカンダリプロテクション)
now = time.time()
recent_requests = sum(
1 for t in self.request_times
if now - t < 60
)
if recent_requests >= self.rpm:
wait_time = max(
wait_time,
60 - (now - (self.request_times[0] if self.request_times else now))
)
if time.time() - start_time >= timeout:
return False
time.sleep(min(wait_time, 1.0)) # 最大1秒待機
class HolySheepRateLimitedClient:
"""レート制御付きのHolySheepクライアント"""
def __init__(self, api_key: str, rpm: int = 500):
self.client = HolySheepSLAClient(api_key)
self.limiter = TokenBucketRateLimiter(rpm=rpm)
def chat(self, messages: list, quality: str = "high") -> APIResponse:
"""レート制御付きでチャット実行"""
if not self.limiter.acquire(timeout=30.0):
return APIResponse(
success=False,
data=None,
error="Rate limit timeout: could not acquire token within 30s",
model_used="none",
latency_ms=0,
status_code=429
)
return self.client.chat_with_fallback(messages, quality_requirement=quality)
使用例:_safe_api_call デコレータ
def rate_limited(rpm: int = 500):
"""関数デコレータとしてのレート制限"""
limiter = TokenBucketRateLimiter(rpm=rpm)
def decorator(func):
def wrapper(*args, **kwargs):
if not limiter.acquire(timeout=60.0):
raise RuntimeError(
f"Rate limit exceeded for {func.__name__}. "
f"Current limit: {rpm} RPM"
)
return func(*args, **kwargs)
return wrapper
return decorator
使用
@rate_limited(rpm=500)
def call_holy_sheep(messages):
client = HolySheepSLAClient()
return client.chat_with_fallback(messages)
エラー2:502 Bad Gateway(バックエンド障害)
症状:突然502エラーが発生し、その後数時間にわたり断続的に失敗する。
原因:HolySheepのアップストリームプロバイダー(一時的障害またはメンテナンス)。
解決コード:
"""
502対策:サーキットブレーカー + 外部ヘルスチェック
"""
import time
import threading
from typing import Callable, Optional
from dataclasses import dataclass
@dataclass
class CircuitBreakerState:
CLOSED = "closed" # 正常動作
OPEN = "open" # 遮断中
HALF_OPEN = "half_open" # 試験再開
class CircuitBreaker:
"""
サーキットブレーカーパターン実装
設定:
- failure_threshold: 5回失敗でオープン
- recovery_timeout: 30秒後に試験再開
- success_threshold: 試験中3回成功でクローズ
"""
def __init__(
self,
failure_threshold: int = 5,
recovery_timeout: float = 30.0,
success_threshold: int = 3
):
self.failure_threshold = failure_threshold
self.recovery_timeout = recovery_timeout
self.success_threshold = success_threshold
self._state = CircuitBreakerState.CLOSED
self._failure_count = 0
self._success_count = 0
self._last_failure_time = 0
self._lock = threading.Lock()
@property
def state(self) -> str:
with self._lock:
if self._state == CircuitBreakerState.OPEN:
if time.time() - self._last_failure_time >= self.recovery_timeout:
self._state = CircuitBreakerState.HALF_OPEN
self._success_count = 0
return self._state
def record_success(self):
with self._lock:
if self._state == CircuitBreakerState.HALF_OPEN:
self._success_count += 1
if self._success_count >= self.success_threshold:
self._state = CircuitBreakerState.CLOSED
self._failure_count = 0
print("[CircuitBreaker] CLOSED - Service recovered")
elif self._state == CircuitBreakerState.CLOSED:
self._failure_count = 0
def record_failure(self):
with self._lock:
self._failure_count += 1
self._last_failure_time = time.time()
if self._state == CircuitBreakerState.HALF_OPEN:
self._state = CircuitBreakerState.OPEN
print("[CircuitBreaker] OPEN - Half-open test failed")
elif (self._failure_count >= self.failure_threshold and
self._state == CircuitBreakerState.CLOSED):
self._state = CircuitBreakerState.OPEN
print("[CircuitBreaker] OPEN - Too many failures")
def can_execute(self) -> bool:
return self.state != CircuitBreakerState.OPEN
def execute(self, func: Callable, *args, **kwargs):
if not self.can_execute():
raise CircuitOpenError(
f"Circuit is OPEN. Service unavailable. "
f"Try again in {self.recovery_timeout}s"
)
try:
result = func(*args, **kwargs)
self.record_success()
return result
except Exception as e:
self.record_failure()
raise
class CircuitOpenError(Exception):
pass
def check_holy_sheep_health() -> bool:
"""HolySheep API のヘルスチェック(軽量ping)"""
import requests
try:
response = requests.get(
"https://api.holysheep.ai/v1/models",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=5
)
return response.status_code == 200
except:
return False
実装例
circuit_breaker = CircuitBreaker(
failure_threshold=5,
recovery_timeout=30.0,
success_threshold=3
)
def safe_api_call(messages, quality="high"):
"""サーキットブレーカー保護下的API呼び出し"""
def _do_call():
client = HolySheepSLAClient()
return client.chat_with_fallback(messages, quality_requirement=quality)
return circuit_breaker.execute(_do_call)
バックグラウンドヘルスチェック(30秒마다)
def background_health_check():
"""バックグラウンドでサーキット状態を確認・ログ出力"""
while True:
time.sleep(30)
is_healthy = check_holy_sheep_health()
if is_healthy:
circuit_breaker.record_success()
print(f"[HealthCheck] OK - Circuit state: {circuit_breaker.state}")
else:
circuit_breaker.record_failure()
print(f"[HealthCheck] FAIL - Circuit state: {circuit_breaker.state}")
エラー3:モデル降級の嵐(無限フォールバック)
症状:全ての高品質モデルが失敗し続け、DeepSeek V3.2 への極端なフォールバックが発生する。
原因:フォールバックチェーンに出口がなく、最悪ケースのモデルに固定される。
解決コード:
"""
モデル降級対策:スマートフォールバック戦略
- コスト上限
- 品質下限
- 人間へのエスカレーション
"""
from enum import Enum
from typing import Optional, List
from dataclasses import dataclass
import logging
logger = logging.getLogger(__name__)
class DegradationLevel(Enum):
NONE = 0 # 正常
MINOR = 1 # Gemini Flash に降級
MODERATE = 2 # DeepSeek V3.2 に降級
SEVERE = 3 # 手動対応が必要
DOWN = 4 # 完全停止
@dataclass
class FallbackPolicy:
"""フォールバックポリシー定義"""
max_cost_per_request: float = 0.50 # $0.50/request上限
min_quality_score: int = 3 # 最低品質スコア(1-5)
escalation_timeout: int = 300 # 300秒後に人間に通知
# モデル品質スコア(高いほど高品質)
model_quality = {
"gpt-4.1": 5,
"claude-sonnet-4.5": 5,
"gemini-2.5-flash": 3,
"deepseek-v3.2": 2
}
# モデルコスト($ per 1M tokens output)
model_cost = {
"gpt-4.1": 8.00,
"claude-sonnet-4.5": 15.00,
"gemini-2.5-flash": 2.50,
"deepseek-v3.2": 0.42
}
class SmartFallbackManager:
"""
スマートフォールバックマネージャー
機能:
- コストベースの自動遮断
- 品質閾値監視
- 人間へのエスカレーション
- インシデント自動記録
"""
def __init__(self, policy: FallbackPolicy = None):
self.policy = policy or FallbackPolicy()
self._