SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-01

วิธีเขียนโปรแกรม Claude API บน Ubuntu 24.04 VPS

เรียนรู้วิธีสร้างเครื่องมือวิเคราะห์ Log ด้วย Claude API บน Ubuntu 24.04 ตั้งแต่การจัดการ API Key การทำ Streaming ไปจนถึงการเขียนโปรแกรมควบคุมค่าใช้จ่ายอย่างปลอดภัย

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

เครื่องมือบรรทัดคำสั่งบน Ubuntu 24.04 VPS ที่ติดตั้งใหม่ ซึ่งคุณสามารถส่งข้อความแสดงข้อผิดพลาดหรือส่วนหนึ่งของบันทึก (log) เข้าไปเพื่อรับคำวินิจฉัยเป็นภาษาอังกฤษที่เข้าใจง่าย: journalctl -u nginx -n 50 | explain เครื่องมือนี้มีความยาวประมาณ 60 บรรทัดในภาษา Python และเป็นการฝึกฝนทุกองค์ประกอบที่แอปพลิเคชัน Claude API จริงจำเป็นต้องมี ได้แก่ คีย์ที่จัดเก็บอย่างถูกต้อง, virtualenv, รูปแบบการตอบสนองของ SDK, การสตรีมข้อมูล, ลำดับข้อยกเว้นที่มีการระบุประเภท และ systemd unit เพื่อให้โปรแกรมทำงานได้โดยที่คุณไม่ต้องคอยดูแล

ผมเลือกโปรเจกต์นี้โดยตั้งใจ บทเรียน "แอปพลิเคชัน API แรก" ส่วนใหญ่จะให้คุณสร้างแชทบอทที่คุณจะไม่มีวันเปิดใช้งานอีกเลย แต่เครื่องมืออธิบายบันทึก (log explainer) นั้นมีประโยชน์บนเซิร์ฟเวอร์ตั้งแต่วันแรก และมันจะบังคับให้คุณเรียนรู้สองสิ่งที่ผู้เริ่มต้นมักทำผิดพลาดจริง ๆ คือ การอ่านออบเจกต์การตอบสนองอย่างถูกต้อง และการควบคุมค่าใช้จ่าย API จะเรียกเก็บเงินตามจำนวนโทเค็นโดยไม่มีเพดานจำกัดนอกจากที่คุณกำหนดไว้ ดังนั้นการควบคุมต้นทุนจึงเป็นปัจจัยในการออกแบบตั้งแต่ต้น ไม่ใช่สิ่งที่ค่อยมาคิดภายหลัง ซึ่งเป็นวินัยเดียวกันกับที่สำคัญเมื่อคุณก้าวไปสู่ การรัน Claude Code บน VPS เดียวกันนี้ใน tmux

การขอรับ API key จาก Console

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

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

ให้สร้างคีย์โดยจำกัดขอบเขตไว้สำหรับหนึ่งโปรเจกต์หรือหนึ่งเซิร์ฟเวอร์เท่านั้น เมื่อคีย์เกิดการรั่วไหล ซึ่งมีโอกาสเกิดขึ้นได้หากใช้งานไปนานพอ คุณจะสามารถเพิกถอนคีย์นั้นได้โดยไม่ส่งผลกระทบต่อส่วนอื่นๆ ทั้งหมดที่คุณมีอยู่

อย่าเก็บคีย์ไว้ใน .bashrc

การกระทำที่ทำตามสัญชาตญาณคือการใช้ export ANTHROPIC_API_KEY=sk-ant-... ใน ~/.bashrc อย่าทำเช่นนั้น เพราะจะเกิดปัญหา 3 ประการดังนี้:

  • ทุกกระบวนการจะสืบทอดคีย์นี้ไป ตัวแปรสภาพแวดล้อมที่ถูก export ใน login shell ของคุณจะส่งต่อไปยังทุกสิ่งที่คุณเริ่มทำงาน ไม่ว่าจะเป็นเว็บแอปพลิเคชัน, โปรแกรมรายงานข้อผิดพลาดที่มักจะ dump สภาพแวดล้อมลงในรายงานบั๊กโดยไม่ตั้งใจ หรือหน้า phpinfo() ที่ใครบางคนเปิดทิ้งไว้ พื้นที่เสี่ยงต่อการถูกเปิดเผยของคีย์จะกลายเป็น "ทุกสิ่งที่ผู้ใช้นี้เรียกใช้งาน"
  • การพิมพ์คีย์จะถูกบันทึกลงใน ~/.bash_history หากคุณรันคำสั่ง export ด้วยตนเองเพียงครั้งเดียว คีย์ของคุณจะค้างอยู่ในไฟล์ข้อความธรรมดาตลอดไป และจะถูกซิงค์ไปยังทุกการสำรองข้อมูลในโฮมไดเรกทอรีของคุณ
  • คีย์จะไม่อยู่ในที่ที่ systemd ต้องการ บริการต่างๆ ไม่ได้อ่านไฟล์ .bashrc ของคุณ ดังนั้นรูปแบบนี้จะล้มเหลวทันทีที่คุณยกระดับสคริปต์ให้เป็น unit ซึ่งมักจะปรากฏเป็นข้อผิดพลาด 401 ที่หาสาเหตุไม่ได้ในเวลา 6 โมงเช้า

