常见问题
安装与配置
Widget 和 SDK 有什么区别?
| 对比项 | React Widget | React SDK |
|---|---|---|
| 包名 | @bdky/aaas-pilot-kit-react-widget | @bdky/aaas-pilot-kit-react |
| 定位 | 开箱即用的 UI 组件库 | 底层能力封装 |
| UI | 内置完整 UI | 无 UI,需自行实现 |
| 灵活性 | 样式可定制 | 完全自由 |
| 适用场景 | 快速集成 | 深度定制 |
详见 介绍页。
需要同时安装 SDK 吗?
不需要。Widget 已经包含了 SDK 的依赖,会自动安装。
# 只需安装 Widget
npm install @bdky/aaas-pilot-kit-react-widget
支持哪些 React 版本?
支持 React 16.8+ 和 React 19。需要支持 Hooks 的版本。
支持 SSR 吗?
支持 Next.js 等 SSR 框架,但需要注意:
// 使用动态导入避免 SSR 问题
import dynamic from 'next/dynamic';
const PilotKit = dynamic(
() => import('@bdky/aaas-pilot-kit-react-widget').then(mod => mod.PilotKit),
{ssr: false}
);
初始化问题
iOS Safari 为什么需要手动激活?
iOS Safari 的安全策略限制了在 iframe 中自动播放音频和使用麦克风。当检测到这种情况时,会触发 onNeedManualActivation 事件。
cloud-native 模式无需处理
如果 rendererMode 配置为 'cloud-native',则不需要处理手动激活,可以忽略此问题。
解决方案(standard 模式):使用 StartupScreen 组件:
const [showStartup, setShowStartup] = useState(false);
<PilotKit
onNeedManualActivation={() => setShowStartup(true)}
{...props}
>
<StartupScreen
show={showStartup}
onReady={() => setShowStartup(false)}
/>
</PilotKit>
为什么组件没有显示?
检查以下几点:
- PilotKit 包裹:所有组件必须在
PilotKit内部使用 - 容器高度:确保父容器有明确的高度
- 配置正确:检查
appKey、appSecret、agentId是否正确
// ✅ 正确
<div style={{height: '100vh'}}>
<PilotKit appKey="..." appSecret="..." agentId="...">
<ConversationList />
</PilotKit>
</div>
// ❌ 错误:缺少高度
<div>
<PilotKit {...props}>
<ConversationList />
</PilotKit>
</div>
onReady 什么时候触发?
当 SDK 初始化完成、WebSocket 连接成功后触发。此时可以:
- 隐藏加载页
- 开始语音交互
- 调用 ref 方法
交互问题
如何发送文字消息?
方式一:使用 ControlPanel 内置的输入框
<ControlPanel defaultMode="text" />
方式二:使用 ref 调用
const pilotKitRef = useRef(null);
<button onClick={() => pilotKitRef.current?.input('你好')}>
发送
</button>
<PilotKit ref={pilotKitRef} {...props} />
方式三:使用 usePilotKitContext
function SendButton() {
const {input} = usePilotKitContext();
return <button onClick={() => input('你好')}>发送</button>;
}
如何打断 AI 播报?
// 方式一:用户说话自动打断(默认开启)
// 方式二:调用 interrupt 方法
pilotKitRef.current?.interrupt();
// 方式三:使用 usePilotKitContext
const {interrupt} = usePilotKitContext();
interrupt();
如何实现静音/取消静音?
// 使用 ref
pilotKitRef.current?.setMuted(true); // 静音
pilotKitRef.current?.setMuted(false); // 取消静音
// 或使用 ControlPanel 内置的静音按钮
<ControlPanel />
如何获取对话历史?
function ConversationHistory() {
const {conversations} = usePilotKitContext();
return (
<div>
{conversations.map(conv => (
<div key={conv.id}>{conv.text}</div>
))}
</div>
);
}
样式问题
如何修改组件样式?
方式一:CSS 类名覆盖
.apk-control-panel {
background: rgba(0, 0, 0, 0.8);
}
方式二:className 属性
<ControlPanel className="my-control-panel" />
方式三:style 属性
<ControlPanel style={{marginBottom: 20}} />
方式四:children 自定义渲染
<ControlPanel>
<div className="my-custom-panel">...</div>
</ControlPanel>
详见 样式定制。
如何适配移动端?
组件默认自动适配。如需强制使用特定模式:
// 强制移动端样式
<ControlPanel variant="mobile" />
// 强制桌面端样式
<ConversationList variant="desktop" />
详见 响应式适配。
样式被覆盖了怎么办?
提高选择器优先级:
/* 方式一:更具体的选择器 */
.my-app .apk-control-panel {
background: red;
}
/* 方式二:使用 !important(慎用) */
.apk-control-panel {
background: red !important;
}
事件与回调
事件回调的参数类型在哪里?
事件 payload 类型定义在 React SDK 中,详见 React SDK Hooks。
如何监听 ASR 识别结果?
<PilotKit
onAsrMessage={(payload) => {
console.log('识别结果:', payload.text);
console.log('是否最终结果:', payload.isFinal);
}}
{...props}
/>
如何监听对话变化?
<PilotKit
onConversationChange={(payload) => {
console.log('对话列表:', payload.conversations);
console.log('最新对话:', payload.latestConversation);
}}
{...props}
/>
性能问题
DebugPanel 影响性能吗?
是的,DebugPanel 会持续监听事件。建议仅在开发环境使用:
<DebugPanel show={process.env.NODE_ENV === 'development'} />
如何优化大量对话的性能?
- 限制显示数量:
<ConversationList>
{({conversations}) => (
<div>
{conversations.slice(-50).map(conv => (
<Conversation key={conv.id} conversation={conv} />
))}
</div>
)}
</ConversationList>
- 使用虚拟滚动(如 react-window)
其他问题
如何与 Redux/Zustand 集成?
通过事件回调同步状态:
import {useDispatch} from 'react-redux';
function App() {
const dispatch = useDispatch();
return (
<PilotKit
onConversationChange={(payload) => {
dispatch(setConversations(payload.conversations));
}}
{...props}
/>
);
}
如何在组件外调用方法?
使用 ref:
// 全局 ref
const pilotKitRef = createRef();
// 在任何地方调用
function sendMessage(text) {
pilotKitRef.current?.input(text);
}
Widget 支持 TypeScript 吗?
完全支持。包含完整的类型定义:
import type {
PilotKitProps,
PilotKitRef,
Variant
} from '@bdky/aaas-pilot-kit-react-widget';
如何报告问题?
- 检查控制台错误信息
- 使用 DebugPanel 查看事件日志
- 提供最小复现示例
- 联系技术支持