Przejdź do głównej zawartości

API Komputera Agenta

Wypróbuj w API Playground.

https://api.rebyte.ai/v1

Każde żądanie wymaga nagłówka API_KEY. Swój klucz uzyskasz w Ustawieniach > Klucze API.

Terminal window
curl https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_your_key_here"

Nazwa nagłówka jest niewrażliwa na wielkość liter. API_KEY, api-key i x-api-key działają.


MethodPathOpis
POST/tasksUtwórz zadanie
GET/tasksWyświetl zadania
GET/tasks/:idPobierz zadanie ze statusem i historią promptów
POST/tasks/:id/promptsWyślij kolejny prompt
PATCH/tasks/:id/visibilityZmień widoczność zadania
DELETE/tasks/:idUsuń zadanie (miękkie usunięcie)
GET/tasks/:id/eventsStrumień zdarzeń wykonania SSE
POST/filesPobierz podpisany URL do przesyłania plików
POST/webhooksZarejestruj webhook
GET/webhooksWyświetl webhooki
GET/webhooks/:idPobierz szczegóły webhooka
DELETE/webhooks/:idUsuń webhook
Wszystkie ścieżki są względne w stosunku do bazowego URL (https://api.rebyte.ai/v1).

POST /tasks

Tworzy nowe zadanie. Domyślnie, udostępnia nową maszynę wirtualną (Komputer Agenta). Przekaż workspaceId, aby zamiast tego uruchomić zadanie w istniejącym obszarze roboczym — to pomija udostępnianie i jest znacznie szybsze.

Wywołanie blokuje się do momentu udostępnienia maszyny wirtualnej i przesłania pierwszego promptu.

Treść żądania:

FieldTypeRequiredOpis
promptstringYesOpis zadania (maks. 100 000 znaków)
executorstringNoclaude (domyślnie), gemini, codex, opencode
modelstringNoPoziom modelu dla wykonawcy. Zobacz Modele.
workspaceIdstringNoUUID istniejącego obszaru roboczego do ponownego użycia
filesobject[]NoPliki z POST /files. Każdy: {"id": "...", "filename": "..."}
skillsstring[]NoSlugi umiejętności (np. ["deep-research", "pdf"])
githubUrlstringNoRepozytorium GitHub w formacie owner/repo
branchNamestringNoNazwa gałęzi (domyślnie: main)
Terminal window
curl -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Build a REST API with Express and add tests",
"executor": "claude",
"skills": ["deep-research"],
"githubUrl": "your-org/your-repo"
}'

Odpowiedź (201):

{
"id": "550e8400-e29b-41d4-a716-446655440000",
"workspaceId": "660e8400-e29b-41d4-a716-446655440001",
"url": "https://app.rebyte.ai/run/550e8400-e29b-41d4-a716-446655440000",
"status": "running",
"createdAt": "2026-01-28T12:00:00.000Z"
}

Zapisz workspaceId z odpowiedzi, aby tworzyć kolejne zadania na tym samym Komputerze Agenta:

