({ trigger }: { trigger: JSX.Element })
| 72 | } |
| 73 | |
| 74 | export default function Settings({ trigger }: { trigger: JSX.Element }) { |
| 75 | const { isPending, isError, error, data } = useQuery({ |
| 76 | queryKey: ['models'], |
| 77 | queryFn: getModels |
| 78 | }) |
| 79 | const [language, setLanguage] = useState(i18n.language) |
| 80 | const [searchParams] = useSearchParams() |
| 81 | const [model, setModel] = useAtom(modelAtom) |
| 82 | const [systemPrompt, setSystemPrompt] = useAtom(systemPromptAtom) |
| 83 | const [temperature, setTemperature] = useAtom(temperatureAtom) |
| 84 | const [darkMode, setDarkMode] = useAtom(darkModeAtom) |
| 85 | const [modelSupportsImages, setModelSupportsImages] = useAtom( |
| 86 | modelSupportsImagesAtom |
| 87 | ) |
| 88 | const [modelSupportsImagesOverrides, setModelSupportsImagesOverrides] = |
| 89 | useAtom(modelSupportsImagesOverridesAtom) |
| 90 | |
| 91 | useEffect(() => { |
| 92 | if (error) { |
| 93 | console.error('Error fetching models', error) |
| 94 | } |
| 95 | }, [error]) |
| 96 | |
| 97 | // Default to another model if no OpenAI models are available |
| 98 | useEffect(() => { |
| 99 | if (searchParams.get('dummy')) { |
| 100 | const available = ['bad'] |
| 101 | setModel( |
| 102 | `dummy/${available.includes(searchParams.get('dummy') ?? '') ? searchParams.get('dummy') : 'good'}` |
| 103 | ) |
| 104 | } else if (data && data.openai.length === 0 && model.startsWith('gpt')) { |
| 105 | if (data.groq.length > 0) { |
| 106 | // Defaulting to the 3rd model which is currently llama3-70b |
| 107 | setModel(`groq/${data.groq[2].id}`) |
| 108 | } else if (data.ollama.length > 0) { |
| 109 | setModel(`ollama/${data.ollama[0].model}`) |
| 110 | } else if (data.litellm.length > 0) { |
| 111 | setModel(`litellm/${data.litellm[0].id}`) |
| 112 | } |
| 113 | } |
| 114 | const override = modelSupportsImagesOverrides[model] |
| 115 | if (override === undefined) { |
| 116 | setModelSupportsImages( |
| 117 | knownImageModels.some(regex => { |
| 118 | let cleanName = model |
| 119 | if (cleanName.includes('/')) { |
| 120 | cleanName = model.split('/').slice(1).join('/') |
| 121 | } |
| 122 | return regex.test(cleanName) |
| 123 | }) |
| 124 | ) |
| 125 | } else { |
| 126 | setModelSupportsImages(override) |
| 127 | } |
| 128 | }, [ |
| 129 | data, |
| 130 | setModel, |
| 131 | model, |
nothing calls this directly
no test coverage detected