เรื่องมันเกิดขึ้นจริง: ใบแจ้งหนี้ 3,000 ดอลลาร์ในเดือนเดียว
สามเดือนก่อน ทีมของผมเจอปัญหาใหญ่หลวง — ค่าใช้จ่าย AI API พุ่งสูงถึง 3,000 ดอลลาร์ในเดือนเดียว ทั้งๆ ที่ตั้งงบประมาณไว้แค่ 500 ดอลลาร์ สาเหตุคือโค้ดที่มี loop ไม่รู้จักจบ ส่ง request ไปเกือบล้านครั้ง ตอนนั้นผมตั้งใจเขียนระบบ monitoring ขึ้นมาใช้เอง และวันนี้จะมาแชร์วิธีการให้ทุกคนได้นำไปใช้กัน
ปัญหาหลักคือเราไม่มีทางนั่งเฝ้าหน้าจอตลอด 24 ชั่วโมงได้ ระบบแจ้งเตือนอัตโนมัติจึงเป็นสิ่งจำเป็นอย่างยิ่งสำหรับทุกโปรเจกต์ที่ใช้ AI API
ทำไมต้องตรวจสอบค่าใช้จ่าย AI API
เมื่อใช้งาน
HolySheep AI ที่มีอัตรา ¥1 ต่อ $1 ประหยัดได้ถึง 85% ขึ้นไป การติดตามค่าใช้จ่ายยิ่งมีความสำคัญมากขึ้น เพราะต้นทุนที่ต่ำทำให้เราอาจประมาทการใช้งานมากเกินไป ระบบแจ้งเตือนจะช่วยป้องกันปัญหาต่างๆ เช่น:
- โค้ดวนลูปส่ง request ซ้ำไม่รู้จบ
- การทดสอบที่ไม่ได้จำกัดจำนวน
- การลืมปิดระบบทดสอบหลังเสร็จสิ้น
- การโจมตีจากภายนอกที่ใช้ API key ของเรา
การตั้งค่าระบบตรวจสอบค่าใช้จ่าย
เราจะสร้างระบบที่ทำหน้าที่ติดตามการใช้งาน token และส่งการแจ้งเตือนผ่าน LINE Notify เมื่อค่าใช้จ่ายเกินงบประมาณที่กำหนด
import requests
import time
from datetime import datetime, timedelta
class HolySheepCostMonitor:
"""
ระบบตรวจสอบค่าใช้จ่าย HolySheep AI
รองรับ: GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2
"""
def __init__(self, api_key: str, budget_usd: float = 500.0):
self.base_url = "https://api.holysheep.ai/v1"
self.api_key = api_key
self.budget_usd = budget_usd
self.total_spent = 0.0
self.request_count = 0
# ราคาเริ่มต้นต่อ 1M tokens (ดอลลาร์)
self.pricing = {
"gpt-4.1": 8.0, # GPT-4.1
"claude-sonnet-4.5": 15.0, # Claude Sonnet 4.5
"gemini-2.5-flash": 2.5, # Gemini 2.5 Flash
"deepseek-v3.2": 0.42 # DeepSeek V3.2
}
def calculate_cost(self, model: str, input_tokens: int,
output_tokens: int) -> float:
"""คำนวณค่าใช้จ่ายจากจำนวน tokens"""
if model not in self.pricing:
# ใช้ราคา GPT-4.1 เป็น default
price_per_m = self.pricing["gpt-4.1"]
else:
price_per_m = self.pricing[model]
total_tokens = input_tokens + output_tokens
cost = (total_tokens / 1_000_000) * price_per_m
return round(cost, 4) # แม่นยำถึง 4 ตำแหน่ง
def send_line_notify(self, message: str, line_token: str):
"""ส่งการแจ้งเตือนผ่าน LINE Notify"""
url = "https://notify-api.line.me/api/notify"
headers = {"Authorization": f"Bearer {line_token}"}
data = {"message": message}
response = requests.post(url, headers=headers, data=data)
return response.status_code == 200
def check_budget(self, line_token: str = None) -> dict:
"""ตรวจสอบงบประมาณและส่งการแจ้งเตือนหากเกิน"""
result = {
"total_spent": self.total_spent,
"budget": self.budget_usd,
"remaining": self.budget_usd - self.total_spent,
"percent_used": (self.total_spent / self.budget_usd) * 100,
"over_budget": self.total_spent > self.budget_usd
}
# ส่งการแจ้งเตือนหากเกินงบ 80% ขึ้นไป
warning_threshold = self.budget_usd * 0.8
if self.total_spent > self.budget_usd:
message = f"""
⚠️ ค่าใช้จ่าย AI API เกินงบประมาณ!
💰 งบประมาณ: ${self.budget_usd:.2f}
💸 ใช้ไป: ${self.total_spent:.2f}
📊 เปอร์เซ็นต์: {result['percent_used']:.1f}%
🔢 จำนวน request: {self.request_count}
"""
if line_token:
self.send_line_notify(message, line_token)
elif self.total_spent > warning_threshold:
message = f"""
🔔 แจ้งเตือน: ค่าใช้จ่ายเกิน 80% ของงบประมาณ
💰 งบประมาณ: ${self.budget_usd:.2f}
💸 ใช้ไป: ${self.total_spent:.2f}
📊 เปอร์เซ็นต์: {result['percent_used']:.1f}%
"""
if line_token:
self.send_line_notify(message, line_token)
return result
ตัวอย่างการใช้งาน
monitor = HolySheepCostMonitor(
api_key="YOUR_HOLYSHEEP_API_KEY",
budget_usd=500.0
)
คำนวณค่าใช้จ่ายตัวอย่าง
cost = monitor.calculate_cost(
model="gpt-4.1",
input_tokens=1500,
output_tokens=500
)
print(f"ค่าใช้จ่าย: ${cost:.4f}")
ระบบ API Proxy พร้อมการติดตามค่าใช้จ่าย
ต่อไปนี้คือระบบที่ผมใช้จริงใน production — เป็น proxy ที่ครอบ API ของ
HolySheep AI โดยมีการ tracking ค่าใช้จ่ายทุก request และ latency ที่แท้จริง
from flask import Flask, request, jsonify
from functools import wraps
import time
import sqlite3
from threading import Lock
app = Flask(__name__)
ฐานข้อมูล SQLite สำหรับเก็บประวัติ
DB_PATH = "cost_tracking.db"
class CostTracker:
"""ระบบติดตามค่าใช้จ่ายพร้อม SQLite"""
def __init__(self, db_path: str):
self.db_path = db_path
self.lock = Lock()
self.init_database()
def init_database(self):
"""สร้างตารางฐานข้อมูล"""
with sqlite3.connect(self.db_path) as conn:
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS api_usage (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
model TEXT NOT NULL,
input_tokens INTEGER,
output_tokens INTEGER,
cost_usd REAL,
latency_ms REAL,
status TEXT,
error_message TEXT
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS daily_summary (
date TEXT PRIMARY KEY,
total_cost REAL,
total_requests INTEGER,
avg_latency_ms REAL
)
""")
conn.commit()
def record_usage(self, model: str, input_tokens: int,
output_tokens: int, cost: float,
latency_ms: float, status: str,
error_message: str = None):
"""บันทึกการใช้งาน"""
timestamp = datetime.now().isoformat()
with self.lock:
with sqlite3.connect(self.db_path) as conn:
cursor = conn.cursor()
cursor.execute("""
INSERT INTO api_usage
(timestamp, model, input_tokens, output_tokens,
cost_usd, latency_ms, status, error_message)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""", (timestamp, model, input_tokens, output_tokens,
cost, latency_ms, status, error_message))
conn.commit()
def get_daily_cost(self, days: int = 30) -> list:
"""ดึงข้อมูลค่าใช้จ่ายรายวัน"""
with sqlite3.connect(self.db_path) as conn:
cursor = conn.cursor()
cursor.execute("""
SELECT date, total_cost, total_requests, avg_latency_ms
FROM daily_summary
ORDER BY date DESC
LIMIT ?
""", (days,))
return cursor.fetchall()
def get_monthly_total(self) -> dict:
"""คำนวณค่าใช้จ่ายรายเดือน"""
with sqlite3.connect(self.db_path) as conn:
cursor = conn.cursor()
cursor.execute("""
SELECT
COALESCE(SUM(cost_usd), 0) as total,
COUNT(*) as requests,
COALESCE(AVG(latency_ms), 0) as avg_latency
FROM api_usage
WHERE timestamp >= date('now', 'start of month')
""")
result = cursor.fetchone()
return {
"total_cost": result[0],
"total_requests": result[1],
"avg_latency_ms": round(result[2], 2)
}
สร้าง instance
tracker = CostTracker(DB_PATH)
ราคาต่อ 1M tokens (ดอลลาร์)
PRICING = {
"gpt-4.1": 8.0,
"claude-sonnet-4.5": 15.0,
"gemini-2.5-flash": 2.5,
"deepseek-v3.2": 0.42
}
def calculate_cost(model: str, input_tokens: int, output_tokens: int) -> float:
"""คำนวณค่าใช้จ่าย - แม่นยำถึงเซ็นต์"""
price = PRICING.get(model, 8.0)
total_tokens = input_tokens + output_tokens
cost = (total_tokens / 1_000_000) * price
return round(cost, 4)
@app.route("/v1/chat/completions", methods=["POST"])
def chat_completions():
"""
Proxy endpoint สำหรับ Chat Completions
พร้อม tracking ค่าใช้จ่ายและ latency
"""
start_time = time.time()
headers = {
"Authorization": f"Bearer {request.headers.get('Authorization', '').replace('Bearer ', '')}",
"Content-Type": "application/json"
}
data = request.get_json()
model = data.get("model", "gpt-4.1")
try:
# เรียก HolySheep API
response = requests.post(
"https://api.holysheep.ai/v1/chat/completions",
headers=headers,
json=data,
timeout=30
)
latency_ms = (time.time() - start_time) * 1000
if response.status_code == 200:
result = response.json()
# ดึงข้อมูล usage
usage = result.get("usage", {})
input_tokens = usage.get("prompt_tokens", 0)
output_tokens = usage.get("completion_tokens", 0)
cost = calculate_cost(model, input_tokens, output_tokens)
# บันทึกลงฐานข้อมูล
tracker.record_usage(
model=model,
input_tokens=input_tokens,
output_tokens=output_tokens,
cost=cost,
latency_ms=latency_ms,
status="success"
)
return jsonify(result)
else:
# บันทึก error
tracker.record_usage(
model=model,
input_tokens=0,
output_tokens=0,
cost=0,
latency_ms=latency_ms,
status="error",
error_message=f"HTTP {response.status_code}"
)
return jsonify(response.json()), response.status_code
except requests.exceptions.Timeout:
tracker.record_usage(
model=model,
input_tokens=0,
output_tokens=0,
cost=0,
latency_ms=(time.time() - start_time) * 1000,
status="timeout",
error_message="Connection timeout"
)
return jsonify({"error": "Request timeout"}), 504
except Exception as e:
tracker.record_usage(
model=model,
input_tokens=0,
output_tokens=0,
cost=0,
latency_ms=(time.time() - start_time) * 1000,
status="exception",
error_message=str(e)
)
return jsonify({"error": str(e)}), 500
@app.route("/api/cost-summary", methods=["GET"])
def cost_summary():
"""API สำหรับดูสรุปค่าใช้จ่าย"""
monthly = tracker.get_monthly_total()
daily = tracker.get_daily_cost(7)
return jsonify({
"monthly": monthly,
"daily_history": [
{
"date": d[0],
"cost": d[1],
"requests": d[2],
"avg_latency": d[3]
} for d in daily
]
})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=False)
ระบบแจ้งเตือนอัตโนมัติผ่าน LINE Notify
ระบบแจ้งเตือนที่ผมใช้จะส่งข้อความทุกครั้งที่ค่าใช้จ่ายเกิน 80% และ 100% ของงบประมาณ โดยสามารถตั้งค่าให้ส่ง email, LINE, หรือ Slack ก็ได้ตามความต้องการ
import schedule
import time
import threading
from datetime import datetime
class BudgetAlertSystem:
"""
ระบบแจ้งเตือนงบประมาณอัตโนมัติ
รองรับ: LINE Notify, Email, Slack
"""
def __init__(self, tracker: CostTracker, budget_usd: float):
self.tracker = tracker
self.budget_usd = budget_usd
self.last_alert_time = {}
self.alert_cooldown_hours = 6 # รอ 6 ชั่วโมงก่อนแจ้งซ้ำ
def should_send_alert(self, level: str) -> bool:
"""ตรวจสอบว่าควรส่งการแจ้งเตือนหรือไม่ (cooldown)"""
now = datetime.now()
if level not in self.last_alert_time:
return True
last = self.last_alert_time[level]
hours_passed = (now - last).total_seconds() / 3600
return hours_passed >= self.alert_cooldown_hours
def send_line_alert(self, token: str, message: str) -> bool:
"""ส่งการแจ้งเตือน LINE"""
import requests
url = "https://notify-api.line.me/api/notify"
headers = {"Authorization": f"Bearer {token}"}
data = {"message": message}
try:
resp = requests.post(url, headers=headers, data=data, timeout=10)
return resp.status_code == 200
except:
return False
def check_and_alert(self, line_token: str):
"""ตรวจสอบงบประมาณและส่งการแจ้งเตือน"""
monthly = self.tracker.get_monthly_total()
current_cost = monthly["total_cost"]
percent_used = (current_cost / self.budget_usd) * 100
# ระดับการแจ้งเตือน
alerts = []
if percent_used >= 100 and self.should_send_alert("critical"):
alerts.append(("critical", f"""
🚨 ค่าใช้จ่ายเกินงบประมาณแล้ว!
💰 งบประมาณเดือนนี้: ${self.budget_usd:.2f}
💸 ใช้ไปแล้ว: ${current_cost:.2f}
📊 เกินงบ: ${current_cost - self.budget_usd:.2f}
🔢 จำนวน request: {monthly['total_requests']}
⏱️ Latency เฉลี่ย: {monthly['avg_latency_ms']:.2f}ms
⛔ กรุณาตรวจสอบการใช้งานโดยด่วน!
"""))
self.last_alert_time["critical"] = datetime.now()
elif percent_used >= 80 and self.should_send_alert("warning"):
alerts.append(("warning", f"""
⚠️ ค่าใช้จ่ายเกิน 80% ของงบประมาณ
💰 งบประมาณเดือนนี้: ${self.budget_usd:.2f}
💸 ใช้ไปแล้ว: ${current_cost:.2f}
📊 เปอร์เซ็นต์: {percent_used:.1f}%
🔢 จำนวน request: {monthly['total_requests']}
⏱️ Latency เฉลี่ย: {monthly['avg_latency_ms']:.2f}ms
💡 แนะนำ: ตรวจสอบการใช้งานที่ไม่จำเป็น
"""))
self.last_alert_time["warning"] = datetime.now()
elif percent_used >= 50 and self.should_send_alert("info"):
alerts.append(("info", f"""
ℹ️ สรุปค่าใช้จ่าย AI API
💰 งบประมาณเดือนนี้: ${self.budget_usd:.2f}
💸 ใช้ไปแล้ว: ${current_cost:.2f}
📊 เปอร์เซ็นต์: {percent_used:.1f}%
🔢 จำนวน request: {monthly['total_requests']}
"""))
self.last_alert_time["info"] = datetime.now()
# ส่งการแจ้งเตือน
for level, message in alerts:
success = self.send_line_alert(line_token, message)
if success:
print(f"[{datetime.now()}] Sent {level} alert")
else:
print(f"[{datetime.now()}] Failed to send {level} alert")
return alerts
def run_scheduler(self, line_token: str):
"""รัน scheduler ตรวจสอบทุก 1 ชั่วโมง"""
def job():
self.check_and_alert(line_token)
# ตรวจสอบทุก 1 ชั่วโมง
schedule.every(1).hours.do(job)
# ตรวจสอบทุกวันเวลา 09:00 น.
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(60)
การใช้งาน
if __name__ == "__main__":
tracker = CostTracker(DB_PATH)
alert_system = BudgetAlertSystem(
tracker=tracker,
budget_usd=500.0
)
# รันใน thread แยก
thread = threading.Thread(
target=alert_system.run_scheduler,
args=("YOUR_LINE_NOTIFY_TOKEN",),
daemon=True
)
thread.start()
print("ระบบแจ้งเตือนกำลังทำงาน...")
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
1. 401 Unauthorized — API Key ไม่ถูกต้อง
ข้อผิดพลาดนี้เกิดขึ้นเมื่อ API key หมดอายุหรือไม่ถูกต้อง วิธีแก้คือตรวจสอบและสร้าง key ใหม่ที่
HolySheep AI dashboard
# วิธีแก้ไข: ตรวจสอบ API key
import requests
API_KEY = "YOUR_HOLYSHEEP_API_KEY"
BASE_URL = "https://api.holysheep.ai/v1"
def verify_api_key():
"""ตรวจสอบความถูกต้องของ API key"""
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
try:
# ทดสอบด้วย request เล็กๆ
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json={
"model": "gpt-4.1",
"messages": [{"role": "user", "content": "test"}],
"max_tokens": 5
},
timeout=10
)
if response.status_code == 401:
print("❌ API Key ไม่ถูกต้องหรือหมดอายุ")
print("👉 สมัครและสร้าง API key ใหม่ที่: https://www.holysheep.ai/register")
return False
elif response.status_code == 200:
print("✅ API Key ถูกต้อง")
return True
else:
print(f"❌ ข้อผิดพลาด: {response.status_code}")
print(response.text)
return False
except requests.exceptions.RequestException as e:
print(f"❌ เชื่อมต่อไม่ได้: {e}")
return False
verify_api_key()
2. ConnectionError: Timeout — API ไม่ตอบสนอง
ปัญหานี้มักเกิดจาก network หรือ server overloaded วิธีแก้คือเพิ่ม retry logic และ timeout ที่เหมาะสม
# วิธีแก้ไข: เพิ่ม Retry และ Timeout
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
import requests
def create_session_with_retry(max_retries: int = 3):
"""สร้าง requests session พร้อม retry logic"""
session = requests.Session()
# ตั้งค่า retry strategy
retry_strategy = Retry(
total=max_retries,
backoff_factor=1, # รอ 1, 2, 4 วินาที
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["POST"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
return session
def call_api_with_fallback(messages: list, model: str = "gpt-4.1"):
"""เรียก API พร้อม fallback ไป model ราคาถูกกว่า"""
session = create_session_with_retry(max_retries=3)
headers = {
"Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY",
"Content-Type": "application/json"
}
# ลำดับความสำคัญ: ถ้า model หลักใช้ไม่ได้ ใช้ fallback
models_to_try = [model]
if model == "gpt-4.1":
models_to_try.append("deepseek-v3.2") # ราคา $0.42
errors = []
for try_model in models_to_try:
try:
response = session.post(
"https://api.holysheep.ai/v1/chat/completions",
headers=headers,
json={
"model": try_model,
"messages": messages,
"max_tokens": 1000
},
timeout=(10, 30) # (connect_timeout, read_timeout)
)
if response.status_code == 200:
return {"success": True, "data": response.json()}
else:
errors.append(f"{try_model}: {response.status_code}")
continue
except requests.exceptions.Timeout:
errors.append(f"{try_model}: Timeout")
continue
except requests.exceptions.ConnectionError as e:
errors.append(f"{try_model}: ConnectionError - {e}")
continue
return {
"success": False,
"errors": errors,
"message": "ทุก model ไม่สามารถเชื่อมต่อได้"
}
ทดสอบ
result = call_api_with_fallback(
messages=[{"role": "user", "content": "ทดสอบระบบ"}],
model="gpt-4.1"
)
print(result)
3. ค่าใช้จ่ายสูงผิดปกติ — Token Counting ไม่ถูกต้อง
ปัญหานี้เกิดจากการคำนวณ token ไม่ตรงกับที่ API คิดจริง ต้องใช้ข้อมูลจาก response ที่ API ส่งมาเท่านั้น
# วิธีแก้ไข: ใช้ค่า usage จาก API response เท่านั้น
import requests
def get_accurate_cost(api_response: dict, model: str) -> dict:
"""
ดึงข้อมูล token และค่าใช้จ่ายจาก API response
อย่า�าถูกต้อง - ใช้ค่าที่ API ส่งมาเท่า
แหล่งข้อมูลที่เกี่ยวข้อง
บทความที่เกี่ยวข้อง