SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor

Tutorial Claude API: Bina Aplikasi Pertama di VPS

Pelajari cara mendapatkan kunci Claude API, melindunginya di Ubuntu 24.04 dan membina alat Python sekitar 60 baris dengan penstriman serta kawalan kos.

Perkara yang anda bina

Alat baris perintah pada VPS Ubuntu 24.04 yang baharu. Anda menyalurkan mesej ralat atau sebahagian log kepadanya, lalu menerima diagnosis dalam bahasa Inggeris mudah: journalctl -u nginx -n 50 | explain. Alat ini mungkin hanya mengandungi kira-kira enam puluh baris Python. Ia merangkumi semua perkara yang diperlukan oleh aplikasi Claude API sebenar: key yang disimpan dengan betul, virtualenv, bentuk respons SDK, penstriman, rantaian pengecualian bertip, serta unit systemd supaya alat ini berjalan sendiri.

Saya memilih projek ini dengan sengaja. Kebanyakan tutorial "aplikasi API pertama" membina chatbot yang tidak akan anda buka lagi. Alat penerang log berguna pada pelayan sejak hari pertama. Alat ini juga memaksa anda memahami dua perkara yang sering tersilap dilakukan oleh pemula: membaca objek respons dengan betul dan mengawal perbelanjaan. API mengenakan bayaran berdasarkan token tanpa had selain had yang anda tetapkan. Oleh itu, kawalan kos ialah input reka bentuk dalam projek ini, bukan perkara yang difikirkan kemudian. Disiplin yang sama penting apabila anda mula menjalankan Claude Code pada VPS yang sama dalam tmux.

Dapatkan kunci API daripada Konsol

Akses API diuruskan dalam Konsol Anthropic di platform.claude.com. Daftar masuk, kemudian cipta kunci di bawah Settings → API Keys (dokumentasi terus memaut ke platform.claude.com/settings/keys). Konsol akan meminta anda menamakan kunci tersebut, memilih tarikh luput, dan memautkannya kepada diri anda atau akaun servis; Anthropic mengesyorkan penggunaan kunci akaun servis untuk servis pengeluaran dan sebarang perkara yang dikongsi. Kunci tersebut dipaparkan sekali sahaja, bermula dengan sk-ant-, dan tidak boleh diperoleh semula. Salin kunci tersebut dengan segera atau padam dan jana semula jika perlu.

Mengenai pembayaran: setakat Oktober 2026, tiada pelan percuma yang berterusan untuk API. Dokumentasi harga Anthropic menyatakan pengguna baharu menerima sejumlah kecil kredit percuma untuk tujuan ujian; jumlah tepat adalah seperti yang dipaparkan dalam Konsol semasa pendaftaran, dan setelah habis, anda perlu menambah nilai akaun sebelum permintaan boleh berjaya. Ini adalah berasingan daripada langganan claude.ai, dan kunci API tidak memberikan anda akses kepada aplikasi sembang. Pelan Pro tidak merangkumi kredit API, tetapi pelan Max dan Team menyediakannya: setakat Oktober 2026, $100 sebulan untuk Max 5x dan $200 untuk Max 20x (Team mengumpulkan $20 bagi setiap kerusi Standard dan $100 bagi setiap kerusi Premium, dengan had $500), yang dituntut dengan memautkan organisasi Konsol daripada tetapan pengebilan claude.ai anda. Kredit yang tidak digunakan akan luput pada akhir setiap kitaran pengebilan dan tidak meliputi Claude Code; butiran lanjut terdapat dalam cara kredit API bulanan Max dan Team berfungsi. Jika anda sedang menimbangkan antara langganan dan API, pertimbangan tersebut adalah topik tersendiri: pelan Claude yang sebenarnya anda perlukan.

Cipta kunci yang dihadkan skopnya kepada satu projek atau pelayan sahaja. Apabila kunci tertiris, dan dalam jangka masa yang cukup panjang, perkara ini pasti akan berlaku, anda perlu dapat membatalkannya tanpa menjejaskan semua perkara lain yang anda miliki.

Simpan key di luar .bashrc

