import { ChangeEvent, FormEventHandler, useCallback, useMemo, useState, } from "react"; import "./settings-dialog.scss"; import { useLiveAPIContext } from "../../contexts/LiveAPIContext"; import { LiveConfig } from "../../multimodal-live-types"; import { FunctionDeclaration, FunctionDeclarationsTool, Tool, } from "@google/generative-ai"; import VoiceSelector from "./VoiceSelector"; import ResponseModalitySelector from "./ResponseModalitySelector"; export default function SettingsDialog() { const [open, setOpen] = useState(false); const { config, setConfig, connected } = useLiveAPIContext(); const functionDeclarations: FunctionDeclaration[] = useMemo(() => { if (!Array.isArray(config.tools)) { return []; } return (config.tools as Tool[]) .filter((t: Tool): t is FunctionDeclarationsTool => Array.isArray((t as any).functionDeclarations) ) .map((t) => t.functionDeclarations) .filter((fc) => !!fc) .flat(); }, [config]); const systemInstruction = useMemo(() => { const s = config.systemInstruction?.parts.find((p) => p.text)?.text || ""; return s; }, [config]); const updateConfig: FormEventHandler = useCallback( (event: ChangeEvent) => { const newConfig: LiveConfig = { ...config, systemInstruction: { parts: [{ text: event.target.value }], }, }; setConfig(newConfig); }, [config, setConfig] ); const updateFunctionDescription = useCallback( (editedFdName: string, newDescription: string) => { const newConfig: LiveConfig = { ...config, tools: config.tools?.map((tool) => { const fdTool = tool as FunctionDeclarationsTool; if (!Array.isArray(fdTool.functionDeclarations)) { return tool; } return { ...tool, functionDeclarations: fdTool.functionDeclarations.map((fd) => fd.name === editedFdName ? { ...fd, description: newDescription } : fd ), }; }) || [], }; setConfig(newConfig); }, [config, setConfig] ); return (
{connected && (

These settings can only be applied before connecting and will override other settings.

)}

System Instructions