Claude API vs OpenAI API: A Python Developer's Honest Comparison
Perbandingan langsung antara Claude API dan OpenAI API untuk developer Python — dari setup, streaming, hingga tool use dan pricing.
Kalau kamu developer Python yang baru mulai eksplorasi LLM API, pertanyaan pertama biasanya sama: Claude atau OpenAI? Artikel ini bukan marketing piece; ini perbandingan teknis berdasarkan penggunaan nyata.
Setup Awal
Keduanya straightforward, tapi ada perbedaan kecil yang penting.
OpenAI:
pip install openai
from openai import OpenAI
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello"}]
)
print(response.choices[0].message.content)
Claude (Anthropic):
pip install anthropic
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-...")
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}]
)
print(response.content[0].text)
Perbedaan pertama yang langsung terasa: Claude menggunakan max_tokens sebagai required parameter. OpenAI tidak. Ini bukan bug, ini design choice; Claude lebih eksplisit soal batas output.
System Prompt
Keduanya support system prompt, tapi caranya berbeda.
OpenAI: system prompt masuk sebagai message pertama dengan role system:
messages = [
{"role": "system", "content": "Kamu adalah code reviewer senior."},
{"role": "user", "content": "Review kode ini..."}
]
Claude: ada parameter terpisah:
client.messages.create(
model="claude-opus-4-8",
max_tokens=2048,
system="Kamu adalah code reviewer senior.",
messages=[{"role": "user", "content": "Review kode ini..."}]
)
Pendekatan Claude lebih clean secara arsitektur; system prompt tidak bercampur dengan conversation history.
Streaming
Kedua API support streaming, dan pattern-nya mirip:
OpenAI:
with client.chat.completions.stream(
model="gpt-4o",
messages=[{"role": "user", "content": "Tulis essay panjang..."}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Claude:
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=4096,
messages=[{"role": "user", "content": "Tulis essay panjang..."}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Quasimirip. Tapi Claude punya stream.get_final_message() yang berguna kalau kamu perlu akses usage stats setelah streaming selesai.
Tool Use / Function Calling
Ini salah satu area di mana keduanya punya filosofi yang sedikit berbeda.
OpenAI tools:
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Ambil cuaca saat ini",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
}
}
}]
response = client.chat.completions.create(
model="gpt-4o",
tools=tools,
messages=[{"role": "user", "content": "Cuaca Jakarta?"}]
)
# Cek apakah ada tool call
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
Claude tools:
tools = [{
"name": "get_weather",
"description": "Ambil cuaca saat ini",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
}
}]
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "Cuaca Jakarta?"}]
)
# Cek tool use
for block in response.content:
if block.type == "tool_use":
print(block.name, block.input)
Claude menggunakan input_schema bukan parameters, dan response-nya berupa list of content blocks; lebih konsisten dengan arsitektur message-nya secara keseluruhan.
Context Window
Ini salah satu keunggulan terbesar Claude saat ini:
| Model | Context Window |
|---|---|
| GPT-4o | 128K tokens |
| GPT-4o mini | 128K tokens |
| Claude Opus 4.8 | 1M tokens |
| Claude Sonnet 4.6 | 1M tokens |
| Claude Haiku 4.5 | 200K tokens |
1 juta tokens itu cukup untuk membaca beberapa novel sekaligus, atau seluruh codebase medium-sized project. Ini membuka use case seperti:
- Analisis seluruh repository
- Processing dokumen panjang
- Long-running conversation dengan banyak context
Error Handling
OpenAI menggunakan exception hierarchy yang straightforward:
from openai import RateLimitError, APIError
try:
response = client.chat.completions.create(...)
except RateLimitError as e:
time.sleep(60)
retry()
except APIError as e:
print(f"Error: {e.status_code}")
Claude punya pattern serupa:
import anthropic
try:
response = client.messages.create(...)
except anthropic.RateLimitError as e:
time.sleep(60)
retry()
except anthropic.APIError as e:
print(f"Error: {e.status_code}")
Hampir identik. SDK keduanya mature dan well-designed.
Pricing (Juni 2026)
| Model | Input (per 1M tokens) | Output (per 1M tokens) |
|---|---|---|
| GPT-4o | ~$5 | ~$15 |
| GPT-4o mini | ~$0.15 | ~$0.60 |
| Claude Opus 4.8 | $5 | $25 |
| Claude Sonnet 4.6 | $3 | $15 |
| Claude Haiku 4.5 | $1 | $5 |
Untuk production workload yang budget-sensitive, GPT-4o mini dan Claude Haiku 4.5 adalah pilihan ekonomis dengan kualitas yang masih solid untuk banyak task.
Kapan Pilih Mana?
Pilih Claude kalau:
- Butuh context window sangat besar (analisis codebase, dokumen panjang)
- Nuance dalam instruction following sangat penting
- Kerjaan memerlukan reasoning yang lebih dalam
- Budget untuk tier Opus/Sonnet
Pilih OpenAI kalau:
- Ekosistem dan tooling yang lebih mature (fine-tuning, DALL-E, Whisper, dll)
- Butuh multimodal yang lebih kaya (vision + generation)
- Tim sudah familiar dengan OpenAI API
- Deployment di Azure OpenAI Service
Pakai keduanya kalau:
- Butuh redundancy dan fallback
- A/B testing model untuk use case spesifik
- Different models untuk different tasks dalam pipeline yang sama
Kesimpulan
Tidak ada yang “lebih baik” secara mutlak. Keduanya excellent API dengan SDK Python yang mature dan well-documented.
Dari pengalaman saya: Claude unggul dalam task yang butuh nuanced understanding dan long context, sementara OpenAI punya ekosistem yang lebih luas. Untuk pure coding assistant atau API integration, keduanya sangat kompetitif.
Satu tip praktis: coba keduanya untuk use case spesifik kamu dengan dataset yang sama. Hasilnya seringkali mengejutkan.
Tertarik dengan satu aspek spesifik yang ingin dibahas lebih dalam? Drop comment di bawah.
