|
|
|
|
@ -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>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|