Claude API: pierwsza aplikacja w Python na Ubuntu VPS
Stwórz narzędzie do analizy logów z Claude API na Ubuntu 24.04. Poradnik obejmuje konfigurację virtualenv, bezpieczne zarządzanie kluczami, obsługę strumieniowania i limitów.
Co budujesz
Narzędzie wiersza poleceń na świeżym systemie Ubuntu 24.04 VPS, do którego przesyłasz komunikat o błędzie lub fragment dziennika, aby otrzymać diagnozę w zrozumiałym języku: journalctl -u nginx -n 50 | explain. Skrypt składa się z około 60 linii kodu w języku Python i wykorzystuje wszystkie elementy niezbędne w rzeczywistej aplikacji korzystającej z Claude API: poprawnie przechowywany klucz, środowisko virtualenv, struktury odpowiedzi SDK, strumieniowanie, typowany łańcuch wyjątków oraz jednostkę systemd, dzięki której narzędzie działa w tle.
Projekt został wybrany celowo. Większość samouczków dotyczących "pierwszej aplikacji API" prowadzi do stworzenia chatbota, którego użytkownik nigdy więcej nie otworzy. Wyjaśniacz dzienników jest przydatny na serwerze od pierwszego dnia i wymusza opanowanie dwóch kwestii, w których początkujący najczęściej popełniają błędy: poprawnego odczytywania obiektu odpowiedzi oraz kontrolowania kosztów. API rozlicza się za tokeny bez górnego limitu poza tymi, które sam ustawisz, więc kontrola kosztów jest tutaj założeniem projektowym, a nie dodatkiem. To ta sama dyscyplina, która jest wymagana, gdy przejdziesz do uruchamiania Claude Code na tym samym VPS wewnątrz tmux.
Uzyskanie klucza API z poziomu konsoli
Dostęp do API jest zarządzany w Anthropic Console pod adresem platform.claude.com. Należy zarejestrować się, a następnie utworzyć klucz w sekcji Settings → API Keys (dokumentacja prowadzi bezpośrednio do platform.claude.com/settings/keys). Konsola wymaga nadania nazwy kluczowi, wybrania daty wygaśnięcia oraz przypisania go do użytkownika lub konta serwisowego. Anthropic zaleca używanie kluczy kont serwisowych w usługach produkcyjnych oraz w przypadku wszelkich współdzielonych zasobów. Klucz jest wyświetlany tylko raz, zaczyna się od sk-ant- i nie ma możliwości jego ponownego odczytania. Należy go niezwłocznie skopiować lub w razie potrzeby usunąć i wygenerować ponownie.
Kwestie finansowe: według stanu na październik 2026 r. nie istnieje stały darmowy plan dostępu do API. Dokumentacja cenowa Anthropic wskazuje, że nowi użytkownicy otrzymują niewielką pulę darmowych kredytów na testy. Dokładna kwota jest widoczna w konsoli po rejestracji. Po jej wyczerpaniu konieczne jest zasilenie konta, aby żądania były realizowane. Jest to usługa odrębna od subskrypcji claude.ai; klucz API nie zapewnia dostępu do aplikacji czatowej. Plan Pro nie obejmuje kredytów API, natomiast plany Max i Team już tak. Według stanu na październik 2026 r. jest to 100 USD miesięcznie w planie Max 5x oraz 200 USD w planie Max 20x (plan Team gromadzi 20 USD na każde stanowisko Standard oraz 100 USD na stanowisko Premium, z limitem do 500 USD). Środki te aktywuje się poprzez powiązanie organizacji w konsoli z ustawieniami rozliczeniowymi w claude.ai. Niewykorzystane kredyty wygasają z końcem każdego cyklu rozliczeniowego i nie pokrywają kosztów Claude Code. Szczegóły znajdują się w sposób działania miesięcznych kredytów API w planach Max i Team. Jeśli rozważasz wybór między subskrypcją a API, ten kompromis jest osobnym zagadnieniem: który plan Claude jest faktycznie potrzebny.
Utwórz klucz ograniczony do jednego projektu lub serwera. W przypadku wycieku klucza – co w dłuższej perspektywie jest nieuniknione – będziesz mógł go unieważnić bez zakłócania działania pozostałych zasobów.
Przechowywanie klucza poza plikiem .bashrc
Odruchowym działaniem jest export ANTHROPIC_API_KEY=sk-ant-... w ~/.bashrc. Należy tego unikać. Istnieją trzy odrębne problemy:
- Każdy proces dziedziczy klucz. Zmienna środowiskowa wyeksportowana w powłoce logowania jest przekazywana do wszystkiego, co uruchomisz: aplikacji webowej, narzędzia do raportowania błędów, które może zrzucić środowisko do pliku, czy strony
phpinfo(), którą ktoś pozostawił aktywną. Powierzchnia ataku na klucz obejmuje wtedy wszystko, co uruchamia dany użytkownik. - Wpisanie klucza trafia do
~/.bash_history. Ręczne wykonanie polecenia export sprawia, że klucz zostaje zapisany w pliku tekstowym na zawsze i jest synchronizowany z każdą kopią zapasową katalogu domowego. - Klucz jest niedostępny dla systemd. Usługi nie odczytują pliku
.bashrc, więc ten schemat zawodzi w momencie przeniesienia skryptu do jednostki systemd, co zazwyczaj objawia się tajemniczym błędem 401 o godzinie 6 rano.
Właściwym wzorcem na serwerze jest dedykowany plik środowiskowy z uprawnieniami 600, ładowany wyłącznie przez proces, który go wymaga:
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/nullUżyj tee z polecenia printf zamiast edytora, jeśli chcesz uniknąć zapisania klucza w plikach tymczasowych edytora. Niezależnie od metody, zweryfikuj za pomocą ls -l /etc/claude-explain.env, czy plik ma uprawnienia -rw------- i czy jego właścicielem jest root. Powłoki interaktywne otrzymują klucz przy każdym wywołaniu za pomocą poniższego wrappera, a systemd otrzymuje go przez EnvironmentFile=. Proces root odczytuje plik przed porzuceniem uprawnień, dzięki czemu użytkownik usługi nie potrzebuje do niego dostępu. Klucz nigdy nie pojawia się w kodzie, w git, w wynikach ps ani w historii powłoki.
Instalacja SDK w venv
Ubuntu 24.04 dostarcza Python 3.12 z wymuszaniem PEP 668, dlatego zwykłe polecenie pip install anthropic uruchomione dla interpretera systemowego kończy się błędem error: externally-managed-environment. Ten błąd oznacza, że system operacyjny działa zgodnie z założeniami; należy użyć virtualenv:
sudo apt update && sudo apt install -y python3-venv
sudo python3 -m venv /opt/explain/venv
sudo /opt/explain/venv/bin/pip install anthropicNa serwerze nie jest wymagana aktywacja środowiska: bezpośrednie wywołanie /opt/explain/venv/bin/python zawsze korzysta z pakietów zainstalowanych w venv.
Pierwsze wywołanie i poprawne odczytywanie odpowiedzi
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)Dwa elementy w tych dwunastu liniach zawierają większość modelu mentalnego tego API. Po pierwsze, anthropic.Anthropic() bez argumentów odczytuje klucz ze środowiska; nigdy nie należy przekazywać go jako literału ciągu znaków. Po drugie, response.content to lista bloków zawartości, a nie ciąg znaków. Bezpośrednie wyświetlenie jej powoduje klasyczny błąd początkującego:
[TextBlock(citations=None, text='A systemd unit file is...', type='text')]To nie jest błąd; to reprezentacja obiektu (repr). Odpowiedzi mogą zawierać wiele typów bloków (tekst, wywołania narzędzi, proces myślowy), dlatego należy iterować i sprawdzać block.type == "text" przed odwołaniem się do .text. W przypadku Opus 5.5 ma to znaczenie już od pierwszego wywołania: proces myślowy jest zawsze włączony, więc o ile model nie pominie myślenia przy prostym zapytaniu, lista rozpoczyna się od bloku thinking, którego tekst jest domyślnie pusty, a response.content[0].text nie zawiera odpowiedzi. Wdrożenie tej pętli od pierwszego dnia eliminuje całą klasę problemów związanych z wyświetlaniem nieczytelnych danych.
Należy używać dokładnego identyfikatora modelu claude-opus-5-5. Począwszy od generacji 4.6, identyfikatory modeli nie zawierają daty, a identyfikator bez daty jest przypiętą migawką. Należy zatem powstrzymać się od nawyku (lub korzystania ze starych wpisów na blogach) sugerującego dodawanie sufiksu z datą do bieżącego modelu; powoduje to błąd 404, omówiony poniżej. Starsze modele działają odwrotnie: kanonicznym identyfikatorem dla Haiku 4.5 jest datowany claude-haiku-4-5-20251001.
Właściwe narzędzie: wyjaśnienie
Oto pełny program, wejście ze stdin, strumieniowa diagnostyka na wyjściu, obsługa błędów:
#!/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())Zapisz go jako /opt/explain/explain.py, a następnie dodaj wrapper, który wczytuje klucz do użytku interaktywnego:
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 musi być uruchamiany przez sudo lub plik środowiskowy musi należeć do grupy, w której znajduje się użytkownik administratora; należy wybrać jedno z tych rozwiązań zamiast nadawania uprawnień 644.)
Dlaczego strumieniowanie. client.messages.stream wypisuje tokeny w miarę ich napływania, zamiast czekać w bezczynności na zakończenie generowania. Pozwala to uniknąć przekroczenia limitów czasu HTTP przy długich odpowiedziach; SDK odrzuca bardzo duże wartości max_tokens w wywołaniach bez strumieniowania właśnie z tego powodu. text_stream zwraca wyłącznie tekst odpowiedzi, a przy domyślnym wyświetlaniu procesu myślowego w Opus 5.5, tekst ten nie jest w ogóle strumieniowany, dzięki czemu wyjście pozostaje przejrzyste. Jeśli po zakończeniu operacji potrzebny jest cały obiekt, należy wywołać stream.get_final_message() wewnątrz bloku with.
Dlaczego taka kolejność wyjątków. SDK zgłasza typowane wyjątki, zaczynając od najbardziej szczegółowych: RateLimitError to błąd 429, który zawiera nagłówek retry-after informujący o czasie oczekiwania; APIStatusError obejmuje pozostałe odpowiedzi inne niż 2xx (należy sprawdzić e.status_code >= 500 pod kątem problemów po stronie serwera); APIConnectionError oznacza, że żądanie w ogóle nie otrzymało odpowiedzi. Zanim zostanie zbudowana pętla ponawiania: SDK automatycznie ponawia żądania przy błędach 429 oraz 5xx, domyślnie dwukrotnie z wykładniczym wycofaniem (max_retries w kliencie). W momencie, gdy uruchamia się except, próby ponowienia zostały już wyczerpane, więc właściwym działaniem w CLI jest zgłoszenie błędu i zakończenie pracy, a nie usypianie procesu i ponowne wysyłanie zapytań.
Kontrola kosztów
Zagadnienie to wymaga osobnej sekcji, ponieważ API nie posiada wbudowanego limitu miesięcznego poza tym, który zostanie skonfigurowany, a każdy błąd w tym zakresie kumuluje się w sposób niezauważalny.
max_tokens to górny limit wydatków na wywołanie. Tokeny wyjściowe są droższym kierunkiem; w modelu Opus 5.5 kosztują pięciokrotnie więcej niż wejściowe, a max_tokens stanowi twardy limit liczby tokenów, które model może wygenerować. Niekontrolowany prompt nie wygeneruje kosztów wyjściowych większych niż zdefiniowany limit. W modelach 5.5 limit ten obejmuje również proces myślowy: tokeny myślowe są wliczane do max_tokens i rozliczane jako wyjściowe, mimo że tekst myślowy nie jest zwracany użytkownikowi. Należy dobrać rozmiar do zadania: 4,096 pozwala na zwięzłą diagnozę logów wraz z miejscem na proces myślowy; zadania klasyfikacyjne wymagają znacznie mniej. Jeśli odpowiedzi są ucinane z powodu stop_reason: "max_tokens", limit został ustawiony zbyt nisko; należy go świadomie zwiększyć (lub obniżyć ustawienie effort, aby model myślał mniej), zamiast domyślnie stosować bardzo wysokie wartości.
Zliczaj przed wysłaniem. Dane wejściowe również kosztują, a logi bywają obszerne. API udostępnia darmowy endpoint do zliczania tokenów (posiada on własne limity szybkości, niezależne od tworzenia wiadomości):
count = client.messages.count_tokens(
model="claude-opus-5-5",
messages=[{"role": "user", "content": big_log_text}],
)
print(count.input_tokens)Należy go używać, aby uniknąć przypadkowego przesyłania 2 GB logów przez narzędzie. Należy przekazać model, który faktycznie zostanie wywołany: Claude 4.7 i nowsze modele używają nowszego tokenizera, który generuje około 30% więcej tokenów dla tego samego tekstu niż wcześniejsze modele Claude. Nie należy używać do tego celu tiktoken, ponieważ jest to tokenizer OpenAI, a nie Claude, więc jego wyniki nie będą zgodne z tym, za co wystawiana jest faktura.
Wybieraj model do zadania, nie z przywiązania. Według stanu na październik 2026 r., Opus 5.5 (claude-opus-5-5) kosztuje 4 USD za milion tokenów wejściowych i 20 USD za milion wyjściowych; Haiku 5.5 (claude-haiku-5-5) kosztuje 0.10 USD / 0.50 USD dla promptów do 100,000 tokenów (0.50 USD / 2.50 USD powyżej tej wartości) przy kontekście 1M; Sonnet 5.5 (claude-sonnet-5-5) plasuje się pomiędzy nimi z cenami 2 USD / 10 USD. Konkretnie: 2,000-tokenowy fragment logu z 500-tokenową odpowiedzią kosztuje około 0.018 USD w modelu Opus i 0.00045 USD w modelu Haiku, plus koszt procesu myślowego modelu, który jest rozliczany jako wyjście. Należy zacząć od modelu Opus podczas oceny jakości odpowiedzi, a następnie przetestować te same prompty na modelu Haiku; w przypadku prostych transformacji o dużej skali, wyniki są często nieodróżnialne przy czterdziestokrotnie niższej cenie za token. Przed zakodowaniem tych wartości w budżecie należy zweryfikować aktualne ceny na stronie cennika.
Przetwarzanie wsadowe dla zadań, które mogą czekać. API Batches przetwarza żądania asynchronicznie za 50% ceny standardowej, a większość partii kończy się w ciągu godziny. Nocne podsumowania, uzupełnianie danych, masowa klasyfikacja – wszystko, co nie wymaga natychmiastowej reakcji człowieka, powinno być przetwarzane w ten sposób.
Buforowanie promptów dla powtarzalnego kontekstu. Jeśli każde wywołanie ponownie przesyła ten sam duży system prompt lub dokumentację, należy oznaczyć go jako możliwy do zbuforowania:
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 onZapis w pamięci podręcznej kosztuje 1.25x ceny wejściowej przy 5-minutowym TTL, a odczyt z pamięci podręcznej kosztuje 0.05x w modelach Opus 5.5 i Sonnet 5.5 (0.1x w większości innych modeli), więc drugie wywołanie w tym samym oknie czasowym zwraca koszt pierwszego. Istnieją dwa haczyki. Zbuforowany prefiks musi przekroczyć minimum dla danego modelu, wynoszące 512 tokenów dla Opus 5.5, więc bardzo krótki system prompt nie zostanie zbuforowany. Jeśli cache_read_input_tokens pozostaje zerowe przy identycznych wywołaniach, oznacza to, że coś w prefiksie zmienia się przy każdym żądaniu (zazwyczaj przyczyną jest znacznik czasu).
Pamiętaj, co wlicza się do danych wejściowych. System prompty, definicje narzędzi oraz – w konwersacjach wieloetapowych – cała historia przesyłana ponownie w każdej turze, są rozliczane jako tokeny wejściowe. Pętla czatu, która nie przycina historii, powoduje kwadratowy wzrost kosztów. Przed rozpoczęciem budowy jakiegokolwiek systemu konwersacyjnego warto zrozumieć pełny mechanizm rozliczeń: jak faktycznie sumuje się użycie tokenów i rozliczenia w Claude.
Uruchamianie w systemd
Dyscyplina w stosowaniu plików środowiskowych przynosi korzyść: timer, który każdego ranka podsumowuje błędy z poprzedniego dnia.
# /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 nowNależy zwrócić uwagę na korzyści płynące z EnvironmentFile=: systemd odczytuje plik należący do root z uprawnieniami 600 przed zmianą uprawnień na użytkownika explain, dzięki czemu proces otrzymuje zmienną, podczas gdy użytkownik nie ma możliwości odczytu pliku z kluczem. Grupa systemd-journal zapewnia dostęp do logów. Należy przeprowadzić test za pomocą ręcznego wywołania systemctl start i sprawdzić journalctl -u log-digest.service; nie należy czekać do godziny 06:15, aby wykryć literówkę. Gdy ten schemat przestaje wystarczać dla potoku powłoki, to samo podejście z kluczem w pliku środowiskowym można bezpośrednio przenieść do przepływów pracy n8n zintegrowanych z Claude na tej samej maszynie.
Tryby awarii i towarzyszące im komunikaty
401 przy działającym kluczu. Wyjątek zawiera treść:
anthropic.AuthenticationError: Error code: 401 - {'type': 'error', 'error': {'type': 'authentication_error', 'message': 'invalid x-api-key'}, 'request_id': 'req_011CSHoEeqs5C35K2UUqR7Fy'}Jeśli klucz działa w powłoce, a usługa zwraca 401, oznacza to, że usługa go nie otrzymała. Należy pamiętać, że systemd nie odczytuje .bashrc; sprawdź, czy EnvironmentFile= wskazuje na właściwą ścieżkę. Inne przyczyny: cudzysłowy wklejone do pliku env (ANTHROPIC_API_KEY="sk-ant-...", systemd usuwa cudzysłowy, ale . file w skrypcie powłoki może je zachować w wartości, jeśli użyto nietypowego cytowania), znaki odstępu na końcu linii, klucz unieważniony w konsoli w zeszłym tygodniu lub klucz, który osiągnął datę wygaśnięcia wybraną podczas tworzenia.
404 z powodu literówki w nazwie modelu. Najczęstszym przypadkiem jest dodanie przyrostka daty do identyfikatora modelu, który nie posiada wersji datowanej:
anthropic.NotFoundError: Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', 'message': 'model: claude-opus-5-5-20260922'}, 'request_id': 'req_011CSJqymAvNw4bT3qmDdMbA'}Identyfikatory bieżącej generacji są dokładne, tak jak zapisano: claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5, claude-fable-5-1. Wyjątkiem są modele sprzed generacji 4.6: claude-haiku-4-5 to wygodny alias dla datowanego identyfikatora claude-haiku-4-5-20251001 i obie formy działają. Identyfikatory należy kopiować z dokumentacji modeli, nigdy z pamięci lub starych poradników.
429 rate_limit_error. Typ błędu to rate_limit_error, a odpowiedź zawiera nagłówek retry-after z liczbą sekund oczekiwania. Zestaw SDK podjął już dwie próby ponowienia z wycofaniem (backoff), zanim wystąpił wyjątek. Trwałe błędy 429 oznaczają, że stałe tempo zapytań faktycznie przekracza posiadany limit. Należy przetwarzać zadania w partiach lub rozłożyć je w czasie, zamiast skracać pętlę ponowień.
Wyświetlany jest obiekt, a nie tekst. Dane wyjściowe wyglądają jak [TextBlock(citations=None, text='...', type='text')]. Wydrukowano response.content zamiast iterować po blokach i odczytywać .text z tych, w których block.type == "text". Każdy powyższy przykład SDK robi to poprawnie; należy skopiować pętlę.
error: externally-managed-environment. Uruchomiono pip install w systemowym środowisku Python w systemie Ubuntu 24.04. Należy używać venv, nigdy --break-system-packages na serwerze, który ma pozostać stabilny.
Ucięte odpowiedzi. response.stop_reason == "max_tokens" oznacza, że model osiągnął limit wyjściowy w trakcie generowania odpowiedzi. Jest to działanie zgodne z projektem; należy celowo zwiększyć limit, pamiętając, że w modelach 5.5 proces myślowy również zużywa ten sam limit.
Gdy pierwsza aplikacja zacznie działać, budowanie agenta AI z Claude pozwoli przekształcić te same wywołania API w agenta korzystającego z narzędzi.
FAQ
Ile kosztuje testowanie API Claude?
Niewiele w odniesieniu do możliwości narzędzia. Według stanu na październik 2026, model Opus 5.5 kosztuje 4 USD za milion tokenów wejściowych i 20 USD za milion wyjściowych. Typowa analiza logów, obejmująca kilka tysięcy tokenów wejściowych i kilkaset wyjściowych, kosztuje około dwóch centów (wliczając tokeny procesowe rozliczane jako wyjściowe). W przypadku modelu Haiku 5.5 (0,10 USD / 0,50 USD) koszt ten wynosi znacznie poniżej jednej dziesiątej centa. Miesięczny koszt codziennych podsumowań jest niższy niż cena kawy. Ryzyko nie wynika z ceny za pojedyncze wywołanie, lecz z nieograniczonych pętli i nieograniczonych max_tokens, dlatego w tym przewodniku oba te parametry są ustawiane jawnie.
Czy istnieje darmowy plan dla API Claude?
Według stanu na październik 2026 nie ma stałego darmowego planu. Dokumentacja cenowa Anthropic wskazuje, że nowi użytkownicy otrzymują niewielką pulę darmowych kredytów na testy API w ramach jednorazowego okresu próbnego. Dokładna kwota jest widoczna w konsoli po rejestracji, po czym należy zasilić konto. Wyjątkiem są subskrybenci planów Max i Team: ich plany obejmują miesięczne kredyty API, o których mowa powyżej. Jeśli celem jest zerowy koszt krańcowy za żądanie, a nie jakość klasy frontier, alternatywą jest samodzielne uruchomienie modelu open-weight za pomocą Ollama, gdzie płaci się zasobami RAM, a nie tokenami.
Jak bezpiecznie przechowywać klucz API na serwerze?
Klucza nie należy umieszczać w kodzie, w repozytoriach git, eksportować z .bashrc ani wpisywać w powłoce, gdzie zostanie zapisany w historii. Należy umieścić go w pliku należącym do użytkownika root z uprawnieniami 600, ładować go dla każdego procesu, używać skryptu opakowującego do pracy interaktywnej, stosować EnvironmentFile= dla systemd oraz przypisywać jeden klucz na serwer lub projekt. Dzięki temu unieważnienie wyciekłego klucza jest operacją punktową, a nie globalną. Jeśli klucz trafi do serwisu typu pastebin lub zostanie zatwierdzony w commitcie git, należy go natychmiast unieważnić w konsoli; usunięcie commita nie cofa wycieku.
Od którego modelu Claude zacząć?
Należy zacząć od claude-opus-5-5 podczas oceny, czy generowane wyniki są wystarczająco dobre do dalszych prac. Pozwala to ocenić koncepcję przy pełnej jakości, a przy hobbystycznym wolumenie różnica w kosztach wynosi zaledwie centy. Gdy prompt zostanie dopracowany, należy przetestować rzeczywiste dane wejściowe na claude-haiku-5-5. W przypadku podsumowań, klasyfikacji i analizy logów model ten jest często wystarczająco dobry, kosztując czterdziestokrotnie mniej za token. Przejście na Haiku lub Sonnet powinno być decyzją opartą na pomiarach, a nie domyślnym wyborem.