Tindakan spontan yang biasa dilakukan ialah export ANTHROPIC_API_KEY=sk-ant-... dalam ~/.bashrc. Jangan lakukan demikian. Terdapat tiga masalah berasingan:

  • Setiap proses mewarisinya. Pemboleh ubah persekitaran yang dieksport dalam shell log masuk anda tersebar kepada semua yang anda mulakan, termasuk aplikasi web, pelapor ranap yang menyertakan persekitarannya dalam laporan pepijat, dan halaman phpinfo() yang dibiarkan aktif. Permukaan pendedahan key menjadi "semua perkara yang pernah dijalankan oleh pengguna ini."
  • Menaipnya menulis ke ~/.bash_history. Jalankan perintah export secara manual sekali, lalu key anda tersimpan dalam fail teks biasa selama-lamanya dan disegerakkan ke setiap sandaran direktori rumah anda.
  • Key itu tiada apabila systemd memerlukannya. Perkhidmatan tidak membaca .bashrc anda. Oleh itu, corak ini gagal apabila skrip dinaik taraf menjadi unit, biasanya sebagai ralat 401 yang tidak jelas pada pukul 6 pagi.

Corak yang betul pada pelayan ialah menggunakan fail persekitaran khusus dengan keizinan 600, yang dimuatkan hanya oleh proses yang memerlukannya:

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

Gunakan tee daripada printf dan bukannya editor jika anda mahu mengelakkan key daripada fail swap editor. Dalam kedua-dua keadaan, sahkan dengan ls -l /etc/claude-explain.env bahawa fail itu membaca -rw------- dan dimiliki oleh root. Shell interaktif menerima key bagi setiap penggunaan melalui wrapper (di bawah), manakala systemd menerimanya melalui EnvironmentFile=. root membaca fail tersebut sebelum menggugurkan keistimewaan, jadi pengguna perkhidmatan tidak perlu mempunyai akses baca kepadanya. Key itu tidak pernah muncul dalam kod, git, output ps atau sejarah shell.

Pasang SDK dalam venv

Ubuntu 24.04 menyediakan Python 3.12 dengan penguatkuasaan PEP 668. Oleh itu, pip install anthropic terus terhadap penterjemah sistem gagal dengan error: externally-managed-environment. Ralat itu menunjukkan OS berfungsi seperti yang ditetapkan. Gunakan 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

Pengaktifan tidak diperlukan pada pelayan. Panggil /opt/explain/venv/bin/python secara terus untuk sentiasa menggunakan pakej venv.

Panggilan pertama, dan membaca respons dengan betul

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)

Dua perkara dalam dua belas baris tersebut membawa sebahagian besar model mental API ini. Pertama, anthropic.Anthropic() tanpa argumen membaca kunci daripada persekitaran, jangan sekali-kali menghantarnya sebagai literal rentetan. Kedua, response.content ialah senarai blok kandungan, bukan rentetan. Cetak secara terus dan anda akan mendapat output klasik bagi pengguna kali pertama:

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

Itu bukan pepijat; ia adalah repr objek tersebut. Respons boleh mengandungi berbilang jenis blok (teks, panggilan alat, pemikiran), jadi anda perlu melakukan lelaran dan menyemak block.type == "text" sebelum menyentuh .text. Pada Opus 5.5, perkara ini penting sejak panggilan pertama: pemikiran sentiasa diaktifkan, jadi melainkan model melangkau pemikiran pada permintaan mudah, senarai tersebut bermula dengan blok thinking yang teksnya kosong secara lalai, dan response.content[0].text bukanlah jawapan anda. Sediakan gelung tersebut pada hari pertama dan satu kelas kekeliruan "ia mencetak sampah" tidak akan berlaku.

Gunakan ID model yang tepat claude-opus-5-5. Bermula daripada generasi 4.6, ID model tidak mempunyai tarikh dan ID tanpa tarikh ialah syot kilat yang dipinkan, jadi lawan memori otot (atau catatan blog lama) yang memberitahu anda untuk menambah akhiran tarikh pada model semasa; tindakan itu menghasilkan 404, yang dibincangkan di bawah. Model yang lebih lama berfungsi secara terbalik: ID kanonik Haiku 4.5 ialah claude-haiku-4-5-20251001 yang bertarikh.

Alat sebenar: penjelasan

Berikut adalah program lengkap, input daripada stdin, diagnosis distrim keluar, dan ralat dikendalikan:

#!/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())

Simpan sebagai /opt/explain/explain.py, kemudian tambah pembungkus (wrapper) yang memuatkan kunci untuk kegunaan interaktif:

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

(Pembungkus perlu dijalankan melalui sudo atau fail env perlu mempunyai kumpulan yang dimiliki oleh pengguna admin anda, pilih satu secara sengaja dan bukannya melonggarkan fail kepada 644.)

