En rad kod, och du kör inom Europeiska unionen.
API:et är OpenAI-kompatibelt. Befintliga SDK:er, ramverk och befintlig kod fortsätter att fungera: du byter base_url och väljer en nivå i stället för ett modellnamn.
Snabbstart: ditt första API-anrop
Skapa en nyckel i din dashboard under Inställningar, API-nycklar. Du ser hemligheten exakt en gång. Därefter sparar vi bara en hash och prefixet. Lägg den i en miljövariabel, aldrig i ditt repository.
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": "Förklara omvänd skattskyldighet för moms."}]
}'import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["UNION_API_KEY"],
base_url="https://api.europeanailab.eu/v1", # den enda raden som ändras
)
resp = client.chat.completions.create(
model="eu-standard",
messages=[{"role": "user", "content": "Förklara omvänd skattskyldighet för moms."}],
)
print(resp.choices[0].message.content)Node, Go, Java eller .NET?
https://api.europeanailab.eu/v1 och använd din Union-nyckel. Vi implementerar chat completions-kontraktet, inklusive streaming, verktyg och JSON-scheman.Modellnivåer och kontextfönster
Du anger en nivå i fältet model, inte ett modellnamn. Då fortsätter din integration att fungera när vi byter modellen under, och det kommer vi att göra, eftersom open-weight-modeller pensioneras och blir omsprungna.
| Nivå | Kontext | Input / 1 milj. | Output / 1 milj. | Bäst för |
|---|---|---|---|---|
eu-lite | 131K | 0,40 € | 1,60 € | Snabbt, billigt arbete: klassificering, extrahering, korta svar. |
eu-standard | 262K | 0,70 € | 3,50 € | Arbetshästen. Standard för chatten och den mesta API-trafiken. |
eu-long | 1 000K | 1,00 € | 2,00 € | Hela ärendeakter, avtal och kodbaser i en enda prompt. |
eu-pro | 1 000K | 4,00 € | 12,00 € | Tungt resonerande, agenter, komplex kod. |
Går du över en nivås kontextfönster får du en 400 med maxvärdet i: vi kortar aldrig tyst av din prompt.
Strömmade svar
Streaming fungerar som du förväntar dig, med en viktig skillnad som du behöver känna till eftersom den gäller dina pengar.
Slå på include_usage
stream_options: {"include_usage": true} kan du inte se i slutet av strömmen vad anropet kostade. Vi mäter det i vilket fall som helst: poängen är att du också ska kunna se och kontrollera det.stream = client.chat.completions.create(
model="eu-standard",
messages=[{"role": "user", "content": "Skriv en sammanfattning."}],
stream=True,
# Utan detta finns inget usage-objekt och du ser inte kostnaden.
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: # sista chunken
print("\n", chunk.usage)Avbryter du en ström halvvägs betalar du bara för det som genererats fram till dess. Om den brutna anslutningen gör att ingen usage-chunk kommer fram uppskattar vi förbrukningen och rättar den i den dagliga avstämningen med vår leverantör. En sådan rad står som estimated i din förbrukningsöversikt tills den är avstämd.
Function calling och verktyg
Verktyg följer det välkända schemat. Om en modell producerar ett verktygsanrop som inte matchar ditt schema loggar vi det: i version 1 rättar vi det inte i tysthet, eftersom att i smyg laga din output är värre än ett synligt fel.
tools = [{
"type": "function",
"function": {
"name": "find_invoice",
"description": "Slå upp en faktura via fakturanummer.",
"parameters": {
"type": "object",
"properties": {"number": {"type": "string"}},
"required": ["number"],
},
},
}]
resp = client.chat.completions.create(
model="eu-standard", messages=messages, tools=tools
)Strukturerad output med ett JSON schema
Skicka med ett JSON schema och validera svaret på din sida. Vårt råd: validera alltid, även när modellen oftast sköter sig.
resp = client.chat.completions.create(
model="eu-standard",
messages=[{"role": "user", "content": "Extrahera namnet och beloppet."}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "invoice",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"amount_eur": {"type": "number"},
},
"required": ["name", "amount_eur"],
},
},
},
)Svarshuvuden: kostnad, nivå och routing
Varje svar berättar vad som hände. Det är ingen extrafunktion för felsökning, det är själva poängen: du kan själv kontrollera att du fick det du betalade för.
| Huvud | Betydelse |
|---|---|
X-EU-Model-Tier | Nivån som anropet kördes på. |
X-EU-Routed | Finns när anropet dirigerades om till en annan modell, med orsaken: censorship eller error. |
X-EU-Degraded | true när ersättningsmodellen är svagare eller har ett mindre kontextfönster. Du betalar då det lägre av de två priserna. |
X-EU-Refusal-Class | Finns vid en vägran som vi inte kunde dirigera om, till exempel A-unrouteable när inget alternativ har tillräckligt med kontext. |
X-EU-Tokens-In / -Out | Uppmätta tokens för det här anropet. |
X-EU-Cost-EUR | Vad det här anropet drog från ditt saldo, i euro. |
X-EU-Balance-EUR | Ditt återstående saldo efter det här anropet. |
Rate limits och kostnadstak
Det finns en gräns per nyckel och per konto, plus de tak du sätter själv. De senare betyder mer än det låter: utan tak kan en läckt nyckel eller en oändlig loop i din egen kod tömma ett saldo över en natt.
- Anrop per minut, per nyckel och per konto.
- Dags- och månadstak i euro, inställbart per nyckel.
- Nya konton: högst 25 € per dag de första 48 timmarna, oavsett saldo.
- Ser vi mer än tio gånger ditt veckosnitt inom en timme pausar vi nyckeln automatiskt och mejlar dig. Hellre ett falskt larm än en tom plånbok.
- Ett anrop startar bara när ditt saldo är minst 0,05 €.
Felkoder och vad du gör
| Kod | Betydelse | Vad du gör |
|---|---|---|
| 400 | Ogiltigt anrop, eller en prompt som är större än kontextfönstret. | Rätta anropet; maxvärdet står i felmeddelandet. |
| 401 | Okänd, återkallad eller pausad nyckel. | Kontrollera nyckeln i din dashboard. |
| 402 | Otillräckligt saldo. | Fyll på. Svaret innehåller en direktlänk. |
| 403 | Anropet faller utanför användarpolicyn. | Se skälig användning nedan. |
| 429 | Rate limit eller tak nått. | Vänta och försök igen; respektera Retry-After. |
| 502 / 503 | Modellen uppströms är otillgänglig och ingen reserv är möjlig. | Försök igen. Se statussidan. |
Misslyckade anrop kostar dig ingenting: kom inget användbart svar tillbaka dras inget från ditt saldo.
Skälig användning och användarpolicy
Vi vägrar instruktioner för vapen, skadlig kod och bedrägeri, och material som skadar barn. De vägranden är slutgiltiga: vi skickar aldrig en sådan förfrågan vidare till en annan modell för att ändå få fram ett svar.
När en modell vägrar en legitim fråga om politik, historia eller ett samhällskänsligt ämne är det en annan sak: det ser vi som en brist, och vi skickar frågan till en modell utan den blinda fläcken. Du ser det i huvudet X-EU-Routed: censorship.
En av våra modeller är licensierad med en egen användarpolicy. Den policyn gäller fullt ut: omdirigering kringgår inga licensvillkor.
Osäker på om ditt användningsfall passar? Mejla hello@europeanailab.eu. Ett svar i förväg är billigare för oss båda än en blockerad nyckel i efterhand.
Vanliga frågor
Frågorna som kommer per mejl innan någon skapar en nyckel: vad API:et är kompatibelt med, vad ett anrop kostar och var det körs.
Vilka OpenAI-SDK:er fungerar med ett OpenAI-kompatibelt API?
Alla officiella, eftersom de är tunna klienter ovanpå chat completions-kontraktet och tar bas-URL:en som konstruktorargument. Python- och Node-SDK:erna är de vanligaste fallen; Go, Java och .NET fungerar på samma sätt. Du behåller din retry-logik, din hantering av streaming och dina typer.
Kan jag använda LangChain eller Vercel AI SDK med det?
Ja. Båda låter dig ställa in bas-URL:en för sin OpenAI-provider, så du pekar den mot vår host och använder en Union AI-nyckel. Allt annat som låter dig byta bas-URL fungerar enligt samma princip, även de flesta agentramverk och utvärderingsverktyg.
Stöder API:et streaming och function calling?
Ja, båda, och dessutom strukturerad output mot ett JSON schema. Strömmade svar skickar tokenförbrukningen i slutet av strömmen, så du kan mäta ett strömmat anrop lika exakt som ett vanligt.
Vilka rate limits gäller för API:et?
Det finns en gräns för anrop per minut per nyckel och per konto, plus dags- och månadstak i euro som du sätter själv. Nya konton har ett tak på 25 € per dag de första 48 timmarna, oavsett saldo. Når du en gräns får du en 429 med ett Retry-After-huvud.
Hur hanterar jag 429 och nya försök?
Respektera Retry-After i stället för att försöka igen direkt, och använd exponentiell backoff med jitter så att en topp inte synkroniseras mellan dina workers. Försök aldrig igen efter en 402: den betyder att saldot är tomt, och en loop upprepar bara felet. Ett nytt försök räcker oftast, för ett andra misslyckande ger sällan ett annat svar.
Hur ser jag vad ett anrop kostade?
Varje svar har huvuden: X-EU-Tokens-In och X-EU-Tokens-Out för de uppmätta tokens, X-EU-Cost-EUR för vad som drogs från ditt saldo och X-EU-Balance-EUR för vad som är kvar. Dina egna loggar kan alltså besvara kostnadsfrågan per funktion eller per kund utan att du öppnar en dashboard.
Vilken modell körs bakom varje nivå?
Varje nivå motsvarar en namngiven open-weight-modell, publicerad med licens och kontextfönster på sidan om AI-transparens. Du köper nivån, inte modellnamnet, så vi kan byta modellen under utan att din integration går sönder, och vi säger till när vi gör det.
Att flytta en befintlig integration är tre rader: nyckeln, bas-URL:en och ett nivånamn. Hela ändringen, plus det som inte följer med, finns i byt på tre rader. Fortfarande frågor? Priserna per nivå finns på prissidan, modellen och licensen bakom varje nivå under AI-transparens och vad som händer vid ett avbrott på statussidan. Två längre texter: vad ett AI-API kostar per token och vart dina prompter faktiskt tar vägen.
Kom igång med AI för européer.
Använd AI utan att skicka din data utomlands: allt på europeiska servrar, till ett europeiskt pris.
13 € i månaden för chatten, avsluta när du vill. Eller per token med kredit från 10 €.
Osäker? Gör quizet på 60 sekunder →