Pobieranie wyników
Śledź zadanie przetwarzania do końca i odczytaj analizę.
Przesłanie zwraca identyfikator zadania przetwarzania. Możesz odpytywać API o to zadanie przetwarzania, aż osiągnie status końcowy, albo zarejestrować webhook i dostać powiadomienie, gdy będzie gotowe — webhooki lepiej sprawdzają się w stale działającej integracji, a odpytywanie jest prostsze w jednorazowym skrypcie.
curl "$BASE/v1/projects/$PROJECT_ID/calls/jobs/$JOB_ID" \
-H "X-API-Key: $AFTERTALK_KEY"Statusy zadań przetwarzania
| Status | Znaczenie |
|---|---|
PENDING | W kolejce, jeszcze nierozpoczęte |
PROCESSING | Trwa transkrypcja i analiza |
COMPLETED | Gotowe — pole transcriptId jest wypełnione |
FAILED | Przetwarzanie nie powiodło się; errorMessage podaje przyczynę |
BILLING_FAILED | Wyniki są zapisane i można je odczytać, ale nie udało się zarejestrować zużycia |
PENDING i PROCESSING to jedyne statusy, które nie są końcowe. Przy każdym innym zakończ odpytywanie.
BILLING_FAILED nie jest błędem przetwarzania: transkrypcja i analiza są zapisane, a pole transcriptId jest
wypełnione, więc przy odczycie wyników traktuj ten status jak COMPLETED. Sygnalizuje problem z rozliczeniem do
rozwiązania w aplikacji, a nie powód do ponownego przesłania.
Rozsądne jest odpytywanie co 5 sekund z górnym limitem czasu — czas przetwarzania rośnie wraz z długością nagrania.
import os, time, requests
BASE = "https://app.aftertalk.co/api"
headers = {"X-API-Key": os.environ["AFTERTALK_KEY"]}
TERMINAL = {"COMPLETED", "FAILED", "BILLING_FAILED"}
def wait_for_job(project_id, job_id, timeout_s=900):
"""Returns the job once it's terminal. FAILED is terminal too, so check job["status"]."""
deadline = time.time() + timeout_s
while True:
job = requests.get(
f"{BASE}/v1/projects/{project_id}/calls/jobs/{job_id}", headers=headers
).json()
if job["status"] in TERMINAL:
return job
if time.time() > deadline:
raise TimeoutError(f"job {job_id} still {job['status']}")
time.sleep(5)
# The ids the quickstart exports.
job = wait_for_job(os.environ["PROJECT_ID"], os.environ["JOB_ID"])
if job["status"] == "FAILED":
raise RuntimeError(f"Processing failed: {job.get('errorMessage')}")Odczyt rozmowy
Gdy pole transcriptId jest wypełnione:
curl "$BASE/v1/projects/$PROJECT_ID/calls/$TRANSCRIPT_ID" \
-H "X-API-Key: $AFTERTALK_KEY"Otrzymujesz transkrypcję podzieloną na wypowiedzi mówców (turns) oraz analizę, którą generuje Twój projekt —
podsumowanie, wydźwięk, kategorię, ewentualną analizę według szablonu i liczbę zadań. Same zadania pobierasz
z endpointów zadań (action items). Pełny schemat odpowiedzi znajdziesz w
dokumentacji referencyjnej API.
Pola analizy są opcjonalne, nawet przy sukcesie
Transkrypcja jest wymagana; każdy kolejny krok analizy jest wykonywany w miarę możliwości: nawet w pomyślnie przetworzonej rozmowie niektórych pól może brakować, więc przed odczytem zawsze sprawdzaj, czy pole istnieje. Jeśli klasyfikacja lub podsumowanie nie powiedzie się dla jednej rozmowy, zadanie przetwarzania i tak się zakończy z zapisaną transkrypcją, a brakować będzie tylko tego konkretnego pola.
Nigdy nie zakładaj, że pole analizy istnieje tylko dlatego, że zadanie przetwarzania ma status COMPLETED. Przed
odczytem sprawdzaj, czy pole istnieje — call.summary?.summary?.executiveSummary, a nie
call.summary.summary.executiveSummary — inaczej jedna nietypowa rozmowa zepsuje Twoją integrację.
Pobieranie nagrania
GET /calls/{id}/audio zwraca metadane i link do zapisanego nagrania, np. dla odtwarzacza lub kopii
archiwalnej.