Mengapa penstriman. client.messages.stream mencetak token sebaik sahaja ia tiba dan bukannya menunggu dalam senyap sehingga penjanaan penuh selesai, dan ia mengelakkan tamat masa HTTP pada output yang panjang. SDK sebenarnya akan menolak nilai max_tokens yang sangat besar pada panggilan bukan penstriman atas sebab tersebut. text_stream hanya menghasilkan teks jawapan, dan dengan paparan pemikiran lalai pada Opus 5.5, tiada teks pemikiran yang distrim, jadi output kekal bersih. Jika anda memerlukan objek yang telah dipasang selepas itu, panggil stream.get_final_message() di dalam blok with.

Mengapa susunan pengecualian tersebut. SDK membangkitkan pengecualian bertaip, yang paling khusus didahulukan: RateLimitError ialah 429 dan membawa pengepala retry-after yang memberitahu anda tempoh masa untuk menunggu; APIStatusError meliputi respons bukan 2xx yang lain (semak e.status_code >= 500 untuk masalah di bahagian pelayan); APIConnectionError bermaksud permintaan tidak menerima sebarang respons langsung. Dan sebelum anda membina gelung cuba semula (retry loop): SDK sudah pun mencuba semula ralat 429 dan 5xx secara automatik, dua kali secara lalai dengan backoff eksponen (max_retries pada klien). Apabila except anda dijalankan, percubaan semula telah habis, jadi tindakan yang betul dalam CLI adalah untuk melaporkan dan keluar, bukan untuk tidur dan terus menghantar permintaan.

Kawalan kos

Bahagian ini perlu diasingkan kerana API tidak mempunyai had bulanan terbina dalam selain daripada apa yang anda konfigurasi, dan setiap kesilapan di sini akan terkumpul secara senyap.

max_tokens ialah siling perbelanjaan anda bagi setiap panggilan. Token output adalah arah yang mahal; pada Opus 5.5, harganya lima kali ganda harga input, dan max_tokens ialah had keras bagi jumlah token yang boleh dihasilkan oleh model. Prompt yang tidak terkawal tidak boleh menelan kos output melebihi had yang anda tetapkan. Pada model 5.5, had tersebut merangkumi proses berfikir juga: token berfikir dikira ke arah max_tokens dan dibilkan sebagai output, walaupun teks pemikiran tersebut tidak dikembalikan kepada anda. Tetapkan saiz mengikut tugasan: 4,096 memberikan ruang untuk diagnosis log yang ringkas berserta proses pemikirannya; tugasan klasifikasi memerlukan saiz yang jauh lebih kecil. Jika respons terhenti dengan stop_reason: "max_tokens", saiz yang anda tetapkan terlalu kecil; tingkatkan saiz tersebut secara sedar (atau rendahkan tetapan usaha supaya model kurang berfikir) dan bukannya terus menetapkan saiz yang sangat besar.

Kira sebelum anda hantar. Input juga menelan kos, dan log biasanya bersaiz besar. API ini mempunyai titik akhir pengiraan yang percuma untuk digunakan (ia mempunyai had kadar sendiri, berasingan daripada penciptaan mesej):

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

Gunakan titik akhir ini untuk mengelakkan daripada menghantar log bersaiz 2 GB ke dalam alat tersebut secara tidak sengaja, dan gunakan model yang akan anda panggil: Claude 4.7 dan model terkemudian menggunakan tokenizer baharu yang menghasilkan kira-kira 30% lebih banyak token untuk teks yang sama berbanding model Claude terdahulu. Jangan gunakan tiktoken untuk tujuan ini; itu ialah tokenizer OpenAI, bukan Claude, jadi kiraannya tidak akan sepadan dengan apa yang dibilkan kepada anda.

Pilih model mengikut tugasan, bukan kesetiaan. Setakat Oktober 2026, Opus 5.5 (claude-opus-5-5) berharga $4 bagi setiap juta token input dan $20 bagi setiap juta output; Haiku 5.5 (claude-haiku-5-5) berharga $0.10/$0.50 untuk prompt sehingga 100,000 token ($0.50/$2.50 jika melebihi jumlah itu) dengan konteks 1M; Sonnet 5.5 (claude-sonnet-5-5) berada di antara kedua-duanya pada harga $2/$10. Secara konkrit: petikan log 2,000-token dengan jawapan 500-token menelan kos kira-kira $0.018 pada Opus dan $0.00045 pada Haiku, ditambah dengan sebarang proses berfikir yang dilakukan oleh model, yang dibilkan sebagai output. Mulakan dengan Opus semasa anda menilai kualiti output, kemudian cuba prompt yang sama pada Haiku; untuk transformasi mudah yang berisipadu tinggi, perbezaannya sering tidak ketara pada harga satu perempat puluh bagi setiap token. Sahkan harga semasa di halaman harga sebelum mengekodkan mana-mana nilai ini ke dalam bajet anda.

