---
title: "CDN / Скриптов таг"
description: "Добавете гласовата джаджа на ThunderPhone към всеки уебсайт без бандлър"
---

CDN компилацията включва React вътрешно, така че можете да използвате уиджета в статични сайтове, WordPress, Webflow или всяка страница, където можете да добавяте HTML. Не са необходими npm, пакетиращ инструмент или framework.

## CDN URL адреси

<CodeGroup>
```html Latest (recommended)
<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
```

```html Pinned version
<!-- Each stable release also publishes an immutable /widget/vX.Y.Z/ path
     matching the @thunderphone/widget npm version (v1.1.2 at the time of
     writing). If you pin, you own updating the URL for new releases. -->
<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/v1.1.2/style.css" />
<script src="https://cdn.thunderphone.com/widget/v1.1.2/widget.js"></script>
```
</CodeGroup>

<Tip>
  URL адресите `latest` се генерират от генератора на код за вграждане в таблото. Те се кешират за 5 минути и автоматично получават новите стабилни версии. Фиксираните пътища `/widget/vX.Y.Z/` са неизменяеми и се кешират дългосрочно -- ако фиксирате версия, съобразете я с npm версията на `@thunderphone/widget`, спрямо която разработвате.
</Tip>

---

## Основна употреба

```html
<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
</head>
<body>

  <div id="thunderphone"></div>

  <script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
  <script>
    ThunderPhone.mount({
      element: '#thunderphone',
      publishableKey: 'pk_live_your_publishable_key',
    })
  </script>

</body>
</html>
```

Уиджетът се монтира в целевия елемент и се визуализира като **лента с фиксирана позиция в ъгъл на прозореца за преглед** (по подразбиране `bottom-right`, управлявано от опцията `position`). Елементът за монтиране е само React коренът -- местоположението му в страницата не влияе върху мястото, където се показва уиджетът.

---

## Опции за монтиране

`ThunderPhone.mount()` приема същите опции като React компонента, плюс свойството `element`:

| Опция | Тип | Задължително | По подразбиране | Описание |
|--------|------|----------|---------|-------------|
| `element` | `string \| HTMLElement` | Да | -- | CSS селектор (напр. `'#thunderphone'`) или референция към DOM елемент. |
| `publishableKey` | `string` | Да | -- | Публичен API ключ (`pk_live_...`). Агентът се определя автоматично от конфигурацията на уиджета за ключа. |
| `theme` | `'light' \| 'dark'` | Не | `'light'` | Цветова схема. |
| `primaryColor` | `string` | Не | `'#000000'` (светла) / `'#ffffff'` (тъмна) | CSS низ за цвят, използван като акцентен цвят. |
| `title` | `string` | Не | `'Voice assistant'` | Текст, показван в лентата на уиджета. |
| `position` | `'bottom-right' \| 'bottom-left' \| 'top-right' \| 'top-left'` | Не | `'bottom-right'` | Фиксирана позиция в прозореца за преглед. |
| `apiBase` | `string` | Не | `'https://api.thunderphone.com/v1'` | Замяна на базовия URL адрес на API. |
| `language` | `string` | Не | -- | Замяна на езика за сесията -- езиков код или локал, като `en`, `es` или `fr-FR`. Когато не е зададено, се използва конфигурираният език на агента. |
| `voice` | `string` | Не | -- | Замяна на гласа за сесията -- име на глас, като `maria`. Когато не е зададено, се използва конфигурираният глас на агента. |
| `context` | `string` | Не | -- | Фактически контекст за страница или сайт за сесията, подаден към агента. Сървърът го съкращава до 12 000 знака. |
| `onConnect` | `() => void` | Не | -- | Извиква се при свързване на гласовата сесия. |
| `onDisconnect` | `() => void` | Не | -- | Извиква се при приключване на сесията. |
| `onError` | `(error) => void` | Не | -- | Извиква се при грешки. Грешката има полета `error` (код) и `message`. |
| `ringtone` | `boolean \| string` | Не | `false` | Възпроизвежда мелодия при свързване. `true` за мелодията по подразбиране или URL низ за персонализирано аудио. |

