Powrót do bloga

Pierwsze krokiPrzewodnik

Pierwsze żądanie do CheapTokens z HTTPie: klucz w env, = i :=

Jedno czytelne polecenie http, które wysyła uzupełnienie czatu z kluczem w zmiennej środowiskowej, a następnie pokazuje, gdzie jest odpowiedź i zużycie tokenów.

Autor: CheapTokens TeamOpublikowano 4 min czytania

Terminal pokazujący polecenie http ze zmienną klucza bearer i polami JSON
Na tej stronie
  1. Co faktycznie robią = i :=
  2. Gdzie jest odpowiedź
  3. Zmień model: zmień jedno pole
  4. Ile kosztuje jedno testowe żądanie
  5. Jeśli nie działa

Chcesz wiedzieć, że klucz działa i że identyfikator modelu jest prawidłowy — i chcesz to wiedzieć w jednej linii. Polecenie http w HTTPie robi to z dużo mniejszą liczbą cudzysłowów niż curl: wpisujesz pola, a ono buduje JSON. Oto całe żądanie, a reszta artykułu wyjaśnia każdy element.

bash
export CHEAPTOKENS_API_KEY="paste-your-key-here"

http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"In one sentence, what is a token?"}]'

API jest zgodne z OpenAI, więc bazowy URL to https://api.cheaptokens.dev/v1, a żądania czatu trafiają pod /chat/completions. Identyfikator modelu jest pełny: deepseek-ai/DeepSeek-V4-Flash-0731 (krótka nazwa z tabel cen nie jest akceptowana). Jeśli wcześniej nie zapisywałeś klucza, najpierw bezpiecznie zapisz klucz API: wpisanie linii export umieszcza klucz w historii powłoki, więc lepszym miejscem dla niego jest plik profilu lub menedżer sekretów.

Żądanie w terminalu: klucz bearer ze zmiennej, model jako string, max_tokens jako liczba, messages jako surowa tablica
To samo żądanie widziane w terminalu

Co faktycznie robią = i :=#

To jedyna część HTTPie, której musisz się nauczyć. Dokumentacja JSON HTTPie (wersja 3.2.4, z 1 listopada 2024, czytana 9 listopada 2026) mówi, że = ustawia pole tekstowe, a := ustawia surową wartość JSON: liczbę, wartość logiczną, tablicę lub obiekt. Pola podane w ten sposób są domyślnie wysyłane jako treść JSON, więc nie dodajesz sam nagłówka Content-Type.

W naszym żądaniu daje to trzy różne kształty:

  • model=deepseek-ai/DeepSeek-V4-Flash-0731 to string, więc =.
  • max_tokens:=200 to liczba, więc :=. Z = wysłałbyś string "200".
  • messages:=[…] to tablica obiektów, więc znowu :=, a wartość jest w pojedynczych cudzysłowach, żeby powłoka nie ruszała wewnętrznych podwójnych cudzysłowów.

Dokumentacja mówi też, że treści ze standardowego wejścia nie można łączyć z polami z wiersza poleceń, więc wybierz jeden styl. Do pierwszego testu pola są krótsze i łatwiejsze do edycji.

Szybkie sprawdzenie

Co wysyła max_tokens=200 (ze zwykłym =)?

Pokaż odpowiedź

Odpowiedź: String "200"

= zawsze tworzy string. Dla liczby potrzebujesz :=, więc napisz max_tokens:=200.

Gdzie jest odpowiedź#

Odpowiedź ma format uzupełnień czatu OpenAI. Szukasz trzech rzeczy i znajdują się one w różnych miejscach:

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "…the answer text…" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": …, "completion_tokens": …, "total_tokens": … }
}

Tekst odpowiedzi to choices[0].message.content. finish_reason jest obok niego w tym samym wyborze, a usage jest na najwyższym poziomie. usage pokazuje, ile tokenów wysłałeś (prompt_tokens) i ile napisał model (completion_tokens), co jest przydatne do szacowania kosztu żądania.

Gdzie patrzeć w odpowiedzi: choices, message.content, finish_reason i usage
Trzy pola do odczytania w każdej odpowiedzi