Terminal window
# First task -- provisions a new VM
RESP=$(curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" -H "Content-Type: application/json" \
-d '{"prompt": "Set up the project"}')
WS_ID=$(echo $RESP | jq -r '.workspaceId')
# Second task -- reuses the same VM (much faster)
curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" -H "Content-Type: application/json" \
-d "{\"prompt\": \"Now add tests\", \"workspaceId\": \"$WS_ID\"}"

Dostępne modele zależą od wykonawcy:

ExecutorDostępne modeleDomyślny
claudeclaude-sonnet-4.6, claude-opus-4.6, gemini-3.1-pro, gpt-5.3-codex, gpt-5.4, minimax-m2.7, kimi-k2.5, glm-5, gemini-3-flashclaude-sonnet-4.6
codexgpt-5.4, gpt-5.3-codexgpt-5.4
geminiauto-gemini-3 (auto-routes between flash and pro)auto-gemini-3
opencodeSame as claudegemini-3.1-pro

Z BYOK (bring your own API key), dostępne są tylko natywne modele dostawcy wykonawcy (np. wykonawca claude z BYOK otrzymuje tylko claude-sonnet-4.6 i claude-opus-4.6).

GET /tasks?limit=50&offset=0

Zwraca zadania utworzone za pośrednictwem API, posortowane według czasu utworzenia (najnowsze najpierw).

ParamTypeDefaultOpis
limitnumber50Wyniki na stronę (maks. 100)
offsetnumber0Przesunięcie paginacji
Terminal window
curl "https://api.rebyte.ai/v1/tasks?limit=10" \
-H "API_KEY: rbk_xxx"

Odpowiedź:

{
"data": [
{
"id": "550e8400-...",
"url": "https://app.rebyte.ai/run/550e8400-...",
"title": "Build REST API with Express",
"executor": "claude",
"model": "claude-sonnet-4.6",
"createdAt": "2026-01-28T12:00:00.000000+00:00",
"completedAt": "2026-01-28T12:05:00.000000+00:00"
}
],
"total": 42,
"limit": 10,
"offset": 0
}
GET /tasks/:id

Zwraca pełne szczegóły zadania, w tym historię promptów i status pochodny.

Terminal window
curl https://api.rebyte.ai/v1/tasks/550e8400-... \
-H "API_KEY: rbk_xxx"

Odpowiedź:

{
"id": "550e8400-...",
"url": "https://app.rebyte.ai/run/550e8400-...",
"status": "running",
"title": "Build REST API with Express",
"executor": "claude",
"model": "claude-sonnet-4.6",
"createdAt": "2026-01-28T12:00:00.000000+00:00",
"completedAt": null,
"prompts": [
{
"id": "660e8400-...",
"status": "running",
"submittedAt": "2026-01-28T12:05:00.000000+00:00",
"completedAt": null
},
{
"id": "550e8400-...",
"status": "succeeded",
"submittedAt": "2026-01-28T12:00:01.000000+00:00",
"completedAt": "2026-01-28T12:03:00.000000+00:00"
}
]
}

Status zadania jest pochodny od stanów promptów:

StatusWarunek
runningDowolny prompt jest pending lub running
completedWszystkie prompty zakończone, ostatni to succeeded
failedWszystkie prompty zakończone, ostatni to failed
canceledWszystkie prompty zakończone, ostatni to canceled
POST /tasks/:id/prompts

Wyślij kolejny prompt do uruchomionego lub zakończonego zadania. Jeśli maszyna wirtualna jest zatrzymana, zostanie automatycznie wznowiona.

FieldTypeRequiredOpis
promptstringYesKolejny prompt (maks. 100 000 znaków)
skillsstring[]NoDodatkowe slugi umiejętności dla tego promptu
Terminal window
curl -X POST https://api.rebyte.ai/v1/tasks/550e8400-.../prompts \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Now add authentication with JWT"}'

Odpowiedź (201):

{
"promptId": "770f9500-..."
}
GET /tasks/:id/events

Otwiera strumień zdarzeń Server-Sent Events dla najnowszego promptu zadania. Zdarzenia obejmują wyjście agenta (stdout, stderr), wywołania narzędzi i sygnały ukończenia.

Terminal window
curl -N https://api.rebyte.ai/v1/tasks/550e8400-.../events \
-H "API_KEY: rbk_xxx"

Strumień emituje dwa typy zdarzeń:

  • event — zdarzenia wykonania (wyjście agenta, wywołania narzędzi)
  • done — końcowe zdarzenie ze statusem ukończenia, po czym strumień się zamyka
PATCH /tasks/:id/visibility
FieldTypeRequiredOpis
visibilitystringYesprywatne, udostępnione lub publiczne
PoziomKto może wyświetlić
privateTylko właściciel klucza API
sharedWszyscy członkowie organizacji (domyślnie)
publicKażdy z linkiem (tylko do odczytu)
Terminal window
curl -X PATCH https://api.rebyte.ai/v1/tasks/550e8400-.../visibility \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"visibility": "public"}'

Po ustawieniu na public, odpowiedź zawiera shareUrl dla nieautoryzowanego dostępu.

DELETE /tasks/:id

Miękkie usunięcie zadania. Zwraca 204 No Content.

Terminal window
curl -X DELETE https://api.rebyte.ai/v1/tasks/550e8400-... \
-H "API_KEY: rbk_xxx"

Przesyłaj pliki, aby dołączyć je do zadań. Wykorzystuje dwuetapowy przepływ z podpisanym URL.

POST /files
FieldTypeRequiredOpis
filenamestringYesNazwa pliku (maks. 255 znaków)
contentTypestringNoTyp MIME (domyślnie: application/octet-stream)

Odpowiedź (201):

{
"id": "550e8400-...",
"filename": "data.csv",
"uploadUrl": "https://storage.googleapis.com/...",
"maxFileSize": 52428800
}

URL do przesłania wygasa po 1 godzinie.

Terminal window
curl -X PUT "UPLOAD_URL_FROM_STEP_1" \
-H "Content-Type: application/octet-stream" \
--data-binary @data.csv

Przekaż id i filename z Kroku 1 podczas tworzenia zadania:

{
"prompt": "Analyze the uploaded data",
"files": [
{"id": "550e8400-...", "filename": "data.csv"}
]
}

Pliki są automatycznie kopiowane do maszyny wirtualnej zadania po rozpoczęciu wykonania.


Otrzymuj powiadomienia HTTP POST, gdy wystąpią zdarzenia zadania. Webhooki są uniwersalne — uruchamiają się dla wszystkich zadań w Twojej organizacji, niezależnie od tego, czy zostały utworzone za pośrednictwem API, interfejsu użytkownika, czy innego kanału.

ZdarzenieUruchamia się, gdy
task.createdNowe zadanie zostało utworzone
task.runningAgent rozpoczyna wykonywanie
task.completedZadanie zakończyło się pomyślnie
task.failedZadanie nie powiodło się
task.canceledZadanie zostało anulowane przez użytkownika
POST /webhooks
FieldTypeRequiredOpis
urlstringYesURL punktu końcowego HTTPS
eventsstring[]YesZdarzenia do subskrybowania
descriptionstringNoEtykieta czytelna dla człowieka (maks. 500 znaków)
secretstringNoWspółdzielony sekret (maks. 500 znaków). Po ustawieniu, dołączany jako nagłówek X-Webhook-Secret w każdej dostawie.
Terminal window
# Webhook without secret
curl -X POST https://api.rebyte.ai/v1/webhooks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"]
}'
# Webhook with pre-shared secret
curl -X POST https://api.rebyte.ai/v1/webhooks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"],
"secret": "my-shared-secret-value"
}'

