Sari la conținut

O singură linie de cod și rulezi în Uniunea Europeană.

API-ul este compatibil cu OpenAI. SDK-urile, frameworkurile și codul pe care le ai deja merg în continuare: schimbi base_url și alegi un nivel în loc de un nume de model.

Start rapid: primul tău apel API

Creează o cheie în dashboardul tău, la Setări, Chei API. Secretul îl vezi o singură dată. După aceea păstrăm doar un hash și prefixul. Pune-l într-o variabilă de mediu, niciodată în 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": "Explică taxarea inversă la TVA."}]
  }'
python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["UNION_API_KEY"],
    base_url="https://api.europeanailab.eu/v1",   # singura linie care se schimbă
)

resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Explică taxarea inversă la TVA."}],
)
print(resp.choices[0].message.content)

Node, Go, Java sau .NET?

Orice SDK oficial OpenAI merge: setează base URL-ul la https://api.europeanailab.eu/v1 și folosește cheia ta Union. Implementăm contractul chat completions, inclusiv streaming, tools și scheme JSON.

Niveluri de model și ferestre de context

În câmpul model trimiți un nivel, nu un nume de model. Așa, integrarea ta merge în continuare când schimbăm modelul de dedesubt, iar asta se va întâmpla, pentru că modelele open-weight sunt retrase și depășite.

NivelContextIntrare / 1 mil.Ieșire / 1 mil.Potrivit pentru
eu-lite131K0,40 €1,60 €Sarcini rapide și ieftine: clasificare, extragere, răspunsuri scurte.
eu-standard262K0,70 €3,50 €Nivelul bun la toate. Implicit pentru chat și pentru majoritatea traficului API.
eu-long1.000K1,00 €2,00 €Dosare întregi, contracte și baze de cod într-un singur prompt.
eu-pro1.000K4,00 €12,00 €Raționament complex, agenți, cod complicat.

Dacă depășești fereastra de context a unui nivel, primești un 400 cu maximul în mesaj: nu îți trunchiem niciodată promptul pe tăcute.

Răspunsuri în streaming

Streamingul funcționează cum te aștepți, cu o diferență importantă pe care trebuie s-o știi, pentru că e vorba de banii tăi.

Activează include_usage

La streamingul compatibil OpenAI, API-ul nu trimite implicit consumul de tokeni. Fără stream_options: {"include_usage": true} nu vezi la finalul streamului cât a costat apelul. Noi îl contorizăm oricum: ideea e să-l poți vedea și verifica și tu.
python
stream = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Scrie un rezumat."}],
    stream=True,
    # Fără asta nu primești obiectul usage și nu vezi costul.
    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:                      # ultimul chunk
        print("\n", chunk.usage)

Dacă întrerupi un stream la jumătate, plătești doar ce s-a generat până atunci. Dacă din cauza conexiunii căzute nu mai sosește chunkul cu usage, estimăm consumul și îl corectăm la reconcilierea zilnică cu furnizorul nostru. Până se decontează, linia apare în evidența consumului ca estimated.

Function calling și tool use

Tool-urile urmează schema pe care o știi deja. Dacă un model produce un tool call care nu se potrivește cu schema ta, îl logăm: în versiunea 1 nu îl corectăm pe tăcute, pentru că o reparație discretă a outputului tău e mai rea decât o eroare vizibilă.

python
tools = [{
    "type": "function",
    "function": {
        "name": "find_invoice",
        "description": "Caută o factură după număr.",
        "parameters": {
            "type": "object",
            "properties": {"number": {"type": "string"}},
            "required": ["number"],
        },
    },
}]

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

Output structurat cu o schemă JSON

Trimite o schemă JSON și validează răspunsul la tine. Sfatul nostru: validează mereu, chiar dacă modelul de obicei se poartă frumos.

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

Headere de răspuns: cost, nivel și rutare

Fiecare răspuns îți spune ce s-a întâmplat. Nu e un bonus pentru debugging, e chiar ideea: poți verifica singur că ai primit ce ai plătit.

HeaderSemnificație
X-EU-Model-TierNivelul pe care a rulat cererea.
X-EU-RoutedApare când cererea a fost redirecționată spre alt model, cu motivul: censorship sau error.
X-EU-Degradedtrue când modelul de rezervă e mai slab sau are o fereastră de context mai mică. Atunci plătești tariful mai mic dintre cele două.
X-EU-Refusal-ClassApare la un refuz pe care nu l-am putut redirecționa, de exemplu A-unrouteable când nicio alternativă nu are context suficient.
X-EU-Tokens-In / -OutTokenii contorizați pentru această cerere.
X-EU-Cost-EURCât a scăzut această cerere din soldul tău, în euro.
X-EU-Balance-EURSoldul rămas după această cerere.

Limite de cereri și plafoane de cheltuieli

Există o limită pe cheie și pe cont, plus plafoanele pe care le setezi tu. Acestea din urmă contează mai mult decât pare: fără plafon, o cheie scursă sau o buclă infinită în propriul tău cod îți poate goli soldul peste noapte.

  • Cereri pe minut, pe cheie și pe cont.
  • Plafon zilnic și lunar în euro, configurabil pentru fiecare cheie.
  • Conturi noi: maximum 25 € pe zi în primele 48 de ore, indiferent de sold.
  • Dacă vedem într-o oră de peste zece ori media ta săptămânală, suspendăm automat cheia și îți trimitem un email. Mai bine o alarmă falsă decât un portofel gol.
  • O cerere pornește doar dacă soldul tău este de cel puțin 0,05 €.

