import { ArrowLeftIcon } from "@heroicons/react/24/outline"; import _ from "lodash"; import { useCallback, useEffect, useState } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useDispatch } from "react-redux"; import { useNavigate, useParams } from "react-router-dom"; import styled from "styled-components"; import { Input, defaultBorderRadius, lightGray, vscBackground, } from "../components"; import StyledMarkdownPreview from "../components/markdown/StyledMarkdownPreview"; import ModelCard from "../components/modelSelection/ModelCard"; import { useNavigationListener } from "../hooks/useNavigationListener"; import { setDefaultModel } from "../redux/slices/stateSlice"; import { postToIde } from "../util/ide"; import { MODEL_PROVIDER_TAG_COLORS, ModelInfo, PROVIDER_INFO, updatedObj, } from "../util/modelData"; const GridDiv = styled.div` display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); grid-gap: 2rem; padding: 1rem; justify-items: center; align-items: center; `; export const CustomModelButton = styled.div<{ disabled: boolean }>` border: 1px solid ${lightGray}; border-radius: ${defaultBorderRadius}; padding: 4px 8px; display: flex; justify-content: center; align-items: center; transition: all 0.5s; ${(props) => props.disabled ? ` opacity: 0.5; ` : ` &:hover { border: 1px solid #be1b55; background-color: #be1b5522; cursor: pointer; } `} `; function ModelConfig() { useNavigationListener(); const formMethods = useForm(); const { modelName } = useParams(); const [modelInfo, setModelInfo] = useState(undefined); useEffect(() => { if (modelName) { setModelInfo(PROVIDER_INFO[modelName]); } }, [modelName]); const dispatch = useDispatch(); const navigate = useNavigate(); const disableModelCards = useCallback(() => { return ( modelInfo?.collectInputFor?.some((d) => { if (!d.required) return false; const val = formMethods.watch(d.key); return ( typeof val === "undefined" || (typeof val === "string" && val === "") ); }) || false ); }, [modelInfo, formMethods]); return (
navigate("/models")} className="inline-block ml-4 cursor-pointer" />

Configure Model

{window.vscMediaUrl && modelInfo?.icon && ( )}

{modelInfo?.title}

{modelInfo?.tags?.map((tag, idx) => { return ( {tag} ); })}
{(modelInfo?.collectInputFor?.filter((d) => d.required).length || 0) > 0 && ( <>

Enter required parameters

{modelInfo?.collectInputFor ?.filter((d) => d.required) .map((d, idx) => { return (
); })} )} {(modelInfo?.collectInputFor?.filter((d) => !d.required).length || 0) > 0 && (
Advanced (optional) {modelInfo?.collectInputFor?.map((d, idx) => { if (d.required) return null; return (
); })}
)}

Select a model preset

{modelInfo?.packages.map((pkg, idx) => { return ( { if (disableModelCards()) return; let formParams: any = {}; for (const d of modelInfo.collectInputFor || []) { formParams = updatedObj(formParams, { [d.key]: d.inputType === "text" ? formMethods.watch(d.key) : parseFloat(formMethods.watch(d.key)), }); } const model = { ...pkg.params, ...modelInfo.params, ..._.merge( {}, ...(pkg.dimensions?.map((dimension, i) => { if (!dimensionChoices?.[i]) return {}; return { ...dimension.options[dimensionChoices[i]], }; }) || []) ), ...formParams, provider: modelInfo.provider, }; postToIde("config/addModel", { model }); dispatch(setDefaultModel(model.title)); navigate("/"); }} /> ); })}

OR choose from other providers / models by editing config.json.

{ postToIde("openConfigJson", undefined); }} >

Open config.json

); } export default ModelConfig;