From 131af500347a6a415e8b94ef17fe9b8ec66be994 Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Thu, 16 Mar 2023 14:44:14 +0800 Subject: [PATCH 1/2] feat: show model based on configured Keys --- api/server/index.js | 8 ++++++++ client/src/App.jsx | 2 +- client/src/components/Models/ModelItem.jsx | 8 +++++--- client/src/components/Models/ModelMenu.jsx | 20 +++++++++++++++++++- client/src/store/modelSlice.js | 7 +++++-- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/api/server/index.js b/api/server/index.js index bda88b14f4..f3507fc2e9 100644 --- a/api/server/index.js +++ b/api/server/index.js @@ -28,6 +28,14 @@ app.use('/api/convos', routes.convos); app.use('/api/customGpts', routes.customGpts); app.use('/api/prompts', routes.prompts); +app.get('/api/models', function (req, res) { + const hasOpenAI = !!process.env.OPENAI_KEY; + const hasChatGpt = !!process.env.CHATGPT_TOKEN; + const hasBing = !!process.env.BING_TOKEN; + + res.send(JSON.stringify({ hasOpenAI, hasChatGpt, hasBing })); +}); + app.listen(port, host, () => { if (host=='0.0.0.0') console.log(`Server listening on all interface at port ${port}. Use http://localhost:${port} to access it`); diff --git a/client/src/App.jsx b/client/src/App.jsx index 5f1446fd0b..cd90ba2b48 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -5,7 +5,7 @@ import TextChat from './components/Main/TextChat'; import Nav from './components/Nav'; import MobileNav from './components/Nav/MobileNav'; import useDocumentTitle from '~/hooks/useDocumentTitle'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; const App = () => { const { messages, messageTree } = useSelector((state) => state.messages); diff --git a/client/src/components/Models/ModelItem.jsx b/client/src/components/Models/ModelItem.jsx index 163c4206fd..fc6390c73a 100644 --- a/client/src/components/Models/ModelItem.jsx +++ b/client/src/components/Models/ModelItem.jsx @@ -30,6 +30,8 @@ export default function ModelItem({ modelName, value, model, onSelect, id, chatG const icon = getIconOfModel({ size: 16, sender: modelName, isCreatedByUser: false, model, chatGptLabel, promptPrefix, error: false, className: "mr-2" }); + if (!initial[model]) return null + if (value === 'chatgptCustom') { return ( @@ -43,9 +45,9 @@ export default function ModelItem({ modelName, value, model, onSelect, id, chatG ); - } + } - if (initial[value]) { + if (initial[value]) return ( $} ); - } + const handleMouseOver = () => { setIsHovering(true); }; diff --git a/client/src/components/Models/ModelMenu.jsx b/client/src/components/Models/ModelMenu.jsx index 3e3333a7cc..52d273c50a 100644 --- a/client/src/components/Models/ModelMenu.jsx +++ b/client/src/components/Models/ModelMenu.jsx @@ -1,4 +1,5 @@ import React, { useState, useEffect } from 'react'; +import axios from 'axios'; import { useSelector, useDispatch } from 'react-redux'; import { setSubmission, @@ -11,7 +12,7 @@ import { setNewConvo } from '~/store/convoSlice'; import ModelDialog from './ModelDialog'; import MenuItems from './MenuItems'; import { swr } from '~/utils/fetchers'; -import { setModels } from '~/store/modelSlice'; +import { setModels, setInitial } from '~/store/modelSlice'; import { setMessages } from '~/store/messageSlice'; import { setText } from '~/store/textSlice'; import GPTIcon from '../svg/GPTIcon'; @@ -61,6 +62,23 @@ export default function ModelMenu() { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + useEffect(() => { + axios.get('/api/models', { + timeout: 1000, + withCredentials: true + }).then((res) => { + return res.data + }).then((data) => { + const initial = {chatgpt: data?.hasOpenAI, chatgptCustom: data?.hasOpenAI, bingai: data?.hasBing, sydney: data?.hasBing, chatgptBrowser: data?.hasChatGpt} + dispatch(setInitial(initial)) + // TODO, auto reset default model + }).catch((error) => { + console.error(error) + console.log('Not login!') + window.location.href = "/auth/login"; + }) + }, []) + useEffect(() => { localStorage.setItem('model', JSON.stringify(model)); }, [model]); diff --git a/client/src/store/modelSlice.js b/client/src/store/modelSlice.js index 7caefdc548..1db760de5d 100644 --- a/client/src/store/modelSlice.js +++ b/client/src/store/modelSlice.js @@ -34,7 +34,7 @@ const initialState = { }, ], modelMap: {}, - initial: { chatgpt: true, chatgptCustom: true, bingai: true, sydney: true, chatgptBrowser: true } + initial: { chatgpt: false, chatgptCustom: false, bingai: false, sydney: false, chatgptBrowser: false } // initial: { chatgpt: true, chatgptCustom: true, bingai: true, } }; @@ -56,10 +56,13 @@ const currentSlice = createSlice({ }); state.modelMap = modelMap; + }, + setInitial: (state, action) => { + state.initial = action.payload; } } }); -export const { setModels } = currentSlice.actions; +export const { setModels, setInitial } = currentSlice.actions; export default currentSlice.reducer; From b6f7f957097e4ef05101b528a0a42518cd1f2824 Mon Sep 17 00:00:00 2001 From: Wentao Lyu <35-wentao.lyu@users.noreply.git.stereye.tech> Date: Thu, 16 Mar 2023 21:12:33 +0800 Subject: [PATCH 2/2] feat: set default model once model list read. --- client/src/components/Models/ModelItem.jsx | 2 -- client/src/components/Models/ModelMenu.jsx | 30 +++++++++++++++++++--- client/src/store/submitSlice.js | 2 +- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/client/src/components/Models/ModelItem.jsx b/client/src/components/Models/ModelItem.jsx index fc6390c73a..567fb28ca3 100644 --- a/client/src/components/Models/ModelItem.jsx +++ b/client/src/components/Models/ModelItem.jsx @@ -30,8 +30,6 @@ export default function ModelItem({ modelName, value, model, onSelect, id, chatG const icon = getIconOfModel({ size: 16, sender: modelName, isCreatedByUser: false, model, chatGptLabel, promptPrefix, error: false, className: "mr-2" }); - if (!initial[model]) return null - if (value === 'chatgptCustom') { return ( diff --git a/client/src/components/Models/ModelMenu.jsx b/client/src/components/Models/ModelMenu.jsx index 52d273c50a..6aab873321 100644 --- a/client/src/components/Models/ModelMenu.jsx +++ b/client/src/components/Models/ModelMenu.jsx @@ -72,6 +72,24 @@ export default function ModelMenu() { const initial = {chatgpt: data?.hasOpenAI, chatgptCustom: data?.hasOpenAI, bingai: data?.hasBing, sydney: data?.hasBing, chatgptBrowser: data?.hasChatGpt} dispatch(setInitial(initial)) // TODO, auto reset default model + if (data?.hasOpenAI) { + dispatch(setModel('chatgpt')); + dispatch(setDisabled(false)); + dispatch(setCustomModel(null)); + dispatch(setCustomGpt({ chatGptLabel: null, promptPrefix: null })); + } else if (data?.hasBing) { + dispatch(setModel('bingai')); + dispatch(setDisabled(false)); + dispatch(setCustomModel(null)); + dispatch(setCustomGpt({ chatGptLabel: null, promptPrefix: null })); + } else if (data?.hasChatGpt) { + dispatch(setModel('chatgptBrowser')); + dispatch(setDisabled(false)); + dispatch(setCustomModel(null)); + dispatch(setCustomGpt({ chatGptLabel: null, promptPrefix: null })); + } else { + dispatch(setDisabled(true)); + } }).catch((error) => { console.error(error) console.log('Not login!') @@ -83,6 +101,8 @@ export default function ModelMenu() { localStorage.setItem('model', JSON.stringify(model)); }, [model]); + const filteredModels = models.filter(({model}) => initial[model]) + const onChange = (value) => { if (!value) { return; @@ -183,10 +203,12 @@ export default function ModelMenu() { onValueChange={onChange} className="overflow-y-auto" > - + {filteredModels.length? + :No model available. + } diff --git a/client/src/store/submitSlice.js b/client/src/store/submitSlice.js index a965c29335..ed6f5771ad 100644 --- a/client/src/store/submitSlice.js +++ b/client/src/store/submitSlice.js @@ -4,7 +4,7 @@ const initialState = { isSubmitting: false, submission: {}, stopStream: false, - disabled: false, + disabled: true, model: 'chatgpt', promptPrefix: null, chatGptLabel: null,