Vai al contenuto

Una riga di codice, e giri nell’Unione europea.

L’API è compatibile con OpenAI. SDK, framework e codice che hai già continuano a funzionare: cambi il base_url e scegli un tier invece del nome di un modello.

Quickstart: la tua prima chiamata API

Crea una chiave nella tua dashboard, sotto Impostazioni, Chiavi API. Il segreto lo vedi una volta sola: dopo conserviamo solo un hash e il prefisso. Mettilo in una variabile d’ambiente, mai nel tuo 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": "Spiega come funziona il reverse charge dell’IVA."}]
  }'
python
import os

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["UNION_API_KEY"],
    base_url="https://api.europeanailab.eu/v1",   # l’unica riga che cambia
)

resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Spiega come funziona il reverse charge dell’IVA."}],
)
print(resp.choices[0].message.content)

Node, Go, Java o .NET?

Funziona ogni SDK ufficiale di OpenAI: imposta il base URL su https://api.europeanailab.eu/v1 e usa la tua chiave Union. Implementiamo il contratto chat completions, compresi streaming, tool e JSON schema.

Tier dei modelli e finestre di contesto

Nel campo model passi un tier, non il nome di un modello. Così la tua integrazione continua a funzionare quando sostituiamo il modello sottostante, e lo faremo, perché i modelli open-weight vengono ritirati e superati.

TierContestoInput / 1 mlnOutput / 1 mlnIdeale per
eu-lite131K0,40 €1,60 €Lavoro veloce ed economico: classificazione, estrazione, risposte brevi.
eu-standard262K0,70 €3,50 €Il tier tuttofare. Predefinito per la chat e per la maggior parte del traffico API.
eu-long1000K1,00 €2,00 €Fascicoli interi, contratti e codebase in un solo prompt.
eu-pro1000K4,00 €12,00 €Ragionamento complesso, agenti, codice impegnativo.

Se superi la finestra di contesto di un tier ricevi un 400 con il massimo indicato: non tronchiamo mai il tuo prompt di nascosto.

Risposte in streaming

Lo streaming funziona come ti aspetti, con una differenza importante che devi conoscere, perché riguarda i tuoi soldi.

Attiva include_usage

Con lo streaming compatibile con OpenAI l’API di default non invia il consumo di token. Senza stream_options: {"include_usage": true} alla fine di uno stream non vedi quanto è costata la chiamata. Noi la misuriamo comunque: il punto è che anche tu possa vederla e verificarla.
python
stream = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Scrivi un riassunto."}],
    stream=True,
    # Senza questo non arriva l’oggetto usage e non vedi il costo.
    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:                      # ultimo chunk
        print("\n", chunk.usage)

Se interrompi uno stream a metà, paghi solo quello che è stato generato fino a quel momento. Se per la connessione interrotta non arriva il chunk con il consumo, stimiamo il consumo e lo correggiamo nella riconciliazione giornaliera con il nostro provider. Fino alla chiusura, quella riga compare nel tuo riepilogo consumi come estimated.

Function calling e uso dei tool

I tool seguono lo schema che conosci. Se un modello produce una chiamata a un tool che non corrisponde al tuo schema, la registriamo: nella versione 1 non la correggiamo di nascosto, perché riparare in silenzio il tuo output è peggio di un errore visibile.

python
tools = [{
    "type": "function",
    "function": {
        "name": "find_invoice",
        "description": "Cerca una fattura in base al numero.",
        "parameters": {
            "type": "object",
            "properties": {"number": {"type": "string"}},
            "required": ["number"],
        },
    },
}]

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

Output strutturato con uno JSON schema

Passa uno JSON schema e valida la risposta dal tuo lato. Il nostro consiglio: valida sempre, anche quando il modello di solito si comporta bene.

python
resp = client.chat.completions.create(
    model="eu-standard",
    messages=[{"role": "user", "content": "Estrai il nome e l’importo."}],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "invoice",
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "amount_eur": {"type": "number"},
                },
                "required": ["name", "amount_eur"],
            },
        },
    },
)

Header di risposta: costo, tier e instradamento

Ogni risposta ti dice cosa è successo. Non è un extra per il debug, è il punto: puoi verificare da solo di aver ricevuto quello che hai pagato.

HeaderSignificato
X-EU-Model-TierIl tier su cui è girata questa richiesta.
X-EU-RoutedPresente quando la richiesta è stata reindirizzata a un altro modello, con il motivo: censorship o error.
X-EU-Degradedtrue quando il modello sostitutivo è più debole o ha una finestra di contesto più piccola. In quel caso paghi la tariffa più bassa delle due.
X-EU-Refusal-ClassPresente su un rifiuto che non siamo riusciti a reindirizzare, per esempio A-unrouteable quando nessuna alternativa ha abbastanza contesto.
X-EU-Tokens-In / -OutToken conteggiati per questa richiesta.
X-EU-Cost-EURQuanto questa richiesta ha scalato dal tuo saldo, in euro.
X-EU-Balance-EURIl saldo che ti resta dopo questa richiesta.

Rate limit e tetti di spesa

C’è un limite per chiave e per account, più i tetti che imposti tu. Questi ultimi contano più di quanto sembri: senza un tetto, una chiave finita in mani sbagliate o un ciclo infinito nel tuo codice possono svuotare un saldo in una notte.

  • Richieste al minuto, per chiave e per account.
  • Tetto giornaliero e mensile in euro, configurabile per chiave.
  • Nuovi account: al massimo 25 € al giorno per le prime 48 ore, qualunque sia il saldo.
  • Se in un’ora vediamo più di dieci volte la tua media settimanale, mettiamo in pausa la chiave in automatico e ti mandiamo un’email. Meglio un falso allarme che un portafoglio vuoto.
  • Una richiesta parte solo se il tuo saldo è almeno 0,05 €.

