spicyapiDokumentacja
Budowanie z API
Treść główna

Wyceny i zgodność protokołów

Poznaj dokładną cenę żądania przed zapłatą, wyślij je po tej cenie, odzyskaj utraconą odpowiedź i sprawdź, jak wyceniane są zgodne API dla tekstu i wideo.

Wycena dokładnego żądania

Wycena podaje cenę jednego, dokładnie określonego żądania, zanim zapłacisz. Jest bezpłatna, nie tworzy zadania i nie rezerwuje środków. Potem wysyłasz to samo żądanie z dołączoną wyceną, dzięki czemu zostanie przyjęte wyłącznie po cenie, która została ci pokazana.

Polecenia poniżej są przeznaczone dla terminala w macOS lub Linuksie, z SPICY_API_KEY ustawionym tak jak w szybkim starcie. MODEL_ID_FROM_CATALOG to symbol zastępczy: wpisz w jego miejsce wartość model ze swojego katalogu na żywo (GET /api/v1/models), a każde pole input weź ze schematu tego modelu.

Zapisz żądanie, które zamierzasz wysłać

Utwórz plik o nazwie request.json zawierający dokładnie te model, input i opcjonalny callBackUrl, które potem wyślesz:

request.json
{
  "model": "MODEL_ID_FROM_CATALOG",
  "input": { "prompt": "A cinematic night portrait" }
}

Zapytaj o cenę

curl https://api.spicyapi.ai/api/v1/jobs/quote \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @request.json
{
  "code": 200,
  "msg": "success",
  "data": {
    "quoteId": "QUOTE_ID_FROM_RESPONSE",
    "model": "MODEL_ID_FROM_CATALOG",
    "estimatedCost": "0.008",
    "maxCharge": "0.008",
    "currency": "USD",
    "quantity": "1",
    "unit": "per_image",
    "expiresAt": "2026-09-17T10:05:00Z"
  },
  "request_id": "req_01k3m8x9q2z4v7n5p6r8s0t1w2"
}

Kwoty to liczby dziesiętne w dolarach amerykańskich, zapisane jako tekst. maxCharge to najwięcej, ile to żądanie może kosztować; obecnie zawsze równa się estimatedCost. quantity i unit pokazują, co jest liczone, na przykład sekundy wideo. Kwotę i expiresAt pokaż osobie, która zatwierdza wydatek.

Wycena przechodzi te same kontrole co prawdziwe zgłoszenie, więc już na tym etapie może się nie powieść: 400 (dane wejściowe nie pasują do schematu modelu), 40201 (za niskie saldo), 40202 (limit wydatków na kluczu albo limit platformy) lub 403 (ten klucz nie może używać tego modelu).

Wyślij to samo żądanie z dołączoną wyceną

W ciągu pięciu minut wyślij niezmienione żądanie do createTask z dwoma dodatkowymi polami: quoteId z wyceny oraz expectedCost ustawionym na wycenione estimatedCost. Ten krok kosztuje.

submit.json
{
  "model": "MODEL_ID_FROM_CATALOG",
  "input": { "prompt": "A cinematic night portrait" },
  "quoteId": "QUOTE_ID_FROM_RESPONSE",
  "expectedCost": "0.008"
}
SPICY_IDEMPOTENCY_KEY="$(uuidgen)"   # jeden na każde nowe zadanie; użyj go ponownie tylko przy ponownym wysyłaniu tego samego żądania

curl https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  --data-binary @submit.json

Odpowiedź to zwykła odpowiedź zadania 202 Accepted, opisana w szybkim starcie. Wycena nie zastępuje Idempotency-Key: wysyłaj jedno i drugie.

Wycena jest powiązana zPrzestaje działać, gdy
Twoim kontem i kluczem API, który o nią poprosiłWysyłasz zgłoszenie innym kluczem
Dokładnymi wartościami model, input i callBackUrlKtórakolwiek z nich się zmieni, choćby o jeden znak promptu. Kolejność pól i odstępy nie mają znaczenia
Ceną z tamtej chwiliMinie pięć minut albo zmieni się cena

