เรียก Claude API ครั้งแรก — คีย์ ค่าใช้จ่าย และพารามิเตอร์ที่ต้องรู้

⏱ 25 นาทีลองในClaude ↗

⚠️ บทนี้มีข้อมูลที่เปลี่ยนบ่อย (ฟีเจอร์ ราคา ชื่อเมนู) ตรวจกับเว็บทางการก่อนนำไปใช้

เป้าหมาย

เรียก Claude จากโค้ด Python/curl ได้ เก็บ API key ปลอดภัย อ่าน stop_reason และ usage เป็น และประเมินค่าใช้จ่ายก่อนรันจริง

API key = รหัสบัตรเครดิต

  • สร้างคีย์ที่ Claude Console (platform.claude.com) → API keys
  • ค่า API แยกจากแพ็กเกจ claude.ai — จ่าย Pro/Max แล้วไม่ได้เครดิต API ต้องเติมเงิน/ผูกบัตรใน Console แยก ตั้งวงเงินสูงสุด (spend limit) ไว้ด้วย
  • เก็บคีย์ใน environment variable ANTHROPIC_API_KEY เท่านั้น — SDK อ่านเองอัตโนมัติ
  • ห้าม ใส่คีย์ในโค้ด แชต prompt หรือ commit ขึ้น git ใส่ .env ใน .gitignore ตั้งแต่วันแรก ถ้าหลุด → ลบคีย์ (revoke) ใน Console ทันทีแล้วสร้างใหม่

โครงคำขอ (Messages API)

ส่วน ใช้ทำอะไร
model รุ่นที่ใช้
system บทบาท/กติกาที่ใช้ทั้งบทสนทนา (เหมือนคำสั่ง Project ระดับ 4)
messages ประวัติแชต user / assistant สลับกัน ข้อความแรกต้องเป็น user
max_tokens เพดานความยาวคำตอบ ถ้าชน → stop_reason = "max_tokens" (คำตอบขาดกลาง)

API ไม่มีความจำ (stateless) — อยากคุยต่อ ต้องส่งประวัติทั้งหมดไปใหม่ทุกครั้ง และจ่ายค่า input ของประวัติทุกครั้งด้วย

stop_reason ต้องเช็กก่อนอ่านคำตอบ: end_turn (จบปกติ) · max_tokens (ถูกตัด) · tool_use (ขอเรียกเครื่องมือ บท 02) · pause_turn · refusal · stop_sequence

รุ่นและราคา

ตระกูล model ID ราคา input/output ต่อ 1M token เหมาะกับ
Fable claude-fable-5-1 $10 / $50 งานยากที่สุด
Opus claude-opus-5-5 $4 / $20 ตัวหลัก งานคิดซับซ้อน โค้ด
Sonnet claude-sonnet-5-5 $2 / $10 เร็ว สมดุล
Haiku claude-haiku-4-5 $1 / $5 งานง่ายปริมาณมาก

⚠️ ต้องตรวจสอบ: ชื่อรุ่น ราคา (ข้อมูล ก.ย. 2026) อัตราแคช ความยาวขั้นต่ำที่แคชได้ และส่วนลด batch — ดูรุ่นล่าสุดด้วย client.models.list() และหน้า pricing

ไม่มี temperature แล้ว — ใช้ effort แทน

บทเรียนเก่าๆ สอนปรับ temperature — รุ่นปัจจุบัน (Opus 5.5, Sonnet 5, Fable ฯลฯ) ตัดพารามิเตอร์ temperature / top_p / top_k ออก ส่งไปจะได้ HTTP 400 (มีแค่รุ่นเก่าอย่าง Haiku 4.5 ที่ยังรับ)

  • คุมความลึก/ความเร็ว/ค่าใช้จ่ายด้วย output_config={"effort": "low" | "medium" | "high" | "xhigh" | "max"}
  • คุมความ "สร้างสรรค์ vs คงที่" ด้วย prompt เช่น "ตอบตามข้อมูลที่ให้เท่านั้น" หรือ "เสนอ 5 แบบที่ต่างกันชัดเจน"
  • อย่า prefill (ปิดท้าย messages ด้วยข้อความ assistant เพื่อบังคับรูปแบบ) — รุ่นใหม่ตอบ 400 ใช้ structured outputs (บท 02) แทน