Gunakan Batch untuk tugasan yang boleh menunggu. API Batches memproses permintaan secara tak segerak pada 50% daripada harga standard, dan kebanyakan batch selesai dalam masa sejam. Ringkasan harian, backfill, klasifikasi pukal, atau apa sahaja yang tidak memerlukan manusia menunggu, harus diletakkan di sini.

Prompt caching untuk konteks yang berulang. Jika setiap panggilan menghantar semula prompt sistem atau runbook besar yang sama, tandakannya sebagai boleh 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 on

Penulisan cache menelan kos 1.25x harga input pada TTL 5-minit, dan bacaan cache menelan kos 0.05x pada Opus 5.5 dan Sonnet 5.5 (0.1x pada kebanyakan model lain), jadi panggilan kedua dalam tempoh masa tersebut sudahpun menampung kos panggilan pertama. Dua perkara perlu diingat. Awalan yang dicache mesti melepasi minimum per-model, iaitu 512 token pada Opus 5.5, jadi prompt sistem yang sangat pendek tidak akan dicache langsung. Dan jika cache_read_input_tokens kekal sifar merentasi panggilan yang serupa, sesuatu dalam awalan anda berubah pada setiap permintaan (cap masa biasanya menjadi punca utama).

Ingat apa yang dikira sebagai input. Prompt sistem, definisi alat, dan dalam perbualan berbilang pusingan, keseluruhan sejarah yang anda hantar semula pada setiap pusingan semuanya dibilkan sebagai token input. Gelung sembang yang tidak pernah memotong sejarah akan menyebabkan kos meningkat secara kuadratik. Perakaunan penuh perlu difahami sebelum anda membina apa-apa yang bersifat perbualan: bagaimana penggunaan token dan bil Claude sebenarnya dikira.

Jalankan di bawah systemd

Faedah penggunaan fail persekitaran yang teratur ialah pemasa yang meringkaskan ralat semalam setiap pagi.

# /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

Perhatikan manfaat EnvironmentFile=: systemd membaca fail milik root dengan mod-600 sebelum menurunkan keistimewaan kepada pengguna tanpa keistimewaan explain. Oleh itu, proses menerima pemboleh ubah tersebut, manakala pengguna tidak dapat membaca fail kunci. Kumpulan systemd-journal memberikan akses log. Uji dengan systemctl start secara manual dan baca journalctl -u log-digest.service. Jangan tunggu sehingga 06:15 untuk menemukan kesilapan taip. Apabila corak ini tidak lagi sesuai untuk saluran paip shell, pendekatan kunci-dalam-fail-persekitaran yang sama boleh terus digunakan dalam aliran kerja n8n berkuasa Claude pada mesin yang sama.

Mod kegagalan, berserta rentetan yang akan anda lihat

401 pada kunci yang berfungsi. Pengecualian tersebut berbunyi:

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

Jika kunci berfungsi dalam shell anda tetapi servis memberikan ralat 401, servis tersebut tidak pernah menerimanya. Ingat bahawa systemd tidak membaca .bashrc; pastikan EnvironmentFile= menghala ke laluan yang betul. Punca lain: tanda petikan yang disalin ke dalam fail env (ANTHROPIC_API_KEY="sk-ant-...", systemd membuang tanda petikan tersebut, tetapi . file dalam shell wrapper anda mengekalkannya dalam nilai jika anda meletakkan tanda petikan dengan cara yang ganjil), ruang putih di hujung baris, kunci yang telah anda batalkan dalam Konsol minggu lepas, atau kunci yang telah mencapai tarikh luput yang anda tetapkan semasa menciptanya.

404 akibat kesilapan menaip model. Versi paling biasa bagi perkara ini ialah menambah akhiran tarikh pada ID model yang tidak mempunyai bentuk bertarikh:

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

ID generasi semasa adalah tepat seperti yang ditulis, claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5, claude-fable-5-1. Model daripada generasi sebelum 4.6 adalah pengecualian: claude-haiku-4-5 ialah alias kemudahan untuk ID bertarikh claude-haiku-4-5-20251001, dan kedua-dua bentuk berfungsi. Salin ID daripada dokumentasi model, jangan sekali-kali menggunakan ingatan atau tutorial lama.

429 rate_limit_error. Rentetan jenis ralat ialah rate_limit_error dan respons membawa pengepala retry-after yang mengandungi saat untuk menunggu. SDK telah pun mencuba semula sebanyak dua kali dengan backoff sebelum anda melihat pengecualian tersebut, jadi ralat 429 yang berterusan bermakna kadar penggunaan anda benar-benar melebihi tier anda. Kumpulkan kerja secara batch atau sebarkan beban kerja tersebut, jangan ketatkan gelung cuba semula (retry loop).

