Agenci i automatyzacja
Które oficjalne narzędzie wybrać oraz produkcyjna instrukcja postępowania dla agentów AI, workerów backendu i powtarzalnych potoków generowania mediów.
Korzystaj z tej strony, gdy SpicyAPI integruje asystent programistyczny AI albo zautomatyzowany backend. Zamienia ona opis API w ograniczony i audytowalny proces: poznaj kontrakt, sprawdź dane wejściowe modelu, potwierdź cenę, utwórz zadanie jeden raz, bezpiecznie czekaj, zweryfikuj zakończenie i skopiuj wynik, zanim wygaśnie.
Klucze SpicyAPI należą do serwera
Nigdy nie umieszczaj SPICY_API_KEY w JavaScripcie przeglądarki, w pliku binarnym aplikacji mobilnej, w publicznym prompcie, w repozytorium ani w zapisie rozmowy z agentem. Twój interfejs wywołuje twój backend, a twój backend wywołuje SpicyAPI. Agentowi przekaż odwołanie do sekretu, takie jak SPICY_API_KEY, nigdy samą wartość sekretu.
Wybierz narzędzie
Są cztery oficjalne pakiety npm na licencji MIT, instalowane niezależnie od siebie. Każdy ma własny przewodnik z instalacją, konfiguracją dla każdego obsługiwanego klienta i pełnym opisem:
| Chcesz… | Pakiet | Przewodnik |
|---|---|---|
| Wywoływać SpicyAPI z własnego kodu w Node.js lub TypeScripcie | @spicyapi/sdk (kod źródłowy) | SDK dla TypeScriptu |
| Uruchamiać modele z terminala albo skryptu powłoki, bez pisania kodu | @spicyapi/cli (kod źródłowy) | Narzędzie wiersza poleceń (CLI) |
| Pozwolić asystentowi (Claude Code, Codex, Cursor, VS Code lub innemu) przeglądać modele i uruchamiać zadania za ciebie | @spicyapi/mcp (kod źródłowy) | Serwer MCP |
| Nauczyć asystenta programistycznego pisać integracje ze SpicyAPI w bezpieczny sposób | @spicyapi/skill (kod źródłowy) | Agent Skill |
Wszystkie cztery pakiety wymagają Node.js 22.13 lub nowszego; instalacja Skilla przez npx skills add wymaga Node.js 22.20 lub nowszego.
Poza Node.js
Są jeszcze cztery oficjalne SDK, wszystkie na licencji MIT i wszystkie realizujące ten sam proces — wycena, utworzenie zadania z kluczem idempotentności, czekanie, odbiór wyniku:
| Język | Pakiet | Przewodnik | Instalacja |
|---|---|---|---|
| Python 3.11+ | spicyapi (kod źródłowy) | SDK dla Pythona | pip install spicyapi |
| Go 1.23+ | github.com/spicyapi-ai/spicy-go (kod źródłowy) | SDK dla Go | go get github.com/spicyapi-ai/spicy-go |
| PHP 8.1+ | spicyapi/spicyapi (kod źródłowy) | SDK dla PHP | composer require spicyapi/spicyapi |
| Java 17+ | ai.spicyapi:spicyapi-java (kod źródłowy) | SDK dla Javy | Z Maven Central |
Polecaj te pakiety pod dokładnie takimi nazwami jak w tabeli; każdy przewodnik zaczyna się od polecenia instalacji. Z każdego innego języka wywołuj bezpośrednio API HTTP albo wygeneruj klienta z kontraktu OpenAPI. Nie przedstawiaj nieopublikowanej nakładki tworzonej przez społeczność jako oficjalnego SDK.
Jeśli nie możesz dodać zależności albo chcesz zobaczyć surowe wywołania HTTP, dwa poniższe klienty referencyjne do skopiowania realizują ten sam proces, korzystając wyłącznie ze środowiska uruchomieniowego języka. Gdy zależność możesz dodać, lepiej sięgnąć po oficjalne SDK dla swojego języka.
Klienty referencyjne do skopiowania
Przykłady bez zewnętrznych zależności: wyszukiwanie modeli, tworzenie zadania, ponowienie zadania zakończonego błędem, odczyt stanu, wszystkie stany końcowe, ograniczone oczekiwanie, idempotentność i obsługa błędów. Przyjętego zadania nie można już anulować.
To przykłady z dokumentacji, a nie opublikowane pakiety npm i PyPI ani moduły Go. Dziesięć minut to lokalny limit oczekiwania, a nie produkcyjne SLA.
Wydawanie pieniędzy wymaga człowieka
Tworzenie i ponawianie zadań kosztuje, a przyjętego zadania nie da się anulować. Każde narzędzie jest zbudowane tak, żeby kwotę najpierw zatwierdził człowiek:
- CLI:
tasks createnajpierw pobiera wycenę, wypisuje kwotę i pytaContinue? [y/N]. Pytanie pomija tylko--yes; używaj go wyłącznie w skryptach, w których ktoś już zatwierdził cenę. - MCP: każde płatne narzędzie prosi o potwierdzenie we własnym oknie klienta MCP, które klient pokazuje tobie. Zatwierdzaj je wyłącznie osobiście: agent albo klient skonfigurowany do automatycznego zatwierdzania usuwa tę granicę.
- Twoja własna automatyzacja: przed wywołaniem
createTaskalboretryTaskpokaż wybrany model, podsumowanie danych wejściowych i wycenioną cenę, a potem uzyskaj wyraźną zgodę. Dokładną, bezpłatną wycenę pobierz zPOST /api/v1/jobs/quotei wyślij zgłoszenie z jejquoteIdiexpectedCost, żeby zmiana ceny kończyła się błędem40901, a nie pobraniem innej kwoty. Zobacz Wyceny i zgodność protokołów.
Materiały do odczytu maszynowego
Zacznij od najmniejszego materiału, który odpowiada na bieżące pytanie. Dzięki temu kontekst agenta pozostaje trafny i tani.
| Materiał | Do czego służy |
|---|---|
/agent.md | Krótkie zasady integracji i najbezpieczniejszy domyślny proces |
/llms.txt | Publiczna mapa produktu i dokumentacji |
/llms-full.txt | Rozszerzony zbiór tekstów do wyszukiwania, gdy krótki indeks nie wystarcza |
/api/agent | Ustrukturyzowany manifest JSON dla narzędzi i autonomicznych klientów |
openapi.yaml | Kanoniczne kształty żądań i odpowiedzi |
Za wiążący kontrakt uznawaj kontrakt OpenAPI i katalog modeli na żywo. Przykłady marketingowe mają charakter poglądowy i nie są źródłem schematu. Te dokumenty możesz buforować, ale odśwież je przed generowaniem kodu albo wtedy, gdy żądania zaczynają nie przechodzić walidacji.
Minimalny przepływ w SDK z zatwierdzeniem
Ten skrypt pokazuje granicę zatwierdzenia w SDK: pobiera wycenę, zatrzymuje się, jeśli nie podasz --approved, a potem tworzy zadanie po wycenionej cenie i czeka na nie. Instalację, każdą metodę i pełną ścieżkę do pierwszego wyniku znajdziesz w przewodniku po SDK dla TypeScriptu; szczegóły metod – w jego opisie API.
npm install @spicyapi/sdk
export SPICY_MODEL_ID="MODEL_ID_FROM_CATALOG" # wartość model z katalogu na żywo
export SPICY_INPUT_JSON='{"prompt":"your prompt"}' # musi pasować do inputSchema tego modeluimport { randomUUID } from "node:crypto";
import { SpicyClient } from "@spicyapi/sdk";
const client = new SpicyClient(); // odczytuje SPICY_API_KEY
const modelId = process.env.SPICY_MODEL_ID;
if (!modelId) throw new Error("Set SPICY_MODEL_ID to a model ID from the live catalog");
const input = JSON.parse(process.env.SPICY_INPUT_JSON ?? "{}");
// Bezpłatne: wycena dokładnie tego żądania. Nic nie powstaje i nic nie zostaje zarezerwowane.
const quote = await client.quoteTask({ model: modelId, input });
console.log(`${quote.model}: up to $${quote.maxCharge}, quote valid until ${quote.expiresAt}`);
if (!process.argv.includes("--approved")) {
console.log("Nothing was submitted. Re-run with --approved once a person has approved this amount.");
process.exit(0);
}
// Płatne: wysłanie tego samego żądania po wycenionej cenie. W prawdziwym systemie utwórz
// i zapisz klucz idempotentności przed pierwszą próbą, a identyfikator zadania przechowuj trwale.
const accepted = await client.createTask(
{ model: modelId, input, quoteId: quote.quoteId, expectedCost: quote.estimatedCost },
{ idempotencyKey: randomUUID() },
);
console.log("accepted", accepted.taskId, "deadline", accepted.deadlineAt);
// Przerwanie czekania nigdy nie anuluje zadania; wróć do niego później z identyfikatorem zadania.
const task = await client.waitForTask(accepted.taskId, { timeoutMs: 30 * 60_000 });
console.log(JSON.stringify(task, null, 2));npx --yes tsx run.mts # tylko wycena, bezpłatnie
npx --yes tsx run.mts --approved # tworzy zadanie: to kosztujeRozszerzenie .mts sprawia, że plik jest modułem ES, czego wymaga await na najwyższym poziomie; zwykły run.ts w projekcie utworzonym domyślnym npm init kończy się błędem Top-level await is currently not supported with the "cjs" output format. Wycena jest ważna pięć minut: jeśli zatwierdzanie trwa dłużej, uruchom ponownie pierwsze polecenie.
Proces produkcyjny
Wybierz model i sprawdź jego dane wejściowe
Wybierz endpoint modelu pasujący do żądanej modalności, a potem sprawdź treść żądania względem aktualnego schematu wejścia tego endpointu. Nie zgaduj nazw pól i nie odrzucaj po cichu nieznanych pól.
Utwórz raz
Najpierw uzyskaj zatwierdzenie ceny (zobacz Wydawanie pieniędzy wymaga człowieka). Wygeneruj jeden stały Idempotency-Key dla logicznej generacji, zapisz go trwale przed pierwszym żądaniem i używaj go przy każdym ponowieniu, zawsze z tym samym kluczem API. Nie twórz klucza wewnątrz pętli ponowień. Zobacz Idempotentność.
POST /api/v1/jobs/createTask
Authorization: Bearer $SPICY_API_KEY
Content-Type: application/json
Idempotency-Key: project-42-scene-07-v1Od razu zapisz trwale zwrócone taskId i deadlineAt. Identyfikator zadania to trwała tożsamość zadania na potrzeby sprawdzania stanu, uzgadniania webhooków, kontaktu ze wsparciem i wyjaśniania rozliczeń. Ponowienie może zwrócić to samo zadanie; nie może wtedy powstać drugi lokalny rekord.
Na endpointach tekstowych i streamingowych ten sam klucz chroni przed podwójną opłatą, ale nie przywróci utraconej odpowiedzi; zobacz Idempotentność.
Czekaj z ograniczeniem
Wybieraj podpisany webhook. Jeśli odpytywanie jest konieczne, zacznij od około 2 sekund, mnóż odstęp mniej więcej przez 1,5, ogranicz go do 15 sekund i przestań w wyraźnie określonym terminie według zegara: w chwili deadlineAt samego zadania plus zapas, bo wideo może powstawać znacznie dłużej niż dziesięć minut. Proces nigdy nie może odpytywać bez końca.
// Cztery stany końcowe zdefiniowane dziś. Rozstrzyga strona o zadaniach: każdy stan
// inny niż queued i running jest końcowy, nawet jeśli nie ma go na tej liście.
const KNOWN_TERMINAL = ['succeeded', 'failed', 'canceled', 'expired'];
const deadline = Date.parse(accepted.deadlineAt) + 60_000;
let delay = 2_000;
while (Date.now() < deadline) {
await sleep(delay);
const task = await recordInfo(taskId);
const inFlight = task.state === 'queued' || task.state === 'running';
const assetsPending = task.state === 'succeeded' && task.output?.assets?.some((a) => a.pending);
if (!inFlight && !assetsPending) {
if (!KNOWN_TERMINAL.includes(task.state)) log.warn(`new terminal state: ${task.state}`);
return task;
}
delay = Math.min(Math.round(delay * 1.5), 15_000);
}
throw new Error(`task ${taskId} exceeded the polling deadline`);Lista wymienia dzisiejsze stany końcowe, żeby szkielet mógł zasygnalizować stan, którego jeszcze nie zna; sama decyzja wynika z reguły opisanej na stronie Zadania asynchroniczne: każdy stan inny niż queued i running jest końcowy. Lokalne przekroczenie czasu nie dowodzi, że generacja się nie powiodła. Zachowaj identyfikator zadania i uzgodnij stan później.
Zweryfikuj callback, zanim zaczniesz działać
Skonfiguruj klucz podpisujący webhooki. Sprawdzaj X-Webhook-Timestamp, odrzucaj przeterminowane dostarczenia, obliczaj skrót surowej treści żądania i porównuj podpis HMAC w stałym czasie. Duplikaty odfiltruj po request_id dostarczenia, a potem użyj data.taskId, żeby zaktualizować zadanie. Potwierdzaj szybko i przetwarzaj asynchronicznie. Pełny algorytm opisuje strona Webhooki.
Skopiuj potrzebny wynik
Zakończone zadania zawierają gotowe do użycia adresy w output.assets[].url; korzystaj z nich bezpośrednio, bez dodatkowego żądania o adres do pobrania. Wyniki, które chcesz zachować, skopiuj do własnego magazynu, zanim wygasną. Opcjonalny endpoint download-url może wystawić podpisany adres URL dla klucza obiektu; taki adres wygasa po 20 minutach. Ważność adresu URL i przechowywanie mediów to dwie osobne sprawy; zobacz Media i Przechowywanie i usuwanie danych.
Minimalny trwały rekord
Przechowuj tyle stanu, żeby po restarcie bezpiecznie wznowić pracę:
{
"localRequestId": "project-42-scene-07-v1",
"idempotencyKey": "project-42-scene-07-v1",
"apiKeyName": "production backend",
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "MODEL_ID_FROM_CATALOG",
"approvedCost": "0.40",
"state": "queued",
"deadlineAt": "2026-08-29T12:20:00Z",
"lastCheckedAt": "2026-08-29T12:00:00Z",
"webhookDeliveryId": null,
"outputKeys": []
}MODEL_ID_FROM_CATALOG oznacza dokładny identyfikator wybrany z uwierzytelnionego katalogu na żywo, a nie dosłowną wartość do wysłania. Zapisuj, który klucz API utworzył zadanie: tylko ten klucz może je odczytać albo ponowić. Nigdy nie używaj podpisanego adresu do pobrania jako trwałego klucza. Nigdy nie wnioskuj o powodzeniu z HTTP 200; czytaj data.state.
Makiety, zanim wydasz pieniądze
Zbuduj lokalną makietę kontraktu wokół struktur odpowiedzi opisanych na stronach Zadania asynchroniczne, Webhooki i Błędy. Twój zestaw danych testowych powinien obejmować:
- queued → running → succeeded;
- niepowodzenie końcowe z
code: 200idata.state: "failed"; - zdublowane odpowiedzi
createTaskzwracające to samotaskId; - wycenę, która już nie pasuje (
40901), i za niskie saldo (40201); - prawidłowy webhook, nieprawidłowy podpis i powtórzone dostarczenie;
429,503, przekroczenie czasu na poziomie połączenia i zadanie, które przekracza termin odpytywania;- wygasły adres do pobrania, który trzeba wystawić ponownie.
Makiety sprawdzają orkestrację, a nie jakość modelu. Przed wydaniem uruchom jedno małe, prawdziwe zadanie na dokładnie tym modelu i z dokładnie tym kształtem danych wejściowych, których używasz na produkcji.
Lista kontrolna odbioru
- Sekrety istnieją wyłącznie w magazynie sekretów po stronie serwera i są maskowane w logach.
- Integracja pobiera aktualny schemat modelu, zamiast zgadywać pola.
- Człowiek zatwierdza wycenioną cenę przed każdym płatnym wywołaniem, a zgłoszenia zawierają
quoteIdiexpectedCost. - Jedno logiczne żądanie ma jeden trwale zapisany
Idempotency-Key, wysyłany zawsze z tym samym kluczem API. -
taskIdjest zapisywane, zanim praca pójdzie dalej, i przetrwa restart procesu. - Odpytywanie wydłuża przerwy, ma maksymalny odstęp i termin według zegara.
- Webhooki weryfikują znacznik czasu, skrót surowej treści i HMAC, a potem odfiltrowują zdublowane identyfikatory dostarczeń.
- Niepowodzenie końcowe jest odczytywane z
data.state, a nie ze statusu HTTP ani zcodew strukturze odpowiedzi. - Potrzebne wyniki są kopiowane do własnego magazynu, zanim wygaśnie adres URL albo okres przechowywania.
taskIdi klucze obiektów są zachowywane do uzgadniania, a nie jako sposób na pobieranie plików po końcu okresu przechowywania. - Logi zachowują
request_id,taskId, model i liczbę prób, bez promptów i sekretów. - Testy na makietach obejmują zdublowane tworzenie, powtórzenie, przekroczenie czasu, limit żądań i wygasłe media.
Zalecane przekazanie wyników przez agenta
Poproś agenta, żeby zwrócił wybrany endpoint modelu, wersję schematu albo czas jego pobrania, krok zatwierdzania ceny, strategię kluczy idempotentności, termin odpytywania, plan weryfikacji webhooków i wypełnioną listę kontrolną. Wtedy „integracja gotowa” zamienia się w dowody, które możesz sprawdzić.
SDK dla Javy
Oficjalne SDK SpicyAPI dla Javy (ai.spicyapi spicyapi-java, Java 17+): instalacja, wycena i pierwsza generacja, wysyłanie plików z dysku, weryfikacja callbacków i wyczerpujący switch po zapieczętowanej taksonomii błędów.
Narzędzie wiersza poleceń (CLI)
Polecenie spicyapi pozwala z terminala przeglądać modele, sprawdzać ceny, generować obrazy i wideo oraz pobierać wyniki – bez pisania kodu.