40901 oznacza, że wycena nie opisuje już żądania

Zmienione dane wejściowe, inny klucz API, wygasła wycena, zmieniona cena albo expectedCost różny od wyceny – wszystko to kończy się tak samo: przyjęcie nie udaje się z kodem 40901 i nic nie zostaje pobrane. Wyceń i potwierdź jeszcze raz – nie usuwaj quoteId ani expectedCost po to, żeby przepchnąć żądanie bez wyceny.

POST /api/v1/jobs/stream, czyli natywny strumień tekstu, przyjmuje wycenę w ten sam sposób; zobacz Tekst i streaming.

Odzyskiwanie utraconej odpowiedzi

Jeśli zgłoszenie przekroczyło limit czasu albo połączenie zostało zerwane, nie wiesz, czy żądanie zostało przyjęte. Dla createTask, retry i POST /v1/videos:

  1. Wyślij pierwotne żądanie ponownie z pierwotnym Idempotency-Key, tym samym kluczem API. Dostaniesz z powrotem pierwotne zadanie w jego bieżącym stanie i nie zapłacisz dwa razy.
  2. Nie twórz kolejnego zadania z nowym kluczem idempotentności. Nowy klucz oznacza nową generację i nową opłatę.
  3. Powtórzenie już przyjętego żądania pozostaje ważne także po wygaśnięciu wyceny. Wygaśnięcie blokuje przyjęcie, a nie zadanie, które to przyjęcie utworzyło.
  4. 409 nie oznacza „nie utworzono”. Albo żądanie się zmieniło (to nowa porcja pracy, która wymaga nowego klucza idempotentności), albo zostało wysłane innym kluczem API z tego samego konta (wyślij je ponownie pierwotnym kluczem API). Zobacz Idempotentność.
  5. Ostateczną opłatę odczytasz z cost i settled w recordInfo.

Żądań tekstowych i streamingu nie da się odzyskać w ten sposób

Odpowiedź na żądanie tekstowe (/api/v1/jobs/stream oraz endpointy tekstowe pod /v1 i /v1beta) trafia do ciebie w miarę generowania i nie jest zapisywana. Ponowne wysłanie klucza, który został już przyjęty, zwraca błąd zamiast odpowiedzi: 400 przy tej samej treści żądania, 409 przy innej. Nic więcej nie zostaje pobrane, ale utraconej odpowiedzi nie da się odzyskać. Żeby dostać odpowiedź jeszcze raz, wyślij żądanie z nowym kluczem i zapłać za nie. Zobacz Które endpointy czytają ten nagłówek.

Szacunek to nie rozliczenie

estimatedCost to kwota, jaką spodziewamy się pobrać. Znacznik końca tekstu w strumieniu mówi tylko, że bajty przestały napływać. Żadne z nich nie dowodzi, że opłata jest ostateczna. W przypadku zadań dowodzi tego settled: true razem z cost w recordInfo. Wywołania tekstowe nie zwracają identyfikatora zadania: ich opłatę znajdziesz na liście zadań pobranej tym samym kluczem API (GET /api/v1/jobs) albo w Konsola → Logi. cost traktuj jako ostateczny, gdy settled ma wartość true.

Wyceny w oficjalnych narzędziach

CLI i serwer MCP pobierają wycenę i pytają człowieka przed każdym płatnym wywołaniem, więc tego kroku nie musisz budować samodzielnie:

  • CLI: spicyapi tasks quote wycenia żądanie; spicyapi tasks create wycenia je jeszcze raz, wypisuje kwotę i pyta, zanim utworzy zadanie. Zobacz Koszty, potwierdzenia i bezpieczeństwo.
  • MCP: asystent może swobodnie pobierać wyceny, ale przed utworzeniem zadania pyta ciebie przez klienta AI, podając cenę. Zobacz Koszty, potwierdzenia i bezpieczeństwo.
  • SDK: quoteTask zwraca wycenę; przekaż jej quoteId i estimatedCost do createTask albo run.

