Poniżej kompletny przykład w JavaScript: sesja z kontekstem użytkownika, wiadomość z odpowiedzią strumieniową i obsługa błędów.
const API = 'https://widget-api.prosecaptain.com/api/v2/widget';
const headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer TWOJ_TOKEN'
};
// Nowa sesja
async function startSession(context) {
const res = await fetch(`${API}/thread`, {
method: 'POST',
headers,
body: JSON.stringify({ widget_id: 'ID_WIDZETU', context })
});
if (!res.ok) throw new Error(`thread: ${res.status}`);
return (await res.json()).session_id;
}
// Wiadomość bez strumienia
async function ask(sessionId, message) {
const res = await fetch(`${API}/message`, {
method: 'POST',
headers,
body: JSON.stringify({ session_id: sessionId, message, widget_id: 'ID_WIDZETU' })
});
if (res.status === 429) throw new Error('Za dużo zapytań, spróbuj za chwilę');
if (!res.ok) throw new Error(`message: ${res.status}`);
return res.json();
}
// Wiadomość ze strumieniem (Server-Sent Events)
async function askStream(sessionId, message, onDelta) {
const res = await fetch(`${API}/message`, {
method: 'POST',
headers,
body: JSON.stringify({ session_id: sessionId, message, widget_id: 'ID_WIDZETU', stream: true })
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
for (;;) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const events = buffer.split('\n\n');
buffer = events.pop();
for (const raw of events) {
const event = raw.match(/^event: (.*)$/m)?.[1];
const data = raw.match(/^data: (.*)$/m)?.[1];
if (event === 'delta' && data) onDelta(JSON.parse(data));
}
}
}
const sessionId = await startSession({ current_page: 'Category: Sports' });
const answer = await ask(sessionId, 'Pokaż dostępne modele butów do biegania');
console.log(answer);
Wskazówka
Na produkcji dodaj ponawianie przy błędach sieci i przy kodzie 429. Wysyłaj w kontekście tylko informacje, które pomagają asystentowi odpowiadać.