SSD Nodes Learn
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24

สอนใช้ Claude API สร้างแอปบน VPS Ubuntu

วิธีใช้ Claude API สร้างเครื่องมือวิเคราะห์ Log บน Ubuntu 24.04 ด้วย Python ครอบคลุมการทำ streaming การจัดการ error และการควบคุมค่าใช้จ่ายผ่าน token

สิ่งที่คุณกำลังสร้าง

เครื่องมือ Command-line บน Ubuntu 24.04 VPS ตัวใหม่ โดยคุณสามารถส่ง Error message หรือ Log เข้าไป เพื่อรับผลการวิเคราะห์เป็นภาษาอังกฤษที่เข้าใจง่าย: journalctl -u nginx -n 50 | explain โปรเจกต์นี้ใช้ Python ประมาณ 60 บรรทัด และครอบคลุมทุกสิ่งที่แอปพลิเคชัน Claude API จำเป็นต้องใช้ ทั้งการจัดเก็บ API key อย่างถูกต้อง, การใช้ virtualenv, โครงสร้างข้อมูล response ของ SDK, การทำ streaming, การจัดการ typed exception chain และการสร้าง systemd unit เพื่อให้โปรแกรมทำงานได้โดยอัตโนมัติ

ผมเลือกโปรเจกต์นี้อย่างตั้งใจ เนื่องจากบทเรียน "แอปพลิเคชัน API แรก" ส่วนใหญ่มักให้คุณสร้าง Chatbot ซึ่งคุณจะไม่ได้เปิดใช้งานอีกเลย แต่เครื่องมือวิเคราะห์ Log จะมีประโยชน์บน Server ตั้งแต่วันแรก และจะช่วยฝึกฝนทักษะสองด้านที่มือใหม่มักทำผิดพลาด คือ การอ่าน response object อย่างถูกต้อง และการควบคุมค่าใช้จ่าย เนื่องจาก API คิดค่าบริการตามจำนวน token และไม่มีเพดานค่าใช้จ่ายยกเว้นคุณจะกำหนดไว้เอง ดังนั้นการควบคุมต้นทุนจึงเป็นส่วนหนึ่งของการออกแบบ ไม่ใช่สิ่งที่มาคิดทีหลัง เช่นเดียวกับวินัยที่จำเป็นเมื่อคุณขยับไปใช้ running Claude Code on this same VPS in tmux

รับ API key จาก Console

การจัดการสิทธิ์เข้าถึง API ทำได้ผ่าน Anthropic Console ที่ platform.claude.com — ให้ลงทะเบียนเข้าใช้งาน จากนั้นสร้าง key ภายใต้ Settings → API Keys (ลิงก์ในเอกสารจะนำไปที่ platform.claude.com/settings/keys โดยตรง) ระบบจะแสดง key เพียงครั้งเดียว โดยจะเริ่มต้นด้วย sk-ant- และไม่สามารถเรียกดูซ้ำได้ — โปรดคัดลอกเก็บไว้ทันที มิฉะนั้นต้องลบแล้วสร้างใหม่

เรื่องค่าใช้จ่าย: ณ เดือน July 2026 ไม่มีบริการแบบ free tier สำหรับ API อย่างต่อเนื่อง เอกสารราคาของ Anthropic ระบุว่าผู้ใช้ใหม่จะได้รับ credit ฟรีจำนวนหนึ่งเพื่อใช้ทดสอบ โดยจำนวนที่แน่นอนจะขึ้นอยู่กับสิ่งที่ Console แสดงให้คุณเห็นขณะลงทะเบียน เมื่อ credit หมดลง คุณต้องเติมเงินเข้าบัญชีเพื่อให้การส่ง request สำเร็จ การใช้งานนี้แยกส่วนจากการสมัครสมาชิก claude.ai — แผน Pro หรือ Max ไม่ได้รวม credit สำหรับ API และ API key ไม่สามารถใช้กับแอปพลิเคชัน chat ได้ หากคุณกำลังพิจารณาระหว่างการสมัครสมาชิกกับการใช้ API ข้อมูลเปรียบเทียบคือหัวข้อเฉพาะ: Claude plan ที่คุณจำเป็นต้องใช้จริงๆ