ประหยัดเงิน 3 ทาง

  • Streaming — client.messages.stream(...) ได้ข้อความทยอยมา ผู้ใช้ไม่ต้องรอ (ราคาเท่าเดิม แต่ควรใช้เมื่อคำตอบยาว)
  • Prompt caching — ใส่ cache_control={"type": "ephemeral"} ใน messages.create ส่วนต้นที่ซ้ำทุกครั้ง (system ยาว, คู่มือ — วางไว้ก่อนเสมอ) ถูกแคช 5 นาที อ่านจากแคช ≈ 0.1 เท่าของราคา input เขียนแคช ≈ 1.25 เท่า ดูผลที่ usage.cache_read_input_tokens ตัวอย่าง: คู่มือ 50,000 token ถาม 10 ครั้งด้วย Opus ($4/1M) → ไม่แคช 10 × $0.20 = $2.00 · แคช $0.25 + 9 × $0.02 = $0.43
  • Batches — งานที่รอได้ (เช่น จัดหมวดอีเมล 5,000 ฉบับข้ามคืน) ส่งผ่าน client.messages.batches.create(requests=[{"custom_id": ..., "params": {...}}]) ลด 50% ได้ผลภายใน 24 ชม.

ลองเลย 🧪

ทดลอง A — เตรียมเครื่อง (ใส่คีย์แบบไม่ค้างใน history)

python3 -m venv .venv && source .venv/bin/activate
pip install anthropic
read -s ANTHROPIC_API_KEY && export ANTHROPIC_API_KEY
printf ".env\n.venv/\n" >> .gitignore

→ คำสั่ง read -s รอให้วางคีย์โดยไม่แสดงบนจอ (กด Enter หลังวาง)

ทดลอง B — เรียกครั้งแรก + log ค่าใช้จ่าย (บันทึกเป็น first_call.py แล้ว python first_call.py)

import anthropic

PRICE_IN, PRICE_OUT = 4.00, 20.00  # USD ต่อ 1M token ของ claude-opus-5-5 (ตรวจราคาล่าสุด)
client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=1024,
    system="คุณเป็นผู้ช่วยตอบลูกค้าร้านกาแฟ ตอบภาษาไทย ไม่เกิน 3 บรรทัด",
    messages=[{"role": "user", "content": "ร้านเปิดกี่โมง มีที่จอดรถไหม"}],
    output_config={"effort": "low"},
)
print("stop_reason:", response.stop_reason)
for block in response.content:
    if block.type == "text":
        print(block.text)

u = response.usage
cost = u.input_tokens / 1e6 * PRICE_IN + u.output_tokens / 1e6 * PRICE_OUT
print(f"input={u.input_tokens} output={u.output_tokens} ≈ ${cost:.5f}")

→ AI ไม่รู้เวลาเปิดร้านจริง สังเกตว่ามันเดาหรือบอกว่าไม่รู้ แล้วลองเติมข้อมูลร้านใน system

ทดลอง C — curl (ดู JSON ดิบ)

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-opus-5-5","max_tokens":1024,"messages":[{"role":"user","content":"สวัสดี แนะนำตัวสั้นๆ"}]}'

→ หา stop_reason และ usage ใน JSON ที่ได้

ทดลอง D — คุยต่อ (ต้องส่งประวัติเอง) + ลองส่ง temperature

import anthropic

client = anthropic.Anthropic()
history = [{"role": "user", "content": "ฉันชื่อมะลิ ทำงานฝ่ายบัญชี"}]
r1 = client.messages.create(model="claude-opus-5-5", max_tokens=512, messages=history)
history.append({"role": "assistant", "content": r1.content})
history.append({"role": "user", "content": "ฉันชื่ออะไร ทำงานฝ่ายไหน"})
r2 = client.messages.create(model="claude-opus-5-5", max_tokens=512, messages=history)
print(r2.content[0].text if r2.content[0].type == "text" else r2.content)
print("input tokens รอบสอง:", r2.usage.input_tokens)

try:
    client.messages.create(model="claude-opus-5-5", max_tokens=100, temperature=0.2,
                           messages=[{"role": "user", "content": "ทดสอบ"}])
except anthropic.BadRequestError as e:
    print("ส่ง temperature แล้วได้ 400:", e.message)

→ รอบสองใช้ input token มากขึ้นเพราะส่งประวัติซ้ำ และ temperature ถูกปฏิเสธจริง

สรุปจำง่าย

คีย์อยู่ใน env ไม่อยู่ใน git — API ไม่จำอะไร ต้องส่งประวัติเอง เช็ก stop_reason ทุกครั้ง และคุมงานด้วย effort + prompt ไม่ใช่ temperature