import axios from "axios"; import clsx from "clsx"; import type { GetStaticProps } from "next"; import { useTranslation } from "next-i18next"; import { serverSideTranslations } from "next-i18next/serverSideTranslations"; import React, { useState } from "react"; import { FaCheckCircle, FaCoins, FaExclamationCircle, FaGlobe, FaKey, FaRobot, FaSyncAlt, FaThermometerFull, } from "react-icons/fa"; import nextI18NextConfig from "../../next-i18next.config.js"; import FadeIn from "../components/motions/FadeIn"; import { useAuth } from "../hooks/useAuth"; import type { LLMModel } from "../hooks/useModels"; import { useModels } from "../hooks/useModels"; import { useSettings } from "../hooks/useSettings"; import DashboardLayout from "../layout/dashboard"; import type { GPTModelNames } from "../types"; import Button from "../ui/button"; import Combo from "../ui/combox"; import Input from "../ui/input"; import type { Language } from "../utils/languages"; import { languages } from "../utils/languages"; const SettingsPage = () => { const [t] = useTranslation("settings"); const { settings, updateSettings, updateLangauge } = useSettings(); const { session } = useAuth({ protectedRoute: true }); const { models, getModel } = useModels(); const [isApiKeyValid, setIsApiKeyValid] = useState(undefined); const validateApiKey = async () => { try { await axios.get("https://api.openai.com/v1/engines", { headers: { Authorization: `Bearer ${settings.customApiKey}`, }, }); setIsApiKeyValid(true); } catch (error) { setIsApiKeyValid(false); } }; const disableAdvancedSettings = !session?.user; const model = getModel(settings.customModelName) || { name: settings.customModelName, max_tokens: 2000, has_access: true, }; const updateModel = (model: LLMModel) => { if (settings.maxTokens > model.max_tokens) { updateSettings("maxTokens", model.max_tokens); } updateSettings("customModelName", model.name as GPTModelNames); }; const onDisconnect = () => { return Promise.resolve(); }; return (
{" "}

Settings

Customize your agent experience

label="Language" value={settings.language} valueMapper={(e) => e.name} onChange={(e) => { updateLangauge(e).catch(console.error); }} items={languages} icon={} /> You can optionally use your own API key here. You can find your API key in your{" "} OpenAI dashboard. } type="text" value={settings.customApiKey} onChange={(e) => { setIsApiKeyValid(undefined); updateSettings("customApiKey", e.target.value); }} icon={} className="flex-grow-1 mr-2" right={ } />
{!disableAdvancedSettings && (

Advanced Settings

label="Model" value={model} valueMapper={(e) => e.name} onChange={updateModel} items={models} icon={} /> updateSettings("customTemperature", parseFloat(e.target.value)) } attributes={{ min: 0, max: 1, step: 0.01, }} helpText={t("HIGHER_VALUES_MAKE_OUTPUT_MORE_RANDOM")} icon={} disabled={disableAdvancedSettings} /> updateSettings("customMaxLoops", parseFloat(e.target.value))} attributes={{ min: 1, max: 25, step: 1, }} helpText={t("CONTROL_THE_MAXIMUM_NUM_OF_LOOPS")} icon={} disabled={disableAdvancedSettings} /> updateSettings("maxTokens", parseFloat(e.target.value))} attributes={{ min: 200, max: model.max_tokens, step: 100, }} helpText={t("CONTROL_MAXIMUM_OF_TOKENS_DESCRIPTION")} icon={} disabled={disableAdvancedSettings} />
)}
); }; export default SettingsPage; export const getStaticProps: GetStaticProps = async ({ locale = "en" }) => { const supportedLocales = languages.map((language) => language.code); const chosenLocale = supportedLocales.includes(locale) ? locale : "en"; return { props: { ...(await serverSideTranslations(chosenLocale, nextI18NextConfig.ns)), }, }; };