Ia mencetak objek, bukan teks. Output kelihatan seperti [TextBlock(citations=None, text='...', type='text')]. Anda mencetak response.content dan bukannya melakukan lelaran (iterate) pada blok dan membaca .text daripada blok yang mempunyai block.type == "text". Setiap contoh SDK di atas melakukannya dengan betul; salin gelung tersebut.

error: externally-managed-environment. Anda menjalankan pip install terhadap Python sistem Ubuntu 24.04. Gunakan venv, jangan sekali-kali menggunakan --break-system-packages pada pelayan yang penting bagi anda.

Jawapan terpotong. response.stop_reason == "max_tokens" bermakna model mencapai had output anda semasa sedang berfikir. Ia berfungsi seperti yang direka; tingkatkan had tersebut secara sengaja, dan ingat bahawa pada model 5.5, proses berfikir menggunakan had yang sama.

Apabila aplikasi pertama anda berfungsi, membina ejen AI dengan Claude menukarkan panggilan API yang sama menjadi ejen yang menggunakan alatan.

FAQ

Berapakah kos untuk mencuba API Claude?

Kosnya sangat rendah untuk alat seumpama ini. Setakat Oktober 2026, Opus 5.5 berharga $4 bagi setiap juta token input dan $20 bagi setiap juta token output. Oleh itu, diagnosis log biasa yang melibatkan beberapa ribu token input dan beberapa ratus token output hanya menelan belanja sekitar dua sen, sebelum mengambil kira token pemikiran (yang dibilkan sebagai output). Bagi Haiku 5.5 ($0.10/$0.50) pula, kosnya jauh lebih rendah daripada satu sen. Kos untuk ringkasan harian selama sebulan adalah lebih murah daripada harga secawan kopi. Risiko sebenar bukanlah harga setiap panggilan, sebaliknya gelung yang tidak terhad dan max_tokens yang tidak terhad. Itulah sebabnya kedua-duanya ditetapkan secara eksplisit dalam panduan ini.

Adakah terdapat pelan percuma untuk API Claude?

Tiada pelan percuma yang berterusan setakat Oktober 2026. Dokumentasi harga Anthropic menyatakan bahawa pengguna baharu menerima sejumlah kecil kredit percuma untuk menguji API sebagai percubaan sekali sahaja. Jumlah tepat dipaparkan dalam Console semasa pendaftaran, dan selepas itu anda perlu menambah nilai akaun. Pengecualian diberikan kepada pelanggan Max dan Team: pelan mereka merangkumi kredit API bulanan seperti yang dinyatakan di atas. Jika matlamat anda adalah kos marginal sifar bagi setiap permintaan dan bukannya kualiti tahap tertinggi, alternatifnya adalah dengan mengehos sendiri model berat terbuka menggunakan Ollama dan membayar menggunakan RAM dan bukannya token.

Bagaimanakah cara untuk memastikan API key saya selamat pada pelayan?

Jangan sekali-kali menyimpannya dalam kod, jangan masukkan ke dalam git, jangan eksport daripada .bashrc, dan jangan taip ke dalam shell yang akan menyimpan sejarahnya. Simpan kunci tersebut dalam fail milik root dengan keizinan 600, muatkan mengikut proses, gunakan skrip pembungkus untuk kegunaan interaktif, gunakan EnvironmentFile= untuk systemd, dan hadkan satu kunci bagi setiap pelayan atau projek. Dengan cara ini, pembatalan kunci yang bocor hanyalah satu pembedahan kecil, bukan amputasi. Jika kunci tersebut pernah terdedah di laman tampal (paste site) atau komit git, batalkan kunci tersebut di Console dengan serta-merta; memadamkan komit tidak bermakna kunci tersebut tidak bocor.

Model Claude yang manakah patut saya gunakan sebagai permulaan?

Mulakan dengan claude-opus-5-5 semasa anda menilai sama ada output yang dihasilkan cukup baik untuk dibina, jika anda ingin menilai idea tersebut pada kualiti penuh, dan pada volum hobi, perbezaan kos hanyalah beberapa sen. Setelah prompt ditetapkan, jalankan semula input sebenar anda pada claude-haiku-5-5; untuk tujuan peringkasan, pengelasan, dan triaj log, model ini sering kali mencukupi dengan harga satu perempat puluh daripada harga setiap token. Beralihlah kepada Haiku atau Sonnet berdasarkan pengukuran, bukan secara lalai.