รูปแบบที่ถูกต้องบนเซิร์ฟเวอร์คือการใช้ไฟล์สภาพแวดล้อมเฉพาะที่มีสิทธิ์เข้าถึงแบบ 600 โดยจะโหลดเฉพาะกระบวนการที่จำเป็นต้องใช้เท่านั้น:

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

ให้ใช้ tee จากคำสั่ง printf แทนการใช้โปรแกรมแก้ไขข้อความ หากคุณต้องการป้องกันไม่ให้คีย์หลุดเข้าไปอยู่ในไฟล์ swap ของโปรแกรมแก้ไขข้อความ ไม่ว่าจะใช้วิธีใด ให้ตรวจสอบด้วย ls -l /etc/claude-explain.env ว่าไฟล์ดังกล่าวอ่านได้เฉพาะ -rw------- และมี root เป็นเจ้าของ สำหรับ interactive shell ให้รับคีย์ผ่าน wrapper (ด้านล่าง) ในแต่ละครั้งที่เรียกใช้งาน ส่วน systemd ให้รับคีย์ผ่าน EnvironmentFile= โดยที่ root จะอ่านไฟล์ก่อนที่จะลดระดับสิทธิ์ลง ทำให้ผู้ใช้ที่เป็นเจ้าของบริการไม่จำเป็นต้องมีสิทธิ์อ่านไฟล์นี้ คีย์จะไม่ปรากฏในโค้ด, ใน git, ในผลลัพธ์ของ ps หรือในประวัติการใช้งาน shell

การติดตั้ง SDK ใน venv

Ubuntu 24.04 มาพร้อมกับ Python 3.12 ซึ่งมีการบังคับใช้ PEP 668 ดังนั้นการรัน pip install anthropic โดยตรงกับอินเทอร์พรีเตอร์ของระบบจะล้มเหลวพร้อมกับข้อผิดพลาด error: externally-managed-environment ข้อผิดพลาดดังกล่าวคือการทำงานตามปกติของระบบปฏิบัติการ โปรดใช้ 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) บนเซิร์ฟเวอร์: การเรียกใช้ /opt/explain/venv/bin/python โดยตรงจะใช้งานแพ็กเกจภายใน 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() ที่ไม่มีอาร์กิวเมนต์จะอ่านคีย์จากสภาพแวดล้อม ห้ามส่งคีย์เป็นสตริงตัวอักษรโดยเด็ดขาด ประการที่สอง response.content คือ รายการของบล็อกเนื้อหา ไม่ใช่สตริง หากคุณสั่งพิมพ์โดยตรง คุณจะได้รับผลลัพธ์แบบที่ผู้เริ่มต้นใช้งานมักพบเจอ:

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

นั่นไม่ใช่บั๊ก แต่เป็น repr ของออบเจกต์ การตอบกลับสามารถประกอบด้วยบล็อกหลายประเภท (ข้อความ, การเรียกใช้เครื่องมือ, การคิด) ดังนั้นคุณต้องวนลูปและตรวจสอบ block.type == "text" ก่อนที่จะเข้าถึง .text หากคุณเขียนลูปนี้ไว้ตั้งแต่วันแรก คุณจะหลีกเลี่ยงความสับสนประเภท "พิมพ์ออกมาเป็นขยะ" ได้ทั้งหมด

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

เครื่องมือจริง: คำอธิบาย

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

