You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			174 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			TypeScript
		
	
| import { RealtimeConfig } from "@/app/store";
 | |
| 
 | |
| import Locale from "@/app/locales";
 | |
| import { ListItem, Select, PasswordInput } from "@/app/components/ui-lib";
 | |
| 
 | |
| import { InputRange } from "@/app/components/input-range";
 | |
| import { Voice } from "rt-client";
 | |
| import { ServiceProvider } from "@/app/constant";
 | |
| 
 | |
| const providers = [ServiceProvider.OpenAI, ServiceProvider.Azure];
 | |
| 
 | |
| const models = ["gpt-4o-realtime-preview-2024-10-01"];
 | |
| 
 | |
| const voice = ["alloy", "shimmer", "echo"];
 | |
| 
 | |
| export function RealtimeConfigList(props: {
 | |
|   realtimeConfig: RealtimeConfig;
 | |
|   updateConfig: (updater: (config: RealtimeConfig) => void) => void;
 | |
| }) {
 | |
|   const azureConfigComponent = props.realtimeConfig.provider ===
 | |
|     ServiceProvider.Azure && (
 | |
|     <>
 | |
|       <ListItem
 | |
|         title={Locale.Settings.Realtime.Azure.Endpoint.Title}
 | |
|         subTitle={Locale.Settings.Realtime.Azure.Endpoint.SubTitle}
 | |
|       >
 | |
|         <input
 | |
|           value={props.realtimeConfig?.azure?.endpoint}
 | |
|           type="text"
 | |
|           placeholder={Locale.Settings.Realtime.Azure.Endpoint.Title}
 | |
|           onChange={(e) => {
 | |
|             props.updateConfig(
 | |
|               (config) => (config.azure.endpoint = e.currentTarget.value),
 | |
|             );
 | |
|           }}
 | |
|         />
 | |
|       </ListItem>
 | |
|       <ListItem
 | |
|         title={Locale.Settings.Realtime.Azure.Deployment.Title}
 | |
|         subTitle={Locale.Settings.Realtime.Azure.Deployment.SubTitle}
 | |
|       >
 | |
|         <input
 | |
|           value={props.realtimeConfig?.azure?.deployment}
 | |
|           type="text"
 | |
|           placeholder={Locale.Settings.Realtime.Azure.Deployment.Title}
 | |
|           onChange={(e) => {
 | |
|             props.updateConfig(
 | |
|               (config) => (config.azure.deployment = e.currentTarget.value),
 | |
|             );
 | |
|           }}
 | |
|         />
 | |
|       </ListItem>
 | |
|     </>
 | |
|   );
 | |
| 
 | |
|   return (
 | |
|     <>
 | |
|       <ListItem
 | |
|         title={Locale.Settings.Realtime.Enable.Title}
 | |
|         subTitle={Locale.Settings.Realtime.Enable.SubTitle}
 | |
|       >
 | |
|         <input
 | |
|           type="checkbox"
 | |
|           checked={props.realtimeConfig.enable}
 | |
|           onChange={(e) =>
 | |
|             props.updateConfig(
 | |
|               (config) => (config.enable = e.currentTarget.checked),
 | |
|             )
 | |
|           }
 | |
|         ></input>
 | |
|       </ListItem>
 | |
| 
 | |
|       {props.realtimeConfig.enable && (
 | |
|         <>
 | |
|           <ListItem
 | |
|             title={Locale.Settings.Realtime.Provider.Title}
 | |
|             subTitle={Locale.Settings.Realtime.Provider.SubTitle}
 | |
|           >
 | |
|             <Select
 | |
|               aria-label={Locale.Settings.Realtime.Provider.Title}
 | |
|               value={props.realtimeConfig.provider}
 | |
|               onChange={(e) => {
 | |
|                 props.updateConfig(
 | |
|                   (config) =>
 | |
|                     (config.provider = e.target.value as ServiceProvider),
 | |
|                 );
 | |
|               }}
 | |
|             >
 | |
|               {providers.map((v, i) => (
 | |
|                 <option value={v} key={i}>
 | |
|                   {v}
 | |
|                 </option>
 | |
|               ))}
 | |
|             </Select>
 | |
|           </ListItem>
 | |
|           <ListItem
 | |
|             title={Locale.Settings.Realtime.Model.Title}
 | |
|             subTitle={Locale.Settings.Realtime.Model.SubTitle}
 | |
|           >
 | |
|             <Select
 | |
|               aria-label={Locale.Settings.Realtime.Model.Title}
 | |
|               value={props.realtimeConfig.model}
 | |
|               onChange={(e) => {
 | |
|                 props.updateConfig((config) => (config.model = e.target.value));
 | |
|               }}
 | |
|             >
 | |
|               {models.map((v, i) => (
 | |
|                 <option value={v} key={i}>
 | |
|                   {v}
 | |
|                 </option>
 | |
|               ))}
 | |
|             </Select>
 | |
|           </ListItem>
 | |
|           <ListItem
 | |
|             title={Locale.Settings.Realtime.ApiKey.Title}
 | |
|             subTitle={Locale.Settings.Realtime.ApiKey.SubTitle}
 | |
|           >
 | |
|             <PasswordInput
 | |
|               aria={Locale.Settings.ShowPassword}
 | |
|               aria-label={Locale.Settings.Realtime.ApiKey.Title}
 | |
|               value={props.realtimeConfig.apiKey}
 | |
|               type="text"
 | |
|               placeholder={Locale.Settings.Realtime.ApiKey.Placeholder}
 | |
|               onChange={(e) => {
 | |
|                 props.updateConfig(
 | |
|                   (config) => (config.apiKey = e.currentTarget.value),
 | |
|                 );
 | |
|               }}
 | |
|             />
 | |
|           </ListItem>
 | |
|           {azureConfigComponent}
 | |
|           <ListItem
 | |
|             title={Locale.Settings.TTS.Voice.Title}
 | |
|             subTitle={Locale.Settings.TTS.Voice.SubTitle}
 | |
|           >
 | |
|             <Select
 | |
|               value={props.realtimeConfig.voice}
 | |
|               onChange={(e) => {
 | |
|                 props.updateConfig(
 | |
|                   (config) => (config.voice = e.currentTarget.value as Voice),
 | |
|                 );
 | |
|               }}
 | |
|             >
 | |
|               {voice.map((v, i) => (
 | |
|                 <option value={v} key={i}>
 | |
|                   {v}
 | |
|                 </option>
 | |
|               ))}
 | |
|             </Select>
 | |
|           </ListItem>
 | |
|           <ListItem
 | |
|             title={Locale.Settings.Realtime.Temperature.Title}
 | |
|             subTitle={Locale.Settings.Realtime.Temperature.SubTitle}
 | |
|           >
 | |
|             <InputRange
 | |
|               aria={Locale.Settings.Temperature.Title}
 | |
|               value={props.realtimeConfig?.temperature?.toFixed(1)}
 | |
|               min="0.6"
 | |
|               max="1"
 | |
|               step="0.1"
 | |
|               onChange={(e) => {
 | |
|                 props.updateConfig(
 | |
|                   (config) =>
 | |
|                     (config.temperature = e.currentTarget.valueAsNumber),
 | |
|                 );
 | |
|               }}
 | |
|             ></InputRange>
 | |
|           </ListItem>
 | |
|         </>
 | |
|       )}
 | |
|     </>
 | |
|   );
 | |
| }
 |