精華筆記

· @aihub.tw

Claude API 開發實戰

第一支程式:呼叫 Claude API

第一支程式:呼叫 Claude API

你每個月付 20 美元的 Claude Pro 訂閱,在 claude.ai 上跟 Claude 聊得很愉快——但你想在自己的程式裡也用到 Claude,第一個反應通常是:「那我怎麼讓我的 Python 腳本去跟 Claude 講話?」

答案不是「把瀏覽器自動化去戳 claude.ai」,那條路又脆又慢,Anthropic 的使用條款也不允許。真正的做法是:用 Anthropic 提供的 API,直接在你的程式裡送請求、拿回應,完全繞過瀏覽器。訂閱和 API 是兩條平行的收費管道,互不干擾——這堂課就從這個區別開始。

這堂課適合誰 適合:想在自己的應用程式、腳本或自動化流程裡整合 Claude 的開發者與自學者(本課程屬工程師專區)。需要基礎:Python 或 JavaScript 基礎(會定義變數、呼叫函式、讀取物件屬性即可)。前置課:無,本課為第 1 課。

這堂學什麼

  • 訂閱 vs API 的本質差異:為什麼不能共用、各自適合哪些場景
  • 在 Anthropic Console 建立 API Key,並用 .env + .gitignore 安全保存
  • 安裝 Python SDK(anthropic)與 JavaScript SDK(@anthropic-ai/sdk)
  • messages.create() 送出第一個請求,完整可跑的雙語範例
  • 解讀 API 回應物件:content、usage、stop_reason 各代表什麼
  • 排解三個最常見的初學錯誤:401、429、以及 SDK 版本問題

觀念一:訂閱 vs API,兩條不同的管道

很多人第一次遇到這個問題:「我已經有 Claude Pro 了,為什麼還要另外付 API 費用?」

簡單說,兩者是完全獨立的產品:

訂閱 vs API 對照圖

Claude API 官方文件(2026 年 7 月實況) 圖:Claude API 官方文件(2026 年 7 月實況),來源:platform.claude.com

Claude.ai 訂閱 Claude API
使用方式 瀏覽器/App 介面 程式呼叫
計費模式 固定月費(Pro: $20/月) 按 token 用量計費
適合場景 人工互動、日常使用 自動化、產品整合、批次處理
資料流向 存在 Anthropic 的對話歷史 傳進你自己的系統

API 帳號要另外到 console.anthropic.com 建立,充值購買用量,才能拿到 API Key 開始呼叫。Pro 訂閱不會自動幫你開 API 存取權限。

這個設計不是刁難:訂閱走的是「登入帳號 + 對話介面」的授權,API 走的是「金鑰 + 按量計費」的授權,兩套系統的計費後台、額度、甚至資料保留政策都不一樣。所以你沒辦法拿 Claude.ai 的登入憑證去呼叫 API,反過來也一樣。想清楚這點,後面所有「為什麼要另外充值」「為什麼金鑰跟訂閱要分開管理」的疑問都會迎刃而解——它們本來就是兩個獨立的產品線。

觀念二:Token 是什麼,帳單怎麼算

在看模型表格之前,先弄清楚 API 的計費單位「token」——這個詞在整門課會一直出現。

Token 不等於字,也不等於一個英文單字。一個英文 token 大約是 4 個字元,一個中文字通常佔 1–2 個 token。實際上你不需要手動換算,Anthropic SDK 會在回應的 usage 物件裡直接告訴你消耗了幾個 input token、幾個 output token。

這裡有個實務重點:output token 的單價通常是 input 的 4 到 5 倍(對照上面模型表就看得出來),所以真正吃成本的往往是「Claude 回你多長」,而不是「你問得多長」。這也提醒你在設計 prompt 時,與其省輸入,不如想辦法讓輸出精簡。另外中文比英文更耗 token——同樣意思的一句話,中文可能用掉接近英文兩倍的 token 量,估算中文應用的帳單時要特別把這個係數算進去。

Token 計算概念圖

計費公式很簡單:

費用 = input_tokens × 輸入單價 + output_tokens × 輸出單價
(單價以「每百萬 token」計)