ควรสร้าง key โดยกำหนดขอบเขต (scope) ให้ใช้ได้เฉพาะหนึ่ง project หรือหนึ่ง server เท่านั้น เมื่อเกิดเหตุการณ์ key รั่วไหล — ซึ่งอาจเกิดขึ้นได้ในระยะยาว — คุณจะสามารถยกเลิกการใช้งาน key นั้นได้โดยไม่กระทบกับส่วนอื่นที่คุณมีอยู่

Keep the key out of .bashrc

การใช้เทคนิค reflexive move ใน ~/.bashrc คือ export ANTHROPIC_API_KEY=sk-ant-... ซึ่งไม่ควรทำ เนื่องจากมีปัญหาหลัก 3 ประการ:

  • ทุก process จะได้รับค่านี้ไปด้วย หากคุณ export environment variable ใน login shell ค่าดังกล่าวจะส่งต่อไปยังทุกอย่างที่คุณสั่งรัน ไม่ว่าจะเป็น web app, crash reporter ที่แนบค่า environment ลงใน bug report หรือหน้า phpinfo() ที่อาจถูกเปิดทิ้งไว้ พื้นที่การรั่วไหลของ key จะขยายครอบคลุม "ทุกอย่างที่ user นี้สั่งรัน"
  • การพิมพ์ค่าจะทำให้ข้อมูลค้างใน ~/.bash_history หากคุณรันคำสั่ง export ด้วยตนเองเพียงครั้งเดียว key จะถูกบันทึกไว้ในไฟล์รูปแบบ plaintext ตลอดไป และจะถูกสำรองข้อมูล (sync) ลงในทุก backup ของ home directory
  • ค่าจะไม่ปรากฏเมื่อ systemd ต้องการใช้งาน เนื่องจาก service ไม่ได้อ่านค่าจาก .bashrc วิธีการนี้จึงล้มเหลวเมื่อคุณนำ script ไปใช้งานในรูปแบบ unit ซึ่งมักจะส่งผลให้เกิด error 401 ในช่วงเวลา 6 a.m. โดยไม่ทราบสาเหตุ

รูปแบบที่ถูกต้องสำหรับ server คือการใช้ environment file แยกต่างหากที่มี permission เป็น 600 และโหลดโดย process ที่จำเป็นต้องใช้เท่านั้น:

sudo mkdir -p /opt/explain
sudo install -m 600 -o root -g root /dev/null /etc/claude-explain.env
printf 'ANTHROPIC_API_KEY=sk-ant-YOUR-KEY-HERE\n' | sudo tee /etc/claude-explain.env >/dev/null

หากต้องการป้องกันไม่ให้ key หลุดเข้าไปใน editor swap files ควรใช้ tee จาก printf แทนการใช้ editor อย่างไรก็ตาม ควรตรวจสอบด้วย ls -l /etc/claude-explain.env ว่าไฟล์อ่านค่าจาก -rw------- และมี root เป็นเจ้าของ สำหรับ interactive shells ให้ใช้ wrapper (ตามด้านล่าง) เพื่อส่งค่า key ในแต่ละครั้งที่เรียกใช้งาน และสำหรับ systemd ให้ใช้ EnvironmentFile= เนื่องจาก root จะอ่านไฟล์ก่อนที่จะลดสิทธิ์ (drop privileges) ทำให้ user ของ service ไม่จำเป็นต้องมีสิทธิ์อ่านไฟล์นั้น Key จะไม่ปรากฏใน code, ใน git, ใน output ของ ps หรือใน shell history

ติดตั้ง SDK ใน venv

Ubuntu 24.04 มาพร้อมกับ Python 3.12 ที่มีการบังคับใช้ PEP 668 ดังนั้นการใช้ pip install anthropic กับ system interpreter โดยตรงจะเกิดข้อผิดพลาด error: externally-managed-environment ข้อผิดพลาดนี้เป็นผลจากการทำงานปกติของ OS ให้ใช้ virtualenv แทน:

