ThunderPhone 2.0 正式上线。全程自助,2 美分/分钟起。查看发布公告

Widget

React 组件

在 React 应用中嵌入 ThunderPhone 语音小组件

ThunderPhoneWidget 组件会渲染一个具有玻璃拟态风格的通话栏,内置静音、结束通话和显示连接状态的控件。这是在 React 应用中添加语音 AI 的最快方式。

安装

npm install @thunderphone/widget

基本用法

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function App() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
    />
  )
}

属性

该组件通过 ThunderPhoneWidgetProps 接受以下属性:

属性类型必填默认值说明
publishableKeystring--开发者设置中的可发布 API 密钥(pk_live_...)。系统会根据该密钥的小组件配置自动解析智能体。
theme'light' | 'dark''light'配色方案。将 tp--lighttp--dark 类应用于小组件根元素。
primaryColorstring'#000000'(浅色)/ '#ffffff'(深色)用作强调色的 CSS 颜色字符串(通话按钮、波形图、活动指示器)。
titlestring'Voice assistant'显示在小组件栏中的文本。
position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left''bottom-right'小组件在视口中的固定位置。
apiBasestring'https://api.thunderphone.com/v1'API 基础 URL 覆盖值。
languagestring--按会话覆盖语言设置——语言代码或区域设置,例如 enesfr-FR。未设置时,将使用智能体配置的语言。
voicestring--按会话覆盖语音设置——语音名称,例如 maria。未设置时,将使用智能体配置的语音。
contextstring--按会话传递给智能体的事实性页面或网站上下文(例如,访客正在查看的页面详情)。服务器端会截断至 12,000 个字符。
onConnect() => void--语音会话成功连接时调用。
onDisconnect() => void--会话结束时调用。
onError(error) => void--发生错误时调用。error 对象包含 error(代码)和 message 字段。
classNamestring--应用于小组件容器的额外 CSS 类名。
ringtoneboolean | stringfalse连接期间播放铃声。true 使用默认铃声,或使用 URL 字符串指定自定义音频。

示例

深色主题与自定义颜色

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function App() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
      theme="dark"
      primaryColor="#8b5cf6"
      title="Talk to our AI"
    />
  )
}

自定义位置

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function App() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
      position="bottom-left"
    />
  )
}

按会话设置语言、语音和上下文

通话开始时,languagevoicecontext 属性会转发到会话请求(POST /widget/session),覆盖该会话中智能体已配置的默认值:

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function PricingPageWidget() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
      language="es"
      voice="maria"
      context="Page: Pricing. Plans: Starter $29/mo, Pro $99/mo. Annual billing saves 20%."
    />
  )
}

使用 context 向智能体提供访客当前页面的事实性知识——产品详情、定价或页面专属常见问题。服务端会将其截断为最多 12,000 个字符。

使用事件回调

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function SupportWidget() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
      onConnect={() => {
        console.log('Voice session connected')
        analytics.track('widget_call_started')
      }}
      onDisconnect={() => {
        console.log('Voice session ended')
        analytics.track('widget_call_ended')
      }}
      onError={(error) => {
        console.error(`Widget error: ${error.error} - ${error.message}`)
      }}
    />
  )
}

使用自定义样式

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function BrandedWidget() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
      primaryColor="#4a90d9"
      className="my-custom-widget"
    />
  )
}
.my-custom-widget .tp-button--end {
  background-color: #e74c3c;
}

有关所有可用 CSS 类和自定义属性,请参阅样式指南

使用铃声

在建立连接期间播放电话铃声:

import { ThunderPhoneWidget } from '@thunderphone/widget'
import '@thunderphone/widget/style.css'
 
function PhoneWidget() {
  return (
    <ThunderPhoneWidget
      publishableKey="pk_live_your_publishable_key"
      ringtone={true}
    />
  )
}

传入音频文件 URL 以使用自定义铃声:

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  ringtone="https://example.com/my-ringtone.mp3"
/>

当组件处于 connecting 状态时,铃声会循环播放;智能体接通后会平滑淡出。

使用自定义 API 基础地址

<ThunderPhoneWidget
  publishableKey="pk_live_your_publishable_key"
  apiBase="https://your-proxy.example.com/v1"
/>

错误处理

触发 onError 回调时,它会接收一个包含两个字段的错误对象:

字段类型描述
errorstring机器可读的错误代码
messagestring人类可读的错误描述

常见错误代码包括不允许的域名、未找到智能体以及无效的 API 密钥。


后续步骤