Hướng dẫn Claude API: app đầu tiên trên VPS
Tạo Claude API key, bảo vệ trên Ubuntu 24.04 và triển khai tool Python khoảng 60 dòng để giải thích log, streaming, xử lý lỗi typed và kiểm soát chi phí.
Bạn đang xây dựng gì
Một công cụ dòng lệnh trên VPS Ubuntu 24.04 mới cài. Bạn truyền thông báo lỗi hoặc một đoạn log vào công cụ qua pipe, rồi nhận lại phần chẩn đoán bằng tiếng Anh đơn giản: journalctl -u nginx -n 50 | explain. Công cụ này chỉ khoảng 60 dòng Python. Nó giúp bạn thực hành mọi thành phần mà một ứng dụng Claude API thực tế cần: lưu key đúng cách, dùng virtualenv, xử lý các dạng response của SDK, streaming, chuỗi exception có kiểu, và một unit systemd để công cụ tự chạy mà không cần bạn can thiệp.
Tôi cố ý chọn dự án này. Hầu hết tutorial về “ứng dụng API đầu tiên” đều hướng dẫn bạn xây chatbot mà sau đó bạn sẽ không bao giờ mở lại. Công cụ giải thích log có ích ngay trên server từ ngày đầu tiên. Nó cũng buộc bạn xử lý đúng 2 vấn đề mà người mới thường làm sai: đọc đúng response object và kiểm soát chi phí. API tính phí theo token, không có giới hạn nào ngoài các giới hạn bạn tự đặt. Vì vậy, kiểm soát chi phí là một yêu cầu thiết kế ngay từ đầu, không phải việc bổ sung sau này. Đây cũng là nguyên tắc cần thiết khi bạn chuyển sang chạy Claude Code trên chính VPS này trong tmux.
Lấy API key từ Console
Quản lý quyền truy cập API trong Anthropic Console tại platform.claude.com. Hãy đăng ký, sau đó tạo key trong Settings → API Keys; tài liệu liên kết trực tiếp đến platform.claude.com/settings/keys. Console yêu cầu bạn đặt tên cho key, chọn thời hạn và liên kết key với tài khoản của bạn hoặc một service account. Anthropic khuyến nghị dùng key của service account cho các service production và mọi thứ được chia sẻ. Key chỉ hiển thị một lần, bắt đầu bằng sk-ant- và không thể lấy lại. Hãy copy ngay hoặc xóa rồi cấp lại key.
Về chi phí: tính đến October 2026, API không có free tier liên tục. Tài liệu giá của Anthropic cho biết người dùng mới nhận được một khoản free credit nhỏ để thử nghiệm. Số tiền chính xác là số Console hiển thị khi bạn đăng ký. Khi khoản này hết, bạn phải nạp tiền vào account thì request mới thành công. Khoản này tách biệt với subscription claude.ai, và API key không cấp quyền dùng chat app. Gói Pro không bao gồm API credit, nhưng gói Max và Team có: tính đến October 2026, Max 5x có $100 mỗi tháng và Max 20x có $200 mỗi tháng; Team phân bổ $20 cho mỗi Standard seat và $100 cho mỗi Premium seat, tối đa $500. Bạn nhận credit bằng cách liên kết một Console organization từ billing settings của claude.ai. Credit chưa dùng hết sẽ hết hạn vào cuối mỗi billing cycle và không áp dụng cho Claude Code. Chi tiết có trong cách hoạt động của API credit hằng tháng trên gói Max và Team. Nếu bạn đang cân nhắc subscription và API, đây là một chủ đề riêng: bạn thực sự cần gói Claude nào.
Hãy tạo key với phạm vi giới hạn cho một project hoặc server. Khi key bị lộ — và nếu đủ thời gian thì sẽ có một key bị lộ — bạn cần revoke key đó mà không làm hỏng mọi thứ khác bạn đang sở hữu.
Không để key trong .bashrc
Phản xạ đầu tiên là export ANTHROPIC_API_KEY=sk-ant-... trong ~/.bashrc. Đừng làm vậy. Có 3 vấn đề riêng biệt:
- Mọi process đều kế thừa nó. Biến môi trường được export trong login shell sẽ lan truyền đến mọi thứ bạn khởi chạy: web app, crash reporter vốn có thể ghi toàn bộ environment vào bug report, và trang
phpinfo()mà ai đó đã bật. Phạm vi lộ key trở thành “mọi thứ user này từng chạy”. - Gõ lệnh này sẽ ghi nó vào
~/.bash_history. Chạy lệnh export thủ công một lần khiến key nằm trong một file plaintext vĩnh viễn, đồng thời được sync vào mọi bản backup của home directory. - systemd không có biến này khi cần. Service không đọc
.bashrccủa bạn, nên cách này sẽ thất bại đúng lúc bạn chuyển script thành unit, thường biểu hiện bằng lỗi 401 khó hiểu lúc 6 giờ sáng.
Cách đúng trên server là dùng một environment file riêng với quyền 600, chỉ được process cần key nạp vào:
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/nullDùng tee từ printf thay vì editor nếu muốn tránh ghi key vào editor swap file. Dù dùng cách nào, hãy kiểm tra bằng ls -l /etc/claude-explain.env để xác nhận file đọc được -rw------- và thuộc sở hữu của root. Interactive shell nhận key cho từng lần chạy thông qua wrapper (bên dưới), còn systemd nhận key qua EnvironmentFile=. root đọc file trước khi hạ quyền, nên service user không cần quyền đọc file này. Key không bao giờ xuất hiện trong code, git, output của ps hoặc shell history.
Cài SDK trong venv
Ubuntu 24.04 phát hành cùng Python 3.12 và bật cơ chế thực thi PEP 668, nên chạy pip install anthropic trực tiếp với trình thông dịch của hệ thống sẽ thất bại với error: externally-managed-environment. Đây là hành vi đúng của OS. Hãy dùng virtualenv:
sudo apt update && sudo apt install -y python3-venv
sudo python3 -m venv /opt/explain/venv
sudo /opt/explain/venv/bin/pip install anthropicTrên server không cần thực hiện bước activate: gọi trực tiếp /opt/explain/venv/bin/python luôn sử dụng các package trong venv.
Lần gọi đầu tiên và cách đọc response cho đúng
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from the environment
response = client.messages.create(
model="claude-opus-5-5",
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)Có 2 điểm trong 12 dòng đó thể hiện phần lớn cách API hoạt động. Thứ nhất, anthropic.Anthropic() không có argument sẽ đọc key từ environment; không bao giờ truyền key dưới dạng string literal. Thứ hai, response.content là list gồm các content block, không phải string. Nếu in trực tiếp, bạn sẽ nhận được output kinh điển của người mới:
[TextBlock(citations=None, text='A systemd unit file is...', type='text')]Đó không phải bug mà là repr của object. Response có thể chứa nhiều loại block (text, tool call, thinking), nên bạn phải lặp qua từng block và kiểm tra block.type == "text" trước khi truy cập .text. Trên Opus 5.5, điều này quan trọng ngay từ lần gọi đầu tiên: thinking luôn được bật. Vì vậy, trừ khi model bỏ qua thinking trong một request đơn giản, list sẽ bắt đầu bằng block thinking có text rỗng theo mặc định, còn response.content[0].text không phải câu trả lời của bạn. Thêm vòng lặp này ngay từ ngày đầu sẽ loại bỏ hoàn toàn một nhóm lỗi kiểu “in ra toàn rác”.
Dùng chính xác model ID claude-opus-5-5. Từ thế hệ 4.6 trở đi, model ID không còn chứa ngày, và ID không chứa ngày chính là snapshot được ghim. Vì vậy, đừng theo thói quen hoặc làm theo blog cũ mà nối thêm hậu tố ngày vào model hiện tại; cách đó sẽ tạo lỗi 404, được đề cập bên dưới. Các model cũ hoạt động theo cách ngược lại: canonical ID của Haiku 4.5 là claude-haiku-4-5-20251001.
Công cụ thực tế: giải thích
Đây là chương trình hoàn chỉnh: nhận dữ liệu từ stdin, xuất chẩn đoán theo stream và xử lý lỗi:
#!/usr/bin/env python3
"""explain: pipe an error or log excerpt in, get a diagnosis out."""
import sys
import anthropic
MODEL = "claude-opus-5-5"
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=4096,
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())Lưu chương trình này thành /opt/explain/explain.py, sau đó thêm một wrapper để nạp key khi chạy tương tác:
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 phải chạy qua sudo, hoặc env file phải thuộc một group mà user quản trị của bạn là thành viên. Hãy chủ động chọn một cách, thay vì nới quyền file thành 644.)
Vì sao dùng streaming. client.messages.stream in các token ngay khi chúng đến, thay vì im lặng trong suốt thời gian generation. Cách này cũng tránh HTTP timeout khi output dài. SDK thực tế sẽ từ chối các giá trị max_tokens quá lớn trong các lần gọi không streaming chính vì lý do đó. text_stream chỉ trả về phần văn bản câu trả lời. Với chế độ hiển thị thinking mặc định trên Opus 5.5, không có văn bản thinking nào được stream, nên output vẫn sạch. Nếu cần object đã được ghép lại sau đó, hãy gọi stream.get_final_message() bên trong block with.
Vì sao phải sắp xếp các exception như vậy. SDK raise các exception có type, theo thứ tự từ cụ thể nhất: RateLimitError là lỗi 429 và có header retry-after cho biết cần chờ bao lâu; APIStatusError bao quát các response khác không thuộc nhóm 2xx (kiểm tra e.status_code >= 500 khi nghi ngờ lỗi phía server); APIConnectionError nghĩa là request hoàn toàn không nhận được response. Trước khi tự xây retry loop, hãy nhớ rằng SDK đã tự retry lỗi 429 và 5xx, mặc định 2 lần với exponential backoff (max_retries trên client). Khi except của bạn chạy, các lần retry đã dùng hết. Vì vậy, trong CLI, cách đúng là báo lỗi rồi thoát, không sleep và tiếp tục gửi request dồn dập.
Kiểm soát chi phí
Phần này cần được tách riêng vì API không có giới hạn chi tiêu hàng tháng mặc định ngoài những gì bạn tự cấu hình, và mọi sai sót ở đây đều tích tụ âm thầm.
max_tokens là trần chi tiêu cho mỗi lần gọi. Token đầu ra là hướng tốn kém nhất, trên Opus 5.5, giá cao gấp năm lần đầu vào, và max_tokens là giới hạn cứng cho số lượng token mà model có thể tạo ra. Một prompt bị lỗi vòng lặp không thể tiêu tốn nhiều token đầu ra hơn mức bạn cho phép. Trên các model 5.5, giới hạn đó bao gồm cả phần suy nghĩ (thinking): các token suy nghĩ được tính vào max_tokens và tính phí như đầu ra, mặc dù văn bản suy nghĩ không được trả về cho bạn. Hãy đặt kích thước phù hợp với công việc: 4,096 là đủ cho một chẩn đoán log ngắn gọn kèm phần suy nghĩ phía trước; một tác vụ phân loại cần ít hơn nhiều. Nếu phản hồi bị cắt ngắn với stop_reason: "max_tokens", nghĩa là bạn đặt giới hạn quá chặt, hãy tăng nó một cách có chủ đích (hoặc giảm thiết lập nỗ lực để model suy nghĩ ít hơn) thay vì mặc định đặt con số khổng lồ.
Đếm trước khi gửi. Đầu vào cũng tốn tiền, và log thì rất cồng kềnh. API có một endpoint đếm token miễn phí (nó có giới hạn rate limit riêng, tách biệt với việc tạo tin nhắn):
count = client.messages.count_tokens(
model="claude-opus-5-5",
messages=[{"role": "user", "content": big_log_text}],
)
print(count.input_tokens)Hãy sử dụng nó để tránh vô tình đẩy một file log 2 GB qua công cụ, và hãy truyền đúng model bạn sẽ gọi: Claude 4.7 và các model sau này sử dụng tokenizer mới hơn, tạo ra số lượng token nhiều hơn khoảng 30% cho cùng một văn bản so với các model Claude cũ. Đừng dùng tiktoken cho việc này, đó là tokenizer của OpenAI, không phải của Claude, nên số lượng đếm sẽ không khớp với hóa đơn của bạn.
Chọn model theo tác vụ, không theo sự trung thành. Tính đến tháng 10 năm 2026, Opus 5.5 (claude-opus-5-5) có giá 4 USD cho mỗi triệu token đầu vào và 20 USD cho mỗi triệu token đầu ra; Haiku 5.5 (claude-haiku-5-5) có giá 0.10 USD/0.50 USD cho các prompt dưới 100,000 token (0.50 USD/2.50 USD cho phần trên mức đó) với context 1M; Sonnet 5.5 (claude-sonnet-5-5) nằm ở mức trung gian với 2 USD/10 USD. Cụ thể: một đoạn log 2,000 token với câu trả lời 500 token tốn khoảng 0.018 USD trên Opus và 0.00045 USD trên Haiku, cộng thêm bất kỳ phần suy nghĩ nào mà model thực hiện, vốn được tính phí như đầu ra. Hãy bắt đầu với Opus khi bạn đang đánh giá chất lượng đầu ra, sau đó thử các prompt tương tự trên Haiku; đối với các tác vụ chuyển đổi đơn giản với khối lượng lớn, kết quả thường không khác biệt đáng kể trong khi chi phí chỉ bằng một phần bốn mươi. Hãy xác minh lại bảng giá hiện tại trước khi hard-code bất kỳ con số nào vào ngân sách.
Sử dụng Batch cho mọi thứ có thể chờ đợi. Batches API xử lý các yêu cầu bất đồng bộ với 50% giá tiêu chuẩn, và hầu hết các batch hoàn thành trong vòng một giờ. Các bản tổng hợp hàng đêm, backfill, phân loại hàng loạt, bất cứ thứ gì không cần con người chờ đợi đều nên dùng cách này.
Prompt caching cho context lặp lại. Nếu mỗi lần gọi đều gửi lại cùng một system prompt lớn hoặc runbook, hãy đánh dấu nó là có thể cache:
response = client.messages.create(
model="claude-opus-5-5",
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 onChi phí ghi cache là 1.25x giá đầu vào với TTL 5 phút, và chi phí đọc cache là 0.05x trên Opus 5.5 và Sonnet 5.5 (0.1x trên hầu hết các model khác), vì vậy lần gọi thứ hai trong khoảng thời gian đó đã bù đắp cho lần đầu tiên. Có hai lưu ý. Tiền tố (prefix) được cache phải vượt qua mức tối thiểu của mỗi model, là 512 token trên Opus 5.5, vì vậy một system prompt quá ngắn sẽ không được cache. Và nếu cache_read_input_tokens luôn bằng 0 qua các lần gọi giống hệt nhau, nghĩa là có thứ gì đó trong tiền tố của bạn thay đổi sau mỗi yêu cầu (thường là do timestamp).
Ghi nhớ những gì được tính là đầu vào. System prompt, định nghĩa công cụ (tool definitions), và trong các cuộc hội thoại nhiều lượt, toàn bộ lịch sử mà bạn gửi lại mỗi lượt đều được tính là token đầu vào. Một vòng lặp chat không bao giờ cắt bớt lịch sử sẽ làm chi phí tăng theo cấp số bình phương. Việc hiểu rõ cách tính toán đầy đủ là rất đáng giá trước khi bạn xây dựng bất kỳ thứ gì liên quan đến hội thoại: cách tính toán sử dụng token và hóa đơn của Claude.
Chạy dưới systemd
Lợi ích của việc quản lý environment file đúng cách là một timer tóm tắt lỗi của ngày hôm trước vào mỗi buổi sáng.
# /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.targetsudo 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 nowLưu ý lợi ích của EnvironmentFile=: systemd đọc file thuộc sở hữu của root, có mode-600, trước khi chuyển sang user không có đặc quyền explain. Vì vậy, process nhận được biến này, còn user không thể đọc key file. Group systemd-journal cấp quyền truy cập log. Kiểm tra bằng systemctl start thủ công và đọc journalctl -u log-digest.service, không chờ đến 06:15 mới phát hiện lỗi đánh máy. Khi pattern này vượt quá khả năng của một shell pipeline, cách dùng key trong env file có thể chuyển thẳng sang workflow n8n dùng Claude trên cùng máy.
Các lỗi thường gặp và chuỗi bạn sẽ thấy
401 dù key vẫn hoạt động. Exception có nội dung:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}Nếu key hoạt động trong shell nhưng service trả về 401, service chưa bao giờ nhận được key đó. Hãy nhớ systemd không đọc .bashrc; kiểm tra EnvironmentFile= có trỏ đến đúng path không. Các nguyên nhân khác gồm dấu ngoặc kép bị dán vào env file (ANTHROPIC_API_KEY="sk-ant-..."; systemd loại bỏ các dấu ngoặc kép này, nhưng . file của shell wrapper vẫn giữ chúng trong value nếu bạn đặt dấu ngoặc không đúng), khoảng trắng ở cuối dòng, key đã bị thu hồi trong Console vào tuần trước hoặc key đã đến thời điểm hết hạn bạn chọn khi tạo.
404 do gõ sai model. Trường hợp phổ biến nhất là thêm hậu tố ngày vào một model ID không có dạng theo ngày:
anthropic.NotFoundError: Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-opus-5-5-20260922'}, 'request_id': 'req_011CSJqymAvNw4bT3qmDdMbA'}Các ID của thế hệ hiện tại phải được viết chính xác như sau: claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5, claude-fable-5-1. Model trước thế hệ 4.6 là ngoại lệ: claude-haiku-4-5 là alias tiện dụng cho ID theo ngày claude-haiku-4-5-20251001, và cả hai dạng đều hoạt động. Hãy copy ID từ tài liệu models, không lấy từ trí nhớ hoặc tutorial cũ.
429 rate_limit_error. Chuỗi error type là rate_limit_error và response có header retry-after chứa số giây cần chờ. SDK đã tự retry 2 lần với backoff trước khi bạn thấy exception. Vì vậy, 429 liên tục có nghĩa là rate thực tế của bạn vượt tier hiện tại. Hãy chia nhỏ công việc hoặc phân bổ theo thời gian, không rút ngắn retry loop.
Kết quả in ra object thay vì text. Output có dạng [TextBlock(citations=None, text='...', type='text')]. Bạn đã in response.content thay vì duyệt qua các block và đọc .text từ những block có block.type == "text". Mọi ví dụ SDK ở trên đều xử lý đúng; hãy copy loop đó.
error: externally-managed-environment. Bạn đã chạy pip install trên system Python của Ubuntu 24.04. Hãy dùng venv, không chạy --break-system-packages trên server quan trọng.
Câu trả lời bị cắt ngắn. response.stop_reason == "max_tokens" có nghĩa là model đã chạm giới hạn output khi đang tạo câu trả lời. Đây là hành vi đúng theo thiết kế. Hãy tăng giới hạn một cách có chủ đích và nhớ rằng trên các model 5.5, phần thinking dùng chung giới hạn này.
Sau khi app đầu tiên hoạt động, xây dựng AI agent với Claude sẽ biến các API call tương tự thành một agent có thể sử dụng tool.
FAQ
Chi phí dùng thử Claude API là bao nhiêu?
Thực sự rất thấp đối với một công cụ như vậy. Tính đến October 2026, Opus 5.5 có giá $4 cho mỗi million input tokens và $20 cho mỗi million output tokens. Vì vậy, một lần chẩn đoán log điển hình, với vài thousand tokens đầu vào và vài hundred tokens đầu ra, có giá khoảng two cents trước thinking tokens (được tính như output tokens). Với Haiku 5.5 ($0.10/$0.50), chi phí thấp hơn nhiều so với một phần mười cent. Dùng hàng ngày trong một tháng để tạo digest còn rẻ hơn một cốc cà phê. Rủi ro không nằm ở giá mỗi lần gọi, mà ở các vòng lặp không giới hạn và max_tokens không giới hạn. Vì vậy, guide này đặt rõ cả hai giá trị.
Claude API có free tier không?
Tính đến October 2026, Claude API không có free tier liên tục. Tài liệu pricing của Anthropic cho biết người dùng mới nhận được một lượng free credits nhỏ để thử API. Đây là trial một lần; Console sẽ hiển thị số credits chính xác khi đăng ký. Sau đó, bạn phải nạp tiền vào account. Max và Team subscribers là ngoại lệ: các plan này bao gồm API credits hàng tháng, như đã nói ở trên. Nếu mục tiêu của bạn là không phát sinh chi phí cho mỗi request thay vì đạt chất lượng frontier, bạn có thể tự host model open-weight bằng Ollama và trả chi phí bằng RAM thay vì tokens.
Làm cách nào để bảo vệ API key trên server?
Không bao giờ đặt key trong code, trong git hoặc export key từ .bashrc. Cũng không nhập key vào shell nếu shell history sẽ lưu lại nó. Hãy đặt key trong file do root sở hữu với quyền 600, rồi nạp key theo từng process. Khi dùng tương tác, hãy dùng wrapper script; với systemd, hãy dùng EnvironmentFile=. Giới hạn mỗi server hoặc project ở một key riêng để khi key bị lộ, bạn chỉ cần revoke key thay vì phải xử lý toàn bộ hệ thống. Nếu key từng xuất hiện trên paste site hoặc trong git commit, hãy revoke key ngay trong Console. Xóa commit không làm key đã bị lộ trở nên an toàn lại.
Nên bắt đầu với Claude model nào?
Hãy bắt đầu với claude-opus-5-5 trong giai đoạn đánh giá xem output có đủ tốt để xây dựng tiếp hay không. Bạn cần đánh giá ý tưởng ở chất lượng đầy đủ, và ở mức sử dụng hobby, chênh lệch chi phí chỉ là vài cents. Khi prompt đã ổn định, hãy chạy lại input thực tế với claude-haiku-5-5. Với các tác vụ summarization, classification và log triage, model này thường đã đủ tốt với giá mỗi token chỉ bằng một phần bốn mươi. Hãy chuyển sang Haiku hoặc Sonnet dựa trên số liệu đo được, không chuyển theo mặc định.