Przejdź do treści głównej

Przewodnik wdrożeniowy

Zostaw swojego klienta. Zmień bazowy adres i wartość model.

Modele tekstowe mówią tu protokołami, które twój SDK już zna: Chat Completions, bezstanowy podzbiór Responses, Anthropic Messages i generateContent od Google. Ciekawe pytanie brzmi, co dzieje się z parametrem, którego docelowy model nigdy nie zadeklarował.

Wyzwanie

Warstwy zgodności zwykle kłamią przez przemilczenie

Klasyczna awaria to nie jest 500. To parametr, który twoja brama przyjęła, odrzuciła i nigdy o tym nie wspomniała, więc model pracował bez twojego temperature, bez twoich definicji narzędzi albo bez twojego formatu odpowiedzi – a wynik wyglądał tylko na rozczarowujący, nie na zepsuty.

01

Niezadeklarowane parametry odrzucamy, a nie pomijamy

messages, tools, tool_choice, response_format, max_tokens, temperature i top_p mapują się na pola deklarowane przez model. Wszystko inne trafia do schematu modelu i kończy się kodem 400, gdy model tego nie deklaruje. Milczenie nigdy nie jest odpowiedzią.

02

Kształt błędu idzie za protokołem, który wywołano

Na /v1 treść jest obiektem błędu w stylu OpenAI albo Anthropic, a nie strukturą {code, msg, data, request_id} używaną przez /api/v1. Obsłuż obie, jeśli twój produkt miesza te powierzchnie.

03

Streaming i rozliczenie to osobne sprawy

stream: true zwraca zdarzenia chat.completion.chunk zamknięte przez data: [DONE]. Rozliczenie i tak idzie za zmierzonym zużyciem, więc przerwany strumień nie jest darmowym żądaniem.

Podejście

Podmień endpoint, a potem przepuść swoje testy

Zmień base_url i api_key, podmień nazwę modelu na wartość z GET /v1/models i uruchom zestaw testów, który już masz. Tam, gdzie wraca 400 na parametrze, ten parametr nigdy nie był obsługiwany przez wybrany model – a tej informacji cicha wersja nie dawała.

Zadziała każdy klient zgodny z OpenAI. Zmienia się tylko bazowy adres i wartość model.

POST /v1/chat/completions

from openai import OpenAI

client = OpenAI(
    base_url="https://api.spicyapi.ai/v1",
    api_key=os.environ["SPICY_API_KEY"],
)

stream = client.chat.completions.create(
    model="<publisher>/<model>/chat",          # exact value from GET /v1/models
    messages=[{"role": "user", "content": "Summarise these notes in three bullets."}],
    temperature=0.7,
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

text/event-stream

data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"- "}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"Ships"}}]}
data: [DONE]

Kontrakt

Co warto ustalić na starcie

API LLM zgodne z OpenAI: zmień bazowy adres — Co warto ustalić na starcie
Pole lub nagłówekWartość lub limit
POST /v1/chat/completionschat.completion · SSE with stream: true
GET /v1/modelsevery callable model value
Authorization: Bearer · x-api-key · x-goog-api-keyaccepted on /v1
undeclared parameter400 · never silently dropped

Przesuń w poziomie, żeby zobaczyć wszystkie kolumny.

Integracja

Od pierwszego wywołania do produkcji

  1. 01Utwórz klucz, a potem wykonaj GET /v1/models po identyfikatory, które da się teraz wywołać.
  2. 02Ustaw w kliencie bazowy adres i wyślij jedno żądanie bez streamingu – odpowiedzią jest zwykły obiekt chat.completion.
  3. 03Włącz streaming i potwierdź, że twój odbiornik radzi sobie z chat.completion.chunk i wartownikiem [DONE].
  4. 04Obserwuj zużycie na klucz w konsoli i ustaw dzienny limit, zanim skierujesz tam ruch produkcyjny.

Dopasowanie

Kiedy ta droga jest właściwa

Wybierz to, gdy

  • Masz już działający kod klienta OpenAI, Anthropic albo Google i chcesz mieć za nim inny model.
  • Chcesz obraz, wideo i tekst na jednym kluczu, jednym saldzie i jednym zestawie limitów wydatków.

Poszukaj gdzie indziej, gdy

  • Zależysz od stanowych wątków albo asystentów po stronie serwera. Wsparcie dla Responses jest tu bezstanowym podzbiorem.
  • Potrzebujesz wyniku multimedialnego. To idzie przez createTask albo przez projekcję Videos dla klientów, którzy już ją znają.

Dowody

Co możesz sprawdzić samodzielnie

Cztery powierzchnie protokołów, jeden klucz

/v1/chat/completions, /v1/responses, /v1/messages i /v1beta/models/{model}:generateContent uwierzytelniają się tym samym kluczem. Authorization: Bearer, x-api-key i x-goog-api-key przyjmujemy każdy tam, gdzie spodziewa się go SDK.

Lista modeli jest kontraktem

GET /v1/models zwraca dokładnie te identyfikatory, które przyjmuje każda operacja /v1 i /api/v1, a w owned_by podaje twórcę modelu. Ceny pochodzą z /api/v1/models, które jest zależne od konta i przez to prywatne.

Walidacja, limity i blokady są wspólne

Warstwa zgodności korzysta z tego samego uwierzytelniania, tych samych limitów żądań, walidacji, cen i logiki blokad co powierzchnia natywna. Różni się tylko struktura odpowiedzi.

Przed startem

Zachowania platformy do potwierdzenia

  • Trzymaj klucz po stronie serwera – danych logowania w parametrach adresu nigdy nie przyjmujemy.
  • Zapisuj przy każdym wywołaniu identyfikator odpowiedzi z danego protokołu, żeby zgłoszenia do wsparcia miały uchwyt.
  • Ustal jeszcze przed wydaniem, jak błąd 400 na nieobsługiwanym parametrze dotrze do twoich użytkowników.
  • Ustaw dzienne, miesięczne i dożywotnie limity wydatków na klucz, zamiast polegać na samym saldzie.

FAQ

O co pytają na tej stronie

Każdy klient, w którym da się ustawić bazowy adres i nazwę modelu. Klienci w stylu OpenAI korzystają z /v1/chat/completions i /v1/responses, klienci Anthropic z /v1/messages, a klienci Google GenAI ze ścieżek generateContent.

Co dalej

Skieruj klienta na model tekstowy

Skieruj istniejącego klienta OpenAI, Anthropic albo Google na SpicyAPI. Co przechodzi wprost, co odrzucamy celowo i jak rozliczamy tekst.

Powiązane przewodniki