Zum Inhalt springen

Eine Zeile Code, und du läufst in der Europäischen Union.

Die API ist OpenAI-kompatibel. Bestehende SDKs, Frameworks und bestehender Code funktionieren weiter: Du tauschst die base_url aus und wählst eine Stufe statt eines Modellnamens.

Schnellstart: dein erster API-Aufruf

Erstelle in deinem Dashboard unter Einstellungen, API-Schlüssel einen Schlüssel. Das Secret siehst du genau einmal. Danach speichern wir nur noch einen Hash und das Präfix. Leg es in eine Umgebungsvariable, niemals in dein Repository.

curl
curl https://api.europeanailab.eu/v1/chat/completions \
  -H "Authorization: Bearer $UNION_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "eu-standard",
    "messages": [{"role": "user", "content": "Erkläre das Reverse-Charge-Verfahren nach § 13b UStG."}]
  }'
python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["UNION_API_KEY"],
    base_url="https://api.europeanailab.eu/v1",   # die einzige Zeile, die sich ändert
)

resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Erkläre das Reverse-Charge-Verfahren nach § 13b UStG."}],
)
print(resp.choices[0].message.content)

Node, Go, Java oder .NET?

Jedes offizielle OpenAI-SDK funktioniert: Setz die Base URL auf https://api.europeanailab.eu/v1 und nutze deinen Union-Schlüssel. Wir implementieren den Chat-Completions-Vertrag, inklusive Streaming, Tools und JSON-Schemas.

Modellstufen und Kontextfenster

Im Feld model übergibst du eine Stufe, keinen Modellnamen. So funktioniert deine Integration weiter, wenn wir das Modell darunter austauschen. Und das werden wir, denn Open-Weight-Modelle werden abgekündigt und überholt.

StufeKontextInput / 1 Mio.Output / 1 Mio.Geeignet für
eu-lite131K0,40 €1,60 €Schnelle, günstige Aufgaben: Klassifizierung, Extraktion, kurze Antworten.
eu-standard262K0,70 €3,50 €Das Arbeitspferd. Standard für den Chat und den Großteil des API-Traffics.
eu-long1.000K1,00 €2,00 €Ganze Akten, Verträge und Codebasen in einem einzigen Prompt.
eu-pro1.000K4,00 €12,00 €Anspruchsvolles Reasoning, Agents, komplexer Code.

Überschreitest du das Kontextfenster einer Stufe, bekommst du eine 400 mit dem Maximum darin: Wir kürzen deinen Prompt nie stillschweigend.

Streaming-Antworten

Streaming funktioniert, wie du es erwartest, mit einem wichtigen Unterschied, den du kennen musst, weil es um dein Geld geht.

Schalte include_usage ein

Beim OpenAI-kompatiblen Streaming sendet die API standardmäßig keine Token-Nutzung. Ohne stream_options: {"include_usage": true} siehst du am Ende eines Streams nicht, was der Aufruf gekostet hat. Wir rechnen ihn so oder so ab: Es geht darum, dass auch du es sehen und prüfen kannst.
python
stream = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Schreib eine Zusammenfassung."}],
    stream=True,
    # Ohne das gibt es kein usage-Objekt und du siehst die Kosten nicht.
    stream_options={"include_usage": True},
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")
    if chunk.usage:                      # letzter Chunk
        print("\n", chunk.usage)

Brichst du einen Stream mittendrin ab, zahlst du nur, was bis dahin generiert wurde. Kommt wegen der abgebrochenen Verbindung kein Usage-Chunk an, schätzen wir den Verbrauch und korrigieren ihn beim täglichen Abgleich mit unserem Anbieter. Bis dahin steht eine solche Zeile in deiner Nutzungsübersicht als estimated.

Function Calling und Tool Use

Tools folgen dem bekannten Schema. Erzeugt ein Modell einen Tool Call, der nicht zu deinem Schema passt, protokollieren wir ihn: In Version 1 korrigieren wir ihn nicht stillschweigend, denn eine heimlich reparierte Ausgabe ist schlimmer als ein sichtbarer Fehler.

python
tools = [{
    "type": "function",
    "function": {
        "name": "find_invoice",
        "description": "Sucht eine Rechnung anhand ihrer Nummer.",
        "parameters": {
            "type": "object",
            "properties": {"number": {"type": "string"}},
            "required": ["number"],
        },
    },
}]