---

## Почистване

`ThunderPhone.mount()` връща екземпляр на джаджата с методи за почистване:

```html
<script>
  var widget = ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
  })

  // Later, when you want to remove the widget:
  widget.unmount()

  // Or equivalently:
  widget.destroy()
</script>
```

И `unmount()`, и `destroy()` правят едно и също -- прекъсват всяка активна гласова сесия и премахват джаджата от DOM. Използвайте този, който се чете по-добре във вашия код.

<Note>
  Винаги почиствайте джаджата при навигиране извън едностранични приложения или когато съдържащият елемент бъде премахнат. Това гарантира, че активните гласови сесии са прекъснати правилно.
</Note>

---

## Примери

### Тъмна тема с персонализиран цвят

```html
<div id="thunderphone"></div>

<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    theme: 'dark',
    primaryColor: '#8b5cf6',
    title: 'Talk to our AI',
  })
</script>
```

### Персонализирана позиция

```html
<div id="thunderphone"></div>

<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    position: 'bottom-left',
  })
</script>
```

### С обратни извиквания за събития

```html
<div id="thunderphone"></div>

<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    onConnect: function () {
      console.log('Call started')
    },
    onDisconnect: function () {
      console.log('Call ended')
    },
    onError: function (error) {
      console.error('Widget error:', error.error, error.message)
    },
  })
</script>
```

### С мелодия за позвъняване

```html
<div id="thunderphone"></div>

<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  ThunderPhone.mount({
    element: '#thunderphone',
    publishableKey: 'pk_live_your_publishable_key',
    ringtone: true, // or a custom URL: 'https://example.com/ringtone.mp3'
  })
</script>
```

### Използване на референция към DOM елемент

```html
<div id="thunderphone"></div>

<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>
<script>
  var container = document.getElementById('thunderphone')

  ThunderPhone.mount({
    element: container,
    publishableKey: 'pk_live_your_publishable_key',
  })
</script>
```

### Интеграция с WordPress / CMS

Добавете това в блок за персонализиран HTML или във футъра на вашата тема:

```html
<link rel="stylesheet" href="https://cdn.thunderphone.com/widget/latest/style.css" />
<script src="https://cdn.thunderphone.com/widget/latest/widget.js"></script>

<div id="thunderphone-widget"></div>
<script>
  ThunderPhone.mount({
    element: '#thunderphone-widget',
    publishableKey: 'pk_live_your_publishable_key',
  })
</script>
```

<Tip>
  `<div>` може да бъде поставен навсякъде -- той е само точката за монтиране. Самата джаджа се визуализира като фиксирано наслагване в ъгъл на прозореца за преглед (зададен чрез опцията `position`) и не следва потока на околното съдържание.
</Tip>

---

## Отстраняване на проблеми

<AccordionGroup>
  <Accordion title="Уиджетът не се показва">
    Уверете се, че са заредени както CSS, така и JS файловете. Проверете конзолата на браузъра за мрежови грешки. Уверете се, че целевият елемент съществува в DOM, преди да извикате `ThunderPhone.mount()`.
  </Accordion>

  <Accordion title="ThunderPhone не е дефиниран">
    Скриптът все още не е зареден. Уверете се, че тагът `<script>` за `widget.js` се намира преди извикването за монтиране или обградете извикването за монтиране със слушател за `DOMContentLoaded`.
  </Accordion>

  <Accordion title="Грешка: домейнът не е разрешен">
    Добавете своя домейн към списъка с разрешени домейни в настройките **Разработчици** на [app.thunderphone.com](https://app.thunderphone.com). Не забравяйте, че `localhost` винаги е разрешен.
  </Accordion>
</AccordionGroup>

---

## Следващи стъпки

<CardGroup cols={2}>
  <Card title="Стилизиране" icon="palette" href="/bg/widget/styling">
    Персонализирайте външния вид на уиджета с персонализирани CSS свойства.
  </Card>
  <Card title="React компонент" icon="react" href="/bg/widget/react">
    Използвате React? Интеграцията с компонента е по-лесна.
  </Card>
</CardGroup>