sudo apt update && sudo apt install -y python3-venv
sudo python3 -m venv /opt/explain/venv
sudo /opt/explain/venv/bin/pip install anthropic

ไม่จำเป็นต้องทำการ activation บน server: การเรียกใช้ /opt/explain/venv/bin/python โดยตรงจะใช้ package จาก venv เสมอ

การเรียกใช้งานครั้งแรก และการอ่านค่าตอบกลับอย่างถูกต้อง

import anthropic

client = anthropic.Anthropic()  # reads ANTHROPIC_API_KEY from the environment

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1000,
    messages=[{"role": "user", "content": "Explain what a systemd unit file is in three sentences."}],
)

for block in response.content:
    if block.type == "text":
        print(block.text)

มีสองประเด็นในสิบสองบรรทัดนี้ที่เป็นหัวใจสำคัญของ API ประการแรกคือการใช้ anthropic.Anthropic() โดยไม่ใส่ argument เพื่ออ่านค่า key จาก environment — ห้ามส่งค่าเป็น string literal โดยเด็ดขาด ประการที่สองคือ response.content คือ list ของ content blocks ไม่ใช่ string หากสั่ง print โดยตรง คุณจะได้ผลลัพธ์ที่ผู้เริ่มต้นมักพบเจอ ดังนี้:

[TextBlock(citations=None, text='A systemd unit file is...', type='text')]

นี่ไม่ใช่ข้อผิดพลาด แต่เป็นค่า repr ของ object เนื่องจาก response สามารถประกอบด้วย block หลายประเภท (text, tool calls, thinking) คุณจึงต้องทำการ iterate และตรวจสอบ block.type == "text" ก่อนที่จะเข้าถึง .text การเขียน loop สำหรับจัดการเรื่องนี้ตั้งแต่เริ่มต้นจะช่วยป้องกันปัญหา "ผลลัพธ์แสดงผลผิดพลาด" ได้อย่างถาวร

ให้ใช้ model ID claude-opus-4-8 ที่ระบุไว้โดยเฉพาะ ID ของรุ่นปัจจุบันจะไม่มีการระบุวันที่ — ห้ามใช้ความเคยชิน (หรือบทความเก่า) ที่บอกให้คุณเติม suffix เป็นวันที่ เพราะจะทำให้เกิด error 404 ซึ่งมีรายละเอียดอธิบายไว้ด้านล่าง

การอธิบายการทำงานของเครื่องมือ

นี่คือโปรแกรมฉบับสมบูรณ์ — รับค่าผ่าน stdin, ส่งผลการวินิจฉัยแบบ streaming, และจัดการข้อผิดพลาดแล้ว:

#!/usr/bin/env python3
"""explain: pipe an error or log excerpt in, get a diagnosis out."""
import sys
import anthropic

MODEL = "claude-opus-4-8"

def main() -> int:
    text = sys.stdin.read().strip()
    if not text:
        print("usage: journalctl -u nginx -n 50 | explain", file=sys.stderr)
        return 1

    client = anthropic.Anthropic()
    try:
        with client.messages.stream(
            model=MODEL,
            max_tokens=1500,
            system=(
                "You are a senior Linux sysadmin. The user pipes you server "
                "logs or error output. Name the most likely cause outright, "
                "then give the commands to confirm and fix it. Be terse."
            ),
            messages=[{"role": "user", "content": text}],
        ) as stream:
            for chunk in stream.text_stream:
                print(chunk, end="", flush=True)
        print()
    except anthropic.RateLimitError as e:
        retry_after = e.response.headers.get("retry-after", "60")
        print(f"rate limited; retry in {retry_after}s", file=sys.stderr)
        return 2
    except anthropic.APIStatusError as e:
        print(f"API error {e.status_code}: {e.message}", file=sys.stderr)
        return 2
    except anthropic.APIConnectionError:
        print("network error reaching the API", file=sys.stderr)
        return 2
    return 0

