Co oznacza to sformułowanie
Ludzie używają "lokalny LLM OpenAI API" na dwa powiązane sposoby. Pierwszy to model językowy, który uruchamiasz samodzielnie na laptopie lub domowym serwerze, który nasłuchuje na lokalnym porcie i mówi w formacie czatu OpenAI. Drugi to nawyk pisania aplikacji zgodnie z tym formatem, dzięki czemu model stojący za nią może być podmieniony.
Format to prosty kontrakt. Twoja aplikacja wysyła ciało JSON z nazwą model i listą messages, każda z rolą systemową, użytkownika lub asystenta. Serwer odpowiada obiektem JSON zawierającym wygenerowaną wiadomość lub strumieniem małych fragmentów, jeśli poprosisz o strumieniowanie. Oficjalne SDK dla Pythona i JavaScriptu to opakowują i pozwalają nadpisać base URL, co jest kluczowe.
Wiele lokalnych narzędzi udostępnia ten kontrakt. Ollama, LM Studio, serwer llama.cpp i vLLM oferują każdy trasę w stylu OpenAI. Usługi hostowane również, dlatego te same dwadzieścia linii kodu klienta mogą rozmawiać z którąkolwiek z nich. Endpoint na tej stronie jest jedną z usług hostowanych. Akceptuje POST /v1/chat/completions i GET /v1/models, a dostęp do niego masz pod https://api.onekeyllmapi.com/v1.
Lokalny versus hostowany na pierwszy rzut oka
Żaden nie jest lepszy ogólnie. Wymieniają kontrolę na wysiłek. Tabela skupia się na różnicach, które obowiązują dla kategorii, a nie dla konkretnego produktu.
| Pytanie | Lokalny runner | Hostowane API w stylu OpenAI |
|---|---|---|
| Gdzie trafiają prompty | Pozostają na Twojej maszynie | Połączenie z dostawcą przez HTTPS |
| Sprzęt | Zapewniasz GPU lub CPU i pamięć | Nic po Twojej stronie |
| Rozmiar modelu | Ograniczone przez Twoją pamięć | To, co oferuje dostawca |
| Model kosztowy | Sprzęt i energia | Za każdy token, z przedpłaconego kredytu tutaj |
| Dostępność | Dopóki Twoja maszyna jest włączona | Serwer zawsze włączony, wspólne limity |
| Konfiguracja | Zainstaluj, pobierz wagi, dostosuj | Utwórz klucz, ustaw base URL |
Jeśli Twoje dane nie mogą nigdy opuścić maszyny, którą kontrolujesz, lokalne rozwiązanie wygrywa, a hostowane jest niewłaściwym narzędziem. Jeśli potrzebujesz większego modelu niż pozwala twój sprzęt lub bota, który jest dostępny z wielu miejsc, wygrywa rozwiązanie hostowane. Typowa konfiguracja używa obu i wybiera w zależności od zadania.
Przełączanie klienta z lokalnego na hostowany
Jeśli twój kod już rozmawia z lokalnym programem, zmiana sprowadza się do trzech wartości. Wszystko inne, w tym sposób budowania wiadomości i odczytywania strumieniowanych fragmentów, pozostaje bez zmian.
- Podstawowy URL. Użyj
https://api.onekeyllmapi.com/v1zamiast swojego lokalnego adresu. - Klucz API. Lokalne serwery często ignorują klucz. Hostowany wymaga go jako
Authorization: Bearer <key>, a SDK wysyła go za Ciebie. - Identyfikator modelu. Lokalne nazwy to dowolne, które pobrałeś. Tutaj ID to
uncensored.
Porządny sposób na utrzymanie elastyczności to odczytanie wszystkich trzech z zmiennych środowiskowych, dzięki czemu jeden plik działa w obu miejscach.
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ.get("LLM_BASE_URL", "https://api.onekeyllmapi.com/v1"),
api_key=os.environ.get("LLM_API_KEY", "YOUR_KEY"),
)
MODEL = os.environ.get("LLM_MODEL", "uncensored")
models = client.models.list()
print([m.id for m in models.data])
resp = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": "Answer in two sentences."},
{"role": "user", "content": "Why do OpenAI-style endpoints make switching models easy?"},
],
temperature=0.5,
)
print(resp.choices[0].message.content)
To samo wywołanie z linii poleceń, przydatne do szybkiego testu dymnego:
curl https://api.onekeyllmapi.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "uncensored", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 20}'
W Node wzorzec jest identyczny:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: process.env.LLM_BASE_URL ?? "https://api.onekeyllmapi.com/v1",
apiKey: process.env.LLM_API_KEY,
});
const res = await client.chat.completions.create({
model: process.env.LLM_MODEL ?? "uncensored",
messages: [{ role: "user", content: "Name three uses for JSON mode." }],
});
console.log(res.choices[0].message.content);
Co obejmuje i czego nie obejmuje kompatybilność z OpenAI
Kompatybilność oznacza zgodność formatu przesyłu. Nie gwarantuje to, że każda funkcja oferowana przez oryginalną usługę jest obecna. Przed migracją prawdziwej aplikacji sprawdź każdy z tych punktów względem docelowej usługi.
To, co obsługuje to API
- Uzupełnienia czatu pod
POST /v1/chat/completionsi lista modeli podGET /v1/models. - Strumieniowanie przez zdarzenia wysyłane przez serwer z
stream: true, z raportem użycia na końcu strumienia. - Wywoływanie funkcji przez
toolsitool_choice, strumieniowanietool_callsi wyniki wysyłane jako wiadomościrole: "tool". - Tryb JSON przez
response_format: {"type": "json_object"}. - Kontrola próbkowania: temperatura, top_p, stop, seed oraz parametry kar są przekazywane dalej.
Czego nie robi
- Brak generowania obrazów, audio lub wideo. Obsługuje tylko tekst.
- Brak endpointu embeddingów i fine-tuningu. Jeśli Twoja aplikacja buduje indeks wektorowy, potrzebujesz osobnego źródła embeddingów.
- Tylko jeden model. Model to model o otwartych wagach uruchamiany przez niezależnego dostawcę. Nie jest to oficjalne API żadnego dużego dostawcy i nie jest routerem między dostawcami, więc nie możesz wybierać między rodzinami modeli, zmieniając ID.
Lokalne runnerki czasem różnią się w drugą stronę: lokalny serwer może oferować trasę embeddingów lub pozwalać na załadowanie kilku modeli, a rozmiar okna kontekstu to to, co skonfigurujesz. Przeczytaj dokumentację celu dla każdego przypadku i utrzymuj krótką listę funkcji, których Twoja aplikacja naprawdę używa. dokumentacja szybkiego startu pokazuje pola żądania w całości.
Różnice w kontekście, limitach i koszcie
Trzy liczby zmieniają się przy wyjściu z lokalnego serwera. Pierwsza to okno. Długość kontekstu lokalnego to ustawienie pamięci. Tutaj jest stałe na 100 000 tokenów, dzielone przez prompt i completion, a max_tokens jest opcjonalne. Druga to konkurencja. Twoja maszyna może być w kolejce, ale pełny klucz daje 8 równoległych zapytań i 300 na minutę, a klucz próbny 2 i 60. Trzecia to rachunek.
Koszt hostowania to $0,15 za 1M tokenów wejściowych i $0,50 za 1M tokenów wyjściowych, płatność za zużycie z przedpłaconego kredytu. Przejdź przez dzienny job jako przykład: sumaryzator przetwarza 400 dokumentów dziennie, każdy o 3000 tokenach wejściowych i 300 tokenach wyjściowych. Wejście to 400 x 3000 = 1 200 000 tokenów, co kosztuje 1,2 x $0,15 = $0,18. Wyjście to 400 x 300 = 120 000 tokenów, co kosztuje 0,12 x $0,50 = $0,06. Dzień łącznie to $0,24, a 30-dniowy miesiąc to $7,20. Porównaj to z kosztami utrzymania włączonego GPU i samej karty, zanim podejmiesz decyzję.
Gdy przekroczysz limit, API odpowiada HTTP 429 z kodem rate_limited lub concurrency. Przy krótkim przeciążeniu dodaje Retry-After: 5. Zachowaj logikę ponawiania, która czeka i próbuje ponownie. Żądania, które się nie powiedły lub zostały odrzucone, nie są rozliczane. Kredyt nigdy nie wygasa, więc miesiąc bezczynności nic nie kosztuje.
Strumieniowane zapytanie trzyma slot konkurencji do końca strumienia, więc zamykaj strumienie, gdy przestaniesz czytać. Doładowania zaczynają się od $20; pakiety i bonusy są na stronie z cenami.
Debugowanie, gdy przełączenie działa nieprawidłowo
Większość nieudanych migracji wynika z kilku przyczyn. Przejrzyj je w tej kolejności.
- Błędy 404 lub połączenia. Base URL prawdopodobnie nie zawiera sufiksu
/v1lub ma dodatkową ścieżkę. Użyj go dokładnie tak, jak whttps://api.onekeyllmapi.com/v1. - Błędy uwierzytelniania. Brakuje klucza lub jest wysłany w złym nagłówku. Format to
Authorization: Bearer <key>. Użytkownicy SDK powinni upewnić się, że zmienna środowiskowa została poprawnie załadowana. - Model nie znaleziony. W Twojej konfiguracji wciąż znajduje się stara nazwa lokalnego modelu. Wywołaj
GET /v1/modelsi użyj ID podanego w odpowiedzi, czyliuncensored. - Błąd 429 przy dużym obciążeniu. Przekroczyłeś limit 8 równoległych zapytań lub 300 na minutę przy pełnym kluczu. Dodaj kolejkę lub semafor.
- Pojawia się wrażenie, że parametr jest ignorowany. Sprawdź, czy jest to jedno z pól przekazywanych dalej wymienionych powyżej i porównaj zachowanie przy stałym
seedi niskiej temperaturze.
Każda odpowiedź zawiera nagłówek X-Request-Id. Zaloguj go obok własnego ID zapytania, aby w razie potrzeby móc prześledzić źródło błędnej odpowiedzi. Jeśli obsługujesz ruch produkcyjny i chcesz mierzyć jakość w czasie, artykuł na stronie LLM Observability: Myths vs Facts to dobry następny temat do przeczytania. Warto również przechwytywać nagłówki odpowiedzi X-Balance-USD, X-RateLimit-Limit-Requests i X-RateLimit-Limit-Concurrency.
Wypróbuj bez zobowiązań
Najtańszym sposobem sprawdzenia, czy twój kod portuje się bezproblemowo, jest jego uruchomienie raz. Załóż konto za pomocą Google lub adresu e-mail i hasła, a następnie odebierz darmowy kredyt próbny $0,50 ze strony kluczy. Zajmuje to jedno kliknięcie, nie wymaga karty, jest ograniczone do jednej osoby i jest ważny przez 7 dni. Pobierz swój klucz na stronie kluczy API, ustaw trzy zmienne środowiskowe z powyżej i uruchom istniejący zestaw testów.
Jeśli testy przejdą pomyślnie, a zużycie mieści się w Twoim budżecie, doładuj konto od kwoty $20, kartą (Visa, Mastercard, Apple Pay, Google Pay) lub kryptowalutami (USDT w sieci TRC20, USDC na Base). Prompty nie są wykorzystywane do trenowania modelu. Model jest dostrojony do odpowiadania bez odmów generowania treści dla legalnego użytku przez osoby pełnoletnie, z jednym stałym ograniczeniem: brak treści seksualnych z udziałem nieletnich.
