feat: add support for 'none' option in math engine settings (#5122)

This commit is contained in:
PilgrimLyieu 2025-04-23 14:53:19 +08:00 committed by GitHub
parent 6c6b2f0b9e
commit 8125fac309
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 40 additions and 13 deletions

View File

@ -1168,6 +1168,7 @@
"messages.input.enable_delete_model": "Enable the backspace key to delete models/attachments.", "messages.input.enable_delete_model": "Enable the backspace key to delete models/attachments.",
"messages.markdown_rendering_input_message": "Markdown render input message", "messages.markdown_rendering_input_message": "Markdown render input message",
"messages.math_engine": "Math engine", "messages.math_engine": "Math engine",
"messages.math_engine.none": "None",
"messages.metrics": "{{time_first_token_millsec}}ms to first token | {{token_speed}} tok/sec", "messages.metrics": "{{time_first_token_millsec}}ms to first token | {{token_speed}} tok/sec",
"messages.model.title": "Model Settings", "messages.model.title": "Model Settings",
"messages.navigation": "Message Navigation", "messages.navigation": "Message Navigation",

View File

@ -1167,6 +1167,7 @@
"messages.input.enable_delete_model": "バックスペースキーでモデル/添付ファイルを削除します。", "messages.input.enable_delete_model": "バックスペースキーでモデル/添付ファイルを削除します。",
"messages.markdown_rendering_input_message": "Markdownで入力メッセージをレンダリング", "messages.markdown_rendering_input_message": "Markdownで入力メッセージをレンダリング",
"messages.math_engine": "数式エンジン", "messages.math_engine": "数式エンジン",
"messages.math_engine.none": "なし",
"messages.metrics": "最初のトークンまでの時間 {{time_first_token_millsec}}ms | トークン速度 {{token_speed}} tok/sec", "messages.metrics": "最初のトークンまでの時間 {{time_first_token_millsec}}ms | トークン速度 {{token_speed}} tok/sec",
"messages.model.title": "モデル設定", "messages.model.title": "モデル設定",
"messages.navigation": "メッセージナビゲーション", "messages.navigation": "メッセージナビゲーション",

View File

@ -1167,6 +1167,7 @@
"messages.input.enable_delete_model": "Включите удаление модели/вложения с помощью клавиши Backspace", "messages.input.enable_delete_model": "Включите удаление модели/вложения с помощью клавиши Backspace",
"messages.markdown_rendering_input_message": "Отображение ввода в формате Markdown", "messages.markdown_rendering_input_message": "Отображение ввода в формате Markdown",
"messages.math_engine": "Математический движок", "messages.math_engine": "Математический движок",
"messages.math_engine.none": "Нет",
"messages.metrics": "{{time_first_token_millsec}}ms до первого токена | {{token_speed}} tok/sec", "messages.metrics": "{{time_first_token_millsec}}ms до первого токена | {{token_speed}} tok/sec",
"messages.model.title": "Настройки модели", "messages.model.title": "Настройки модели",
"messages.navigation": "Навигация сообщений", "messages.navigation": "Навигация сообщений",

View File

@ -1168,6 +1168,7 @@
"messages.input.enable_delete_model": "启用删除键删除输入的模型/附件", "messages.input.enable_delete_model": "启用删除键删除输入的模型/附件",
"messages.markdown_rendering_input_message": "Markdown 渲染输入消息", "messages.markdown_rendering_input_message": "Markdown 渲染输入消息",
"messages.math_engine": "数学公式引擎", "messages.math_engine": "数学公式引擎",
"messages.math_engine.none": "无",
"messages.metrics": "首字时延 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens", "messages.metrics": "首字时延 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens",
"messages.model.title": "模型设置", "messages.model.title": "模型设置",
"messages.navigation": "对话导航按钮", "messages.navigation": "对话导航按钮",

View File

@ -1166,7 +1166,8 @@
"messages.input.enable_quick_triggers": "啟用 '/' 和 '@' 觸發快捷選單", "messages.input.enable_quick_triggers": "啟用 '/' 和 '@' 觸發快捷選單",
"messages.input.enable_delete_model": "啟用刪除鍵刪除模型/附件", "messages.input.enable_delete_model": "啟用刪除鍵刪除模型/附件",
"messages.markdown_rendering_input_message": "Markdown 渲染輸入訊息", "messages.markdown_rendering_input_message": "Markdown 渲染輸入訊息",
"messages.math_engine": "Markdown 渲染輸入訊息", "messages.math_engine": "數學公式引擎",
"messages.math_engine.none": "無",
"messages.metrics": "首字延遲 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens", "messages.metrics": "首字延遲 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens",
"messages.model.title": "模型設定", "messages.model.title": "模型設定",
"messages.navigation": "訊息導航", "messages.navigation": "訊息導航",

View File

@ -32,12 +32,18 @@ interface Props {
message: Message message: Message
} }
const remarkPlugins = [remarkMath, remarkGfm, remarkCjkFriendly]
const Markdown: FC<Props> = ({ message }) => { const Markdown: FC<Props> = ({ message }) => {
const { t } = useTranslation() const { t } = useTranslation()
const { renderInputMessageAsMarkdown, mathEngine } = useSettings() const { renderInputMessageAsMarkdown, mathEngine } = useSettings()
const remarkPlugins = useMemo(() => {
const plugins = [remarkGfm, remarkCjkFriendly]
if (mathEngine !== 'none') {
plugins.push(remarkMath)
}
return plugins
}, [mathEngine])
const messageContent = useMemo(() => { const messageContent = useMemo(() => {
const empty = isEmpty(message.content) const empty = isEmpty(message.content)
const paused = message.status === 'paused' const paused = message.status === 'paused'
@ -45,12 +51,18 @@ const Markdown: FC<Props> = ({ message }) => {
return removeSvgEmptyLines(escapeBrackets(content)) return removeSvgEmptyLines(escapeBrackets(content))
}, [message, t]) }, [message, t])
const rehypeMath = useMemo(() => (mathEngine === 'KaTeX' ? rehypeKatex : rehypeMathjax), [mathEngine])
const rehypePlugins = useMemo(() => { const rehypePlugins = useMemo(() => {
const hasElements = ALLOWED_ELEMENTS.test(messageContent) const plugins: any[] = []
return hasElements ? [rehypeRaw, rehypeMath] : [rehypeMath] if (ALLOWED_ELEMENTS.test(messageContent)) {
}, [messageContent, rehypeMath]) plugins.push(rehypeRaw)
}
if (mathEngine === 'KaTeX') {
plugins.push(rehypeKatex as any)
} else if (mathEngine === 'MathJax') {
plugins.push(rehypeMathjax as any)
}
return plugins
}, [mathEngine, messageContent])
const components = useMemo(() => { const components = useMemo(() => {
const baseComponents = { const baseComponents = {

View File

@ -42,7 +42,14 @@ import {
setShowMessageDivider, setShowMessageDivider,
setThoughtAutoCollapse setThoughtAutoCollapse
} from '@renderer/store/settings' } from '@renderer/store/settings'
import { Assistant, AssistantSettings, CodeStyleVarious, ThemeMode, TranslateLanguageVarious } from '@renderer/types' import {
Assistant,
AssistantSettings,
CodeStyleVarious,
MathEngine,
ThemeMode,
TranslateLanguageVarious
} from '@renderer/types'
import { modalConfirm } from '@renderer/utils' import { modalConfirm } from '@renderer/utils'
import { Button, Col, InputNumber, Row, Segmented, Select, Slider, Switch, Tooltip } from 'antd' import { Button, Col, InputNumber, Row, Segmented, Select, Slider, Switch, Tooltip } from 'antd'
import { CircleHelp, RotateCcw, Settings2 } from 'lucide-react' import { CircleHelp, RotateCcw, Settings2 } from 'lucide-react'
@ -512,11 +519,12 @@ const SettingsTab: FC<Props> = (props) => {
<SettingRowTitleSmall>{t('settings.messages.math_engine')}</SettingRowTitleSmall> <SettingRowTitleSmall>{t('settings.messages.math_engine')}</SettingRowTitleSmall>
<StyledSelect <StyledSelect
value={mathEngine} value={mathEngine}
onChange={(value) => dispatch(setMathEngine(value as 'MathJax' | 'KaTeX'))} onChange={(value) => dispatch(setMathEngine(value as MathEngine))}
style={{ width: 135 }} style={{ width: 135 }}
size="small"> size="small">
<Select.Option value="KaTeX">KaTeX</Select.Option> <Select.Option value="KaTeX">KaTeX</Select.Option>
<Select.Option value="MathJax">MathJax</Select.Option> <Select.Option value="MathJax">MathJax</Select.Option>
<Select.Option value="none">{t('settings.messages.math_engine.none')}</Select.Option>
</StyledSelect> </StyledSelect>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />

View File

@ -1,6 +1,6 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import { TRANSLATE_PROMPT } from '@renderer/config/prompts' import { TRANSLATE_PROMPT } from '@renderer/config/prompts'
import { CodeStyleVarious, LanguageVarious, ThemeMode, TranslateLanguageVarious } from '@renderer/types' import { CodeStyleVarious, LanguageVarious, MathEngine, ThemeMode, TranslateLanguageVarious } from '@renderer/types'
import { IpcChannel } from '@shared/IpcChannel' import { IpcChannel } from '@shared/IpcChannel'
import { WebDAVSyncState } from './backup' import { WebDAVSyncState } from './backup'
@ -58,7 +58,7 @@ export interface SettingsState {
codeCacheMaxSize: number codeCacheMaxSize: number
codeCacheTTL: number codeCacheTTL: number
codeCacheThreshold: number codeCacheThreshold: number
mathEngine: 'MathJax' | 'KaTeX' mathEngine: MathEngine
messageStyle: 'plain' | 'bubble' messageStyle: 'plain' | 'bubble'
codeStyle: CodeStyleVarious codeStyle: CodeStyleVarious
foldDisplayMode: 'expanded' | 'compact' foldDisplayMode: 'expanded' | 'compact'
@ -360,7 +360,7 @@ const settingsSlice = createSlice({
setCodeCacheThreshold: (state, action: PayloadAction<number>) => { setCodeCacheThreshold: (state, action: PayloadAction<number>) => {
state.codeCacheThreshold = action.payload state.codeCacheThreshold = action.payload
}, },
setMathEngine: (state, action: PayloadAction<'MathJax' | 'KaTeX'>) => { setMathEngine: (state, action: PayloadAction<MathEngine>) => {
state.mathEngine = action.payload state.mathEngine = action.payload
}, },
setFoldDisplayMode: (state, action: PayloadAction<'expanded' | 'compact'>) => { setFoldDisplayMode: (state, action: PayloadAction<'expanded' | 'compact'>) => {

View File

@ -510,3 +510,5 @@ export interface Citation {
title?: string title?: string
content?: string content?: string
} }
export type MathEngine = 'KaTeX' | 'MathJax' | 'none'