Migratie
Een basis-URL en een sleutel verplaatsen een OpenAI-client. Deze pagina vermeldt ook wat de API niet doet, omdat een migratie die dat in productie ontdekt, geen migratie is.
De drop-invorm
Richt de basis-URL van de client op https://api.llmeu.com/v1 en geef deze een API-sleutel uit de console. De vorm van het verzoek verandert niet.
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)
Wat het chat-endpoint accepteert
De verzoekvalidator in apps/api/src/app.mjs controleert het volgende; wat hij niet controleert, wordt doorgegeven of genegeerd in plaats van afgewezen, zodat een nieuwere client blijft werken.
- model en messages zijn verplicht; messages moet een niet-lege array zijn.
- Elk bericht vereist een rol (system, user, assistant, tool of developer) en content als een string of een array van onderdelen.
- stream moet een boolean zijn wanneer aanwezig.
- temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed en n moeten getallen zijn wanneer ze aanwezig zijn.
- max_tokens moet ten minste 1 zijn.
- n moet precies 1 zijn; al het andere wordt geweigerd.
- stop mag een string of een array van strings zijn.
- tools moet een array zijn wanneer aanwezig.
- llmeu moet een object zijn; het is nooit verplicht.
- tool_choice en response_format worden samen met de bovenstaande velden naar de backend doorgestuurd; een onbekend extra veld wordt niet afgewezen.
Verzoekextra's onder llmeu
Een llmeu-object met eigen namespace in de request body; een client die onbekende velden negeert, kan het veilig sturen.
| Veld | Waarde | Effect |
|---|---|---|
| residency | eu-hosted | eu-owned | de | any | Beperkt routering tot endpoints in die residentie; een lege set van in aanmerking komende endpoints geeft 409 no_endpoint_for_policy in plaats van het filter te verbreden. |
| task | een taaknaam | De taak waarop de router het model afstemt. |
| retention | zero | Alleen nul is geïmplementeerd. Vragen om meer dan het beleid toestaat, geeft 403 retention_exceeds_policy; een toegestane effectieve waarde anders dan nul geeft 501 retention_not_implemented. |
| data_class | public | internal | confidential | restricted | Getoetst aan de toegestane dataklassen van het beleid: een klasse buiten die klassen geeft 403 data_class_not_allowed, en een onbekende klasse geeft 400 invalid_data_class. |
| policy_id | uuid | Noemt een beleid van dezelfde organisatie; een onbekend id geeft 404 policy_not_found. |
| max_usd_per_1m | een getal | Een prijsplafond per miljoen tokens voor dit verzoek. |
| allow_partners | true | false | Of partnerendpoints voor dit verzoek mogen worden gebruikt. |
Onbekende sleutels binnen llmeu worden genegeerd; een bekende sleutel met een ongeldige waarde wordt geweigerd, omdat een verkeerde data_class gesloten moet falen in plaats van stil te betekenen dat er geen dataklasse is.
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"}
}'
Wat niet bestaat
Deze antwoorden zijn bewust, en een client die ze verwacht, ziet de foutcode in plaats van een stille vervanging.
| Verzoek | Resultaat |
|---|---|
| POST /v1/completions | 501 not_implemented — het legacy completions-endpoint wordt niet aangeboden; gebruik /v1/chat/completions. |
| n > 1 | 400 unsupported_n — alleen n = 1 wordt ondersteund. |
| POST /v1/embeddings | Embeddings vereisen een embeddingmodel, en het standaard opgevraagde id is bge-m3. Ze worden momenteel geleverd door de deterministische lokale backend, waarvan het antwoord llmeu.mock: true bevat en de melding dat deterministische placeholder-vectoren worden geretourneerd en dat er op deze deployment geen embeddinggewichten worden geleverd. |
| /v1/files, /v1/batches, /v1/assistants, /v1/fine_tuning, /v1/audio, /v1/images | 404 unknown_route — helemaal niet gerouteerd; een /v1-pad dat de router niet kent, antwoordt 404 unknown_route, en elk ander pad antwoordt 404 not_found. |
Uw gegevens eruit halen
De accountexport me.json bevat geselecteerde accountvelden, organisaties, API-sleutelmetadata zonder secrets, actueel beleid, de laatste 200 traces per organisatie en dagelijkse gebruiksaggregaten voor 365 dagen. Het is geen volledige kopie van alle persoonsgegevens en geen historisch beleidsregister.
De NDJSON-auditexport staat standaard op 7 dagen, staat maximaal 90 dagen toe en begrenst traces op 5000; het manifest bevat counts.truncated, wat een export markeert die de limiet heeft bereikt.
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
Het verwijderen van het account zelf gebeurt op de profielpagina en is onderworpen aan de eigenaarsregel op de consolepagina.
Een sessiecookie is geen API-credential
Een browsersessie authenticeert de console, niet de API. Een OpenAI-client die er een stuurt, wordt geweigerd met 403 api_key_required en moet in plaats daarvan een API-sleutel gebruiken.
Een weigering hier noemt een code, zodat een migratie daarop kan vertakken, en het llmeu-blok op elk antwoord zegt wat er daadwerkelijk is gebeurd.