Odpowiedź (201):

{
"id": "880e8400-...",
"url": "https://your-server.com/webhook",
"events": ["task.completed", "task.failed"],
"description": null,
"hasSecret": true,
"isActive": true,
"createdAt": "2026-01-28T12:00:00.000Z",
"lastTriggeredAt": null,
"failureCount": 0
}

Uwagi dotyczące zachowania:

  • Zduplikowane URL: zarejestrowanie tego samego URL dwukrotnie zwraca istniejący webhook (idempotentne)
  • Limit: maksymalnie 3 webhooki na organizację. Czwarty zwraca limit_exceeded.
  • Przechowywanie sekretu: wartość sekretu nigdy nie jest zwracana w żadnej odpowiedzi. Ujawniane jest tylko hasSecret: true/false.
GET /webhooks

Zwraca wszystkie webhooki dla Twojej organizacji z informacjami o statusie (lastTriggeredAt, failureCount, isActive). Sekrety nigdy nie są ujawniane.

GET /webhooks/:id
DELETE /webhooks/:id

Zwraca 204 No Content. Usunięte webhooki natychmiast przestają otrzymywać dostawy.

Gdy zdarzenie zadania pasuje do subskrybowanych zdarzeń webhooka, Rebyte wysyła żądanie HTTP POST na URL webhooka.

Ładunek:

{
"event": "task.completed",
"taskId": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": 1706443200,
"data": {
"status": "succeeded",
"taskUrl": "https://app.rebyte.ai/run/550e8400-...",
"result": "Created CSV file with 10 Hacker News posts..."
}
}
  • status — status promptu: pending (task.created), running (task.running), succeeded (task.completed), failed (task.failed), canceled (task.canceled)
  • taskUrl — bezpośredni link do zadania w interfejsie użytkownika Rebyte (zawsze obecny)
  • result — końcowy tekst wyjściowy AI (obecny w zdarzeniach końcowych: task.completed, task.failed, task.canceled; nieobecny w task.created i task.running)

Wywołaj GET /tasks/:id, aby uzyskać pełne szczegóły zadania, w tym historię promptów.

Nagłówki dostawy:

HeaderZawsze obecnyOpis
Content-TypeYesapplication/json
X-Webhook-SignatureYesPodpis RSA-SHA256 zakodowany w Base64
X-Webhook-TimestampYesZnacznik czasu Unix (sekundy)
X-Webhook-SecretOnly if secret configuredWspółdzielony sekret, który ustawiłeś podczas tworzenia

Limit czasu: dostawy przekraczają limit czasu po 10 sekundach.

Obsługa błędów:

  • Dostawa jest typu fire-and-forget — brak automatycznych ponownych prób w przypadku awarii
  • Odpowiedzi inne niż 2xx zwiększają failureCount
  • Po 10 kolejnych niepowodzeniach, webhook jest automatycznie wyłączany (isActive: false)
  • Udane dostawy resetują failureCount do 0

Każda dostawa jest podpisywana parą kluczy RSA-2048 Twojej organizacji, niezależnie od tego, czy skonfigurowano współdzielony sekret.