舉個具體例子:你用 claude-haiku-4-5 送了一個 200 token 的問題,Claude 回了 150 token 的答案:

費用 = (200 × $1.00 + 150 × $5.00) / 1,000,000
     = ($0.000200 + $0.000750)
     = $0.000950 ≈ 不到台幣一毛錢

這也是為什麼說 API 適合大量自動化:單次請求幾乎是微不足道的費用,但如果你一天送一百萬次就不同了——選對模型、用好 Caching 和 Batch,才是成本控制的關鍵。

觀念三:三個模型,各有定位

截至 2026 年 7 月,Claude 4 系列有三個主要模型:

Claude 4 系列模型定位圖

模型 模型 ID 輸入(每百萬 token) 輸出(每百萬 token) 適合場景
Claude Opus 4.8 claude-opus-4-8 $5.00 $25.00 複雜推理、長文分析
Claude Sonnet 4.6 claude-sonnet-4-6 $3.00 $15.00 日常開發、產品整合(主力)
Claude Haiku 4.5 claude-haiku-4-5 $1.00 $5.00 大量批次、即時回應

本課所有範例用 claude-haiku-4-5——它最便宜,測試時不會燒錢,等你確認程式能跑再換成 Sonnet。模型選擇的完整策略是第 2 課的主題。

三個模型的能力邊界值得記住:Haiku 適合短文本分類、簡單問答、格式轉換等機械性任務;Sonnet 是你的日常主力,處理中等複雜度的推理和生成;Opus 則留給真正需要深度思考的場景——例如法律文件解析、複雜的多步驟規劃,或要求嚴格邏輯正確性的場合。用 Opus 跑簡單任務是最常見的浪費,用 Haiku 跑複雜推理則會得到不可靠的答案。

三模型能力邊界圖

Batch API 對所有模型打五折;Prompt Caching 快取讀取再打一折(省 90%)。這兩個省錢技巧在第 7 課完整介紹。

手把手實戰

建立 Anthropic 帳號並拿到 API Key

打開瀏覽器到 console.anthropic.com,用 Email 或 Google 帳號註冊。注意:這個帳號和 Claude.ai 訂閱是分開的,就算你有 Pro 訂閱也需要另外建立。

登入後的第一件事:去 Settings → Billing 加信用卡並購買用量(預付制)。跳過這步是新手最常見的坑——金鑰建好了,但每次呼叫都回 400 錯誤,因為帳戶餘額是零。

加好付款後,到左側選單 Settings → API Keys,點 「Create Key」:

  1. 取個方便辨識的名稱,例如 dev-local-202407
  2. 按建立,立刻複製出現的金鑰——Anthropic 只顯示一次,關掉視窗就看不到了
  3. 金鑰格式是 sk-ant-api03-XXXX...,開頭固定是 sk-ant-

Console 建立 API Key 流程圖

安全保存 API Key:env 檔案 + gitignore

絕對不要把 API Key 直接寫進程式碼——一旦推到 GitHub(就算是私有 repo),未來如果不小心公開,GitHub 上的掃描機器人幾小時內就會找到並刷空你的帳戶餘額。

正確做法:用 .env 檔案儲存,用 .gitignore 排除。

在你的專案根目錄建立 .env:

ANTHROPIC_API_KEY=sk-ant-api03-你的實際金鑰

.gitignore 確認有這一行(沒有就加上去):

.env

驗證有沒有被排除:

git status
# .env 應該不出現在 Changes 或 Untracked files 裡

如果 .env 已經 commit 進去過,光加 .gitignore 是不夠的——必須執行 git rm --cached .env 把它從追蹤清單移除,再 commit 一次。詳細的補救方式在常見坑第 3 條。

安裝 SDK

Python

pip install anthropic
# 或用 uv
uv add anthropic

確認安裝版本:

python -c "import anthropic; print(anthropic.__version__)"
# 2026 年 7 月現況約 0.116.x,新專案直接裝最新版即可

JavaScript / TypeScript

npm install @anthropic-ai/sdk
# 或
pnpm add @anthropic-ai/sdk

確認安裝版本:

node -e "const a = require('@anthropic-ai/sdk'); console.log(a.default?.VERSION ?? 'ok')"

Python 專案建議加 python-dotenv 來讀取 .env:

pip install python-dotenv

Node.js 18+ 內建 --env-file 旗標,也可以用 dotenv 套件:

npm install dotenv

寫第一支 messages API 呼叫程式

Python 版本(完整可跑)

建立 first_call.py:

import os
from dotenv import load_dotenv
import anthropic

# 從 .env 讀取金鑰
load_dotenv()

# 初始化 client,若環境變數 ANTHROPIC_API_KEY 存在會自動讀取
client = anthropic.Anthropic()

# 呼叫 messages API
message = client.messages.create(
    model="claude-haiku-4-5",
    max_tokens=1024,
    messages=[
        {
            "role": "user",
            "content": "用一句話解釋什麼是 API?"
        }
    ]
)

# 印出回應
print(message.content[0].text)
print(f"\n--- 用量統計 ---")
print(f"輸入 token: {message.usage.input_tokens}")
print(f"輸出 token: {message.usage.output_tokens}")
print(f"停止原因:  {message.stop_reason}")

執行:

python first_call.py

成功會看到類似這樣的輸出:

API(應用程式介面)是一套規則,讓不同的軟體系統之間能夠溝通與交換資料。

--- 用量統計 ---
輸入 token: 18
輸出 token: 32
停止原因:  end_turn

JavaScript / TypeScript 版本(完整可跑)

建立 first_call.mjs(注意副檔名 .mjs 使用 ES module):

import Anthropic from "@anthropic-ai/sdk";
import "dotenv/config";

const client = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

const message = await client.messages.create({
  model: "claude-haiku-4-5",
  max_tokens: 1024,
  messages: [
    {
      role: "user",
      content: "用一句話解釋什麼是 API?",
    },
  ],
});

console.log(message.content[0].text);
console.log("\n--- 用量統計 ---");
console.log("輸入 token:", message.usage.input_tokens);
console.log("輸出 token:", message.usage.output_tokens);
console.log("停止原因: ", message.stop_reason);

執行:

node first_call.mjs

兩個版本邏輯完全相同:建立 client → 呼叫 messages.create() → 讀取回應。

這裡注意幾個重要的參數:

  • model:指定要呼叫哪個模型。測試期間用 claude-haiku-4-5,上線後視需求換成更高階的模型
  • max_tokens:允許 Claude 回應的最大 token 數。設太小回答會被截斷;設太大不會多花錢(只計實際產生的 token),但建議根據場景設合理上限
  • messages:陣列格式,每一筆是一個輪次。role 只有兩個合法值:user(你送的訊息)和 assistant(Claude 的回應)。多輪對話時,把歷史輪次全部放進去——這就是第 3 課「多輪對話」的核心結構

你可能注意到這個請求裡沒有 system 參數。system prompt 是用來設定 Claude「扮演什麼角色、遵守什麼規則」的全域指令,本課先用最精簡的請求讓你跑通,它的完整用法留到第 3 課。現在只要記得一件事:一個最小可跑的請求,modelmax_tokensmessages 這三個參數缺一不可,少任何一個 API 都會回 400 錯誤。

解讀 API 回應物件

messages.create() 回傳的物件長這樣(JSON 結構):

{
  "id": "msg_01XFDUDYJgAACzvnptvVoYEL",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "API(應用程式介面)是..."
    }
  ],
  "model": "claude-haiku-4-5-20251001",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 18,
    "output_tokens": 32
  }
}

API 回應物件解剖圖

幾個關鍵欄位的意義:

欄位 說明
content 陣列,通常只有一個元素。content[0].text 才是文字回應
model 實際用到的精確版本(含日期後綴),和你傳的模型 ID 可能略有不同
stop_reason end_turn:Claude 自然結束;max_tokens:撞到你設的上限;stop_sequence:碰到你指定的停止字串
usage.input_tokens 你這次送出的 token 數,包含 system prompt 和對話歷史
usage.output_tokens Claude 回應的 token 數,這兩個相加就是計費基準

