Migracja
Bazowy URL i klucz przenoszą klienta OpenAI. Ta strona podaje również, czego API nie robi, ponieważ migracja, która odkrywa to na produkcji, nie jest migracją.
Kształt zamienny
Ustaw bazowy URL klienta na https://api.llmeu.com/v1 i przekaż mu klucz API z konsoli. Kształt żądania się nie zmienia.
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)
Co akceptuje punkt końcowy czatu
Walidator żądań w apps/api/src/app.mjs sprawdza następujące rzeczy; to, czego nie sprawdza, jest przekazywane dalej lub ignorowane, a nie odrzucane, dzięki czemu nowszy klient nadal działa.
- model i messages są wymagane; messages musi być niepustą tablicą.
- Każda wiadomość wymaga roli (system, user, assistant, tool lub developer) i treści jako ciąg znaków lub tablicy części.
- stream musi być wartością logiczną, gdy jest obecne.
- temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed i n muszą być liczbami, gdy są obecne.
- max_tokens musi wynosić co najmniej 1.
- n musi wynosić dokładnie 1; cokolwiek innego jest odrzucane.
- stop może być ciągiem znaków lub tablicą ciągów znaków.
- tools musi być tablicą, gdy jest obecne.
- llmeu musi być obiektem; nigdy nie jest wymagane.
- tool_choice i response_format są przekazywane do backendu razem z powyższymi polami; nieznane dodatkowe pole nie jest odrzucane.
Dodatki żądania w llmeu
Obiekt llmeu z przestrzenią nazw w treści żądania; klient, który ignoruje nieznane pola, może go bezpiecznie wysłać.
| Pole | Wartość | Efekt |
|---|---|---|
| residency | eu-hosted | eu-owned | de | any | Zawęża routing do punktów końcowych w tej rezydencji; pusty zbiór kwalifikujących się zwraca 409 no_endpoint_for_policy, zamiast rozszerzać filtr. |
| task | nazwa zadania | Zadanie, do którego router dopasowuje model. |
| retention | zero | Zaimplementowano tylko zero. Żądanie większej wartości niż pozwala polityka zwraca 403 retention_exceeds_policy; dozwolona wartość efektywna inna niż zero zwraca 501 retention_not_implemented. |
| data_class | public | internal | confidential | restricted | Sprawdzane względem dozwolonych klas danych w polityce: klasa spoza nich zwraca 403 data_class_not_allowed, a nieznana klasa zwraca 400 invalid_data_class. |
| policy_id | uuid | Nazywa politykę tej samej organizacji; nieznany identyfikator zwraca 404 policy_not_found. |
| max_usd_per_1m | liczba | Górny limit ceny za milion tokenów dla tego żądania. |
| allow_partners | true | false | Czy dla tego żądania mogą być używane punkty końcowe partnerów. |
Nieznane klucze w llmeu są ignorowane; znany klucz z nieprawidłową wartością jest odrzucany, ponieważ błędna data_class musi zawieść bezpiecznie, a nie po cichu oznaczać brak klasy danych.
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"}
}'
Co nie istnieje
Te odpowiedzi są celowe, a klient, który ich oczekuje, otrzymuje kod błędu, a nie ciche podstawienie.
| Żądanie | Wynik |
|---|---|
| POST /v1/completions | 501 not_implemented — starszy punkt końcowy completions nie jest oferowany; użyj /v1/chat/completions. |
| n > 1 | 400 unsupported_n — obsługiwane jest tylko n = 1. |
| POST /v1/embeddings | Embeddingi wymagają modelu embeddingów, a domyślnie żądany identyfikator to bge-m3. Żaden nie jest obsługiwany w tym wdrożeniu, więc ta trasa nie jest tutaj oferowana, zamiast zwracać wektory zastępcze. |
| /v1/files, /v1/batches, /v1/assistants, /v1/fine_tuning, /v1/audio, /v1/images | 404 unknown_route — w ogóle nie jest trasowany; ścieżka /v1, której router nie zna, zwraca 404 unknown_route, a każda inna ścieżka zwraca 404 not_found. |
Eksportowanie danych
Eksport konta me.json zawiera wybrane pola konta, organizacje, metadane kluczy API bez sekretów, bieżące polityki, najnowsze 200 śladów na organizację i dzienne zagregowane dane użycia za 365 dni. Nie jest to kompletna kopia wszystkich danych osobowych ani historyczny zapis polityk.
Eksport audytu NDJSON domyślnie obejmuje 7 dni, pozwala na maksymalnie 90 dni i ogranicza liczbę śladów do 5000; jego manifest zawiera counts.truncated, co oznacza eksport, który osiągnął limit.
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
Usunięcie samego konta odbywa się na stronie profilu i podlega regule własności na stronie konsoli.
Ciasteczko sesji nie jest poświadczeniem API
Sesja przeglądarki uwierzytelnia konsolę, a nie API. Klient OpenAI, który ją wyśle, zostaje odrzucony z 403 api_key_required i musi zamiast tego użyć klucza API.
Odmowa tutaj zawiera kod, więc migracja może na nim rozgałęziać, a blok llmeu w każdej odpowiedzi mówi, co faktycznie się stało.