Agent nie może potwierdzać w imieniu użytkownika

Potwierdzenie istnieje po to, żeby decyzję podejmował człowiek. Agent, który sam na nie odpowiada, albo klient ustawiony na automatyczne zatwierdzanie usuwa jedyną granicę wydatków na tej ścieżce.

Zgodność dla tekstu i wideo

SpicyAPI obsługuje też formaty OpenAI, Anthropic i Google Gemini dla modeli tekstowych oraz format OpenAI Videos dla wideo. Pełna lista endpointów jest w spisie endpointów; żądania, strumienie i błędy dla każdego protokołu opisuje strona Tekst i streaming.

Adres bazowy. Format OpenAI używa https://api.spicyapi.ai/v1. SDK Anthropic i Google GenAI same dopisują /v1 albo /v1beta, więc ustaw w nich adres bazowy https://api.spicyapi.ai.

Poświadczenie. Jeden klucz API do wszystkich formatów, w nagłówku Authorization: Bearer. Przyjmowane są też nagłówek x-api-key, którego używa SDK Anthropic, i nagłówek x-goog-api-key, którego używa SDK Google GenAI. Parametr ?key= w adresie URL – nigdy.

Model. Wybierz dokładny model z katalogu na żywo. To, czy działają narzędzia, wiadomości z obrazami i opcje generowania, zależy od schematu tego modelu, a nie od wybranego protokołu.

Kształt odpowiedzi. Każdy protokół zwraca własną strukturę odpowiedzi, a nie platformową {code, msg, data, request_id}.

Pola rozumowania

Modele czatu, które udostępniają tekst rozumowania, mogą zwracać opcjonalny ciąg znaków w message.reasoning_content, a przy streamingu – w delta.reasoning_content. Gdy kontynuujesz rozmowę po wywołaniu narzędzia, możesz zachować ten tekst w odpowiedniej wiadomości asystenta, jeśli schemat modelu w katalogu na żywo na to pozwala.

usage.completion_tokens_details.reasoning_tokens opisuje część rozumowania, która jest już wliczona w completion_tokens; nie dodawaj jej drugi raz. Nie każdy model zwraca tekst rozumowania albo te szczegóły tokenów.

Dwa kształty, które warto znać przed budową

  • Responses wymaga pełnej rozmowy w input. previous_response_id nie jest obsługiwane.
  • Videos przyjmuje JSON z polami model, prompt, input_reference, seconds i size, które są mapowane na własne pola modelu. Zwrócone id wideo jest zarazem identyfikatorem zadania, który przyjmuje recordInfo. Endpoint z treścią wideo przekierowuje statusem HTTP 302 na krótko ważny, podpisany adres URL.

Zgodne API naliczają cenę w chwili przyjęcia

quoteId i expectedCost dotyczą wyłącznie jobs/createTask i jobs/stream. /v1 i /v1beta stosują cenę obowiązującą w chwili przyjęcia żądania i odrzucają te dwa pola, więc na tej ścieżce nie ma potwierdzania ceny dla pojedynczego wywołania. Jeśli proces musi potwierdzać limit opłaty, użyj natywnego API zadań; żeby ograniczyć wszystko, co może wydać klucz, ustaw jego limity dzienny, miesięczny i łączny – zobacz Uwierzytelnianie.

Przykład czatu ze streamingiem w oficjalnych klientach OpenAI, Anthropic i Google znajdziesz w sekcji Użyj oficjalnego SDK. CLI i serwer MCP wysyłają i śledzą zadania natywne; nie przesyłają strumieniowo tokenów czatu.

Na tej stronie