stop_reasonmax_tokens 時代表回答被截斷,要把 max_tokens 參數調大。

常見坑

坑 1:401 認證錯誤——invalid x-api-key

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

這個錯誤有三個常見原因,依序排查:

  1. .env 檔案路徑不對——執行 python first_call.py 時,工作目錄必須和 .env 在同一層,或用 load_dotenv(dotenv_path="絕對路徑") 指定
  2. 金鑰複製時不小心多了空格——打開 .env,確認 = 後面沒有前後空格,金鑰本身不要加引號
  3. 帳戶餘額歸零——到 Console 的 Billing 頁面確認還有剩餘額度,帳單欠費時 Anthropic 會讓金鑰繼續存在但請求全部回 401

坑 2:429 頻率限制——rate_limit_error

anthropic.RateLimitError: Error code: 429 - {'type': 'error', 'error': {'type': 'rate_limit_error', 'message': 'Number of requests has exceeded your per-minute rate limit'}}

新帳號預設在 Tier 1,限制相對保守(約 50 RPM)。短時間內連續送大量請求就會觸發。解法:

import time
import anthropic

client = anthropic.Anthropic()

def safe_create(messages, max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.messages.create(
                model="claude-haiku-4-5",
                max_tokens=1024,
                messages=messages
            )
        except anthropic.RateLimitError as e:
            wait = 2 ** attempt  # 指數退避:1s, 2s, 4s
            print(f"Rate limit 了,等 {wait} 秒後重試...")
            time.sleep(wait)
    raise Exception("重試三次都失敗")

長期解法是到 Console 的 Settings → Limits 確認你的 Tier,然後增加帳戶充值金額(Tier 升級是自動的,累積消費越多限制越寬鬆)。

坑 3:.env 不小心進了 git,金鑰外洩

如果你發現 GitHub repo 的檔案列表看得到 .env,處理順序必須是:

  1. 先換鑰匙:立刻到 Console 的 API Keys 把那把金鑰 Revoke(作廢)、再建一把新的——因為 git 歷史裡的舊金鑰就算刪掉檔案也還在,機器人能翻到
  2. 再清理 git:把 .env 加進 .gitignore,執行 git rm --cached .env,然後 commit 並 push
echo ".env" >> .gitignore
git rm --cached .env
git commit -m "remove .env from tracking"
git push
  1. 如果 repo 是公開的,舊金鑰幾乎必定已被掃描到,一定要 Revoke。私有 repo 也要換——安全習慣比僥倖心理重要。

坑 4:content[0].text 拋出 IndexError 或 AttributeError

AttributeError: 'ToolUseBlock' object has no attribute 'text'

這個錯誤在你開始用 Tool Use(第 5 課主題)之後會出現:content 陣列不一定只有 TextBlock,也可能有 ToolUseBlock。安全的取文字方式:

# 只取第一個 TextBlock
text_blocks = [b for b in message.content if b.type == "text"]
if text_blocks:
    print(text_blocks[0].text)

在只做純文字對話的場景(本課內容),content[0].text 是安全的;一旦加入 Tool Use 就要改成上面的寫法。

作業

  1. 用你自己的 API Key 跑通本課的 Python 或 JS 範例,印出回應和用量統計
  2. 把模型換成 claude-sonnet-4-6,送同一個問題,比較回應品質和 token 數的差異
  3. 故意把 max_tokens 設成 5,觀察 stop_reason 是不是變成 max_tokens,以及回應被截斷的效果
  4. 在 Console 的 Usage 頁面看到剛才的請求紀錄,確認你理解帳單的計算方式

下一課預告

你現在已經能讓程式跟 Claude 說話了。但三個模型的差異遠不只是價格——Opus 在複雜推理上的表現可能是 Haiku 的數倍,選錯模型不是「只是貴一點」,而是「功能根本不夠用」或「白白燒了十倍成本」。**第 2 課「模型與計價:選對模型省十倍」**會帶你做實際的 benchmark 測試,用數據建立你自己的模型選擇框架,讓每一分錢花在刀口上。

#Claude API#API Key#Python#JavaScript#Anthropic SDK

← 回所有文章