Migrare
Un URL de bază și o cheie mută un client OpenAI de partea cealaltă. Această pagină precizează, de asemenea, ce nu face API-ul, deoarece o migrare care descoperă asta în producție nu este o migrare.
Forma de înlocuire directă
Îndreptați URL-ul de bază al clientului către https://api.llmeu.com/v1 și furnizați-i o cheie API din consolă. Forma cererii nu se schimbă.
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)
Ce acceptă punctul final de chat
Validatorul cererii din apps/api/src/app.mjs verifică următoarele; ceea ce nu verifică este transmis mai departe sau ignorat, nu respins, astfel încât un client mai nou să funcționeze în continuare.
- model și messages sunt obligatorii; messages trebuie să fie o matrice nevidă.
- Fiecare mesaj are nevoie de un rol (system, user, assistant, tool sau developer) și conținut ca șir sau matrice de părți.
- stream trebuie să fie un boolean atunci când este prezent.
- temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed și n trebuie să fie numere atunci când sunt prezente.
- max_tokens trebuie să fie cel puțin 1.
- n trebuie să fie exact 1; orice altceva este refuzat.
- stop poate fi un șir sau o matrice de șiruri.
- tools trebuie să fie o matrice atunci când este prezent.
- llmeu trebuie să fie un obiect; nu este niciodată obligatoriu.
- tool_choice și response_format sunt transmise către backend împreună cu câmpurile de mai sus; un câmp suplimentar necunoscut nu este respins.
Extra-uri ale cererii sub llmeu
Un obiect llmeu cu spațiu de nume în corpul cererii; un client care ignoră câmpurile necunoscute îl poate trimite în siguranță.
| Câmp | Valoare | Efect |
|---|---|---|
| residency | eu-hosted | eu-owned | de | any | Restrânge rutarea către puncte finale din acea rezidență; un set eligibil gol returnează 409 no_endpoint_for_policy în loc să lărgească filtrul. |
| task | un nume de sarcină | Sarcina pentru care routerul potrivește modelul. |
| retention | zero | Doar zero este implementat. Solicitarea unei valori mai mari decât permite politica returnează 403 retention_exceeds_policy; o valoare efectivă permisă diferită de zero returnează 501 retention_not_implemented. |
| data_class | public | internal | confidential | restricted | Verificat față de clasele de date permise de politică: o clasă în afara acestora returnează 403 data_class_not_allowed, iar o clasă necunoscută returnează 400 invalid_data_class. |
| policy_id | uuid | Numește o politică a aceleiași organizații; un id necunoscut returnează 404 policy_not_found. |
| max_usd_per_1m | un număr | Un plafon de preț pe milion de tokenuri pentru această cerere. |
| allow_partners | true | false | Dacă punctele finale partenere pot fi folosite pentru această cerere. |
Cheile necunoscute din interiorul llmeu sunt ignorate; o cheie cunoscută cu o valoare invalidă este refuzată, deoarece un data_class greșit trebuie să eșueze în siguranță, nu să însemne în mod silențios nicio clasă de date.
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"}
}'
Ce nu există
Aceste răspunsuri sunt deliberate, iar un client care le așteaptă vede codul de eroare în locul unei substituiri silențioase.
| Cerere | Rezultat |
|---|---|
| POST /v1/completions | 501 not_implemented — punctul final completions legacy nu este oferit; folosiți /v1/chat/completions. |
| n > 1 | 400 unsupported_n — doar n = 1 este suportat. |
| POST /v1/embeddings | Embeddings necesită un model de embedding, iar id-ul solicitat implicit este bge-m3. Acestea sunt servite în prezent de backend-ul local determinist, al cărui răspuns poartă llmeu.mock: true și nota că sunt returnați vectori placeholder deterministi și nu sunt servite ponderi de embedding în această implementare. |
| /v1/files, /v1/batches, /v1/assistants, /v1/fine_tuning, /v1/audio, /v1/images | 404 unknown_route — nu este rutat deloc; o cale /v1 pe care routerul nu o cunoaște răspunde cu 404 unknown_route, iar orice altă cale răspunde cu 404 not_found. |
Extragerea datelor
Exportul contului me.json conține câmpuri selectate ale contului, organizații, metadate ale cheilor API fără secrete, politici actuale, cele mai recente 200 urme per organizație și agregate de utilizare zilnică pentru 365 zile. Nu este o copie completă a tuturor datelor personale și nici o înregistrare istorică a politicilor.
Exportul de audit NDJSON are implicit 7 zile, permite cel mult 90 zile și limitează urmele la 5000; manifestul său conține counts.truncated, care marchează un export care a atins limita.
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
Ștergerea contului în sine are loc pe pagina de profil și este supusă regulii de proprietate de pe pagina consolei.
Un cookie de sesiune nu este o acreditare API
O sesiune de browser autentifică consola, nu API-ul. Un client OpenAI care trimite una este refuzat cu 403 api_key_required și trebuie să folosească în schimb o cheie API.
Un refuz aici numește un cod, astfel încât o migrare poate ramifica pe baza lui, iar blocul llmeu din fiecare răspuns spune ce s-a întâmplat de fapt.