resp = client.chat.completions.create(
    model="eu-standard", messages=messages, tools=tools
)

Structured Output mit einem JSON-Schema

Übergib ein JSON-Schema und validiere die Antwort auf deiner Seite. Unser Rat: immer validieren, auch wenn sich das Modell meistens benimmt.

python
resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Extrahiere Name und Betrag."}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "invoice",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "amount_eur": {"type": "number"},
                },
                "required": ["name", "amount_eur"],
            },
        },
    },
)

Response-Header: Kosten, Stufe und Routing

Jede Antwort sagt dir, was passiert ist. Das ist kein Debugging-Extra, sondern der Kern: Du kannst selbst prüfen, ob du bekommen hast, wofür du bezahlt hast.

HeaderBedeutung
X-EU-Model-TierDie Stufe, auf der diese Anfrage lief.
X-EU-RoutedVorhanden, wenn die Anfrage an ein anderes Modell umgeleitet wurde, mit dem Grund: censorship oder error.
X-EU-Degradedtrue, wenn das Ersatzmodell schwächer ist oder ein kleineres Kontextfenster hat. Du zahlst dann den niedrigeren der beiden Tarife.
X-EU-Refusal-ClassVorhanden bei einer Ablehnung, die wir nicht umleiten konnten, zum Beispiel A-unrouteable, wenn keine Alternative genug Kontext hat.
X-EU-Tokens-In / -OutAbgerechnete Tokens für diese Anfrage.
X-EU-Cost-EURWas diese Anfrage von deinem Guthaben abgezogen hat, in Euro.
X-EU-Balance-EURDein verbleibendes Guthaben nach dieser Anfrage.

Rate Limits und Ausgabengrenzen

Es gibt ein Limit pro Schlüssel und pro Konto, dazu die Grenzen, die du selbst festlegst. Letztere sind wichtiger, als es klingt: Ohne Grenze kann ein geleakter Schlüssel oder eine Endlosschleife in deinem eigenen Code ein Guthaben über Nacht leeren.

  • Anfragen pro Minute, pro Schlüssel und pro Konto.
  • Tages- und Monatsgrenze in Euro, pro Schlüssel einstellbar.
  • Neue Konten: höchstens 25 € pro Tag in den ersten 48 Stunden, egal wie hoch das Guthaben ist.
  • Sehen wir innerhalb einer Stunde mehr als das Zehnfache deines Wochendurchschnitts, pausieren wir den Schlüssel automatisch und schreiben dir eine E-Mail. Lieber ein Fehlalarm als ein leeres Konto.
  • Eine Anfrage startet erst, wenn dein Guthaben mindestens 0,05 € beträgt.

Fehlercodes und was du tun kannst

CodeBedeutungWas tun
400Ungültige Anfrage oder ein Prompt über dem Kontextfenster.Korrigiere die Anfrage; das Maximum steht in der Fehlermeldung.
401Unbekannter, widerrufener oder pausierter Schlüssel.Prüfe den Schlüssel in deinem Dashboard.
402Guthaben reicht nicht aus.Lade auf. Die Antwort enthält einen direkten Link.
403Anfrage verstößt gegen die Nutzungsrichtlinie.Siehe Fair Use weiter unten.
429Rate Limit oder Grenze erreicht.Warte und versuch es erneut; halte dich an Retry-After.
502 / 503Upstream-Modell nicht verfügbar, kein Fallback möglich.Versuch es erneut. Siehe Statusseite.

Fehlgeschlagene Anfragen kosten dich nichts: Kam keine brauchbare Antwort zurück, geht nichts von deinem Guthaben ab.

Fair Use und Nutzungsrichtlinie

Wir lehnen Anleitungen für Waffen, Malware und Betrug ab, ebenso Material, das Kindern schadet. Diese Ablehnungen sind endgültig: Wir leiten eine solche Anfrage nie an ein anderes Modell weiter, um doch noch eine Antwort herauszuholen.

Etwas anderes ist es, wenn ein Modell eine legitime Frage zu Politik, Geschichte oder einem gesellschaftlich heiklen Thema ablehnt: Das behandeln wir als Mangel und schicken die Frage an ein Modell ohne diesen blinden Fleck. Du siehst das im Header X-EU-Routed: censorship.

