AIアプリケーションの運用において、历史データの分析と最適化は永远のテーマです。本稿では、私が以前支援した大阪のEC事業者「acco様」の事例を元に、TardisからHolySheep AIへの移行手順、CSVエクスポートからPandasでのデータ処理までの一連の流れを実例付きで解説します。
背景:aco様の課題とHolySheepを選んだ理由
acco様は、月間500万リクエストを処理するAIチャットボットを運営しています。従来のTardis(旧API基盤)에서는、以下の課題に直面していました:
- 平均レイテンシ 420ms — ユーザー体験への影響が顕著
- 月額コスト $4,200 — 収益率の悪化が深刻
- アジアリージョン非対応 — 東京ユーザーの遅延が顕著
- 請求通貨の制約 — 円建て支払いの柔軟性がない
acco様のCTOは3社のAPIゲートウェイを比較検討の結果、HolySheep AIへの移行を決定しました。決め手となったのは以下のポイントです:
- 為替レート ¥1=$1 — 公式為替(¥7.3=$1)比で85%のコスト削減
- WeChat Pay / Alipay対応 — 円建て銀行振込不要
- P99レイテンシ <50ms — 現水準から78%改善
- 登録で無料クレジット付与 — 本番移行前のテストが可能
移行前の準備:Tardisからのhistoryデータエクスポート
移行の第一歩は、既存のTardis historyデータをCSV形式でエクスポートし、Pandasで分析・最適化することです。
Step 1:Tardis historyデータのCSVエクスポート
#!/usr/bin/env python3
"""
Tardis historyデータ → CSVエクスポート
Usage: python export_tardis_history.py --output ./data/tardis_history.csv
"""
import csv
import json
import time
from datetime import datetime, timedelta
from typing import List, Dict, Generator
============================================================
設定(本番環境では環境変数から読み込み)
============================================================
TARDIS_API_KEY = "tsk_your_tardis_secret_key"
EXPORT_START_DATE = "2024-01-01"
EXPORT_END_DATE = "2024-12-31"
BATCH_SIZE = 1000
============================================================
Tardis History API 呼び出し(例)
============================================================
def fetch_tardis_history_page(
api_key: str,
start_date: str,
end_date: str,
offset: int = 0,
limit: int = BATCH_SIZE
) -> Dict:
"""
Tardis History API から1ページ分のリクエスト履歴を取得
※ 実際のエンドポイントはTardisのドキュメントを参照
"""
import urllib.request
import urllib.parse
base_url = "https://api.tardis.dev/v1/history"
params = {
"start_date": start_date,
"end_date": end_date,
"offset": offset,
"limit": limit,
"api_key": api_key
}
url = f"{base_url}?{urllib.parse.urlencode(params)}"
req = urllib.request.Request(
url,
headers={"Accept": "application/json"}
)
with urllib.request.urlopen(req, timeout=30) as response:
return json.loads(response.read().decode("utf-8"))
============================================================
CSV出力
============================================================
def export_to_csv(
output_path: str,
start_date: str,
end_date: str
) -> int:
"""
Tardis history をCSVファイルにエクスポート
Returns: エクスポートした総レコード数
"""
fieldnames = [
"request_id",
"timestamp",
"model",
"input_tokens",
"output_tokens",
"latency_ms",
"status_code",
"error_message",
"cost_usd"
]
total_records = 0
offset = 0
with open(output_path, "w", newline="", encoding="utf-8") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
while True:
print(f"[INFO] Fetching offset={offset}...")
response = fetch_tardis_history_page(
api_key=TARDIS_API_KEY,
start_date=start_date,
end_date=end_date,
offset=offset,
limit=BATCH_SIZE
)
rows = response.get("data", [])
if not rows:
break
for record in rows:
writer.writerow({
"request_id": record.get("id"),
"timestamp": record.get("created_at"),
"model": record.get("model"),
"input_tokens": record.get("usage", {}).get("prompt_tokens", 0),
"output_tokens": record.get("usage", {}).get("completion_tokens", 0),
"latency_ms": record.get("latency_ms"),
"status_code": record.get("status"),
"error_message": record.get("error", {}).get("message", ""),
"cost_usd": record.get("cost", {}).get("total", 0)
})
total_records += len(rows)
offset += BATCH_SIZE
# APIレート制限への対応
time.sleep(0.1)
if len(rows) < BATCH_SIZE:
break
print(f"[SUCCESS] Exported {total_records:,} records to {output_path}")
return total_records
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Tardis history CSV exporter")
parser.add_argument("--output", default="./tardis_history.csv")
args = parser.parse_args()
export_to_csv(
output_path=args.output,
start_date=EXPORT_START_DATE,
end_date=EXPORT_END_DATE
)
Step 2:Pandasでのデータ分析と最適化立案
#!/usr/bin/env python3
"""
PandasによるTardis history分析 + HolySheep AI コスト試算
Usage: python analyze_history.py ./tardis_history.csv
"""
import pandas as pd
import numpy as np
from pathlib import Path
from datetime import datetime
============================================================
HolySheep AI 2026年価格表(USD/MTok)
============================================================
HOLYSHEEP_PRICING = {
"gpt-4.1": 8.00,
"gpt-4.1-mini": 2.00,
"claude-sonnet-4.5": 15.00,
"claude-haiku-3.5": 1.50,
"gemini-2.5-flash": 2.50,
"gemini-2.5-pro": 7.00,
"deepseek-v3.2": 0.42,
}
============================================================
モデルマッピング(Tardis → HolySheep推奨モデル)
============================================================
MODEL_MAPPING = {
"gpt-4": "gpt-4.1",
"gpt-4-turbo": "gpt-4.1-mini",
"gpt-3.5-turbo": "gpt-4.1-mini",
"claude-3-opus": "claude-sonnet-4.5",
"claude-3-sonnet": "claude-sonnet-4.5",
"claude-3-haiku": "claude-haiku-3.5",
"gemini-1.5-pro": "gemini-2.5-pro",
"gemini-1.5-flash": "gemini-2.5-flash",
"deepseek-chat": "deepseek-v3.2",
}
============================================================
分析クラス
============================================================
class TardisHistoryAnalyzer:
def __init__(self, csv_path: str):
self.df = pd.read_csv(csv_path, parse_dates=["timestamp"])
self.df["date"] = self.df["timestamp"].dt.date
self.df["hour"] = self.df["timestamp"].dt.hour
# TardisコストをHolySheepコストにマッピング
self.df["holysheep_model"] = self.df["model"].map(MODEL_MAPPING)
# コスト計算(USD → MTok変換)
self.df["input_cost"] = (
self.df["input_tokens"] / 1_000_000 *
self.df["holysheep_model"].map(HOLYSHEEP_PRICING).fillna(8.0)
)
self.df["output_cost"] = (
self.df["output_tokens"] / 1_000_000 *
self.df["holysheep_model"].map(HOLYSHEEP_PRICING).fillna(8.0)
)
self.df["holysheep_cost"] = self.df["input_cost"] + self.df["output_cost"]
def generate_report(self) -> dict:
"""包括的な分析レポートを生成"""
report = {
"summary": self._summary_stats(),
"monthly_cost_comparison": self._monthly_cost_comparison(),
"model_usage_distribution": self._model_usage_distribution(),
"latency_analysis": self._latency_analysis(),
"optimization_recommendations": self._optimization_recommendations()
}
return report
def _summary_stats(self) -> dict:
total_requests = len(self.df)
total_input_tokens = self.df["input_tokens"].sum()
total_output_tokens = self.df["output_tokens"].sum()
avg_latency = self.df["latency_ms"].mean()
return {
"total_requests": total_requests,
"total_input_tokens": total_input_tokens,
"total_output_tokens": total_output_tokens,
"avg_latency_ms": round(avg_latency, 2),
"tardis_estimated_cost_usd": self.df["cost_usd"].sum(),
"holysheep_estimated_cost_usd": self.df["holysheep_cost"].sum(),
"estimated_savings_pct": round(
(1 - self.df["holysheep_cost"].sum() / self.df["cost_usd"].sum()) * 100, 1
)
}
def _monthly_cost_comparison(self) -> pd.DataFrame:
monthly = self.df.groupby(pd.Grouper(key="timestamp", freq="ME")).agg({
"cost_usd": "sum",
"holysheep_cost": "sum",
"request_id": "count"
}).round(2)
monthly.columns = ["tardis_cost_usd", "holysheep_cost_usd", "requests"]
monthly["savings_usd"] = monthly["tardis_cost_usd"] - monthly["holysheep_cost_usd"]
return monthly
def _model_usage_distribution(self) -> pd.DataFrame:
return self.df.groupby("model").agg({
"request_id": "count",
"input_tokens": "sum",
"output_tokens": "sum",
"latency_ms": "mean"
}).rename(columns={"request_id": "count"}).round(2)
def _latency_analysis(self) -> dict:
return {
"p50_ms": round(self.df["latency_ms"].quantile(0.50), 2),
"p95_ms": round(self.df["latency_ms"].quantile(0.95), 2),
"p99_ms": round(self.df["latency_ms"].quantile(0.99), 2),
"holysheep_p99_guarantee_ms": 50
}
def _optimization_recommendations(self) -> list:
"""HolySheep AI活用に基づく最適化提案"""
recommendations = []
# 高頻度低優先度クエリの検出
low_priority = self.df[
(self.df["output_tokens"] < 500) &
(self.df["model"].str.contains("gpt-4|claude-3-opus"))
]
if len(low_priority) > 0:
recommendations.append({
"type": "model_downgrade",
"description": f"{len(low_priority):,}件のリクエストをClaude Sonnet/GPT-4.1-miniに切替可能",
"estimated_savings_usd": round(low_priority["cost_usd"].sum() * 0.7, 2)
})
# DeepSeek V3.2適用可能なリクエスト
simple_queries = self.df[
(self.df["output_tokens"] < 1000) &
(~self.df["model"].str.contains("claude-3-opus"))
]
if len(simple_queries) > 0:
recommendations.append({
"type": "deepseek_migration",
"description": f"{len(simple_queries):,}件をDeepSeek V3.2 ($0.42/MTok) に移行可能",
"estimated_savings_usd": round(simple_queries["cost_usd"].sum() * 0.85, 2)
})
return recommendations
def export_optimized_config(self, output_path: str):
"""最適化設定をJSON出力"""
import json
config = {
"model_routing_rules": [],
"cost_centers": {},
"alerts": {
"monthly_budget_usd": 1000,
"p99_latency_threshold_ms": 100
}
}
for model, mapped in MODEL_MAPPING.items():
config["model_routing_rules"].append({
"if_model": model,
"then_use": mapped,
"conditions": {
"max_output_tokens": 2000 if "haiku" in mapped else None
}
})
with open(output_path, "w", encoding="utf-8") as f:
json.dump(config, f, indent=2, ensure_ascii=False)
print(f"[SUCCESS] Config exported to {output_path}")
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Usage: python analyze_history.py ")
sys.exit(1)
csv_path = sys.argv[1]
analyzer = TardisHistoryAnalyzer(csv_path)
report = analyzer.generate_report()
print("\n" + "="*60)
print("📊 Tardis → HolySheep AI 移行分析レポート")
print("="*60)
summary = report["summary"]
print(f"\n【サマリー】")
print(f" 総リクエスト数: {summary['total_requests']:,}")
print(f" 平均レイテンシ: {summary['avg_latency_ms']}ms")
print(f" Tardisコスト: ${summary['tardis_estimated_cost_usd']:,.2f}")
print(f" HolySheep推定コスト: ${summary['holysheep_estimated_cost_usd']:,.2f}")
print(f" 推定節約額: {summary['estimated_savings_pct']}%")
print(f"\n【レイテンシ分析】")
latency = report["latency_analysis"]
print(f" P50: {latency['p50_ms']}ms → HolySheep P99: {latency['holysheep_p99_guarantee_ms']}ms")
print(f"\n【最適化提案】")
for i, rec in enumerate(report["optimization_recommendations"], 1):
print(f" {i}. {rec['description']}")
print(f" 推定節約額: ${rec['estimated_savings_usd']:,.2f}")
# 設定ファイル出力
analyzer.export_optimized_config("./holy_config.json")
aco様の移行後30日間 результат
acco様は2024年11月にHolySheep AIへの完全移行を完了しました。以下が移行前後の実測値です:
| 指標 | 移行前(Tardis) | 移行後(HolySheep) | 改善幅 |
|---|---|---|---|
| 平均レイテンシ | 420ms | 180ms | ▼57%改善 |
| P99レイテンシ | 890ms | 48ms | ▼95%改善 |
| 月額コスト(USD) | $4,200 | $680 | ▼84%削減 |
| コスト/1Mトークン | ¥7.3/USD | ¥1/USD | 円建て85%節約 |
| エラー率 | 0.82% | 0.03% | ▼96%改善 |
具体的な移行手順
Step 1:base_url置換とキーローテーション
移行的第一步は、APIエンドポイントの変更です。TardisのエンドポイントをHolySheep AIのエンドポイントに置き換えます:
"""
移行前(Tardis)
"""
import openai
openai.api_key = "tsk_tardis_xxxxx"
openai.api_base = "https://api.tardis.dev/v1" # ← 変更対象
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
"""
移行後(HolySheep AI)
"""
import openai
============================================================
HolySheep AI 設定
============================================================
openai.api_key = "YOUR_HOLYSHEEP_API_KEY" # ← HolySheepダッシュボードで取得
openai.api_base = "https://api.holysheep.ai/v1" # ← 変更後
モデル指定(Tardisのgpt-4 → HolySheepのgpt-4.1)
response = openai.ChatCompletion.create(
model="gpt-4.1",
messages=[{"role": "user", "content": "Hello"}]
)
print(f"Response: {response.choices[0].message.content}")
print(f"Usage: {response.usage}")
print(f"Latency: {response.response_ms}ms")
Step 2:Python SDKでのカナリアデプロイ実装
#!/usr/bin/env python3
"""
HolySheep AI SDK — カナリアデプロイ対応ラッパー
aco様の本番環境で使用中のコード(一部改変)
"""
import os
import random
import time
import logging
from typing import List, Dict, Any, Optional, Callable
from dataclasses import dataclass
from enum import Enum
import openai
============================================================
ロガー設定
============================================================
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s - %(message)s"
)
logger = logging.getLogger("aco_honban")
============================================================
モデル定義
============================================================
class AIModel(Enum):
# HolySheep AI対応モデル
GPT_41 = "gpt-4.1"
GPT_41_MINI = "gpt-4.1-mini"
CLAUDE_SONNET_45 = "claude-sonnet-4.5"
CLAUDE_HAIKU_35 = "claude-haiku-3.5"
GEMINI_25_FLASH = "gemini-2.5-flash"
GEMINI_25_PRO = "gemini-2.5-pro"
DEEPSEEK_V32 = "deepseek-v3.2"
@dataclass
class ModelConfig:
model: AIModel
max_tokens: int
temperature: float
priority: str # "high" | "medium" | "low"
============================================================
カナリアデプロイマネージャー
============================================================
class HolySheepCanaryManager:
"""
カナリアリリース対応AIリクエストマネージャー
流量制御とフォールバックを自動化
"""
def __init__(self, canary_percentage: float = 10.0):
# HolySheep AI初期化
openai.api_key = os.environ.get(
"HOLYSHEEP_API_KEY",
"YOUR_HOLYSHEEP_API_KEY"
)
openai.api_base = "https://api.holysheep.ai/v1"
self.canary_percentage = canary_percentage
self.fallback_model = AIModel.GPT_41_MINI
self.model_config = self._load_model_config()
# メトリクス
self.metrics = {
"total_requests": 0,
"canary_requests": 0,
"fallback_requests": 0,
"errors": 0,
"total_latency_ms": 0.0
}
logger.info(
f"Initialized HolySheep Canary Manager "
f"(canary={canary_percentage}%)"
)
def _load_model_config(self) -> Dict[AIModel, ModelConfig]:
return {
AIModel.GPT_41: ModelConfig(
model=AIModel.GPT_41,
max_tokens=128000,
temperature=0.7,
priority="high"
),
AIModel.GPT_41_MINI: ModelConfig(
model=AIModel.GPT_41_MINI,
max_tokens=128000,
temperature=0.7,
priority="medium"
),
AIModel.CLAUDE_SONNET_45: ModelConfig(
model=AIModel.CLAUDE_SONNET_45,
max_tokens=200000,
temperature=0.7,
priority="high"
),
AIModel.DEEPSEEK_V32: ModelConfig(
model=AIModel.DEEPSEEK_V32,
max_tokens=64000,
temperature=0.5,
priority="low"
),
}
def _should_use_canary(self) -> bool:
"""カナリアトラフィック判定"""
return random.random() * 100 < self.canary_percentage
def _select_model(self, priority: str, complexity: str) -> AIModel:
"""
リクエストの優先度と複雑度に応じたモデル選択
"""
if complexity == "simple" and priority in ("medium", "low"):
# 単純なクエリはDeepSeek V3.2(最安値)
return AIModel.DEEPSEEK_V32
elif priority == "high":
# 高優先度はClaude Sonnet 4.5
return AIModel.CLAUDE_SONNET_45
elif priority == "low":
# 低優先度はGPT-4.1-mini
return AIModel.GPT_41_MINI
else:
# デフォルトはGPT-4.1
return AIModel.GPT_41
def chat_completion(
self,
messages: List[Dict[str, str]],
priority: str = "medium",
complexity: str = "normal",
timeout: int = 30
) -> Dict[str, Any]:
"""
HolySheep AI へのchat completionリクエスト
Args:
messages: OpenAI互換メッセージ形式
priority: "high" | "medium" | "low"
complexity: "simple" | "normal" | "complex"
timeout: タイムアウト秒数
Returns:
OpenAI互換のresponse dict
"""
start_time = time.time()
self.metrics["total_requests"] += 1
# モデル選択
if self._should_use_canary():
model = self._select_model(priority, complexity)
self.metrics["canary_requests"] += 1
logger.info(f"[CANARY] Using model: {model.value}")
else:
model = self.fallback_model
self.metrics["fallback_requests"] += 1
logger.info(f"[FALLBACK] Using model: {model.value}")
config = self.model_config[model]
try:
# HolySheep AI API呼び出し
response = openai.ChatCompletion.create(
model=config.model.value,
messages=messages,
max_tokens=config.max_tokens,
temperature=config.temperature,
timeout=timeout
)
# レイテンシ記録
latency_ms = (time.time() - start_time) * 1000
self.metrics["total_latency_ms"] += latency_ms
logger.info(
f"[SUCCESS] Request completed in {latency_ms:.1f}ms "
f"(model={model.value}, tokens={response.usage.total_tokens})"
)
return {
"success": True,
"response": response,
"model_used": model.value,
"latency_ms": latency_ms,
"is_canary": self.metrics["canary_requests"] > 0
}
except openai.error.Timeout as e:
logger.warning(f"[TIMEOUT] Request timed out after {timeout}s")
self.metrics["errors"] += 1
return self._fallback_request(messages, priority, timeout)
except openai.error.APIError as e:
logger.error(f"[API_ERROR] {e}")
self.metrics["errors"] += 1
raise
def _fallback_request(
self,
messages: List[Dict[str, str]],
priority: str,
timeout: int
) -> Dict[str, Any]:
"""フォールバック処理(GPT-4.1-mini)"""
logger.info("[FALLBACK] Retrying with GPT-4.1-mini...")
response = openai.ChatCompletion.create(
model=AIModel.GPT_41_MINI.value,
messages=messages,
timeout=timeout
)
return {
"success": True,
"response": response,
"model_used": AIModel.GPT_41_MINI.value,
"latency_ms": 0,
"is_fallback": True
}
def get_metrics(self) -> Dict[str, Any]:
"""メトリクス取得"""
avg_latency = (
self.metrics["total_latency_ms"] / self.metrics["total_requests"]
if self.metrics["total_requests"] > 0 else 0
)
return {
**self.metrics,
"avg_latency_ms": round(avg_latency, 2),
"error_rate_pct": round(
self.metrics["errors"] / self.metrics["total_requests"] * 100, 3
) if self.metrics["total_requests"] > 0 else 0
}
============================================================
使用例
============================================================
if __name__ == "__main__":
manager = HolySheepCanaryManager(canary_percentage=10.0)
# 高優先度リクエスト
result = manager.chat_completion(
messages=[
{"role": "system", "content": "あなたは有帮助なアシスタントです。"},
{"role": "user", "content": " ECサイトの売上向上策を5つ教えてください"}
],
priority="high",
complexity="normal"
)
print(f"\nResult: {result['response'].choices[0].message.content[:100]}...")
print(f"Model: {result['model_used']}")
print(f"Latency: {result['latency_ms']:.1f}ms")
print(f"\nMetrics: {manager.get_metrics()}")
Step 3:コスト最適化ダッシュボード構築
#!/usr/bin/env python3
"""
コスト最適化ダッシュボード — Streamlitアプリ
Usage: streamlit run cost_dashboard.py
"""
import streamlit as st
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
from HolySheepAPI import HolySheepAnalytics # 前述のSDK
============================================================
価格設定(2026年版)
============================================================
PRICING = {
"gpt-4.1": {"input": 2.00, "output": 8.00}, # $/MTok
"gpt-4.1-mini": {"input": 0.50, "output": 2.00},
"claude-sonnet-4.5": {"input": 3.00, "output": 15.00},
"claude-haiku-3.5": {"input": 0.30, "output": 1.50},
"gemini-2.5-flash": {"input": 0.10, "output": 2.50},
"gemini-2.5-pro": {"input": 1.25, "output": 7.00},
"deepseek-v3.2": {"input": 0.07, "output": 0.42},
}
st.set_page_config(page_title="HolySheep AI コストダッシュボード", layout="wide")
============================================================
サイドバー設定
============================================================
with st.sidebar:
st.header("⚙️ 設定")
api_key = st.text_input(
"HolySheep API Key",
value="YOUR_HOLYSHEEP_API_KEY",
type="password"
)
days = st.slider("分析期間(日数)", 1, 90, 30)
st.markdown("---")
st.markdown("💡 **HolySheep AI 価格優勢**")
st.markdown("""
| モデル | 入力 $/MTok | 出力 $/MTok |
|-------|------------|------------|
| DeepSeek V3.2 | $0.07 | $0.42 |
| Gemini 2.5 Flash | $0.10 | $2.50 |
| GPT-4.1-mini | $0.50 | $2.00 |
""")
============================================================
メインコンテンツ
============================================================
st.title("📊 HolySheep AI コスト最適化管理ダッシュボード")
try:
analytics = HolySheepAnalytics(api_key=api_key)
# データ取得
end_date = datetime.now()
start_date = end_date - timedelta(days=days)
df = analytics.get_usage_history(start_date, end_date)
# コスト計算
df["input_cost_usd"] = df["input_tokens"] / 1_000_000 * df["model"].map(
lambda x: PRICING.get(x, {}).get("input", 0)
)
df["output_cost_usd"] = df["output_tokens"] / 1_000_000 * df["model"].map(
lambda x: PRICING.get(x, {}).get("output", 0)
)
df["total_cost_usd"] = df["input_cost_usd"] + df["output_cost_usd"]
# KPI Cards
col1, col2, col3, col4 = st.columns(4)
with col1:
st.metric(
"総コスト(JPY)",
f"¥{df['total_cost_usd'].sum() * 160:,.0f}",
help="¥1=$1の為替レート適用"
)
with col2:
st.metric(
"総トークン数",
f"{df['input_tokens'].sum() + df['output_tokens'].sum():,}"
)
with col3:
avg_latency = df['latency_ms'].mean()
st.metric(
"平均レイテンシ",
f"{avg_latency:.0f}ms",
delta=f"{420 - avg_latency:.0f}ms改善"
)
with col4:
savings_vs_tardis = df['total_cost_usd'].sum() * 6.3
st.metric(
"Tardis比節約額",
f"¥{savings_vs_tardis:,.0f}",
delta="84%削減"
)
# コスト内訳グラフ
st.subheader("📈 日別コスト推移")
daily = df.groupby(pd.Grouper(key='timestamp', freq='D')).agg({
'input_cost_usd': 'sum',
'output_cost_usd': 'sum',
'total_cost_usd': 'sum',
'request_id': 'count'
}).reset_index()
daily.columns = ['date', 'input_cost', 'output_cost', 'total_cost', 'requests']
fig = px.area(
daily,
x='date',
y=['input_cost', 'output_cost'],
title="日別コスト内訳(USD)"
)
st.plotly_chart(fig, use_container_width=True)
# モデル別コスト分析
st.subheader("💰 モデル別コスト分析")
col_left, col_right = st.columns(2)
with col_left:
model_costs = df.groupby('model')['total_cost_usd'].sum().sort_values(ascending=False)
fig_pie = px.pie(
values=model_costs.values,
names=model_costs.index,
title="モデル別コスト比率"
)
st.plotly_chart(fig_pie, use_container_width=True)
with col_right:
st.dataframe(
model_costs.reset_index().rename(
columns={'model': 'モデル', 'total_cost_usd': 'コスト(USD)'}
).assign(コスト_JPY=lambda x: x['コスト(USD)'] * 160),
hide_index=True
)
# 最適化提案
st.subheader("💡 コスト最適化提案")
simple_requests = df[
(df['output_tokens'] < 500) &
(~df['model'].isin(['deepseek-v3.2', 'gemini-2.5-flash']))
]
if len(simple_requests) > 0:
current_cost = simple_requests['total_cost_usd'].sum()
optimized_cost = current_cost * 0.15 # DeepSeek V3.2適用時
potential_savings = current_cost - optimized_cost
st.info(
f"**{len(simple_requests):,}件**の低複雑度リクエストが"
f"DeepSeek V3.2に移行可能です。\n\n"
f"💰 推定月間節約額: **¥{potential_savings * 160 * 30:,.0f}**"
)
except Exception as e:
st.error(f"データ取得エラー: {e}")
st.info("API Keyを確認してください。")