Zurück zum Blog

Erste SchritteAnleitung

Erste Anfrage an CheapTokens mit HTTPie: Key in env, = und :=

Ein lesbarer http-Befehl, der eine Chat-Completion mit dem Key in einer Umgebungsvariable sendet und dann zeigt, wo die Antwort und der Token-Verbrauch stehen.

Von CheapTokens TeamVeröffentlicht am 4 Min. Lesezeit

Ein Terminal, das einen http-Befehl mit einer Bearer-Key-Variable und JSON-Feldern zeigt
Auf dieser Seite
  1. Was = und := tatsächlich tun
  2. Wo die Antwort steht
  3. Modell wechseln: ein Feld ändern
  4. Was eine Testanfrage kostet
  5. Wenn es nicht funktioniert

Du willst wissen, dass der Key funktioniert und die Modell-ID stimmt, und das in einer Zeile. HTTPies Befehl http erledigt das mit weit weniger Quoting als curl: Du tippst die Felder, er baut das JSON. Hier ist die komplette Anfrage, und der Rest des Artikels erklärt jedes Stück.

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?"}]'

Die API ist OpenAI-kompatibel, also ist die Basis-URL https://api.cheaptokens.dev/v1 und Chat-Anfragen gehen an /chat/completions darunter. Die Modell-ID ist die vollständige, deepseek-ai/DeepSeek-V4-Flash-0731 (der Kurzname aus Preistabellen wird nicht akzeptiert). Wenn du noch keinen Key gespeichert hast, speichere einen API-Key sicher zuerst: Die Zeile export zu tippen legt den Key in deiner Shell-History ab, also ist eine Profildatei oder ein Secrets-Manager der bessere Ort dafür.

Die Anfrage in einem Terminal: Bearer-Key aus der Variable, Modell als String, max_tokens als Zahl, messages als rohes Array
Dieselbe Anfrage, wie sie im Terminal aussieht

Was = und := tatsächlich tun#

Das ist der einzige Teil von HTTPie, den du lernen musst. HTTPies JSON-Dokumentation (Version 3.2.4, datiert auf den 1. November 2024, gelesen am 9. November 2026) sagt, dass = ein String-Feld setzt und := einen rohen JSON-Wert: eine Zahl, einen Boolean, ein Array oder ein Objekt. So angegebene Felder werden standardmäßig als JSON-Body gesendet, du fügst also keinen Content-Type-Header selbst hinzu.

In unserer Anfrage ergibt das drei verschiedene Formen:

  • model=deepseek-ai/DeepSeek-V4-Flash-0731 ist ein String, also =.
  • max_tokens:=200 ist eine Zahl, also :=. Mit = würdest du den String "200" senden.
  • messages:=[…] ist ein Array von Objekten, also wieder :=, und der Wert steht in einfachen Anführungszeichen, damit die Shell die inneren doppelten Anführungszeichen in Ruhe lässt.

Die Doku sagt außerdem, dass ein Body von stdin nicht mit Kommandozeilen-Feldern kombiniert werden kann, also wähle einen Stil. Für einen ersten Test sind die Felder kürzer und leichter zu bearbeiten.

Kurzer Check

Was sendet max_tokens=200 (mit einem einfachen =)?

Antwort anzeigen

Antwort: Den String "200"

= erzeugt immer einen String. Für eine Zahl brauchst du :=, also schreibe max_tokens:=200.

Wo die Antwort steht#

Die Antwort folgt dem OpenAI-Chat-Completions-Format. Du suchst drei Dinge, und sie stehen an verschiedenen Stellen:

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

Der Antworttext ist choices[0].message.content. finish_reason steht daneben in derselben Choice, und usage steht auf der obersten Ebene. usage zeigt, wie viele Tokens du gesendet hast (prompt_tokens) und wie viele das Modell geschrieben hat (completion_tokens), was praktisch ist, um die Kosten einer Anfrage abzuschätzen.

Wo man in der Antwort nachsieht: choices, message.content, finish_reason und usage
Drei Felder, die man in jeder Antwort liest

Wenn du nur den Text willst, pipe den Body an 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'
Probier es selbstProbier es aus: Mach das Limit zu klein und lies finish_reasonAntwort anzeigen

Ändere max_tokens:=200 zu max_tokens:=5 und führe es erneut aus. Die Antwort ist abgeschnitten, und finish_reason liest length statt stop: Das Limit hat das Modell gestoppt, nicht das Ende des Gedankens. Warum eine Antwort abgeschnitten wird behandelt die Lösung.

Modell wechseln: ein Feld ändern#

Das Modell ist ein String, also ist ein anderes auszuprobieren eine Ein-Wort-Änderung. Beide IDs unten sind auf CheapTokens mit einem Guthaben verfügbar; DeepSeek-V4-Flash gibt dir einen 380K-Kontext und bis zu 32.768 Ausgabe-Tokens pro Antwort, GLM-5.3-Flash einen 390K-Kontext und bis zu 8.192.

Eine Anfrage, zwei Modelle

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."}]'

Nicht sicher, welche ID du verwenden sollst? Liste die Modelle mit GET /v1/models und kopiere den exakten String.

Was eine Testanfrage kostet#

Eine kurze Frage wie diese ist günstig. Sagen wir, die Frage hat etwa 100 Tokens und die Antwort etwa 150: Diese Anfrage kostet $0.000017. Tausend davon sehen so aus, mit Input und Output zusammengezählt:

Modell Pro Anfrage 1.000 Anfragen OpenRouter, 1.000 Anfragen
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 Input- und 150 Output-Tokens pro Anfrage. Die Preise pro 1 Mio. Tokens sind aktuell und ändern sich zusammen mit unseren Tarifen; die OpenRouter-Spalte zeigt Referenzpreise für dieselbe Arbeitslast.

Insgesamt, mit Input und Output zusammengezählt, kommt DeepSeek-V4-Flash günstiger weg als OpenRouter, und der Preis ist ein fester Satz ohne Stoßzeiten. Aktuelle Preise für jedes Modell stehen auf der Preisseite.

Wenn es nicht funktioniert#

  • Du hast messages=[…] mit einem einfachen = getippt. Das Array geht als String raus, nicht als Liste von Messages. Verwende := und einfache Anführungszeichen um den ganzen Wert.
  • Das JSON in := ist ungültig. Jeder Key und jeder String braucht doppelte Anführungszeichen, und die äußeren müssen einfach sein. Wenn du den Nachrichtentext bearbeitest, halte die Anführungszeichen im Gleichgewicht.
  • Der Key ist leer. echo ${#CHEAPTOKENS_API_KEY} gibt die Länge aus, ohne den Key zu zeigen; 0 bedeutet, dass die Variable in diesem Terminal nicht gesetzt ist.
  • Die Modell-ID ist der Kurzname. Verwende die vollständige deepseek-ai/DeepSeek-V4-Flash-0731. Für 401- und 404-Antworten siehe falscher Key, Basis-URL oder Modell-ID.
  • Du hast zu --session gegriffen. HTTPies Authentifizierungsdoku sagt, dass Session-Dateien Anmeldedaten im Klartext speichern, also halte den Key in der Umgebung und lass --session aus diesem Befehl raus.

Prüfe deine Version mit http --version, wenn sich ein Flag anders verhält als oben beschrieben. Lieber Python? Dieselbe Anfrage ohne SDK steht in erste Anfrage in Python mit requests. Für die vollständige API-Referenz siehe die CheapTokens-Doku.