#!/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 เพื่อโหลดคีย์สำหรับการใช้งานแบบโต้ตอบ:

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 ต้องอยู่ในกลุ่มที่ผู้ดูแลระบบของคุณเป็นสมาชิกอยู่ ให้เลือกวิธีใดวิธีหนึ่งอย่างตั้งใจ แทนที่จะลดระดับสิทธิ์ไฟล์เป็น 644)

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

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

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

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

max_tokens คือเพดานการใช้จ่ายต่อการเรียกใช้งาน โทเค็นขาออก (Output tokens) คือส่วนที่มีราคาสูง โดยในรุ่น Opus 4.8 จะมีราคาสูงกว่าราคาขาเข้าถึง 5 เท่า และ max_tokens คือการจำกัดจำนวนโทเค็นสูงสุดที่โมเดลสามารถสร้างได้ หากเกิดข้อผิดพลาดในพรอมต์ (Runaway prompt) ค่าใช้จ่ายจะไม่เกินจำนวนโทเค็นขาออกที่คุณกำหนดไว้ ให้ปรับขนาดตามลักษณะงาน: 1,500 โทเค็นเพียงพอสำหรับการวิเคราะห์ล็อก ส่วนงานจำแนกประเภทข้อมูลต้องการเพียง 100 โทเค็น หากการตอบกลับหยุดกลางคันพร้อมกับ stop_reason: "max_tokens" แสดงว่าคุณกำหนดขนาดไว้ต่ำเกินไป ให้ค่อยๆ ปรับเพิ่มขึ้นอย่างมีสติแทนการตั้งค่าไว้สูงเกินความจำเป็นตั้งแต่ต้น

นับจำนวนก่อนส่ง ข้อมูลขาเข้าก็มีค่าใช้จ่ายเช่นกัน และไฟล์ล็อกมักมีขนาดใหญ่ API มีเอนด์พอยต์สำหรับการนับโทเค็นซึ่งใช้งานได้ฟรี (มีขีดจำกัดอัตราการเรียกใช้งานแยกต่างหากจากการสร้างข้อความ):

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

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

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

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

การแคชพรอมต์สำหรับบริบทที่ใช้ซ้ำ หากทุกการเรียกใช้งานมีการส่ง System prompt หรือคู่มือการทำงาน (Runbook) ขนาดใหญ่ซ้ำๆ ให้ทำเครื่องหมายว่าเป็นสิ่งที่แคชได้:

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

การเขียนแคชมีค่าใช้จ่ายประมาณ 1.25 เท่าของราคาขาเข้า และการอ่านแคชมีค่าใช้จ่ายประมาณ 0.1 เท่า โดยมีระยะเวลา TTL 5 นาที ดังนั้นการเรียกใช้งานครั้งที่สองภายในช่วงเวลานี้จะคุ้มทุนตั้งแต่ครั้งแรก มีข้อควรระวัง 2 ประการ: คำนำหน้า (Prefix) ที่แคชไว้ต้องมีขนาดผ่านเกณฑ์ขั้นต่ำของแต่ละโมเดล ซึ่งอยู่ที่ประมาณสองสามพันโทเค็นสำหรับ Opus ดังนั้น System prompt ที่สั้นเกินไปจะไม่ถูกแคช และหาก cache_read_input_tokens ยังคงเป็นศูนย์ในการเรียกใช้งานที่เหมือนกันทุกประการ แสดงว่ามีบางอย่างในคำนำหน้าของคุณเปลี่ยนแปลงไปในทุกคำขอ (โดยปกติมักเกิดจาก Timestamp)

จำไว้ว่าอะไรนับเป็นข้อมูลขาเข้า System prompt, คำจำกัดความของเครื่องมือ (Tool definitions) และในกรณีการสนทนาหลายรอบ ประวัติการสนทนาทั้งหมดที่คุณส่งซ้ำในทุกรอบ จะถูกคิดเป็นโทเค็นขาเข้าทั้งหมด ลูปการสนทนาที่ไม่เคยตัดประวัติการสนทนาทิ้งจะมีค่าใช้จ่ายเพิ่มขึ้นแบบทวีคูณ ควรทำความเข้าใจการคิดบัญชีทั้งหมดก่อนที่คุณจะสร้างระบบสนทนาใดๆ: วิธีที่การใช้งานโทเค็นและการเรียกเก็บเงินของ Claude คำนวณจริง

การรันภายใต้ systemd

