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
residencyeu-hosted | eu-owned | de | anyBeperkt 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.
taskeen taaknaamDe taak waarop de router het model afstemt.
retentionzeroAlleen 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_classpublic | internal | confidential | restrictedGetoetst 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_iduuidNoemt een beleid van dezelfde organisatie; een onbekend id geeft 404 policy_not_found.
max_usd_per_1meen getalEen prijsplafond per miljoen tokens voor dit verzoek.
allow_partnerstrue | falseOf 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/completions501 not_implemented — het legacy completions-endpoint wordt niet aangeboden; gebruik /v1/chat/completions.
n > 1400 unsupported_n — alleen n = 1 wordt ondersteund.
POST /v1/embeddingsEmbeddings 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/images404 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.