Migracja
Bazowy adres URL i klucz przenoszą klienta OpenAI. Ta strona mówi też, czego API nie robi, bo migracja, która odkrywa to na produkcji, nie jest migracją.
Zamiennik typu drop-in
Ustaw bazowy adres 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 przyjmuje punkt końcowy czatu
Walidator żądań w apps/api/src/app.mjs sprawdza poniższe; to, czego nie sprawdza, jest przekazywane dalej lub ignorowane, a nie odrzucane, więc 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) oraz content jako ciąg znaków albo tablicy części.
- stream musi być wartością logiczną, jeśli jest obecne.
- temperature, top_p, max_tokens, presence_penalty, frequency_penalty, seed i n muszą być liczbami, jeśli są obecne.
- max_tokens musi wynosić co najmniej 1.
- n musi wynosić dokładnie 1; każda inna wartość jest odrzucana.
- stop może być ciągiem znaków lub tablicą ciągów znaków.
- tools musi być tablicą, jeśli 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 do żądania w llmeu
Obiekt llmeu w 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ę punktów zwraca 409 no_endpoint_for_policy, zamiast rozszerzać filtr. |
| task | nazwa zadania | Zadanie, do którego router dopasowuje model. |
| retention | zero | Zaimplementowane jest tylko zero. Żądanie większej wartości niż pozwalają zasady zwraca 403 retention_exceeds_policy; dozwolona wartość efektywna inna niż zero zwraca 501 retention_not_implemented. |
| data_class | public | internal | confidential | restricted | Sprawdzana względem dozwolonych klas danych w zasadach: klasa spoza nich zwraca 403 data_class_not_allowed, a nieznana klasa zwraca 400 invalid_data_class. |
| policy_id | uuid | Wskazuje zasady 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żyte punkty końcowe partnerów. |
Nieznane klucze wewnątrz llmeu są ignorowane; znany klucz z nieprawidłową wartością jest odrzucany, ponieważ błędna wartość 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, widzi kod błędu, a nie ciche podstawienie.
| Żądanie | Wynik |
|---|---|
| POST /v1/completions | 501 not_implemented — przestarzały 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 | Embeddings wymagają modelu osadzającego, a domyślnie żądany identyfikator to bge-m3. Są obecnie obsługiwane przez deterministyczny lokalny backend, którego odpowiedź zawiera llmeu.mock: true oraz informację, że zwracane są deterministyczne wektory zastępcze, a na tym wdrożeniu nie są udostępniane żadne wagi osadzania. |
| /v1/files, /v1/batches, /v1/assistants, /v1/fine_tuning, /v1/audio, /v1/images | 404 unknown_route — w ogóle nie jest routowane; ścieżka /v1, której router nie zna, odpowiada 404 unknown_route, a każda inna ścieżka odpowiada 404 not_found. |
Zabieranie swoich danych
Eksport konta me.json zawiera wybrane pola konta, organizacje, metadane kluczy API bez sekretów, bieżące zasady, najnowsze 200 śladów na organizację oraz dzienne agregaty użycia za 365 dni. Nie jest to pełna kopia wszystkich danych osobowych ani historyczny zapis zasad.
Eksport dziennika audytu w formacie NDJSON domyślnie obejmuje 7 dni, pozwala na co najwyżej 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
Samo usunięcie konta odbywa się na stronie profilu i podlega regule własności opisanej na stronie konsoli.
Plik cookie sesji nie jest poświadczeniem API
Sesja przeglądarki uwierzytelnia konsolę, a nie API. Klient OpenAI, który ją wyśle, otrzymuje odmowę 403 api_key_required i musi zamiast tego użyć klucza API.
Odmowa w tym miejscu podaje kod, więc migracja może na nim rozgałęzić logikę, a blok llmeu w każdej odpowiedzi mówi, co faktycznie się stało.