| import { useState, useEffect } from "react"; |
| import System from "@/models/system"; |
|
|
| export default function DeepSeekOptions({ settings }) { |
| const [inputValue, setInputValue] = useState(settings?.DeepSeekApiKey); |
| const [deepSeekApiKey, setDeepSeekApiKey] = useState( |
| settings?.DeepSeekApiKey |
| ); |
|
|
| return ( |
| <div className="flex gap-[36px] mt-1.5"> |
| <div className="flex flex-col w-60"> |
| <label className="text-white text-sm font-semibold block mb-3"> |
| API Key |
| </label> |
| <input |
| type="password" |
| name="DeepSeekApiKey" |
| className="border-none bg-theme-settings-input-bg text-white 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="DeepSeek API Key" |
| defaultValue={settings?.DeepSeekApiKey ? "*".repeat(20) : ""} |
| required={true} |
| autoComplete="off" |
| spellCheck={false} |
| onChange={(e) => setInputValue(e.target.value)} |
| onBlur={() => setDeepSeekApiKey(inputValue)} |
| /> |
| </div> |
| {!settings?.credentialsOnly && ( |
| <DeepSeekModelSelection settings={settings} apiKey={deepSeekApiKey} /> |
| )} |
| </div> |
| ); |
| } |
|
|
| function DeepSeekModelSelection({ apiKey, settings }) { |
| const [models, setModels] = useState([]); |
| const [loading, setLoading] = useState(true); |
|
|
| useEffect(() => { |
| async function findCustomModels() { |
| if (!apiKey) { |
| setModels([]); |
| setLoading(true); |
| return; |
| } |
|
|
| setLoading(true); |
| const { models } = await System.customModels( |
| "deepseek", |
| typeof apiKey === "boolean" ? null : apiKey |
| ); |
| setModels(models || []); |
| setLoading(false); |
| } |
| findCustomModels(); |
| }, [apiKey]); |
|
|
| if (loading) { |
| return ( |
| <div className="flex flex-col w-60"> |
| <label className="text-white text-sm font-semibold block mb-3"> |
| Chat Model Selection |
| </label> |
| <select |
| name="DeepSeekModelPref" |
| disabled={true} |
| className="border-none bg-theme-settings-input-bg border-gray-500 text-white 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-white text-sm font-semibold block mb-3"> |
| Chat Model Selection |
| </label> |
| <select |
| name="DeepSeekModelPref" |
| required={true} |
| className="border-none bg-theme-settings-input-bg border-gray-500 text-white text-sm rounded-lg block w-full p-2.5" |
| > |
| {models.map((model) => ( |
| <option |
| key={model.id} |
| value={model.id} |
| selected={settings?.DeepSeekModelPref === model.id} |
| > |
| {model.name} |
| </option> |
| ))} |
| </select> |
| </div> |
| ); |
| } |
|
|