if __name__ == "__main__":
    sys.exit(main())

บันทึกไฟล์นี้ในชื่อ /opt/explain/explain.py จากนั้นให้เพิ่ม wrapper เพื่อโหลด key สำหรับการใช้งานแบบ interactive:

sudo tee /usr/local/bin/explain >/dev/null <<'EOF'
#!/bin/sh
set -a; . /etc/claude-explain.env; set +a
exec /opt/explain/venv/bin/python /opt/explain/explain.py "$@"
EOF
sudo chmod 755 /usr/local/bin/explain

(wrapper จำเป็นต้องรันผ่าน sudo หรือไฟล์ env ต้องมี group ที่ user ของ admin สังกัดอยู่ — ควรเลือกวิธีใดวิธีหนึ่ง แทนที่จะเปลี่ยน permission ของไฟล์เป็น 644)

เหตุผลที่ต้องใช้ streaming. client.messages.stream จะพิมพ์ token ทันทีที่ได้รับข้อมูล แทนที่จะรอจนกว่าการสร้างข้อมูลทั้งหมดจะเสร็จสิ้น และช่วยหลีกเลี่ยงปัญหา HTTP timeout เมื่อมี output จำนวนมาก — สาเหตุเพราะ SDK จะปฏิเสธค่า max_tokens ที่มีขนาดใหญ่มากสำหรับการเรียกใช้งานแบบ non-streaming หากคุณต้องการ object ที่ประกอบเสร็จสมบูรณ์ในภายหลัง ให้เรียกใช้ stream.get_final_message() ภายใน block ของ with

เหตุผลของลำดับการดักจับ exception. SDK จะส่ง exception ตามประเภท โดยเริ่มจากประเภทที่เฉพาะเจาะจงที่สุด: RateLimitError คือ error 429 ซึ่งจะมี header retry-after ระบุระยะเวลาที่ต้องรอ; APIStatusError ครอบคลุมการตอบกลับอื่นๆ ที่ไม่ใช่ 2xx (ตรวจสอบ e.status_code >= 500 หากเกิดปัญหาที่ฝั่ง server); APIConnectionError หมายถึงคำขอไม่ได้รับการตอบกลับใดๆ เลย และก่อนที่คุณจะสร้าง loop สำหรับการ retry: SDK จะทำการ retry error 429 และ 5xx ให้โดยอัตโนมัติอยู่แล้ว โดยค่าเริ่มต้นจะทำ 2 ครั้งด้วยวิธี exponential backoff (max_retries ที่ฝั่ง client) เมื่อถึงเวลาที่ except ของคุณทำงาน การ retry จะถูกใช้ไปจนหมดแล้ว — ดังนั้นวิธีที่ถูกต้องสำหรับ CLI คือการรายงานข้อผิดพลาดแล้ว exit แทนที่จะ sleep และส่งคำขอซ้ำๆ

การควบคุมค่าใช้จ่าย

หัวข้อนี้ควรแยกออกมาเป็นพิเศษ เนื่องจาก API ไม่มีระบบจำกัดวงเงินรายเดือนในตัวนอกเหนือจากที่คุณตั้งค่าไว้ และข้อผิดพลาดทุกอย่างจะสะสมขึ้นอย่างเงียบๆ

max_tokens คือเพดานค่าใช้จ่ายต่อการเรียกใช้งานหนึ่งครั้ง Output tokens มีราคาสูงกว่า — สำหรับ Opus 4.8 ราคาจะสูงกว่า input ถึงห้าเท่า — และ max_tokens คือการจำกัดจำนวน token สูงสุดที่โมเดลสามารถสร้างได้ Prompt ที่ทำงานผิดพลาดจะไม่สามารถสร้างค่าใช้จ่าย output เกินกว่าที่คุณกำหนดไว้ ควรตั้งค่าให้เหมาะสมกับงาน เช่น 1,500 tokens เพียงพอสำหรับการวิเคราะห์ log ส่วนงาน classification ใช้เพียง 100 tokens หากการตอบกลับหยุดลงกลางประโยคพร้อมกับ stop_reason: "max_tokens" แสดงว่าคุณตั้งค่าไว้ต่ำเกินไป — ให้เพิ่มค่าขึ้นอย่างเหมาะสมแทนที่จะตั้งค่าไว้สูงเกินความจำเป็น

