|
@@ -61,7 +61,14 @@ import Locale from "../locales";
|
|
|
import { IconButton } from "./button";
|
|
|
import styles from "./chat.module.scss";
|
|
|
|
|
|
-import { ListItem, Modal, showConfirm, showPrompt, showToast } from "./ui-lib";
|
|
|
+import {
|
|
|
+ ListItem,
|
|
|
+ Modal,
|
|
|
+ Selector,
|
|
|
+ showConfirm,
|
|
|
+ showPrompt,
|
|
|
+ showToast,
|
|
|
+} from "./ui-lib";
|
|
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
|
import { LAST_INPUT_KEY, Path, REQUEST_TIMEOUT_MS } from "../constant";
|
|
|
import { Avatar } from "./emoji";
|
|
@@ -404,16 +411,11 @@ export function ChatActions(props: {
|
|
|
|
|
|
// switch model
|
|
|
const currentModel = chatStore.currentSession().mask.modelConfig.model;
|
|
|
- function nextModel() {
|
|
|
- const models = config.models.filter((m) => m.available).map((m) => m.name);
|
|
|
- const modelIndex = models.indexOf(currentModel);
|
|
|
- const nextIndex = (modelIndex + 1) % models.length;
|
|
|
- const nextModel = models[nextIndex];
|
|
|
- chatStore.updateCurrentSession((session) => {
|
|
|
- session.mask.modelConfig.model = nextModel as ModelType;
|
|
|
- session.mask.syncGlobalConfig = false;
|
|
|
- });
|
|
|
- }
|
|
|
+ const models = useMemo(
|
|
|
+ () => config.models.filter((m) => m.available).map((m) => m.name),
|
|
|
+ [config.models],
|
|
|
+ );
|
|
|
+ const [showModelSelector, setShowModelSelector] = useState(false);
|
|
|
|
|
|
return (
|
|
|
<div className={styles["chat-input-actions"]}>
|
|
@@ -485,10 +487,28 @@ export function ChatActions(props: {
|
|
|
/>
|
|
|
|
|
|
<ChatAction
|
|
|
- onClick={nextModel}
|
|
|
+ onClick={() => setShowModelSelector(true)}
|
|
|
text={currentModel}
|
|
|
icon={<RobotIcon />}
|
|
|
/>
|
|
|
+
|
|
|
+ {showModelSelector && (
|
|
|
+ <Selector
|
|
|
+ items={models.map((m) => ({
|
|
|
+ title: m,
|
|
|
+ value: m,
|
|
|
+ }))}
|
|
|
+ onClose={() => setShowModelSelector(false)}
|
|
|
+ onSelection={(s) => {
|
|
|
+ if (s.length === 0) return;
|
|
|
+ chatStore.updateCurrentSession((session) => {
|
|
|
+ session.mask.modelConfig.model = s[0] as ModelType;
|
|
|
+ session.mask.syncGlobalConfig = false;
|
|
|
+ });
|
|
|
+ showToast(s[0]);
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )}
|
|
|
</div>
|
|
|
);
|
|
|
}
|