Jak to działa:

  1. Rebyte łączy {timestamp}.{body} (np. 1706443200.{"event":"task.completed",...})
  2. Podpisuje ciąg znaków za pomocą RSA-SHA256, używając klucza prywatnego Twojej organizacji
  3. Wysyła podpis zakodowany w Base64 w X-Webhook-Signature

Pobierz swój klucz publiczny: skontaktuj się z pomocą techniczną lub pobierz go z pulpitu nawigacyjnego Rebyte. Para kluczy RSA-2048 jest generowana automatycznie przy pierwszym utworzeniu webhooka i utrzymuje się dla organizacji.

Przykład weryfikacji (Node.js):

const crypto = require('crypto');
function verifyWebhook(rawBody, timestamp, signature, publicKey) {
const payload = `${timestamp}.${rawBody}`;
const verifier = crypto.createVerify('RSA-SHA256');
verifier.update(payload);
return verifier.verify(publicKey, signature, 'base64');
}
// W Twoim handlerze webhooka:
app.post('/webhook', (req, res) => {
const rawBody = req.body; // must be raw string, not parsed JSON
const timestamp = req.headers['x-webhook-timestamp'];
const signature = req.headers['x-webhook-signature'];
if (!verifyWebhook(rawBody, timestamp, signature, PUBLIC_KEY)) {
return res.status(401).send('Invalid signature');
}
const event = JSON.parse(rawBody);
console.log(`Task ${event.taskId}: ${event.event}`);
res.status(200).send('OK');
});

Przykład weryfikacji (Python):

from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
import base64
def verify_webhook(raw_body: str, timestamp: str, signature: str, public_key_pem: str) -> bool:
public_key = serialization.load_pem_public_key(public_key_pem.encode())
payload = f"{timestamp}.{raw_body}".encode()
try:
public_key.verify(
base64.b64decode(signature),
payload,
padding.PKCS1v15(),
hashes.SHA256()
)
return True
except Exception:
return False

Webhooki obsługują dwie niezależne metody weryfikacji, które mogą być używane razem:

MetodaHeaderJak to działaPrzypadek użycia
RSA signatureX-Webhook-SignatureKryptograficzny dowód, że ładunek pochodzi z RebyteWeryfikacja odporna na manipulacje
Pre-shared secretX-Webhook-SecretStatyczny ciąg znaków, który ustawiasz podczas tworzenia, zwracany w każdej dostawieProsta weryfikacja współdzielonego sekretu

Podpisy RSA są zawsze obecne. Współdzielony sekret jest opcjonalny — ustaw go podczas tworzenia webhooka, jeśli chcesz prostszej ścieżki weryfikacji.


Kompletny przykład: utwórz zadanie, odpytuj do momentu ukończenia, a następnie wyślij kontynuację.

Terminal window
# Create task
TASK_ID=$(curl -s -X POST https://api.rebyte.ai/v1/tasks \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Write a Python CLI that converts CSV to JSON"}' | jq -r '.id')
echo "Task: https://app.rebyte.ai/run/$TASK_ID"
# Poll until done
while true; do
STATUS=$(curl -s https://api.rebyte.ai/v1/tasks/$TASK_ID \
-H "API_KEY: rbk_xxx" | jq -r '.status')
echo "Status: $STATUS"
[[ "$STATUS" == "completed" || "$STATUS" == "failed" ]] && break
sleep 5
done
# Send a follow-up
curl -s -X POST https://api.rebyte.ai/v1/tasks/$TASK_ID/prompts \
-H "API_KEY: rbk_xxx" \
-H "Content-Type: application/json" \
-d '{"prompt": "Now add support for nested JSON objects"}'

Wszystkie błędy mają następującą strukturę:

{
"error": {
"code": "validation_error",
"message": "Invalid request body"
}
}
KodStatus HTTPOpis
missing_api_key401Nagłówek API_KEY nie został dostarczony
invalid_api_key401Nieprawidłowy lub wygasły klucz API
validation_error400Treść żądania nie przeszła walidacji
not_found404Zasób nie istnieje lub jest niedostępny
limit_exceeded400Osiągnięto limit organizacji (np. maks. liczba webhooków)
agent_disabled403Żądany wykonawca jest wyłączony dla tej organizacji
internal_error500Błąd po stronie serwera

API obecnie nie narzuca limitów szybkości na klucz. Każde POST /tasks udostępnia rzeczywistą maszynę wirtualną, więc koszty skalują się wraz z użyciem. Używaj webhooków zamiast agresywnego odpytywania, aby zmniejszyć liczbę niepotrzebnych żądań.