ตรวจสอบจำนวนก่อนส่ง Input ก็มีค่าใช้จ่ายเช่นกัน และ log มักมีขนาดใหญ่ API มี endpoint สำหรับนับจำนวน token ซึ่งใช้งานได้ฟรี (แต่มี rate limits ของตัวเอง แยกจากการสร้างข้อความ):

count = client.messages.count_tokens(
    model="claude-opus-4-8",
    messages=[{"role": "user", "content": big_log_text}],
)
print(count.input_tokens)

ใช้ endpoint นี้เพื่อป้องกันการส่ง log ขนาด 2 GB ผ่านเครื่องมือโดยไม่ตั้งใจ ห้ามใช้ tiktoken สำหรับงานนี้ เนื่องจากเป็น tokenizer ของ OpenAI ซึ่งจะนับจำนวน token ของ Claude น้อยกว่าความเป็นจริงประมาณ 15–20% สำหรับข้อความทั่วไป และอาจมากกว่านั้นสำหรับ code

เลือกโมเดลตามลักษณะงาน ไม่ใช่ตามความนิยม ณ เดือนกรกฎาคม 2026, Opus 4.8 (claude-opus-4-8) มีราคา $5 ต่อหนึ่งล้าน input tokens และ $25 ต่อหนึ่งล้าน output; Haiku 4.5 (claude-haiku-4-5) ราคา $1/$5 พร้อม context 200K; Sonnet 5 (claude-sonnet-5) อยู่ระหว่างกลางที่ราคา $3/$15 โดยมีราคาแนะนำ $2/$10 จนถึงวันที่ 31 สิงหาคม 2026 ตัวอย่างเช่น: การส่ง log จำนวน 2,000 tokens พร้อมคำตอบ 500 tokens จะมีค่าใช้จ่ายประมาณ $0.0225 บน Opus และ $0.0045 บน Haiku เริ่มต้นด้วย Opus ในขณะที่กำลังประเมินคุณภาพของ output จากนั้นให้ลองใช้ prompt เดิมกับ Haiku — สำหรับงานแปลงข้อมูลแบบง่ายที่มีปริมาณมาก ผลลัพธ์มักไม่ต่างกันแต่จ่ายเพียงหนึ่งในห้าของราคาเดิม โปรดตรวจสอบตัวเลขปัจจุบันที่หน้า pricing ก่อนนำไปคำนวณในงบประมาณ

ใช้ Batches สำหรับงานที่รอได้ Batches API ประมวลผลคำขอแบบ asynchronous โดยมีราคาเพียง 50% ของราคามาตรฐาน และ batch ส่วนใหญ่จะเสร็จสิ้นภายในหนึ่งชั่วโมง งานสรุปผลรายวัน, การเติมข้อมูลย้อนหลัง (backfills), หรือการทำ bulk classification — งานใดก็ตามที่ไม่มีมนุษย์รอคำตอบควรใช้ระบบนี้

ใช้ Prompt caching สำหรับ context ที่ใช้ซ้ำ หากทุกการเรียกใช้งานมีการส่ง system prompt หรือ runbook ขนาดใหญ่ชุดเดิมซ้ำๆ ให้กำหนดให้สามารถทำ cache ได้:

response = client.messages.create(
    model="claude-opus-4-8",
    max_tokens=1000,
    system=[{
        "type": "text",
        "text": RUNBOOK_TEXT,  # the same 30K tokens on every call
        "cache_control": {"type": "ephemeral"},
    }],
    messages=[{"role": "user", "content": question}],
)
print(response.usage.cache_read_input_tokens)  # non-zero from the second call on

