"use client" import { useState } from "react" import { useLocalStorage } from 'usehooks-ts' import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { LLMVendor, RenderingModelVendor } from "@/types" import { Input } from "@/components/ui/input" import { Label } from "./label" import { Field } from "./field" import { localStorageKeys } from "./localStorageKeys" import { defaultSettings } from "./defaultSettings" import { useDynamicConfig } from "@/lib/useDynamicConfig" import { Slider } from "@/components/ui/slider" import { fonts } from "@/lib/fonts" import { cn } from "@/lib/utils" import { SectionTitle } from "./section-title" export function SettingsDialog() { const [isOpen, setOpen] = useState(false) const [renderingModelVendor, setRenderingModelVendor] = useLocalStorage( localStorageKeys.renderingModelVendor, defaultSettings.renderingModelVendor ) const [renderingUseTurbo, setRenderingUseTurbo] = useLocalStorage( localStorageKeys.renderingUseTurbo, defaultSettings.renderingUseTurbo ) const [llmVendor, setLlmModelVendor] = useLocalStorage( localStorageKeys.llmVendor, defaultSettings.llmVendor ) const [huggingfaceApiKey, setHuggingfaceApiKey] = useLocalStorage( localStorageKeys.huggingfaceApiKey, defaultSettings.huggingfaceApiKey ) const [huggingfaceInferenceApiModel, setHuggingfaceInferenceApiModel] = useLocalStorage( localStorageKeys.huggingfaceInferenceApiModel, defaultSettings.huggingfaceInferenceApiModel ) const [huggingfaceInferenceApiModelTrigger, setHuggingfaceInferenceApiModelTrigger] = useLocalStorage( localStorageKeys.huggingfaceInferenceApiModelTrigger, defaultSettings.huggingfaceInferenceApiModelTrigger ) const [huggingfaceInferenceApiFileType, setHuggingfaceInferenceApiFileType] = useLocalStorage( localStorageKeys.huggingfaceInferenceApiFileType, defaultSettings.huggingfaceInferenceApiFileType ) const [replicateApiKey, setReplicateApiKey] = useLocalStorage( localStorageKeys.replicateApiKey, defaultSettings.replicateApiKey ) const [replicateApiModel, setReplicateApiModel] = useLocalStorage( localStorageKeys.replicateApiModel, defaultSettings.replicateApiModel ) const [replicateApiModelVersion, setReplicateApiModelVersion] = useLocalStorage( localStorageKeys.replicateApiModelVersion, defaultSettings.replicateApiModelVersion ) const [replicateApiModelTrigger, setReplicateApiModelTrigger] = useLocalStorage( localStorageKeys.replicateApiModelTrigger, defaultSettings.replicateApiModelTrigger ) const [openaiApiKey, setOpenaiApiKey] = useLocalStorage( localStorageKeys.openaiApiKey, defaultSettings.openaiApiKey ) const [openaiApiModel, setOpenaiApiModel] = useLocalStorage( localStorageKeys.openaiApiModel, defaultSettings.openaiApiModel ) const [openaiApiLanguageModel, setOpenaiApiLanguageModel] = useLocalStorage( localStorageKeys.openaiApiLanguageModel, defaultSettings.openaiApiLanguageModel ) const [groqApiKey, setGroqApiKey] = useLocalStorage( localStorageKeys.groqApiKey, defaultSettings.groqApiKey ) const [groqApiLanguageModel, setGroqApiLanguageModel] = useLocalStorage( localStorageKeys.groqApiLanguageModel, defaultSettings.groqApiLanguageModel ) const [anthropicApiKey, setAnthropicApiKey] = useLocalStorage( localStorageKeys.anthropicApiKey, defaultSettings.anthropicApiKey ) const [anthropicApiLanguageModel, setAnthropicApiLanguageModel] = useLocalStorage( localStorageKeys.anthropicApiLanguageModel, defaultSettings.anthropicApiLanguageModel ) const [userDefinedMaxNumberOfPages, setUserDefinedMaxNumberOfPages] = useLocalStorage( localStorageKeys.userDefinedMaxNumberOfPages, defaultSettings.userDefinedMaxNumberOfPages ) const { config: { maxNbPages }, isConfigReady } = useDynamicConfig() return ( AI Comic Factory Settings

ℹ️ Some models can take time to cold-start, or be under heavy traffic.
πŸ‘‰ In case of trouble, try again after 5-10 minutes.
πŸ”’ Your settings are stored inside your browser, not on our servers.

πŸ‘‡ General options {isConfigReady && { let numericValue = Number(value[0]) numericValue = !isNaN(value[0]) && isFinite(value[0]) ? numericValue : 0 numericValue = Math.min(maxNbPages, Math.max(1, numericValue)) setUserDefinedMaxNumberOfPages(numericValue) }} defaultValue={[userDefinedMaxNumberOfPages]} value={[userDefinedMaxNumberOfPages]} /> }
{ // renderingModelVendor === "SERVER" && <> // // //
// // {/* // setRenderingUseTurbo(!renderingUseTurbo)} // className={cn("cursor-pointer", { "text-zinc-800": renderingUseTurbo })}> // Use a faster, but lower quality model (you are warned!) // // */} // // Following feedbacks from users (low rendering quality on comics) the fast renderer has been disabled. // //
//
// } πŸ‘‡ Panel rendering options {renderingModelVendor === "HUGGINGFACE" && <> { setHuggingfaceApiKey(x.target.value) }} value={huggingfaceApiKey} /> { setHuggingfaceInferenceApiModel(x.target.value) }} value={huggingfaceInferenceApiModel} /> { setHuggingfaceInferenceApiFileType(x.target.value) }} value={huggingfaceInferenceApiFileType} />

Using a LoRA? Don't forget the trigger keyword! Also you will want to use the "Neutral" style.

{ setHuggingfaceInferenceApiModelTrigger(x.target.value) }} value={huggingfaceInferenceApiModelTrigger} /> } {renderingModelVendor === "OPENAI" && <> { setOpenaiApiKey(x.target.value) }} value={openaiApiKey} /> { setOpenaiApiModel(x.target.value) }} value={openaiApiModel} /> } {renderingModelVendor === "REPLICATE" && <> { setReplicateApiKey(x.target.value) }} value={replicateApiKey} /> { setReplicateApiModel(x.target.value) }} value={replicateApiModel} /> { setReplicateApiModelVersion(x.target.value) }} value={replicateApiModelVersion} />

Using a LoRA? Don't forget the trigger keyword! Also you will want to use the "Neutral" style.

{ setReplicateApiModelTrigger(x.target.value) }} value={replicateApiModelTrigger} /> } πŸ‘‡ Story generation options (🚧 experimental feature 🚧)

⚠️ Some vendors might be buggy or require tunning, please report issues to Discord.
⚠️ Billing and privacy depend on your preferred vendor, so please exercice caution.

{llmVendor === "GROQ" && <> { setGroqApiKey(x.target.value) }} value={groqApiKey} /> { setGroqApiLanguageModel(x.target.value) }} value={groqApiLanguageModel} /> } {llmVendor === "ANTHROPIC" && <> { setAnthropicApiKey(x.target.value) }} value={anthropicApiKey} /> { setAnthropicApiLanguageModel(x.target.value) }} value={anthropicApiLanguageModel} /> } {llmVendor === "OPENAI" && <> { setOpenaiApiKey(x.target.value) }} value={openaiApiKey} /> { setOpenaiApiLanguageModel(x.target.value) }} value={openaiApiLanguageModel} /> }
) }