mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 08:13:43 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			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>
 | 
						|
        </>
 | 
						|
      )}
 | 
						|
    </>
 | 
						|
  );
 | 
						|
}
 |