ผลตอบแทนของการจัดการไฟล์ environment-file อย่างเป็นระเบียบ คือการมีตัวตั้งเวลาที่สรุปข้อผิดพลาดของเมื่อวานนี้ในทุกเช้า

# /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 และมีสิทธิ์แบบ 600 ก่อน ที่จะเปลี่ยนสิทธิ์ไปเป็นผู้ใช้ explain ที่ไม่มีสิทธิ์พิเศษ ดังนั้นกระบวนการทำงานจึงได้รับตัวแปรดังกล่าวในขณะที่ผู้ใช้ไม่สามารถอ่านไฟล์คีย์ได้ กลุ่ม systemd-journal จะเป็นผู้ให้สิทธิ์ในการเข้าถึงบันทึก (log) ให้ทดสอบด้วยการใช้ systemctl start ด้วยตนเองและอ่าน journalctl -u log-digest.service อย่ารอจนถึงเวลา 06:15 เพื่อตรวจสอบหาคำผิด เมื่อรูปแบบนี้มีความซับซ้อนเกินกว่าที่จะใช้ shell pipeline วิธีการเก็บคีย์ไว้ในไฟล์ environment-file แบบเดิมนี้สามารถนำไปใช้ต่อกับ เวิร์กโฟลว์ n8n ที่ขับเคลื่อนด้วย Claude บนเครื่องเดียวกันได้โดยตรง

รูปแบบความล้มเหลวและข้อความที่คุณจะพบ

401 เมื่อใช้คีย์ที่ใช้งานได้จริง ข้อยกเว้นที่แสดงคือ:

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

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

404 จากการพิมพ์ชื่อโมเดลผิด รูปแบบที่พบบ่อยที่สุดคือการเติมวันที่ต่อท้าย 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 ให้คัดลอกมาจากเอกสารประกอบของโมเดลเท่านั้น ห้ามคัดลอกมาจากความจำหรือบทช่วยสอนเก่า

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

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

error: externally-managed-environment คุณรัน pip install กับ Python ของระบบบน Ubuntu 24.04 ให้ใช้ venv เสมอ ห้ามใช้ --break-system-packages บนเซิร์ฟเวอร์ที่คุณต้องการรักษาความปลอดภัย

คำตอบถูกตัดทอน response.stop_reason == "max_tokens" หมายความว่าโมเดลถึงขีดจำกัดเอาต์พุตที่คุณตั้งไว้ในขณะที่กำลังประมวลผล เป็นการทำงานตามปกติ ให้เพิ่มขีดจำกัดอย่างตั้งใจ

เมื่อแอปแรกของคุณทำงานได้แล้ว การสร้าง AI agent ด้วย Claude จะเปลี่ยนการเรียก API เหล่านั้นให้กลายเป็นเอเจนต์ที่สามารถใช้เครื่องมือต่างๆ ได้

FAQ

ค่าใช้จ่ายในการทดลองใช้งาน Claude API เป็นอย่างไร

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

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

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

ฉันจะรักษาความปลอดภัยของ API key บนเซิร์ฟเวอร์ได้อย่างไร

ห้ามเก็บไว้ในโค้ด ห้ามเก็บไว้ใน git ห้ามส่งออกผ่าน .bashrc และห้ามพิมพ์ลงในเชลล์ที่ประวัติการใช้งานจะบันทึกคีย์ไว้ ให้เก็บไว้ในไฟล์ที่ root เป็นเจ้าของโดยตั้งค่าสิทธิ์เป็น 600 โหลดคีย์แยกตามกระบวนการทำงาน ใช้สคริปต์ wrapper สำหรับการใช้งานแบบโต้ตอบ ใช้ EnvironmentFile= สำหรับ systemd และกำหนดคีย์หนึ่งชุดต่อหนึ่งเซิร์ฟเวอร์หรือหนึ่งโปรเจกต์ เพื่อให้การเพิกถอนคีย์ที่รั่วไหลเป็นเพียงการผ่าตัดเล็กน้อยไม่ใช่การตัดอวัยวะ หากคีย์หลุดไปอยู่ในเว็บไซต์วางข้อความหรือ git commit ให้เพิกถอนคีย์ใน Console ทันที การลบ commit ไม่ได้หมายความว่าคีย์นั้นจะปลอดภัยจากการรั่วไหล

ฉันควรเริ่มต้นด้วยโมเดล Claude รุ่นใด

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