* Refactor workspace sidebar component styles (#2380) rely on css for conditional styles * New sidebar colors (#2381) new sidebar colors * Main container color update (#2382) * Dark mode setup themes (#2411) * setup generic tailwind theme + ability to add new themes * add theme context * use correct colors from design for sidebar + fix padding * Settings sidebar UI updates (#2416) settings sidebar ui updates * fix sidebar resizing/truncate issue on hover * Dark mode chat window (#2443) * Support XLSX files (#2403) * support xlsx files * lint * create seperate docs for each xlsx sheet * lint * use node-xlsx pkg for parsing xslx files * lint * update error handling --------- Co-authored-by: timothycarambat <rambat1010@gmail.com> * wip chat window * ux+ux improvements and update new colors * chat window dark mode * remove comment --------- Co-authored-by: timothycarambat <rambat1010@gmail.com> * Dark mode welcome page (#2444) * dark mode welcome page styles + refactor * remove AI_BACKGROUND_COLOR and USER_BACKGROUND_COLOR constants * Dark mode UI for admin and tools pages + mobile view improvements (#2454) * dark mode ui for admin and tools pages + mobile view improvements * lint * ai provider pages + options darkmode ui * placeholder generic class * appearance settings styles * ai providers mobile margin * dark mode styles for agent skills + experimental features * mobile styles on security settings * fine tune flow ui dark mode * workspace settings page * lint * Dark mode onboarding (#2461) dark mode onboarding * update all modals + normalize styles (#2471) * lint * Dark mode privacy & experimental pages (#2479) * document watch + privacy pages ui + mobile modal darkmode * lint * Dark mode login screens (#2483) * multi-user auth screen ui update * dark mode login screen + recovery key modals * remove unneeded import * Workspace preset commands modals dark mode (#2484) update workspace preset dark mode modal * Document pinning modal ui update (#2490) document pinning modal ui update * Experimental agreement modal dark mode (#2491) experimental agreement modal dark mode * Serp options dark mode (#2492) serp options dark mode * field fixes * attempt light mode wip * setting sidebar * Toasts and threads * main page content and privacy page * force rewrite for light * add border for light mode rightside content * more fixes * wip * wip * wip light mode implementation * wip dark light mode file picker * document picker light mode ui * slight ui tweaks * light mode fine tuning flow * light mode tweaks + qa fixes * fix md rendering of light mode + tooltip fixes * lint * qa bug fixes * Add developer hook for theme move provider to outmost layer * qa light mode bug fixes * Linting and hotfixes for UI * Light mode to dev * accept invite light mode ui fix * Fix onboarding inputs in dark mode * fix close icons last minute items * patch z-index on tooltips * patch light mode citations --------- Co-authored-by: timothycarambat <rambat1010@gmail.com>
146 lines
5.1 KiB
JavaScript
146 lines
5.1 KiB
JavaScript
import System from "@/models/system";
|
|
import { CaretDown, CaretUp } from "@phosphor-icons/react";
|
|
import { useState, useEffect } from "react";
|
|
|
|
export default function NovitaLLMOptions({ settings }) {
|
|
return (
|
|
<div className="w-full flex flex-col gap-y-7">
|
|
<div className="w-full flex items-start gap-[36px] mt-1.5">
|
|
<div className="flex flex-col w-60">
|
|
<label className="text-theme-text-primary text-sm font-semibold block mb-3">
|
|
Novita API Key
|
|
</label>
|
|
<input
|
|
type="password"
|
|
name="NovitaLLMApiKey"
|
|
className="bg-theme-settings-input-bg text-theme-text-primary placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
|
|
placeholder="Novita API Key"
|
|
defaultValue={settings?.NovitaLLMApiKey ? "*".repeat(20) : ""}
|
|
required={true}
|
|
autoComplete="off"
|
|
spellCheck={false}
|
|
/>
|
|
</div>
|
|
{!settings?.credentialsOnly && (
|
|
<NovitaModelSelection settings={settings} />
|
|
)}
|
|
</div>
|
|
<AdvancedControls settings={settings} />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function AdvancedControls({ settings }) {
|
|
const [showAdvancedControls, setShowAdvancedControls] = useState(false);
|
|
|
|
return (
|
|
<div className="flex flex-col gap-y-4">
|
|
<div className="flex justify-start">
|
|
<button
|
|
type="button"
|
|
onClick={() => setShowAdvancedControls(!showAdvancedControls)}
|
|
className="text-theme-text-primary hover:text-theme-text-secondary flex items-center text-sm"
|
|
>
|
|
{showAdvancedControls ? "Hide" : "Show"} advanced settings
|
|
{showAdvancedControls ? (
|
|
<CaretUp size={14} className="ml-1" />
|
|
) : (
|
|
<CaretDown size={14} className="ml-1" />
|
|
)}
|
|
</button>
|
|
</div>
|
|
<div hidden={!showAdvancedControls}>
|
|
<div className="flex flex-col w-60">
|
|
<label className="text-theme-text-primary text-sm font-semibold block mb-3">
|
|
Stream Timeout (ms)
|
|
</label>
|
|
<input
|
|
type="number"
|
|
name="NovitaLLMTimeout"
|
|
className="bg-theme-settings-input-bg text-theme-text-primary placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
|
|
placeholder="Timeout value between token responses to auto-timeout the stream"
|
|
defaultValue={settings?.NovitaLLMTimeout ?? 500}
|
|
autoComplete="off"
|
|
onScroll={(e) => e.target.blur()}
|
|
min={500}
|
|
step={1}
|
|
/>
|
|
<p className="text-xs leading-[18px] font-base text-theme-text-primary text-opacity-60 mt-2">
|
|
Timeout value between token responses to auto-timeout the stream.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function NovitaModelSelection({ settings }) {
|
|
const [groupedModels, setGroupedModels] = useState({});
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
async function findCustomModels() {
|
|
setLoading(true);
|
|
const { models } = await System.customModels("novita");
|
|
if (models?.length > 0) {
|
|
const modelsByOrganization = models.reduce((acc, model) => {
|
|
acc[model.organization] = acc[model.organization] || [];
|
|
acc[model.organization].push(model);
|
|
return acc;
|
|
}, {});
|
|
setGroupedModels(modelsByOrganization);
|
|
}
|
|
setLoading(false);
|
|
}
|
|
findCustomModels();
|
|
}, []);
|
|
|
|
if (loading || Object.keys(groupedModels).length === 0) {
|
|
return (
|
|
<div className="flex flex-col w-60">
|
|
<label className="text-theme-text-primary text-sm font-semibold block mb-3">
|
|
Chat Model Selection
|
|
</label>
|
|
<select
|
|
name="NovitaLLMModelPref"
|
|
disabled={true}
|
|
className="bg-theme-settings-input-bg text-theme-text-primary border-theme-border text-sm rounded-lg block w-full p-2.5"
|
|
>
|
|
<option disabled={true} selected={true}>
|
|
-- loading available models --
|
|
</option>
|
|
</select>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className="flex flex-col w-60">
|
|
<label className="text-theme-text-primary text-sm font-semibold block mb-3">
|
|
Chat Model Selection
|
|
</label>
|
|
<select
|
|
name="NovitaLLMModelPref"
|
|
required={true}
|
|
className="bg-theme-settings-input-bg text-theme-text-primary border-theme-border text-sm rounded-lg block w-full p-2.5"
|
|
>
|
|
{Object.keys(groupedModels)
|
|
.sort()
|
|
.map((organization) => (
|
|
<optgroup key={organization} label={organization}>
|
|
{groupedModels[organization].map((model) => (
|
|
<option
|
|
key={model.id}
|
|
value={model.id}
|
|
selected={settings?.NovitaLLMModelPref === model.id}
|
|
>
|
|
{model.name}
|
|
</option>
|
|
))}
|
|
</optgroup>
|
|
))}
|
|
</select>
|
|
</div>
|
|
);
|
|
}
|