Eines unserer Modelle ist mit einer eigenen Nutzungsrichtlinie lizenziert. Diese Richtlinie gilt uneingeschränkt: Umleiten hebelt keine Lizenzbedingungen aus.

Unsicher, ob dein Anwendungsfall passt? Schreib an hello@europeanailab.eu. Eine Antwort vorab ist für uns beide günstiger als ein gesperrter Schlüssel hinterher.

Häufige Fragen

Die Fragen, die per E-Mail kommen, bevor jemand einen Schlüssel erstellt: womit die API kompatibel ist, was eine Anfrage kostet und wo sie läuft.

Welche OpenAI-SDKs funktionieren mit einer OpenAI-kompatiblen API?

Alle offiziellen, denn sie sind schlanke Clients für den Chat-Completions-Vertrag und nehmen die Base URL als Konstruktor-Argument. Am häufigsten sind die SDKs für Python und Node; Go, Java und .NET funktionieren genauso. Deine Retry-Logik, dein Streaming-Handling und deine Typen bleiben, wie sie sind.

Kann ich LangChain oder das Vercel AI SDK damit nutzen?

Ja. Beide bieten die Base URL als Einstellung ihres OpenAI-Providers an: Du richtest sie auf unseren Host und nutzt einen Union-AI-Schlüssel. Alles andere, bei dem du die Base URL überschreiben kannst, funktioniert nach demselben Prinzip, auch die meisten Agent-Frameworks und Evaluations-Tools.

Unterstützt die API Streaming und Function Calling?

Ja, beides, dazu Structured Output nach einem JSON-Schema. Gestreamte Antworten liefern die Token-Nutzung am Ende des Streams mit. So kannst du eine gestreamte Anfrage genauso exakt abrechnen wie eine normale.

Welche Rate Limits gelten für die API?

Es gibt ein Limit für Anfragen pro Minute pro Schlüssel und pro Konto, dazu Tages- und Monatsgrenzen in Euro, die du selbst festlegst. Neue Konten sind in den ersten 48 Stunden auf 25 € pro Tag begrenzt, egal wie hoch das Guthaben ist. Wer ein Limit erreicht, bekommt eine 429 mit einem Retry-After-Header.

Wie gehe ich mit 429-Fehlern und Retries um?

Halte dich an Retry-After, statt sofort erneut zu senden, und warte exponentiell länger mit etwas Zufall, damit sich ein Ansturm nicht über all deine Worker synchronisiert. Wiederhole eine 402 nicht: Dann ist das Guthaben leer, und eine Schleife wiederholt nur den Fehler. Ein Retry reicht meistens, denn ein zweiter Fehlschlag bringt selten eine andere Antwort.

Wie sehe ich, was eine API-Anfrage gekostet hat?

Jede Antwort trägt Header: X-EU-Tokens-In und X-EU-Tokens-Out für die abgerechneten Tokens, X-EU-Cost-EUR für den Betrag, der von deinem Guthaben abging, und X-EU-Balance-EUR für den Rest. Deine eigenen Logs beantworten die Kostenfrage also pro Feature oder pro Kunde, ohne dass du ein Dashboard öffnen musst.

Welches Modell läuft hinter welcher Stufe?

Jede Stufe gehört zu einem namentlich genannten Open-Weight-Modell, veröffentlicht mit Lizenz und Kontextfenster auf der Seite KI-Transparenz. Du kaufst die Stufe, nicht den Modellnamen. So können wir das Modell darunter austauschen, ohne deine Integration zu brechen, und wir sagen dir, wenn wir es tun.

Eine bestehende Integration umzuziehen sind drei Zeilen: der Schlüssel, die Base URL und ein Stufenname. Die ganze Änderung und was sich nicht übertragen lässt, steht in Wechseln in drei Zeilen. Noch Fragen? Die Tarife pro Stufe findest du auf der Preisseite, Modell und Lizenz hinter jeder Stufe unter KI-Transparenz und was bei einem Ausfall passiert auf der Statusseite. Zwei längere Texte: was eine KI-API pro Token kostet und wohin deine Prompts wirklich gehen.

Starte mit KI für Europäer.

Nutze KI, ohne deine Daten ins Ausland zu schicken: alles auf europäischen Servern, zu einem europäischen Preis.

13 € im Monat für den Chat, jederzeit kündbar. Oder pro Token ab 10 € Guthaben.

Noch unsicher? Mach das 60-Sekunden-Quiz →