# Przykładowa integracja

> Kompletny przykład w JavaScript: sesja, wiadomości, odpowiedź strumieniowa i błędy.

Poniżej kompletny przykład w JavaScript: sesja z kontekstem użytkownika, wiadomość z odpowiedzią strumieniową i obsługa błędów.

```js
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ć.