Jeśli chcesz tylko tekst, przekieruj treść do jq:

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"In one sentence, what is a token?"}]' \
  | jq -r '.choices[0].message.content'
Spróbuj samWypróbuj: ustaw limit za mały i odczytaj finish_reasonPokaż odpowiedź

Zmień max_tokens:=200 na max_tokens:=5 i uruchom ponownie. Odpowiedź jest ucięta, a finish_reason ma wartość length zamiast stop: limit zatrzymał model, a nie koniec myśli. Dlaczego odpowiedź się urywa omawia rozwiązanie.

Zmień model: zmień jedno pole#

Model to jeden string, więc wypróbowanie innego to edycja jednego słowa. Oba poniższe identyfikatory są dostępne w CheapTokens z jednym saldem; DeepSeek-V4-Flash daje kontekst 380K i do 32 768 tokenów wyjściowych na odpowiedź, GLM-5.3-Flash kontekst 390K i do 8 192.

Jedno żądanie, dwa modele

DeepSeek-V4-Flash

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=deepseek-ai/DeepSeek-V4-Flash-0731 \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"Name three uses of a token limit."}]'

GLM-5.3-Flash

bash
http --body -A bearer -a "$CHEAPTOKENS_API_KEY" \
  POST https://api.cheaptokens.dev/v1/chat/completions \
  model=zai-org/GLM-5.3-Flash \
  max_tokens:=200 \
  'messages:=[{"role":"user","content":"Name three uses of a token limit."}]'

Nie wiesz, którego identyfikatora użyć? Wypisz modele za pomocą GET /v1/models i skopiuj dokładny string.

Ile kosztuje jedno testowe żądanie#

Krótkie pytanie, takie jak to, jest tanie. Załóżmy, że pytanie ma około 100 tokenów, a odpowiedź około 150: to żądanie kosztuje $0.000017. Tysiąc takich wygląda tak, z wejściem i wyjściem liczonym razem:

Model Za żądanie 1000 żądań OpenRouter, 1000 żądań
GLM-5.3-Flash $0.000008 $0.008 $0.0158
DeepSeek-V4-Flash $0.000017 $0.0165 $0.028
MiniMax-M2.7 $0.000028 $0.0275 $0.33

100 tokenów wejściowych i 150 tokenów wyjściowych na żądanie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.

Łącznie, z wejściem i wyjściem liczonym razem, DeepSeek-V4-Flash wypada taniej niż OpenRouter, a cena to jedna stała stawka bez godzin szczytu. Aktualne stawki dla każdego modelu są na stronie cen.

Jeśli nie działa#

  • Wpisałeś messages=[…] ze zwykłym =. Tablica wychodzi jako string, a nie lista wiadomości. Użyj := i pojedynczych cudzysłowów wokół całej wartości.
  • JSON wewnątrz := jest nieprawidłowy. Każdy klucz i string wymaga podwójnych cudzysłowów, a zewnętrzne cudzysłowy muszą być pojedyncze. Jeśli edytujesz tekst wiadomości, zachowaj równowagę cudzysłowów.
  • Klucz jest pusty. echo ${#CHEAPTOKENS_API_KEY} wypisuje długość bez pokazywania klucza; 0 oznacza, że zmienna nie jest ustawiona w tym terminalu.
  • Identyfikator modelu to krótka nazwa. Użyj pełnego deepseek-ai/DeepSeek-V4-Flash-0731. W przypadku odpowiedzi 401 i 404 zobacz zły klucz, bazowy URL lub identyfikator modelu.
  • Sięgnąłeś po --session. Dokumentacja uwierzytelniania HTTPie mówi, że pliki sesji przechowują dane uwierzytelniające w postaci zwykłego tekstu, więc trzymaj klucz w środowisku i pomiń --session w tym poleceniu.

Sprawdź swoją wersję za pomocą http --version, jeśli jakaś flaga zachowuje się inaczej niż opisano powyżej. Wolisz Python? To samo żądanie bez SDK jest w pierwsze żądanie w Pythonie z requests. Pełna dokumentacja API jest w dokumentacji CheapTokens.