ค่าใช้จ่ายในการเขียน cache (cache writes) จะอยู่ที่ประมาณ 1.25 เท่าของราคา input และค่าอ่าน cache (cache reads) อยู่ที่ประมาณ 0.1 เท่า โดยมี TTL 5 นาที — ดังนั้นการเรียกใช้งานครั้งที่สองภายในช่วงเวลาดังกล่าวจะจ่ายในราคาที่ถูกลงจากการเรียกครั้งแรก มีข้อควรระวังสองประการ: prefix ที่ทำ cache ต้องมีขนาดมากกว่าค่าขั้นต่ำของแต่ละโมเดล (เช่น หลายพัน tokens สำหรับ Opus) ดังนั้น system prompt สั้นๆ จะไม่ถูกทำ cache โดยอัตโนมัติ และหาก cache_read_input_tokens ยังคงเป็นศูนย์แม้จะเรียกใช้งานด้วยข้อมูลเดิมซ้ำๆ แสดงว่ามีบางอย่างใน prefix เปลี่ยนแปลงไปในทุกการเรียก (โดยปกติคือ timestamp)

จำไว้ว่าสิ่งใดนับเป็น input บ้าง System prompts, tool definitions และประวัติการสนทนาทั้งหมดที่ถูกส่งซ้ำในทุกรอบการสนทนา (multi-turn conversations) ทั้งหมดจะถูกคิดเงินเป็น input tokens วงจรการแชทที่ไม่เคยตัดประวัติการสนทนาออกจะมีค่าใช้จ่ายเพิ่มขึ้นแบบทวีคูณ (quadratically) ควรทำความเข้าใจรายละเอียดการคำนวณทั้งหมดก่อนเริ่มสร้างระบบสนทนา: วิธีที่การใช้งาน token และการเรียกเก็บเงินของ Claude ทำงานจริง

Run it under systemd

ข้อดีของการใช้ environment-file คือคุณจะมี timer ที่สรุปข้อผิดพลาดของเมื่อวานให้ทุกเช้า

# /etc/systemd/system/log-digest.service
[Unit]
Description=Daily error-log digest via the Claude API

[Service]
Type=oneshot
User=explain
Group=systemd-journal
EnvironmentFile=/etc/claude-explain.env
ExecStart=/bin/sh -c 'journalctl -p err --since yesterday | /opt/explain/venv/bin/python /opt/explain/explain.py >> /var/log/log-digest.txt'
# /etc/systemd/system/log-digest.timer
[Unit]
Description=Run the log digest every morning

[Timer]
OnCalendar=06:15
Persistent=true

[Install]
WantedBy=timers.target
sudo useradd -r -s /usr/sbin/nologin explain
sudo touch /var/log/log-digest.txt && sudo chown explain /var/log/log-digest.txt
sudo systemctl daemon-reload
sudo systemctl enable --now log-digest.timer
sudo systemctl start log-digest.service   # test it once, right now

ข้อควรระวังเกี่ยวกับ EnvironmentFile=: systemd จะอ่านไฟล์ที่เจ้าของเป็น root และมี mode เป็น 600 ก่อน ที่จะเปลี่ยนสิทธิ์เป็น user explain ที่ไม่มีสิทธิ์ระดับสูง ดังนั้น process จะได้รับค่าตัวแปร ในขณะที่ user ไม่สามารถอ่าน key file ได้ ส่วน group systemd-journal จะเป็นตัวกำหนดสิทธิ์ในการเข้าถึง log ให้ทดสอบด้วยการรัน systemctl start ด้วยตนเองและตรวจสอบ journalctl -u log-digest.service เพื่อป้องกันความผิดพลาดจากการพิมพ์ผิดโดยไม่ต้องรอจนถึงเวลา 06:15 เมื่อรูปแบบนี้มีความซับซ้อนเกินกว่าจะใช้ shell pipeline คุณสามารถใช้แนวทางการเก็บ key ใน env-file แบบเดียวกันนี้กับ Claude-powered n8n workflows บนเครื่องเดียวกันได้ทันที

Failure modes, with the strings you will see

401 on a working key. ข้อความแจ้งข้อผิดพลาดคือ:

anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}

หากคีย์ใช้งานได้ใน shell แต่บริการตอบกลับด้วย 401 แสดงว่าบริการไม่ได้รับคีย์นั้น — โปรดจำไว้ว่า systemd ไม่ได้อ่าน .bashrc; ให้ตรวจสอบว่า EnvironmentFile= ชี้ไปยัง path ที่ถูกต้อง สาเหตุอื่น ๆ ได้แก่: การใส่เครื่องหมายคำพูดลงใน env file (ANTHROPIC_API_KEY="sk-ant-..." — systemd จะตัดเครื่องหมายคำพูดออก แต่ . file ของ shell wrapper อาจเก็บเครื่องหมายคำพูดไว้ในค่าตัวแปรหากใส่เครื่องหมายคำพูดไม่ถูกต้อง), การมีช่องว่างต่อท้าย (trailing whitespace), หรือคีย์ที่คุณเพิ่งยกเลิกไปใน Console เมื่อสัปดาห์ก่อน

404 from a model typo. สาเหตุที่พบบ่อยที่สุดคือการใส่ date-suffix ต่อท้าย model ID ปัจจุบัน:

anthropic.NotFoundError: Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-opus-4-8-20260115'}, 'request_id': 'req_011CSJqymAvNw4bT3qmDdMbA'}

ID ของรุ่นปัจจุบันต้องระบุให้ถูกต้องตามที่เขียน — claude-opus-4-8, claude-haiku-4-5, claude-sonnet-5. ให้คัดลอกข้อมูลจากเอกสารประกอบของ model ห้ามจำมาพิมพ์เองหรือคัดลอกมาจาก tutorial เก่า

429 rate_limit_error. ข้อความระบุประเภทข้อผิดพลาดคือ rate_limit_error และ response จะมี header retry-after ที่ระบุจำนวนวินาทีที่ต้องรอ SDK ได้ทำการ retry พร้อมทำ backoff ไปแล้ว 2 ครั้งก่อนที่คุณจะเห็น exception ดังนั้นหากยังพบ 429 อย่างต่อเนื่อง แสดงว่าอัตราการใช้งานจริงของคุณเกินขีดจำกัดของ tier ที่ใช้งาน — ให้ใช้วิธีประมวลผลแบบ batch หรือกระจายเวลาการทำงานแทนการเพิ่มความถี่ใน retry loop

It prints the object, not the text. ผลลัพธ์ที่แสดงคือ [TextBlock(citations=None, text='...', type='text')]. คุณพิมพ์ response.content แทนที่จะทำการ iterate blocks และอ่าน .text จาก block ที่ block.type == "text" ตัวอย่าง SDK ทุกตัวด้านบนเขียนไว้อย่างถูกต้อง; ให้คัดลอกรูปแบบการวนลูปนั้นมาใช้

error: externally-managed-environment. คุณรัน pip install บน system Python ของ Ubuntu 24.04 ให้ใช้ venv — ห้ามใช้ --break-system-packages บน server ที่สำคัญต่อการใช้งาน

Truncated answers. response.stop_reason == "max_tokens" หมายถึง model ทำงานจนถึงขีดจำกัด output cap ในขณะที่กำลังประมวลผล นี่คือการทำงานตามปกติ; ให้เพิ่มค่า cap ตามความเหมาะสม

เมื่อแอปพลิเคชันแรกของคุณใช้งานได้แล้ว building an AI agent with Claude จะเปลี่ยนการเรียก API เหล่านั้นให้กลายเป็น agent ที่สามารถใช้ tools ได้

FAQ

ค่าใช้จ่ายในการทดลองใช้ Claude API ประมาณเท่าใด?