Codici di errore e cosa fare

CodiceSignificatoCosa fare
400Richiesta non valida, o prompt oltre la finestra di contesto.Correggi la richiesta; il massimo è nel messaggio di errore.
401Chiave sconosciuta, revocata o in pausa.Controlla la chiave nella tua dashboard.
402Saldo insufficiente.Ricarica. La risposta contiene un link diretto.
403Richiesta fuori dalla policy di utilizzo.Vedi l’uso corretto qui sotto.
429Rate limit o tetto raggiunto.Aspetta e riprova; rispetta Retry-After.
502 / 503Modello a monte non disponibile e nessun fallback possibile.Riprova. Controlla la pagina di stato.

Le richieste fallite non ti costano nulla: se non è arrivata una risposta utilizzabile, dal tuo saldo non si scala niente.

Uso corretto e policy di utilizzo

Rifiutiamo istruzioni per armi, malware e frodi, e materiale che danneggia i minori. Questi rifiuti sono definitivi: non inoltriamo mai una richiesta del genere a un altro modello per strappargli comunque una risposta.

Un modello che rifiuta una domanda legittima su politica, storia o un tema socialmente delicato è un’altra cosa: lo trattiamo come un difetto e mandiamo la richiesta a un modello senza quel punto cieco. Lo vedi nell’header X-EU-Routed: censorship.

Uno dei nostri modelli ha una licenza con una propria policy di utilizzo. Quella policy vale per intero: il reindirizzamento non aggira i termini di licenza.

Non sai se il tuo caso d’uso rientra? Scrivi a hello@europeanailab.eu. Una risposta prima costa meno a entrambi di una chiave bloccata dopo.

Domande frequenti

Le domande che arrivano per email prima che qualcuno crei una chiave: con cosa è compatibile l’API, quanto costa una richiesta e dove gira.

Quali SDK di OpenAI funzionano con un’API compatibile con OpenAI?

Tutti quelli ufficiali, perché sono client leggeri sopra il contratto chat completions e accettano il base URL come argomento del costruttore. Gli SDK per Python e Node sono i casi più comuni; Go, Java e .NET funzionano allo stesso modo. Tieni la tua logica di retry, la gestione dello streaming e i tuoi tipi.

Posso usarla con LangChain o con il Vercel AI SDK?

Sì. Entrambi espongono il base URL come configurazione del loro provider OpenAI: lo punti al nostro host e usi una chiave Union AI. Funziona con lo stesso principio qualsiasi altro strumento che ti permetta di sovrascrivere il base URL, compresa la maggior parte dei framework per agenti e degli strumenti di valutazione.

L’API supporta streaming e function calling?

Sì, entrambi, più l’output strutturato secondo uno JSON schema. Le risposte in streaming riportano il consumo di token alla fine dello stream, quindi puoi misurare una richiesta in streaming con la stessa precisione di una normale.

Quali sono i rate limit dell’API?

C’è un limite di richieste al minuto per chiave e per account, più dei tetti giornalieri e mensili in euro che imposti tu. I nuovi account hanno un tetto di 25 € al giorno per le prime 48 ore, qualunque sia il saldo. Quando raggiungi un limite ricevi un 429 con un header Retry-After.

Come gestire gli errori 429 e i retry?

Rispetta Retry-After invece di riprovare subito, e usa un backoff esponenziale con jitter, così un picco non si sincronizza tra i tuoi worker. Non riprovare un 402: vuol dire che il saldo è esaurito e un ciclo non fa che ripetere l’errore. Di solito basta un solo retry, perché un secondo fallimento raramente dà una risposta diversa.

Come vedo quanto è costata una richiesta?

Ogni risposta porta degli header: X-EU-Tokens-In e X-EU-Tokens-Out per i token conteggiati, X-EU-Cost-EUR per quanto è stato scalato dal saldo e X-EU-Balance-EUR per quanto resta. I tuoi log possono quindi dirti il costo per funzionalità o per cliente senza aprire una dashboard.

Quale modello c’è dietro ogni tier?

Ogni tier corrisponde a un modello open-weight con un nome preciso, pubblicato con licenza e finestra di contesto nella pagina sulla trasparenza sull’AI. Compri il tier, non il nome del modello, così possiamo sostituire il modello sottostante senza rompere la tua integrazione, e quando lo facciamo te lo diciamo.

Spostare un’integrazione esistente richiede tre righe: la chiave, il base URL e il nome di un tier. Tutta la modifica, più quello che non si porta dietro, è in il passaggio in tre righe. Hai ancora dubbi? Le tariffe per tier sono nella pagina dei prezzi, il modello e la licenza dietro ogni tier in trasparenza sull’AI e cosa succede durante un disservizio nella pagina di stato. Due letture più lunghe: quanto costa un’API AI a token e dove finiscono davvero i tuoi prompt.

Inizia con l’AI per gli europei.

Usa l’AI senza mandare i tuoi dati all’estero: tutto su server europei, a un prezzo europeo.

13 € al mese per la chat, disdici quando vuoi. Oppure a token, con credito da 10 €.

Non sei sicuro? Fai il quiz da 60 secondi →