Bulan pertama saya menjalankan AI Gymbro dengan Claude API di produksi menghabiskan lebih dari uang sewa bulanan saya. Saya melakukan kesalahan klasik pemula — mengirim seluruh riwayat percakapan setiap permintaan, menggunakan model paling canggih untuk setiap tugas, tanpa caching sama sekali. Setelah dua bulan optimasi, saya memangkas tagihan sebesar 60% sambil sebenarnya meningkatkan kualitas respons. Inilah yang saya lakukan, dengan jumlah token dan perbandingan biaya nyata.
Claude 3.5 Haiku berharga $0,80 per juta token input dan $4 per juta token output per awal 2025. Claude 3.5 Sonnet adalah $3/$15. Claude Opus 4 adalah $15/$75. Rasio yang penting: token output hampir selalu 3-5x lebih mahal per token dibandingkan token input. GPT-4o OpenAI adalah $2,50/$10, sementara GPT-4o-mini adalah $0,15/$0,60. Google Gemini 1.5 Flash adalah $0,075/$0,30 — model frontier termurah yang pernah saya gunakan. Rahasia kotor: sebagian besar aplikasi menghabiskan 60-80% anggaran token mereka untuk token input (system prompt, konteks, riwayat percakapan), bukan untuk output. Di sinilah optimasi memiliki leverage terbesar.
Sebelum menyentuh kode apa pun, habiskan seminggu mencatat penggunaan token per jenis permintaan. API Anthropic mengembalikan usage.input_tokens dan usage.output_tokens di setiap respons. Agregasikan ini berdasarkan endpoint, tier pengguna, dan waktu dalam sehari. Saya menemukan bahwa fitur 'chat dengan rencana latihan' saya menggunakan 4x lebih banyak token daripada fitur 'catat latihan' tetapi menghasilkan 10x lebih sedikit pendapatan per sesi.
Prompt caching Anthropic memungkinkan Anda men-cache bagian statis dari prompt — instruksi sistem, konteks RAG, contoh few-shot — dan membayar 10% dari harga token input normal untuk permintaan berikutnya yang menggunakan cache. Dengan asumsi hit rate 90%, penghematan bisa mencapai 79% dari biaya system prompt saja.
LLM API Cost Optimization Stack
┌─────────────────────────────────────────────────────┐
│ Request arrives │
└─────────────────────────┬───────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 1. Model Router │
│ Simple task? → Claude Haiku ($0.80/M) │
│ Medium task? → Claude Sonnet ($3.00/M) │
│ Complex task? → Claude Opus ($15.00/M) │
└─────────────────────────┬───────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 2. Prompt Cache Check │
│ System prompt cached? → Pay 10% of input cost │
│ Cache miss? → Pay 25% extra to cache │
└─────────────────────────┬───────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 3. History Compressor (every 5 turns) │
│ Full history → 200-token summary │
│ Saves ~45% on input tokens per session │
└─────────────────────────┬───────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ 4. Output Mode │
│ Real-time? → Sync API (full price) │
│ Async task? → Batch API (50% discount) │
└─────────────────────────────────────────────────────┘Saya mengurangi tagihan Claude API dengan menempatkan system prompt statis pertama dalam array messages dengan cache_control: { type: 'ephemeral' }, kemudian menambahkan riwayat percakapan dinamis setelahnya. TTL cache adalah 5 menit, jadi selama pengguna aktif chat (sebagian besar sesi kurang dari 5 menit), cache hit mendekati 100%.
Optimasi paling berdampak yang saya buat adalah merutekan jenis permintaan berbeda ke model berbeda. Aplikasi saya memiliki sekitar tiga tingkat kompleksitas: tugas klasifikasi sederhana, penalaran sedang, dan personalisasi kompleks. Sebelum routing: semua pergi ke Claude 3.5 Sonnet. Setelah routing: biaya rata-rata per permintaan turun dari $0,0043 menjadi $0,0018 — pengurangan 58%.
Setiap percakapan multi-giliran mengakumulasi riwayat. Strategi kompresi: setelah setiap 5 giliran, panggil model murah dengan prompt 'Rangkum fakta dan keputusan kunci dari percakapan ini dalam kurang dari 200 token.' Ini sendiri mengurangi rata-rata token input percakapan saya sebesar 45%.
// Anthropic prompt caching — TypeScript
import Anthropic from "@anthropic-ai/sdk"
const client = new Anthropic()
const SYSTEM_PROMPT = `You are a fitness AI assistant for AI Gymbro...
[... 600+ tokens of static instructions ...]`
async function chat(userId: string, history: Message[], userMessage: string) {
const response = await client.messages.create({
model: "claude-3-5-haiku-20241022",
max_tokens: 1024,
system: [
{
type: "text",
text: SYSTEM_PROMPT,
cache_control: { type: "ephemeral" }, // Cache this!
},
],
messages: [
...history, // dynamic — not cached
{ role: "user", content: userMessage },
],
})
return response.content[0].text
}
// Model routing by complexity
function selectModel(taskType: "classify" | "plan" | "analyze") {
const models = {
classify: "claude-3-5-haiku-20241022", // $0.80/M
plan: "claude-3-5-sonnet-20241022", // $3.00/M
analyze: "claude-opus-4-5", // $15.00/M
}
return models[taskType]
}Tidak setiap panggilan LLM perlu terjadi secara real time. Dengan memindahkan pembuatan ringkasan mingguan ke pekerjaan batch async, saya bisa menggunakan Batch API Anthropic dengan pengurangan biaya 50%. Ini saja menghemat 15% dari biaya API bulanan.
Merutekan kueri sederhana ke model murah kedengarannya jelas, tetapi definisi 'sederhana' itu bergeser. Saya beralih semua pencatatan latihan ke Haiku dan dalam dua minggu menyadari itu menghalu sinasi nama latihan. Selalu uji A/B metrik kualitas (bukan hanya biaya) saat merutekan ke model yang lebih murah.
Memaksa output terstruktur via JSON mode atau tool use menghilangkan pembungkus percakapan. Untuk output terstruktur saya, ini mengurangi token output sebesar 30-40% per permintaan.
Stack lengkap yang saya jalankan sekarang: prompt caching pada semua system prompt statis (hemat 60-70% pada token input untuk bagian yang di-cache), model routing berdasarkan kompleksitas tugas (hemat 40-50% pada biaya model), kompresi percakapan setelah 5 giliran (hemat 40% pada token riwayat), pemrosesan batch untuk tugas async (hemat 50% pada panggilan yang memenuhi syarat batch), dan output terstruktur di mana berlaku (hemat 30% pada token output). Efek gabungan: pengurangan biaya keseluruhan 60%.