Skip to main content

Frequently Asked Questions

Installation and Configuration​

What's the difference between Widget and SDK?​

Comparison ItemReact WidgetReact SDK
Package Name@bdky/aaas-pilot-kit-react-widget@bdky/aaas-pilot-kit-react
PositioningOut-of-the-box UI component libraryUnderlying capability encapsulation
UIBuilt-in complete UINo UI, implement yourself
FlexibilityStyle customizableCompletely free
Use CaseQuick integrationDeep customization

See introduction page for details.

Do I need to install SDK at the same time?​

No. Widget already includes SDK as a dependency and will install automatically.

# Just need to install Widget
npm install @bdky/aaas-pilot-kit-react-widget

Which React versions are supported?​

Supports React 16.8+ and React 19. Requires a version supporting Hooks.

Is SSR supported?​

Supports SSR frameworks like Next.js, but note:

// Use dynamic import to avoid SSR issues
import dynamic from 'next/dynamic';

const PilotKit = dynamic(
() => import('@bdky/aaas-pilot-kit-react-widget').then(mod => mod.PilotKit),
{ssr: false}
);

Initialization Issues​

Why does iOS Safari need manual activation?​

iOS Safari's security policy restricts automatic audio playback and microphone usage in iframes. When this is detected, the onNeedManualActivation event is triggered.

cloud-native mode doesn't require handling

If rendererMode is configured to 'cloud-native', you don't need to handle manual activation and can ignore this issue.

Solution (standard mode): Use StartupScreen component:

const [showStartup, setShowStartup] = useState(false);

<PilotKit
onNeedManualActivation={() => setShowStartup(true)}
{...props}
>
<StartupScreen
show={showStartup}
onReady={() => setShowStartup(false)}
/>
</PilotKit>

Why isn't the component displaying?​

Check the following:

  1. PilotKit wrapper: All components must be used inside PilotKit
  2. Container height: Ensure parent container has explicit height
  3. Correct configuration: Check if appKey, appSecret, agentId are correct
// ✅ Correct
<div style={{height: '100vh'}}>
<PilotKit appKey="..." appSecret="..." agentId="...">
<ConversationList />
</PilotKit>
</div>

// ❌ Error: Missing height
<div>
<PilotKit {...props}>
<ConversationList />
</PilotKit>
</div>

When does onReady trigger?​

Triggers when SDK initialization completes and WebSocket connection succeeds. At this point you can:

  • Hide loading page
  • Start voice interaction
  • Call ref methods

Interaction Issues​

How to send text messages?​

Method 1: Use built-in input box in ControlPanel

<ControlPanel defaultMode="text" />

Method 2: Use ref call

const pilotKitRef = useRef(null);

<button onClick={() => pilotKitRef.current?.input('Hello')}>
Send
</button>

<PilotKit ref={pilotKitRef} {...props} />

Method 3: Use usePilotKitContext

function SendButton() {
const {input} = usePilotKitContext();
return <button onClick={() => input('Hello')}>Send</button>;
}

How to interrupt AI broadcasting?​

// Method 1: User speaking automatically interrupts (default enabled)

// Method 2: Call interrupt method
pilotKitRef.current?.interrupt();

// Method 3: Use usePilotKitContext
const {interrupt} = usePilotKitContext();
interrupt();

How to implement mute/unmute?​

// Use ref
pilotKitRef.current?.setMuted(true); // Mute
pilotKitRef.current?.setMuted(false); // Unmute

// Or use built-in mute button in ControlPanel
<ControlPanel />

How to get conversation history?​

function ConversationHistory() {
const {conversations} = usePilotKitContext();

return (
<div>
{conversations.map(conv => (
<div key={conv.id}>{conv.text}</div>
))}
</div>
);
}

Style Issues​

How to modify component styles?​

Method 1: CSS class name override

.apk-control-panel {
background: rgba(0, 0, 0, 0.8);
}

Method 2: className attribute

<ControlPanel className="my-control-panel" />

Method 3: style attribute

<ControlPanel style={{marginBottom: 20}} />

Method 4: children custom rendering

<ControlPanel>
<div className="my-custom-panel">...</div>
</ControlPanel>

See Style Customization for details.

How to adapt for mobile?​

Components automatically adapt by default. If you need to force a specific mode:

// Force mobile styles
<ControlPanel variant="mobile" />

// Force desktop styles
<ConversationList variant="desktop" />

See Responsive Adaptation for details.

What if styles are being overridden?​

Increase selector priority:

/* Method 1: More specific selector */
.my-app .apk-control-panel {
background: red;
}

/* Method 2: Use !important (use with caution) */
.apk-control-panel {
background: red !important;
}

Events and Callbacks​

Where are event callback parameter types?​

Event payload type definitions are in React SDK, see React SDK Hooks for details.

How to listen to ASR recognition results?​

<PilotKit
onAsrMessage={(payload) => {
console.log('Recognition result:', payload.text);
console.log('Is final result:', payload.isFinal);
}}
{...props}
/>

How to listen to conversation changes?​

<PilotKit
onConversationChange={(payload) => {
console.log('Conversation list:', payload.conversations);
console.log('Latest conversation:', payload.latestConversation);
}}
{...props}
/>

Performance Issues​

Does DebugPanel affect performance?​

Yes, DebugPanel continuously monitors events. Recommend using only in development environment:

<DebugPanel show={process.env.NODE_ENV === 'development'} />

How to optimize performance with many conversations?​

  1. Limit display count:
<ConversationList>
{({conversations}) => (
<div>
{conversations.slice(-50).map(conv => (
<Conversation key={conv.id} conversation={conv} />
))}
</div>
)}
</ConversationList>
  1. Use virtual scrolling (like react-window)

Other Questions​

How to integrate with Redux/Zustand?​

Sync state through event callbacks:

import {useDispatch} from 'react-redux';

function App() {
const dispatch = useDispatch();

return (
<PilotKit
onConversationChange={(payload) => {
dispatch(setConversations(payload.conversations));
}}
{...props}
/>
);
}

How to call methods outside component?​

Use ref:

// Global ref
const pilotKitRef = createRef();

// Call from anywhere
function sendMessage(text) {
pilotKitRef.current?.input(text);
}

Does Widget support TypeScript?​

Fully supports. Includes complete type definitions:

import type {
PilotKitProps,
PilotKitRef,
Variant
} from '@bdky/aaas-pilot-kit-react-widget';

How to report issues?​

  1. Check console error information
  2. Use DebugPanel to view event logs
  3. Provide minimal reproducible example
  4. Contact technical support