Kalau Anda selama ini hanya menggunakan Claude lewat antarmuka chat, ada dunia lain yang belum Anda sentuh. Dengan Claude API, Anda tidak lagi sekadar menggunakan Claude — Anda membangunnya menjadi bagian dari sistem, produk, atau layanan yang Anda kerjakan.
Tapi ada dua tipe developer yang mulai belajar Claude API. Yang pertama berhasil membuat beberapa request jalan, kagum dengan hasilnya, lalu berhenti di situ — menggunakan API seperti pemanggil fungsi sederhana tanpa memahami cara kerjanya. Yang kedua memahami bahwa API adalah fondasi sebuah sistem: ia tahu bagaimana token dihitung, bagaimana cache bekerja, mengapa tool use memerlukan multi-turn loop, dan bagaimana mendesain agent yang andal di production.
Panduan ini ditulis untuk membantu Anda masuk ke kelompok kedua. Dibangun dari kurikulum resmi Anthropic Academy dan diperkaya dengan contoh kode Python yang langsung bisa dipraktikkan.

Kenapa Langsung ke Native API, Bukan Framework?
Pertanyaan yang wajar muncul di awal: kenapa tidak langsung pakai LangChain atau LlamaIndex saja yang sudah populer?
Jawabannya ada di kontrol dan akses fitur. Dengan native Claude API, Anda punya akses penuh ke semua fitur terbaru — PDF processing, citations, extended thinking, dan prompt caching — tanpa harus menunggu framework wrapper memperbarui dukungannya, yang sering tertinggal berbulan-bulan. Latency juga lebih rendah karena tidak ada middleware di antara kode Anda dan API.
Yang lebih penting: memahami native API membuat Anda lebih baik dalam menggunakan framework manapun. Ketika sesuatu tidak berjalan di LangChain, Anda tahu persis apa yang terjadi di bawahnya.
Setup Pertama: Dari Instalasi hingga Request Pertama
Prasyarat yang Anda butuhkan sebelum mulai: Python 3.9 ke atas, pemahaman dasar Python (fungsi, dictionary, list), familiar dengan konsep REST API dan JSON, serta akun aktif di console.anthropic.com untuk mendapatkan API key.
Instalasi SDK-nya satu baris:
pip install anthropic
Untuk API key, jangan pernah hardcode langsung di kode Anda. Simpan sebagai environment variable:
# macOS/Linux
export ANTHROPIC_API_KEY='sk-ant-api03-xxxxx'
# Windows PowerShell
$env:ANTHROPIC_API_KEY='sk-ant-api03-xxxxx'
Lalu verifikasi setup dengan request pertama:
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=256,
messages=[
{"role": "user", "content": "Apa model AI terbaru dari Anthropic?"}
]
)
print(message.content[0].text) # Teks respons
print(message.stop_reason) # 'end_turn', 'max_tokens', atau 'tool_use'
print(message.usage.input_tokens) # Token yang dikonsumsi
Memilih Model yang Tepat: Keputusan Arsitektural dengan Dampak Biaya Besar
Ini bukan sekadar pilihan teknis — ini adalah keputusan arsitektural dengan implikasi biaya yang sangat signifikan di skala production.
Claude Haiku adalah model tercepat dan termurah, cocok untuk klasifikasi, routing, ekstraksi data, dan task sederhana dengan volume tinggi. Biayanya $0.80 per juta token input dan $4 per juta token output.
Claude Sonnet adalah model yang paling seimbang antara kemampuan dan biaya — ini yang paling banyak digunakan untuk aplikasi production seperti RAG, coding assistant, analisis dokumen, dan chatbot. Biayanya $3 per juta token input dan $15 per juta token output.
Claude Opus adalah model paling capable, cocok untuk reasoning kompleks, agentic multi-step, dan research yang butuh pemikiran sangat mendalam. Biayanya $15 per juta token input dan $75 per juta token output.
Aturan praktis yang terbukti efektif: gunakan Sonnet untuk 80% kebutuhan production. Downgrade ke Haiku untuk preprocessing dan routing dengan volume tinggi. Upgrade ke Opus hanya ketika Sonnet benar-benar tidak cukup — perbedaan biaya 5x sangat terasa di skala besar.
Parameter Penting yang Harus Anda Pahami
max_tokens: Batas Output yang Harus Selalu Di-set
max_tokens adalah batas keras jumlah token output. Kalau model mencapai batas ini, respons akan terpotong dengan stop_reason='max_tokens'. Selalu set nilai yang masuk akal:
# Panduan per use case:
# Klasifikasi/labeling: 20-50
# Q&A singkat: 256-512
# Dokumen/laporan: 2048-4096
# Kode kompleks: 4096-8192
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=512,
messages=[...]
)
if response.stop_reason == "max_tokens":
print("PERINGATAN: Respons mungkin terpotong!")
temperature: Mengontrol Kreativitas vs Konsistensi
Temperature 0 menghasilkan output deterministik — selalu konsisten, cocok untuk klasifikasi, ekstraksi data, dan code generation. Temperature 0.7 (default) cocok untuk chatbot dan content generation. Temperature 0.9-1.0 untuk creative writing dan brainstorming yang butuh variasi tinggi.
# Klasifikasi: selalu pakai temperature=0
def classify_sentiment(text):
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=10,
temperature=0,
messages=[{
"role": "user",
"content": f"Klasifikasikan sentimen. Jawab HANYA: POSITIF, NEGATIF, atau NETRAL.\nTeks: {text}"
}]
)
return response.content[0].text.strip()
System Prompts: Investasi Terpenting dalam Aplikasi AI
System prompt adalah instruksi yang mendefinisikan identitas, kemampuan, dan batasan Claude untuk seluruh sesi. System prompt yang buruk menghasilkan output yang tidak konsisten dan tidak dapat diprediksi.
Formula yang terbukti efektif terdiri dari empat komponen: pertama, IDENTITAS — siapa Claude dalam konteks aplikasi ini. Kedua, KEMAMPUAN — apa yang bisa dan harus dilakukan. Ketiga, PANDUAN RESPONS — format output, bahasa, panjang, dan tone yang diharapkan. Keempat, BATASAN — apa yang tidak boleh dilakukan.
SYSTEM_PROMPT = '''
# IDENTITAS
Anda adalah Asistan Analitik untuk tim riset pasar PT. Nusantara Data.
# KEMAMPUAN
- Menganalisis data kuantitatif dan kualitatif dari riset pasar
- Menghasilkan insight bisnis berdasarkan data yang diberikan
- Menyusun laporan eksekutif yang jelas dan actionable
# PANDUAN RESPONS
- Bahasa: Indonesia profesional
- Format laporan: selalu mulai dengan Executive Summary
- Data tanpa sumber: tandai dengan [PERLU VERIFIKASI]
# BATASAN
- TIDAK memberikan rekomendasi investasi spesifik
- TIDAK membuat prediksi tanpa dukungan data
'''
Prompt Engineering di Level API: Engineering, Bukan Art
Di antarmuka chat, prompt yang kurang presisi masih bisa diklarifikasi secara interaktif. Di API, setiap request berbiaya dan setiap output yang tidak tepat menjadi bug di aplikasi Anda. Prompt engineering di level API harus terukur, dapat direproduksi, dan dioptimalkan secara sistematis.
XML Tags untuk Prompt Kompleks
XML tags adalah cara paling efektif untuk memisahkan bagian-bagian prompt yang berbeda — instruksi, data input, contoh, dan format output. Claude dilatih secara khusus untuk memahami struktur ini:
def analyze_contract(contract_text, focus_areas):
areas_formatted = '\n'.join(f'- {a}' for a in focus_areas)
prompt = f'''
<task>
Analisis kontrak hukum berikut dan identifikasi risiko.
Berikan analisis yang spesifik dan dapat ditindaklanjuti.
</task>
<focus_areas>
{areas_formatted}
</focus_areas>
<contract>
{contract_text}
</contract>
<output_format>
Untuk setiap area fokus, berikan:
1. TEMUAN: [apa yang ditemukan di kontrak]
2. RISIKO: [level risiko: TINGGI/SEDANG/RENDAH dan alasannya]
3. REKOMENDASI: [tindakan konkret yang disarankan]
</output_format>
'''
return client.messages.create(
model="claude-sonnet-4-6",
max_tokens=3000,
system='Anda adalah analis kontrak hukum senior.',
messages=[{'role': 'user', 'content': prompt}]
).content[0].text
Few-Shot Examples: Kualitas Lebih Penting dari Kuantitas
Tiga sampai lima contoh yang sempurna mengalahkan sepuluh contoh yang mediocre. Gunakan XML tags untuk memisahkan contoh-contoh tersebut:
prompt = '''
Klasifikasikan tiket customer support.
<examples>
<example>
Input: "Pesanan saya belum tiba setelah 10 hari"
Output: {"category": "pengiriman", "priority": "KRITIS"}
</example>
<example>
Input: "Apakah bisa bayar dengan cicilan?"
Output: {"category": "pembayaran", "priority": "RENDAH"}
</example>
</examples>
Sekarang klasifikasikan:
<ticket>{ticket}</ticket>
Respons hanya dengan JSON.
'''
Chain-of-Thought untuk Reasoning Kompleks
Meminta Claude berpikir langkah demi langkah sebelum menjawab secara konsisten meningkatkan akurasi untuk masalah multi-step. Ini terbukti secara empiris, bukan hanya intuitif:
prompt = f'''
Evaluasi kelayakan skenario bisnis berikut.
<scenario>{scenario}</scenario>
Sebelum memberikan evaluasi akhir, lakukan analisis langkah demi langkah:
<thinking>
Langkah 1 — ANALISIS PASAR: [evaluasi ukuran pasar dan kompetisi]
Langkah 2 — ANALISIS FINANSIAL: [hitung estimasi pendapatan dan break-even]
Langkah 3 — ANALISIS RISIKO: [identifikasi risiko utama]
Langkah 4 — ANALISIS EKSEKUSI: [evaluasi kemampuan tim dan resource]
</thinking>
Setelah analisis di atas, berikan:
KEPUTUSAN: GO / NO-GO / CONDITIONAL
KEYAKINAN: [persentase]
ALASAN UTAMA: [3 poin terpenting]
'''
Tool Use: Dari Model Bahasa ke Agen yang Benar-benar Bertindak
Tanpa tool use, Claude hanya bisa menjawab berdasarkan pengetahuan training-nya. Dengan tool use, Claude bisa memanggil API eksternal, membaca database, mencari web real-time, dan berinteraksi dengan sistem nyata.
Cara kerjanya penting dipahami: Anda mendefinisikan tools dengan JSON schema. Claude menganalisis permintaan dan memutuskan tool yang dibutuhkan. Tapi Claude tidak mengeksekusi tool — ia mengembalikan tool_use block dengan argumen. Anda yang mengeksekusi toolnya dan mengirim hasilnya kembali. Claude kemudian menggunakan hasil itu untuk menghasilkan respons final. Loop ini terus berulang sampai stop_reason='end_turn'.
tools = [
{
"name": "get_customer_info",
"description": """Ambil informasi pelanggan berdasarkan ID atau email.
Gunakan tool ini ketika pengguna bertanya tentang:
- Detail akun pelanggan tertentu
- Riwayat pesanan pelanggan
- Status keanggotaan atau loyalty points
JANGAN gunakan untuk mencari produk atau cek inventory.""",
"input_schema": {
"type": "object",
"properties": {
"identifier": {
"type": "string",
"description": "ID pelanggan (format: CUST-XXXXXX) atau email"
},
"include_orders": {
"type": "boolean",
"description": "Sertakan riwayat pesanan? Default: false"
}
},
"required": ["identifier"]
}
}
]
Kualitas description jauh lebih penting dari kompleksitas schema — Claude memilih tool berdasarkan description, bukan nama. Selalu sertakan: apa yang dilakukan tool, kapan harus digunakan, kapan tidak harus digunakan, dan format identifier yang diperlukan.
Implementasi Agentic Loop Lengkap
def agent_with_tools(user_query, verbose=False):
messages = [{'role': 'user', 'content': user_query}]
max_iterations = 10 # Safeguard penting
for iteration in range(max_iterations):
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
tools=tools,
system='Anda adalah asisten customer service.',
messages=messages
)
# Claude selesai — tidak ada tool call lagi
if response.stop_reason == 'end_turn':
for block in response.content:
if hasattr(block, 'text'):
return block.text
# Claude ingin panggil tool — proses dan kirim balik
elif response.stop_reason == 'tool_use':
messages.append({'role': 'assistant', 'content': response.content})
tool_results = []
for block in response.content:
if block.type == 'tool_use':
result = execute_tool(block.name, block.input)
tool_results.append({
'type': 'tool_result',
'tool_use_id': block.id,
'content': result
})
messages.append({'role': 'user', 'content': tool_results})
return 'Max iterations reached.'
Claude juga bisa memanggil beberapa tool secara paralel ketika tools tersebut bersifat independen — ini menghemat latency secara signifikan untuk query yang membutuhkan beberapa sumber data berbeda.
RAG: Cara Membangun Sistem Retrieval yang Cerdas
Model AI memiliki knowledge cutoff — informasi setelah tanggal training tidak tersedia. RAG (Retrieval-Augmented Generation) memecahkan ini dengan mengambil dokumen relevan dari knowledge base Anda dan menyertakannya sebagai konteks sebelum Claude menjawab.
Arsitektur RAG terdiri dari tiga fase. Pertama, Indexing: pecah dokumen menjadi chunks, buat embeddings untuk setiap chunk, simpan ke vector database. Kedua, Retrieval: ambil query pengguna, buat query embedding, cari chunks yang paling mirip secara semantik. Ketiga, Generation: kirim chunks relevan plus query ke Claude, biarkan Claude menjawab berdasarkan konteks yang disediakan.
Strategi chunking yang tepat sangat mempengaruhi kualitas retrieval. Untuk artikel dan konten homogen, fixed-size chunking dengan overlap sekitar 64 token bekerja dengan baik. Untuk dokumen terstruktur seperti panduan teknis atau SOP, chunking berbasis section atau heading jauh lebih efektif.
Error Handling: Pattern yang Wajib Ada di Production
Ini yang paling sering dilupakan developer saat pertama kali membangun dengan Claude API, dan paling mahal konsekuensinya ketika sistem sudah berjalan di production.
import time
from anthropic import Anthropic, RateLimitError, APIStatusError, APIConnectionError
def robust_call(messages, model='claude-sonnet-4-6', max_tokens=1024, max_retries=3):
client = Anthropic()
for attempt in range(max_retries):
try:
response = client.messages.create(
model=model,
max_tokens=max_tokens,
messages=messages
)
return response.content[0].text
except RateLimitError:
if attempt == max_retries - 1:
raise
wait = 2 ** attempt + 1 # 2, 5, 17 detik
print(f'Rate limited. Menunggu {wait}s...')
time.sleep(wait)
except APIStatusError as e:
if e.status_code >= 500: # Server errors — boleh retry
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt)
else: # Client errors 4xx — JANGAN retry
raise
except APIConnectionError:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt)
Aturan yang wajib diingat: retry untuk rate limit (429) dan server errors (5xx) dengan exponential backoff. Jangan pernah retry untuk client errors (4xx) — itu berarti ada masalah di request Anda, bukan di server.
Multi-Turn Conversations: Mempertahankan Konteks Percakapan
Satu hal yang paling sering salah dipahami developer baru: Claude API bersifat stateless. Setiap request adalah independen. Untuk percakapan multi-turn, Anda harus secara eksplisit mengirimkan seluruh riwayat percakapan di setiap request.
class ConversationManager:
def __init__(self, system_prompt, model='claude-sonnet-4-6'):
self.client = anthropic.Anthropic()
self.system_prompt = system_prompt
self.model = model
self.history = []
def chat(self, user_message):
self.history.append({"role": "user", "content": user_message})
response = self.client.messages.create(
model=self.model,
max_tokens=1024,
system=self.system_prompt,
messages=self.history # Kirim seluruh history
)
assistant_reply = response.content[0].text
self.history.append({"role": "assistant", "content": assistant_reply})
return assistant_reply
Untuk sesi yang sangat panjang, implementasikan strategi manajemen context window: sliding window (hapus pesan tertua), summarization (minta Claude ringkas percakapan lama), atau selective retention (simpan hanya keputusan dan fakta penting).
Streaming: Respons yang Terasa Lebih Responsif
Untuk output yang panjang, streaming menampilkan token saat dihasilkan sehingga pengguna tidak perlu menunggu keseluruhan respons selesai:
def stream_response(prompt):
full_text = []
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": prompt}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
full_text.append(text)
return ''.join(full_text)
Untuk aplikasi berbasis FastAPI atau framework async lainnya, gunakan AsyncAnthropic dan async for untuk streaming yang non-blocking.
Structured Output: Data JSON yang Dapat Diandalkan
Untuk pipeline yang membutuhkan data terstruktur, kombinasi instruksi eksplisit di prompt dan validasi dengan Pydantic adalah praktik terbaik:
from pydantic import BaseModel
from typing import List, Optional
import json
class JobApplication(BaseModel):
applicant_name: str
years_experience: int
skills: List[str]
salary_expectation: Optional[int] = None
recommendation: str # 'RECOMMEND', 'REJECT', 'REVIEW'
reasoning: str
def screen_resume(resume_text):
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=512,
temperature=0,
system='Selalu respons dengan valid JSON sesuai schema yang diminta. Jangan sertakan teks apapun di luar JSON.',
messages=[{
"role": "user",
"content": f"Analisis resume ini dan respons dengan JSON:\n{resume_text}"
}]
)
data = json.loads(response.content[0].text)
return JobApplication(**data)
Prompt Evaluation: Ukur Kualitas Sebelum Deploy
Engineering tanpa pengukuran adalah tebakan. Sebelum deploy prompt ke production, bangun eval pipeline sederhana:
from dataclasses import dataclass
from typing import List, Callable
@dataclass
class EvalCase:
input: str
expected: str
def run_eval(prompt_template, test_cases, grader):
results = []
for case in test_cases:
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=256,
temperature=0,
messages=[{
'role': 'user',
'content': prompt_template.format(input=case.input)
}]
)
actual = response.content[0].text.strip()
passed = grader(actual, case.expected)
results.append({'input': case.input, 'expected': case.expected,
'actual': actual, 'passed': passed})
accuracy = sum(1 for r in results if r['passed']) / len(results)
print(f"Akurasi: {accuracy:.1%}")
return results
# Contoh penggunaan:
test_cases = [
EvalCase('Produk sangat memuaskan!', 'POSITIF'),
EvalCase('Pengiriman lambat dan rusak', 'NEGATIF'),
EvalCase('Harga standar, sesuai ekspektasi', 'NETRAL'),
]
exact_grader = lambda actual, expected: actual.strip() == expected.strip()
run_eval(sentiment_template, test_cases, exact_grader)
Pertanyaan yang Sering Ditanyakan
Apakah Claude API gratis untuk developer Indonesia? Claude API tidak gratis — Anda membayar per token yang digunakan. Tapi Anthropic menyediakan free credits untuk developer baru saat pertama kali mendaftar di console.anthropic.com. Biaya sangat tergantung model dan volume: Haiku adalah yang termurah ($0.80 per juta token input), Sonnet di tengah ($3), dan Opus yang paling mahal ($15).
Apa bedanya Claude API dengan menggunakan Claude.ai langsung? Claude.ai adalah antarmuka untuk pengguna akhir — Anda yang menggunakannya secara interaktif. Claude API adalah untuk developer yang ingin mengintegrasikan kemampuan Claude ke dalam aplikasi, sistem, atau produk yang mereka bangun. Dengan API, Anda bisa otomasi, integrasikan ke pipeline, dan bangun produk di atas Claude.
Bahasa pemrograman apa saja yang didukung Claude API? Anthropic menyediakan SDK resmi untuk Python dan TypeScript/JavaScript. Untuk bahasa lain seperti Java, Go, atau Ruby, Anda bisa menggunakan REST API langsung karena Claude API adalah HTTP API standar yang bisa dipanggil dari bahasa apapun.
Bagaimana cara memulai belajar Claude API untuk pemula yang belum pernah pakai API? Mulai dari tiga langkah: pertama, buat akun di console.anthropic.com dan dapatkan API key. Kedua, install SDK Python dengan pip install anthropic. Ketiga, coba contoh pertama di artikel ini — buat satu request sederhana dan pahami struktur responsnya sebelum lanjut ke fitur yang lebih kompleks.
Apakah perlu server khusus untuk menjalankan Claude API? Tidak. Claude API berjalan di server Anthropic — Anda hanya perlu koneksi internet dan API key. Kode Python Anda bisa berjalan di laptop lokal, VPS, cloud server, atau serverless function. Tidak ada GPU atau infrastruktur khusus yang dibutuhkan.
Bagaimana cara menghemat biaya Claude API di production? Tiga strategi utama: gunakan model yang tepat untuk setiap task (Haiku untuk task sederhana, bukan Sonnet), implementasikan prompt caching untuk prompt yang sering diulang, dan pantau penggunaan token secara aktif lewat message.usage. Jangan pernah set max_tokens lebih tinggi dari yang benar-benar dibutuhkan.
Lanjutkan Perjalanan Belajar Claude Anda
Artikel ini adalah bagian dari seri Belajar Claude Gratis — panduan berbahasa Indonesia yang membahas ekosistem Claude untuk berbagai profil pembaca.
Kembali ke peta besar: Belajar Claude Gratis: Panduan Lengkap dari Nol hingga Mahir
Artikel cluster lainnya:
-
- Claude Code 01: Panduan Lengkap untuk Developer Indonesia
- Claude Code 02: Panduan Pemula untuk Semua Profesi
- Claude 03 Cowork: Panduan Lengkap Otomasi Pekerjaan untuk Profesional
- Claude 04-AI Fluency: Cara Menggunakan Claude AI dengan Benar, Efektif, dan Etis
- Claude 05 API: Panduan Lengkap Membangun Aplikasi AI dengan Python untuk Developer
- Claude 06, Mengenal Model Context Protocol (MCP): Cara Menghubungkan Claude ke Tools dan Data Eksternal
- Claude 7, AI Fluency untuk Pendidik: Panduan Lengkap Menggunakan Claude AI dalam Pengajaran dan Kurikulum
- Claude 08, AI Fluency untuk Mahasiswa: Panduan Lengkap Claude untuk Belajar, Menulis, dan Persiapan Karier
- Claude 09, MCP Advanced Topics: Panduan Teknis Sampling, Notifications, Roots, dan Transport untuk Developer
- Claude 10 Amazon Bedrock: Panduan Lengkap dari Setup hingga Production AI System
- Claude 11 dengan Google Cloud Vertex AI: Panduan Lengkap untuk Developer Indonesia
- Claude 12 Teaching AI Fluency: Panduan Lengkap Mengajarkan dan Menilai Kemampuan AI di Kelas
- Caude 13, AI Fluency untuk Organisasi Nonprofit: Panduan Praktis Menggunakan Claude AI untuk Dampak Misi yang Lebih Besa
- Claude 14 Agent Skills: Panduan Lengkap Membangun dan Mendistribusikan Skills Reusable
- Claude 15, Subagents Claude Code: Panduan Lengkap Mendelegasikan Task dan Mengelola Context Window
- Claude 16, AI Capabilities & Limitations: Model Mental Lengkap untuk Berkolaborasi dengan Claude Secara Cerdas
- Claude 17 Code: Panduan Lengkap Developer Indonesia — Dari Instalasi hingga CI/CD Otomatis
- Claude 18, Belajar Claude API: Panduan Lengkap Membangun Aplikasi AI dengan Python, Dari Hello World hingga Productio
- Claude 19: Cara Pakai Claude dari Nol untuk Semua Profesi — Panduan AI Fluency Lengkap
- Claude 20 untuk Pekerjaan dan Tim: Panduan Lengkap Implementasi Claude di Organisasi Anda