Coduri de eroare și ce faci

CodSemnificațieCe faci
400Cerere invalidă sau prompt peste fereastra de context.Corectează cererea; maximul e în mesajul de eroare.
401Cheie necunoscută, revocată sau suspendată.Verifică cheia în dashboard.
402Sold insuficient.Încarcă credit. Răspunsul conține un link direct.
403Cererea iese din politica de utilizare.Vezi utilizarea corectă mai jos.
429Limită de cereri sau plafon atins.Așteaptă și reîncearcă; respectă Retry-After.
502 / 503Modelul din amonte nu e disponibil și nu există alternativă.Reîncearcă. Vezi pagina de status.

Cererile eșuate nu te costă nimic: dacă nu s-a întors un răspuns utilizabil, nu se scade nimic din sold.

Utilizare corectă și politica de utilizare

Refuzăm instrucțiuni pentru arme, malware și fraudă, precum și materiale care fac rău copiilor. Aceste refuzuri sunt definitive: nu trimitem niciodată o astfel de cerere la alt model ca să scoatem totuși un răspuns.

Altceva e când un model refuză o întrebare legitimă despre politică, istorie sau un subiect sensibil social: tratăm asta ca pe un defect și trimitem cererea la un model fără acel punct orb. Vezi asta în headerul X-EU-Routed: censorship.

Unul dintre modelele noastre are o licență cu propria politică de utilizare. Acea politică se aplică integral: redirecționarea nu ocolește termenii licenței.

Nu ești sigur că utilizarea ta se încadrează? Scrie la hello@europeanailab.eu. Un răspuns dinainte e mai ieftin pentru amândoi decât o cheie blocată după.

Întrebări frecvente

Întrebările care sosesc pe email înainte ca cineva să-și facă o cheie: cu ce e compatibil API-ul, cât costă o cerere și unde rulează.

Ce SDK-uri OpenAI merg cu un API compatibil OpenAI?

Toate cele oficiale, pentru că sunt clienți subțiri peste contractul chat completions și primesc base URL-ul ca argument în constructor. SDK-urile de Python și Node sunt cazurile obișnuite; Go, Java și .NET merg la fel. Îți păstrezi logica de retry, tratarea streamingului și tipurile.

Pot folosi LangChain sau Vercel AI SDK cu el?

Da. Amândouă expun base URL-ul ca setare la providerul OpenAI, așa că îl îndrepți spre hostul nostru și folosești o cheie Union AI. Orice altceva care te lasă să suprascrii base URL-ul merge pe același principiu, inclusiv majoritatea frameworkurilor de agenți și a instrumentelor de evaluare.

API-ul suportă streaming și function calling?

Da, pe amândouă, plus output structurat după o schemă JSON. Răspunsurile în streaming includ consumul de tokeni la finalul streamului, așa că poți măsura o cerere în streaming la fel de precis ca pe una obișnuită.

Care sunt limitele de cereri ale API-ului?

Există o limită de cereri pe minut pentru fiecare cheie și pentru fiecare cont, plus plafoane zilnice și lunare în euro, pe care le setezi tu. Conturile noi au un plafon de 25 € pe zi în primele 48 de ore, indiferent de sold. Când atingi o limită primești un 429 cu headerul Retry-After.

Cum tratez erorile 429 și reîncercările?

Respectă Retry-After în loc să reîncerci imediat și folosește backoff exponențial cu jitter, ca o rafală de cereri să nu se sincronizeze între workerii tăi. Nu reîncerca un 402: înseamnă că soldul e gol, iar o buclă doar repetă eșecul. De obicei ajunge o singură reîncercare, pentru că a doua eroare rareori aduce alt răspuns.

Cum văd cât a costat o cerere?

Fiecare răspuns are headere: X-EU-Tokens-In și X-EU-Tokens-Out pentru tokenii contorizați, X-EU-Cost-EUR pentru ce s-a scăzut din sold și X-EU-Balance-EUR pentru ce a rămas. Așa, propriile tale loguri îți pot spune costul pe funcționalitate sau pe client, fără să deschizi un dashboard.

Ce model rulează în spatele fiecărui nivel?

Fiecare nivel corespunde unui model open-weight numit, publicat cu licența și fereastra de context pe pagina de transparență AI. Cumperi nivelul, nu numele modelului, așa că putem schimba modelul de dedesubt fără să-ți stricăm integrarea, și îți spunem când o facem.

Mutarea unei integrări existente înseamnă trei linii: cheia, base URL-ul și numele unui nivel. Toată schimbarea, plus ce nu se poate porta, e în trecerea în trei linii. Mai ai întrebări? Tarifele pe nivel sunt pe pagina de prețuri, modelul și licența din spatele fiecărui nivel la Transparență AI, iar ce se întâmplă la o pană pe pagina de status. Două lecturi mai lungi: cât costă un API AI pe token și unde ajung de fapt prompturile tale.

Începe cu AI pentru europeni.

Folosește AI fără să-ți trimiți datele în străinătate: totul pe servere europene, la un preț european.

13 € pe lună pentru chat, anulezi oricând. Sau plătești pe token, cu credit de la 10 €.

Nu ești sigur? Fă testul de 60 de secunde →