@vowel.to/client / index / VowelClientConfig
Interface: VowelClientConfig
Defined in: lib/vowel/types/types.ts:527
Vowel client configuration
Properties
| Property | Type | Description | Defined in |
|---|---|---|---|
appId? | string | App ID for this tenant (string format from Vowel platform) | lib/vowel/types/types.ts:529 |
convexUrl? | string | Optional: Custom Convex platform URL (base URL) If provided, constructs the token endpoint as ${convexUrl}/vowel/api/generateToken Useful for pointing to different Convex deployments (dev, staging, production) Example const vowel = new Vowel({ appId: 'demo-app', convexUrl: 'https://my-deployment.convex.site' }); | lib/vowel/types/types.ts:544 |
tokenEndpoint? | string | Optional: Custom token endpoint URL If provided, overrides the default Vowel platform endpoint Takes precedence over convexUrl if both are provided Useful for self-hosted or proxy token generation Example const vowel = new Vowel({ appId: 'demo-app', tokenEndpoint: 'https://my-server.com/api/token' }); | lib/vowel/types/types.ts:560 |
tokenProvider? | (config) => Promise<{ tokenName: string; model: string; provider: "gemini" | "openai" | "vowel-prime"; expiresAt: string; systemInstructions?: string; }> | Optional: Custom token provider for advanced use cases Allows complete control over token generation (e.g., caching, custom auth) The token provider should return an object matching this interface: `{ tokenName: string; // The ephemeral token model: string; // AI model name provider: 'gemini' | 'openai'; expiresAt: string; // ISO timestamp systemInstructions?: string; }**Example**const vowel = new Vowel({ appId: 'demo-app', tokenProvider: async (config) => { // Custom token generation logic const response = await fetch('/my-custom-endpoint', { method: 'POST', body: JSON.stringify(config) }); return await response.json(); } });` |
router? | RouterAdapter | Router adapter for navigation (LEGACY - deprecated) Deprecated Use navigationAdapter instead for the new dual-adapter architecture | lib/vowel/types/types.ts:604 |
navigationAdapter? | NavigationAdapter | Navigation adapter (NEW) Handles WHERE to go (routing) Optional - if not provided, navigation features will be disabled | lib/vowel/types/types.ts:611 |
automationAdapter? | AutomationAdapter | Automation adapter (NEW) Handles WHAT to do (page interaction) Optional - if not provided, page interaction features will be disabled | lib/vowel/types/types.ts:618 |
routes? | VowelRoute[] | Optional: Custom routes (can also be auto-detected from adapters) | lib/vowel/types/types.ts:621 |
voiceConfig? | VowelVoiceConfig | Optional: Voice configuration | lib/vowel/types/types.ts:624 |
instructions? | string | Optional: Custom system instructions for the AI agent | lib/vowel/types/types.ts:627 |
systemInstructionOverride? | string | Deprecated Use 'instructions' instead Legacy alias for instructions (from OpenAI SDK compatibility) | lib/vowel/types/types.ts:633 |
onUserSpeakingChange? | (isSpeaking) => void | Optional: Callback when user speaking state changes | lib/vowel/types/types.ts:636 |
onAIThinkingChange? | (isThinking) => void | Optional: Callback when AI thinking state changes | lib/vowel/types/types.ts:639 |
onToolExecutingChange? | (isExecuting) => void | - | lib/vowel/types/types.ts:640 |
onAISpeakingChange? | (isSpeaking) => void | Optional: Callback when AI speaking state changes | lib/vowel/types/types.ts:643 |
floatingCursor? | FloatingCursorConfig | Optional: Floating cursor configuration By default, floating cursor is enabled. Set enabled: false to disable it. Default { enabled: true } | lib/vowel/types/types.ts:650 |
borderGlow? | { enabled: boolean; color?: string; intensity?: number; width?: number; animationDuration?: number; zIndex?: number; pulse?: boolean; } | Optional: Border glow configuration | lib/vowel/types/types.ts:680 |
borderGlow.enabled | boolean | Enable border glow feature (default: false) | lib/vowel/types/types.ts:682 |
borderGlow.color? | string | Glow color (CSS color value) | lib/vowel/types/types.ts:684 |
borderGlow.intensity? | number | Glow intensity (blur radius in pixels) | lib/vowel/types/types.ts:686 |
borderGlow.width? | number | Glow width (box-shadow spread in pixels) | lib/vowel/types/types.ts:688 |
borderGlow.animationDuration? | number | Animation duration in milliseconds | lib/vowel/types/types.ts:690 |
borderGlow.zIndex? | number | Z-index for positioning | lib/vowel/types/types.ts:692 |
borderGlow.pulse? | boolean | Whether to show pulsing animation | lib/vowel/types/types.ts:694 |
actionPill? | { enabled: boolean; bottomOffset?: number; autoHideDelay?: number; maxWidth?: number; zIndex?: number; mobileOnly?: boolean; } | Optional: Floating action pill configuration | lib/vowel/types/types.ts:698 |
actionPill.enabled | boolean | Enable action pill feature (default: false) | lib/vowel/types/types.ts:700 |
actionPill.bottomOffset? | number | Position from bottom in pixels | lib/vowel/types/types.ts:702 |
actionPill.autoHideDelay? | number | Auto-hide delay in milliseconds (0 = no auto-hide) | lib/vowel/types/types.ts:704 |
actionPill.maxWidth? | number | Maximum width in pixels | lib/vowel/types/types.ts:706 |
actionPill.zIndex? | number | Z-index for positioning | lib/vowel/types/types.ts:708 |
actionPill.mobileOnly? | boolean | Show only on mobile devices | lib/vowel/types/types.ts:710 |
typingSounds? | { enabled?: boolean; volume?: number; typingSoundUrl?: string; clickSoundUrl?: string; minSegmentDurationMs?: number; maxSegmentDurationMs?: number; minPauseDurationMs?: number; maxPauseDurationMs?: number; clickSoundProbability?: number; } | Optional: Typing sound configuration | lib/vowel/types/types.ts:714 |
typingSounds.enabled? | boolean | Enable typing sounds (default: true) | lib/vowel/types/types.ts:716 |
typingSounds.volume? | number | Volume multiplier (0.0 to 1.0, default: 0.3) | lib/vowel/types/types.ts:718 |
typingSounds.typingSoundUrl? | string | Custom typing sound URL (default: assets.vowel.to/typing-sound.pcm) | lib/vowel/types/types.ts:720 |
typingSounds.clickSoundUrl? | string | Custom click sound URL (default: assets.vowel.to/mouse-click-sound.pcm) | lib/vowel/types/types.ts:722 |
typingSounds.minSegmentDurationMs? | number | Minimum segment duration in ms (default: 200) | lib/vowel/types/types.ts:724 |
typingSounds.maxSegmentDurationMs? | number | Maximum segment duration in ms (default: 800) | lib/vowel/types/types.ts:726 |
typingSounds.minPauseDurationMs? | number | Minimum pause duration in ms (default: 300) | lib/vowel/types/types.ts:728 |
typingSounds.maxPauseDurationMs? | number | Maximum pause duration in ms (default: 1500) | lib/vowel/types/types.ts:730 |
typingSounds.clickSoundProbability? | number | Probability of click sound vs typing (0.0 to 1.0, default: 0.15) | lib/vowel/types/types.ts:732 |
darkMode? | { enabled?: boolean; storageKeyPrefix?: string; } | Optional: Dark mode configuration Controls the appearance theme of vowel UI components Example const vowel = new Vowel({ appId: 'demo-app', darkMode: { enabled: true, // Enable dark mode storageKeyPrefix: 'my-app' // Optional: custom storage key prefix } }); | lib/vowel/types/types.ts:750 |
darkMode.enabled? | boolean | Enable dark mode (default: follows system preference) | lib/vowel/types/types.ts:752 |
darkMode.storageKeyPrefix? | string | Storage key prefix for persisting preference (default: 'vowel') | lib/vowel/types/types.ts:754 |