Title: Migration %E2%80%94 LLM EU Canonical: https://llmeu.com/de/docs/migration/ Markdown mirror: https://llmeu.com/de/docs/migration.md Machine-readable: https://llmeu.com/llms.txt (index) - https://llmeu.com/llms-full.txt (full catalogue) - https://llmeu.com/llms-catalogue.json Einstieg - [Schnellstart](/de/docs/quickstart/) - [Konsole](/de/docs/console/) - [Migration](/de/docs/migration/) - [API-Referenz](/de/docs/api/) Referenz - [Authentifizierung](/de/docs/authentication/) - [Endpunkte](/de/docs/endpoints/) - [Fehler](/de/docs/errors/) - [Rate Limits](/de/docs/rate-limits/) - [Streaming](/de/docs/streaming/) - [Richtlinien](/de/docs/policies/) - [Routing und Richtlinien](/de/docs/routing/) - [Datenhaltung und Regionen](/de/docs/residency/) - [Nachweise und Pr%C3%BCfung](/de/docs/evidence/) - [OpenAI-Kompatibilit%C3%A4t](/de/docs/openai-compat/) Betrieb - [Selbst hosten](/de/docs/self-hosting/) # Migration Basis-URL und Schl%C3%BCssel gen%C3%BCgen, um einen OpenAI-Client umzustellen. Diese Seite nennt auch, was die API nicht tut, denn eine Migration, die das erst im Produktivbetrieb entdeckt, ist keine Migration. ## Die Drop-in-Form Die Basis-URL des Clients auf https://api.llmeu.com/v1 richten und einen API-Schl%C3%BCssel aus der Konsole verwenden. Die Anfrageform %C3%A4ndert sich nicht. ``` 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) ``` ## Was der Chat-Endpunkt akzeptiert Der Anfrage-Validator in apps/api/src/app.mjs pr%C3%BCft Folgendes; was er nicht pr%C3%BCft, wird durchgereicht oder ignoriert statt abgelehnt, damit ein neuerer Client weiter funktioniert. - model und messages sind erforderlich; messages muss ein nicht leeres Array sein. - Jede Nachricht braucht eine Rolle (system, user, assistant, tool oder developer) und content als Zeichenkette oder Array von Teilen. - stream muss, wenn vorhanden, ein boolescher Wert sein. - temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed und n m%C3%BCssen, wenn vorhanden, Zahlen sein. - max_tokens muss mindestens 1 sein. - n muss genau 1 sein; alles andere wird abgelehnt. - stop darf eine Zeichenkette oder ein Array von Zeichenketten sein. - tools muss, wenn vorhanden, ein Array sein. - llmeu muss ein Objekt sein; erforderlich ist es nie. - tool_choice und response_format werden zusammen mit den obigen Feldern an das Backend weitergegeben; ein unbekanntes Zusatzfeld wird nicht abgelehnt. ## Anfrage-Erweiterungen unter llmeu Ein namensraumgebundenes llmeu-Objekt im Anfragek%C3%B6rper; ein Client, der unbekannte Felder ignoriert, kann es gefahrlos senden. Unbekannte Schl%C3%BCssel innerhalb von llmeu werden ignoriert; ein bekannter Schl%C3%BCssel mit ung%C3%BCltigem Wert wird abgelehnt, denn eine falsche data_class muss geschlossen fehlschlagen statt still keine Datenklasse zu bedeuten. ``` 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"} }' ``` ## Was es nicht gibt Diese Antworten sind beabsichtigt; ein Client, der sie erwartet, sieht den Fehlercode statt einer stillen Ersetzung. ## Daten wieder herausbekommen Der Kontoexport me.json enth%C3%A4lt ausgew%C3%A4hlte Kontofelder, Organisationen, API-Schl%C3%BCsselmetadaten ohne Geheimnisse, aktuelle Richtlinien, die neuesten 200 Traces je Organisation und t%C3%A4gliche Nutzungsaggregate f%C3%BCr 365 Tage. Er ist keine vollst%C3%A4ndige Kopie aller personenbezogenen Daten und keine historische Richtlinienfassung. Der NDJSON-Audit-Export umfasst standardm%C3%A4%C3%9Fig 7 Tage, h%C3%B6chstens 90 Tage und maximal 5000 Traces; sein Manifest enth%C3%A4lt counts.truncated, das einen Export markiert, der die Grenze erreicht hat. ``` 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 ``` Das L%C3%B6schen des Kontos erfolgt auf der Profilseite und unterliegt der Eigentumsregel auf der Konsolenseite. ## Ein Sitzungs-Cookie ist keine API-Berechtigung Eine Browser-Sitzung authentifiziert die Konsole, nicht die API. Ein OpenAI-Client, der eine sendet, wird mit 403 api_key_required abgelehnt und muss einen API-Schl%C3%BCssel verwenden. Eine Ablehnung nennt hier einen Code, auf den eine Migration verzweigen kann, und der llmeu-Block jeder Antwort sagt, was tats%C3%A4chlich geschah.