ค่าใช้จ่ายต่ำมากสำหรับเครื่องมือประเภทนี้ ข้อมูล ณ เดือน July 2026 รุ่น Opus 4.8 มีราคา $5 ต่อหนึ่งล้าน input tokens และ $25 ต่อหนึ่งล้าน output tokens ดังนั้นการวิเคราะห์ log ทั่วไปซึ่งใช้ input ประมาณสองพัน tokens และ output ประมาณไม่กี่ร้อย tokens จะมีค่าใช้จ่ายประมาณสองเซนต์ ส่วนรุ่น Haiku 4.5 ($1/$5) จะมีค่าใช้จ่ายไม่ถึงครึ่งเซนต์ การใช้งานเพื่อสรุปผลรายวันตลอดหนึ่งเดือนมีค่าใช้จ่ายน้อยกว่ากาแฟหนึ่งแก้ว ความเสี่ยงไม่ได้อยู่ที่ราคาต่อการเรียกใช้งาน แต่อยู่ที่การทำงานแบบ loop ที่ไม่สิ้นสุดและ max_tokens ที่ไม่จำกัด ด้วยเหตุนี้คู่มือนี้จึงกำหนดค่าทั้งสองอย่างไว้อย่างชัดเจน

Claude API มีระดับการใช้งานฟรีหรือไม่?

ไม่มีระดับการใช้งานฟรีแบบต่อเนื่อง ณ เดือน July 2026 เอกสารราคาของ Anthropic ระบุว่าผู้ใช้ใหม่จะได้รับเครดิตฟรีจำนวนหนึ่งเพื่อทดสอบ API ซึ่งเป็นการทดลองใช้งานเพียงครั้งเดียว โดยจำนวนที่แน่นอนจะแสดงใน Console เมื่อลงทะเบียน หลังจากนั้นต้องเติมเงินเข้าบัญชี หากเป้าหมายของคุณคือการทำให้ต้นทุนต่อคำขอเป็นศูนย์แทนที่จะเน้นคุณภาพระดับสูงสุด ทางเลือกอื่นคือการ self-host an open-weight model with Ollama โดยจ่ายเป็น RAM แทนการจ่ายเป็น tokens

วิธีรักษาความปลอดภัยของ API key บน server ทำอย่างไร?

ห้ามเขียนลงใน code, ห้ามเก็บไว้ใน git, ห้าม export ออกจาก .bashrc และห้ามพิมพ์ลงใน shell ที่มีการบันทึก history ให้เก็บไว้ในไฟล์ที่มี root เป็นเจ้าของและตั้งค่า permission เป็น 600 ให้โหลดค่าผ่าน per-process เช่น ใช้ wrapper script สำหรับการใช้งานแบบ interactive หรือใช้ EnvironmentFile= สำหรับ systemd และควรแยก key หนึ่งชุดต่อหนึ่ง server หรือหนึ่ง project เพื่อให้การยกเลิก key ที่รั่วไหลทำได้ง่ายเหมือนการผ่าตัด ไม่ใช่การตัดอวัยวะ หาก key หลุดไปอยู่ใน paste site หรือ git commit ให้ทำการยกเลิกใน Console ทันที การลบ commit ไม่สามารถแก้ไขการรั่วไหลของข้อมูลได้

ควรเริ่มต้นด้วย Claude model รุ่นใด?

ควรเริ่มด้วย claude-opus-4-8 ในขณะที่กำลังประเมินว่าผลลัพธ์มีคุณภาพเพียงพอสำหรับการพัฒนาต่อหรือไม่ เนื่องจากคุณต้องการตัดสินใจจากคุณภาพสูงสุด และหากใช้งานในระดับ hobby ส่วนต่างของราคาจะอยู่ที่เพียงไม่กี่เซนต์ เมื่อกำหนด prompt ได้ที่แล้ว ให้รันข้อมูลจริงด้วย claude-haiku-4-5 สำหรับงานสรุปผล (summarization), การจำแนกประเภท (classification) และการคัดกรอง log (log triage) รุ่นนี้มักให้ผลลัพธ์ที่ดีใกล้เคียงกันในราคาเพียงหนึ่งในห้าของรุ่นหลัก ให้เปลี่ยนไปใช้ Haiku หรือ Sonnet ตามผลการวัดผลจริง ไม่ใช่เปลี่ยนตามค่าเริ่มต้น