Migrazione
Un URL di base e una chiave spostano un client OpenAI. Questa pagina dichiara anche ciò che l’API non fa, perché una migrazione che lo scopre in produzione non è una migrazione.
La forma drop-in
Imposta l’URL di base del client su https://api.llmeu.com/v1 e forniscigli una chiave API dalla console. La forma della richiesta non cambia.
from openai import OpenAI
client = OpenAI(base_url="https://api.llmeu.com/v1", api_key="llmeu_live_xxxxxxxx.your-secret")
resp = client.chat.completions.create(
model="llmeu-auto",
messages=[{"role": "user", "content": "Say hello from EU hosting."}],
)
print(resp.choices[0].message.content)
Cosa accetta l’endpoint chat
Il validatore delle richieste in apps/api/src/app.mjs controlla quanto segue; ciò che non controlla viene lasciato passare o ignorato anziché rifiutato, così un client più recente continua a funzionare.
- model e messages sono obbligatori; messages deve essere un array non vuoto.
- Ogni messaggio richiede un ruolo (system, user, assistant, tool o developer) e content come stringa o array di parti.
- stream deve essere un booleano quando presente.
- temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed e n devono essere numeri quando presenti.
- max_tokens deve essere almeno 1.
- n deve essere esattamente 1; qualsiasi altro valore viene rifiutato.
- stop può essere una stringa o un array di stringhe.
- tools deve essere un array quando presente.
- llmeu deve essere un oggetto; non è mai obbligatorio.
- tool_choice e response_format sono inoltrati al backend insieme ai campi sopra; un campo extra sconosciuto non viene rifiutato.
Extra di richiesta sotto llmeu
Un oggetto llmeu con namespace nel corpo della richiesta; un client che ignora campi sconosciuti può inviarlo in sicurezza.
| Campo | Valore | Effetto |
|---|---|---|
| residency | eu-hosted | eu-owned | de | any | Restringe il routing agli endpoint in quella residenza; un insieme ammissibile vuoto restituisce 409 no_endpoint_for_policy invece di ampliare il filtro. |
| task | un nome di task | Il task a cui il router adatta il modello. |
| retention | zero | Solo zero è implementato. Chiedere più di quanto consenta la policy restituisce 403 retention_exceeds_policy; un valore effettivo consentito diverso da zero restituisce 501 retention_not_implemented. |
| data_class | public | internal | confidential | restricted | Verificata rispetto alle classi di dati consentite dalla policy: una classe al di fuori di esse restituisce 403 data_class_not_allowed, e una classe sconosciuta restituisce 400 invalid_data_class. |
| policy_id | uuid | Indica una policy della stessa organizzazione; un id sconosciuto restituisce 404 policy_not_found. |
| max_usd_per_1m | un numero | Un tetto di prezzo per milione di token per questa richiesta. |
| allow_partners | true | false | Se gli endpoint dei partner possono essere usati per questa richiesta. |
Le chiavi sconosciute dentro llmeu vengono ignorate; una chiave nota con un valore non valido viene rifiutata, perché un data_class errato deve fallire in modo chiuso invece di significare silenziosamente nessuna classe di dati.
curl https://api.llmeu.com/v1/chat/completions \
-H "Authorization: Bearer $LLMEU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "llmeu-auto",
"messages": [{"role": "user", "content": "Summarise this contract."}],
"llmeu": {"residency": "eu-owned", "data_class": "confidential", "retention": "zero"}
}'
Ciò che non esiste
Queste risposte sono deliberate, e un client che se le aspetta vede il codice di errore anziché una sostituzione silenziosa.
| Richiesta | Risultato |
|---|---|
| POST /v1/completions | 501 not_implemented — l’endpoint completions legacy non è offerto; usa /v1/chat/completions. |
| n > 1 | 400 unsupported_n — è supportato solo n = 1. |
| POST /v1/embeddings | Gli embedding richiedono un modello di embedding, e l’id richiesto predefinito è bge-m3. Attualmente sono serviti dal backend locale deterministico, la cui risposta porta llmeu.mock: true e la nota che vengono restituiti vettori segnaposto deterministici e nessun peso di embedding è servito su questa distribuzione. |
| /v1/files, /v1/batches, /v1/assistants, /v1/fine_tuning, /v1/audio, /v1/images | 404 unknown_route — non instradato affatto; un percorso /v1 che il router non conosce risponde 404 unknown_route, e qualsiasi altro percorso risponde 404 not_found. |
Estrarre i tuoi dati
L’esportazione dell’account me.json contiene campi selezionati dell’account, organizzazioni, metadati delle chiavi API senza segreti, policy correnti, le ultime 200 tracce per organizzazione e aggregati di utilizzo giornaliero per 365 giorni. Non è una copia completa di tutti i dati personali né un registro storico delle policy.
L’esportazione di audit NDJSON ha come impostazione predefinita 7 giorni, consente al massimo 90 giorni e limita le tracce a 5000; il suo manifest porta counts.truncated, che segnala un’esportazione che ha raggiunto il limite.
GET /app/exports/me.json
GET /app/exports/audit.ndjson?days=7
GET /app/exports/traces.json
GET /app/exports/usage.json
GET /app/exports/policies.json
L’eliminazione dell’account stesso avviene nella pagina del profilo ed è soggetta alla regola di proprietà nella pagina della console.
Un cookie di sessione non è una credenziale API
Una sessione del browser autentica la console, non l’API. Un client OpenAI che ne invia una viene rifiutato con 403 api_key_required e deve usare una chiave API.
Un rifiuto qui indica un codice, quindi una migrazione può diramarsi su di esso, e il blocco llmeu su ogni risposta dice cosa è realmente accaduto.