Merge pull request #3236 from Yidadaa/latex

This commit is contained in:
Yifei Zhang 2023-11-12 19:35:22 +08:00 committed by GitHub
commit 4f52679ec6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 40 additions and 30 deletions

View File

@ -61,7 +61,10 @@ export function ChatItem(props: {
{props.narrow ? ( {props.narrow ? (
<div className={styles["chat-item-narrow"]}> <div className={styles["chat-item-narrow"]}>
<div className={styles["chat-item-avatar"] + " no-dark"}> <div className={styles["chat-item-avatar"] + " no-dark"}>
<MaskAvatar mask={props.mask} /> <MaskAvatar
avatar={props.mask.avatar}
model={props.mask.modelConfig.model}
/>
</div> </div>
<div className={styles["chat-item-narrow-count"]}> <div className={styles["chat-item-narrow-count"]}>
{props.count} {props.count}

View File

@ -1176,7 +1176,12 @@ function _Chat() {
{["system"].includes(message.role) ? ( {["system"].includes(message.role) ? (
<Avatar avatar="2699-fe0f" /> <Avatar avatar="2699-fe0f" />
) : ( ) : (
<MaskAvatar mask={session.mask} /> <MaskAvatar
avatar={session.mask.avatar}
model={
message.model || session.mask.modelConfig.model
}
/>
)} )}
</> </>
)} )}

View File

@ -186,7 +186,8 @@
box-shadow: var(--card-shadow); box-shadow: var(--card-shadow);
border: var(--border-in-light); border: var(--border-in-light);
*:not(li) { code,
pre {
overflow: hidden; overflow: hidden;
} }
} }

View File

@ -1,5 +1,5 @@
/* eslint-disable @next/next/no-img-element */ /* eslint-disable @next/next/no-img-element */
import { ChatMessage, useAppConfig, useChatStore } from "../store"; import { ChatMessage, ModelType, useAppConfig, useChatStore } from "../store";
import Locale from "../locales"; import Locale from "../locales";
import styles from "./exporter.module.scss"; import styles from "./exporter.module.scss";
import { import {
@ -275,7 +275,8 @@ export function RenderExport(props: {
}); });
props.onRender(renderMsgs); props.onRender(renderMsgs);
}); // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return ( return (
<div ref={domRef}> <div ref={domRef}>
@ -619,8 +620,6 @@ export function MarkdownPreviewer(props: {
); );
} }
// modified by BackTrackZ now it's looks better
export function JsonPreviewer(props: { export function JsonPreviewer(props: {
messages: ChatMessage[]; messages: ChatMessage[];
topic: string; topic: string;

View File

@ -11,7 +11,7 @@ import mermaid from "mermaid";
import LoadingIcon from "../icons/three-dots.svg"; import LoadingIcon from "../icons/three-dots.svg";
import React from "react"; import React from "react";
import { useDebouncedCallback, useThrottledCallback } from "use-debounce"; import { useDebouncedCallback } from "use-debounce";
import { showImageModal } from "./ui-lib"; import { showImageModal } from "./ui-lib";
export function Mermaid(props: { code: string }) { export function Mermaid(props: { code: string }) {

View File

@ -18,6 +18,7 @@ import {
ChatMessage, ChatMessage,
createMessage, createMessage,
ModelConfig, ModelConfig,
ModelType,
useAppConfig, useAppConfig,
useChatStore, useChatStore,
} from "../store"; } from "../store";
@ -58,11 +59,11 @@ function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {
return result; return result;
} }
export function MaskAvatar(props: { mask: Mask }) { export function MaskAvatar(props: { avatar: string; model?: ModelType }) {
return props.mask.avatar !== DEFAULT_MASK_AVATAR ? ( return props.avatar !== DEFAULT_MASK_AVATAR ? (
<Avatar avatar={props.mask.avatar} /> <Avatar avatar={props.avatar} />
) : ( ) : (
<Avatar model={props.mask.modelConfig.model} /> <Avatar model={props.model} />
); );
} }
@ -123,7 +124,10 @@ export function MaskConfig(props: {
onClick={() => setShowPicker(true)} onClick={() => setShowPicker(true)}
style={{ cursor: "pointer" }} style={{ cursor: "pointer" }}
> >
<MaskAvatar mask={props.mask} /> <MaskAvatar
avatar={props.mask.avatar}
model={props.mask.modelConfig.model}
/>
</div> </div>
</Popover> </Popover>
</ListItem> </ListItem>
@ -398,7 +402,7 @@ export function MaskPage() {
setSearchText(text); setSearchText(text);
if (text.length > 0) { if (text.length > 0) {
const result = allMasks.filter((m) => const result = allMasks.filter((m) =>
m.name.toLowerCase().includes(text.toLowerCase()) m.name.toLowerCase().includes(text.toLowerCase()),
); );
setSearchMasks(result); setSearchMasks(result);
} else { } else {
@ -523,7 +527,7 @@ export function MaskPage() {
<div className={styles["mask-item"]} key={m.id}> <div className={styles["mask-item"]} key={m.id}>
<div className={styles["mask-header"]}> <div className={styles["mask-header"]}>
<div className={styles["mask-icon"]}> <div className={styles["mask-icon"]}>
<MaskAvatar mask={m} /> <MaskAvatar avatar={m.avatar} model={m.modelConfig.model} />
</div> </div>
<div className={styles["mask-title"]}> <div className={styles["mask-title"]}>
<div className={styles["mask-name"]}>{m.name}</div> <div className={styles["mask-name"]}>{m.name}</div>

View File

@ -208,7 +208,10 @@ export function MessageSelector(props: {
{m.role === "user" ? ( {m.role === "user" ? (
<Avatar avatar={config.avatar}></Avatar> <Avatar avatar={config.avatar}></Avatar>
) : ( ) : (
<MaskAvatar mask={session.mask} /> <MaskAvatar
avatar={session.mask.avatar}
model={m.model || session.mask.modelConfig.model}
/>
)} )}
</div> </div>
<div className={styles["body"]}> <div className={styles["body"]}>

View File

@ -17,21 +17,13 @@ import { useCommand } from "../command";
import { showConfirm } from "./ui-lib"; import { showConfirm } from "./ui-lib";
import { BUILTIN_MASK_STORE } from "../masks"; import { BUILTIN_MASK_STORE } from "../masks";
function getIntersectionArea(aRect: DOMRect, bRect: DOMRect) {
const xmin = Math.max(aRect.x, bRect.x);
const xmax = Math.min(aRect.x + aRect.width, bRect.x + bRect.width);
const ymin = Math.max(aRect.y, bRect.y);
const ymax = Math.min(aRect.y + aRect.height, bRect.y + bRect.height);
const width = xmax - xmin;
const height = ymax - ymin;
const intersectionArea = width < 0 || height < 0 ? 0 : width * height;
return intersectionArea;
}
function MaskItem(props: { mask: Mask; onClick?: () => void }) { function MaskItem(props: { mask: Mask; onClick?: () => void }) {
return ( return (
<div className={styles["mask"]} onClick={props.onClick}> <div className={styles["mask"]} onClick={props.onClick}>
<MaskAvatar mask={props.mask} /> <MaskAvatar
avatar={props.mask.avatar}
model={props.mask.modelConfig.model}
/>
<div className={styles["mask-name"] + " one-line"}>{props.mask.name}</div> <div className={styles["mask-name"] + " one-line"}>{props.mask.name}</div>
</div> </div>
); );

View File

@ -84,6 +84,9 @@ You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: {{cutoff}} Knowledge cutoff: {{cutoff}}
Current model: {{model}} Current model: {{model}}
Current time: {{time}} Current time: {{time}}
Latex inline: $x^2$
Latex block: $$e=mc^2$$
`; `;
export const SUMMARIZE_MODEL = "gpt-3.5-turbo"; export const SUMMARIZE_MODEL = "gpt-3.5-turbo";

View File

@ -85,8 +85,8 @@ const cn = {
Copy: "全部复制", Copy: "全部复制",
Download: "下载文件", Download: "下载文件",
Share: "分享到 ShareGPT", Share: "分享到 ShareGPT",
MessageFromYou: "来自你的消息", MessageFromYou: "用户",
MessageFromChatGPT: "来自 ChatGPT 的消息", MessageFromChatGPT: "ChatGPT",
Format: { Format: {
Title: "导出格式", Title: "导出格式",
SubTitle: "可以导出 Markdown 文本或者 PNG 图片", SubTitle: "可以导出 Markdown 文本或者 PNG 图片",