From 1f8d08eaa2ef2998b05890f5a13522e9a3602b5b Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Aug 2024 03:30:21 -0400 Subject: [PATCH 01/14] SSRF Fix --- backend/apps/images/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/apps/images/main.py b/backend/apps/images/main.py index 4239f3f45..b8bd38285 100644 --- a/backend/apps/images/main.py +++ b/backend/apps/images/main.py @@ -151,9 +151,10 @@ async def update_engine_url( url = form_data.AUTOMATIC1111_BASE_URL.strip("/") try: r = requests.head(url) + r.raise_for_status() app.state.config.AUTOMATIC1111_BASE_URL = url except Exception as e: - raise HTTPException(status_code=400, detail=ERROR_MESSAGES.DEFAULT(e)) + raise HTTPException(status_code=400, detail="Invalid URL provided.") if form_data.COMFYUI_BASE_URL == None: app.state.config.COMFYUI_BASE_URL = COMFYUI_BASE_URL From 590fd129c87b72b3a35a556d2006654dda863d84 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 7 Aug 2024 10:59:22 -0400 Subject: [PATCH 02/14] SSRF Fix Updated --- backend/apps/images/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/apps/images/main.py b/backend/apps/images/main.py index b8bd38285..0b123088d 100644 --- a/backend/apps/images/main.py +++ b/backend/apps/images/main.py @@ -150,8 +150,7 @@ async def update_engine_url( else: url = form_data.AUTOMATIC1111_BASE_URL.strip("/") try: - r = requests.head(url) - r.raise_for_status() + r = requests.head(url) app.state.config.AUTOMATIC1111_BASE_URL = url except Exception as e: raise HTTPException(status_code=400, detail="Invalid URL provided.") From 13403cd7dc15a684f685180756fa5ce1dcee4059 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Thu, 8 Aug 2024 14:24:47 +0200 Subject: [PATCH 03/14] enh: codeblock i18n --- src/lib/components/chat/Messages/CodeBlock.svelte | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/Messages/CodeBlock.svelte b/src/lib/components/chat/Messages/CodeBlock.svelte index daa8a8cd0..2d4133298 100644 --- a/src/lib/components/chat/Messages/CodeBlock.svelte +++ b/src/lib/components/chat/Messages/CodeBlock.svelte @@ -1,12 +1,15 @@ diff --git a/src/lib/components/chat/Messages/MarkdownTokens.svelte b/src/lib/components/chat/Messages/MarkdownTokens.svelte index 530548e56..1f27fb4eb 100644 --- a/src/lib/components/chat/Messages/MarkdownTokens.svelte +++ b/src/lib/components/chat/Messages/MarkdownTokens.svelte @@ -1,141 +1,112 @@ -
- {#each tokens as token, tokenIdx (`${id}-${tokenIdx}`)} - {#if token.type === 'code'} - {#if token.lang === 'mermaid'} -
{revertSanitizedResponseContent(token.text)}
- {:else} - - {/if} +{#each tokens as token, tokenIdx} + {#if token.type === 'hr'} +
+ {:else if token.type === 'heading'} + + + + {:else if token.type === 'code'} + + {:else if token.type === 'table'} + + + + {#each token.header as header, headerIdx} + + {/each} + + + + {#each token.rows as row, rowIdx} + + {#each row ?? [] as cell, cellIdx} + + {/each} + + {/each} + +
+ +
+ +
+ {:else if token.type === 'blockquote'} +
+ +
+ {:else if token.type === 'list'} + {#if token.ordered} +
    + {#each token.items as item, itemIdx} +
  1. + +
  2. + {/each} +
{:else} - {@html marked.parse(token.raw, { - ...defaults, - gfm: true, - breaks: true, - renderer - })} +
    + {#each token.items as item, itemIdx} +
  • + +
  • + {/each} +
{/if} - {/each} -
+ {:else if token.type === 'html'} + {@html token.text} + {:else if token.type === 'paragraph'} +

+ +

+ {:else if token.type === 'text'} + {#if top} +

+ {#if token.tokens} + + {:else} + {unescapeHtml(token.text)} + {/if} +

+ {:else if token.tokens} + + {:else} + {unescapeHtml(token.text)} + {/if} + {:else if token.type === 'space'} + {''} + {:else} + {console.log('Unknown token', token)} + {/if} +{/each} diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index fdc846205..1226b5231 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -99,7 +99,7 @@ tooltipInstance[0]?.destroy(); } - renderLatex(); + // renderLatex(); if (message.info) { let tooltipContent = ''; @@ -420,7 +420,7 @@ {/if}
{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0} From 92e77d7b33fc8498a3164a5cc30eb64110978020 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Fri, 9 Aug 2024 00:01:38 +0200 Subject: [PATCH 10/14] refac: katex --- package-lock.json | 18 +++++ package.json | 1 + .../chat/Messages/KatexRenderer.svelte | 9 +++ .../chat/Messages/MarkdownInlineTokens.svelte | 16 +++- .../chat/Messages/MarkdownTokens.svelte | 14 +++- .../chat/Messages/ResponseMessage.svelte | 16 ++-- src/lib/utils/index.ts | 5 +- src/lib/utils/katex-extension.ts | 80 +++++++++++++++++++ 8 files changed, 147 insertions(+), 12 deletions(-) create mode 100644 src/lib/components/chat/Messages/KatexRenderer.svelte create mode 100644 src/lib/utils/katex-extension.ts diff --git a/package-lock.json b/package-lock.json index b7e714ed7..2006a3fd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "js-sha256": "^0.10.1", "katex": "^0.16.9", "marked": "^9.1.0", + "marked-katex-extension": "^5.1.1", "mermaid": "^10.9.1", "pyodide": "^0.26.1", "socket.io-client": "^4.2.0", @@ -1544,6 +1545,11 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" + }, "node_modules/@types/mdast": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", @@ -6036,6 +6042,18 @@ "node": ">= 16" } }, + "node_modules/marked-katex-extension": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/marked-katex-extension/-/marked-katex-extension-5.1.1.tgz", + "integrity": "sha512-piquiCyZpZ1aiocoJlJkRXr+hkk5UI4xw9GhRZiIAAgvX5rhzUDSJ0seup1JcsgueC8MLNDuqe5cRcAzkFE42Q==", + "dependencies": { + "@types/katex": "^0.16.7" + }, + "peerDependencies": { + "katex": ">=0.16 <0.17", + "marked": ">=4 <15" + } + }, "node_modules/matcher-collection": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-2.0.1.tgz", diff --git a/package.json b/package.json index 0c7a8518a..bd2b173bf 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "js-sha256": "^0.10.1", "katex": "^0.16.9", "marked": "^9.1.0", + "marked-katex-extension": "^5.1.1", "mermaid": "^10.9.1", "pyodide": "^0.26.1", "socket.io-client": "^4.2.0", diff --git a/src/lib/components/chat/Messages/KatexRenderer.svelte b/src/lib/components/chat/Messages/KatexRenderer.svelte new file mode 100644 index 000000000..766454c29 --- /dev/null +++ b/src/lib/components/chat/Messages/KatexRenderer.svelte @@ -0,0 +1,9 @@ + + +{@html katex.renderToString(content, { displayMode, throwOnError: false })} diff --git a/src/lib/components/chat/Messages/MarkdownInlineTokens.svelte b/src/lib/components/chat/Messages/MarkdownInlineTokens.svelte index 7f984264b..170429f4b 100644 --- a/src/lib/components/chat/Messages/MarkdownInlineTokens.svelte +++ b/src/lib/components/chat/Messages/MarkdownInlineTokens.svelte @@ -1,8 +1,11 @@ @@ -25,14 +28,21 @@ {:else if token.type === 'codespan'} - {unescapeHtml(token.text.replaceAll('&', '&'))} + {revertSanitizedResponseContent(token.raw)} {:else if token.type === 'br'}
{:else if token.type === 'del'} + {:else if token.type === 'inlineKatex'} + {#if token.text} + + {/if} {:else if token.type === 'text'} - {unescapeHtml(token.text)} + {token.raw} {/if} {/each} diff --git a/src/lib/components/chat/Messages/MarkdownTokens.svelte b/src/lib/components/chat/Messages/MarkdownTokens.svelte index 1f27fb4eb..089a0847a 100644 --- a/src/lib/components/chat/Messages/MarkdownTokens.svelte +++ b/src/lib/components/chat/Messages/MarkdownTokens.svelte @@ -1,17 +1,22 @@ + {#each tokens as token, tokenIdx} {#if token.type === 'hr'}
@@ -104,6 +109,13 @@ {:else} {unescapeHtml(token.text)} {/if} + {:else if token.type === 'inlineKatex'} + {#if token.text} + + {/if} {:else if token.type === 'space'} {''} {:else} diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index 1226b5231..2ecbd418c 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -4,7 +4,6 @@ import { marked } from 'marked'; import tippy from 'tippy.js'; import auto_render from 'katex/dist/contrib/auto-render.mjs'; - import 'katex/dist/katex.min.css'; import mermaid from 'mermaid'; import { fade } from 'svelte/transition'; @@ -79,19 +78,24 @@ let tokens; + import 'katex/dist/katex.min.css'; + + import markedKatex from '$lib/utils/katex-extension'; + + const options = { + throwOnError: false + }; + + marked.use(markedKatex(options)); + $: (async () => { if (message?.content) { tokens = marked.lexer( replaceTokens(sanitizeResponseContent(message?.content), model?.name, $user?.name) ); - // console.log(message?.content, tokens); } })(); - $: if (message) { - renderStyling(); - } - const renderStyling = async () => { await tick(); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 5b5c69047..de3a2ca2c 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -25,7 +25,8 @@ const convertLatexToSingleLine = (content) => { export const sanitizeResponseContent = (content: string) => { // replace single backslash with double backslash - content = content.replace(/\\/g, '\\\\'); + content = content.replace(/\\\\/g, '\\\\\\\\'); + content = convertLatexToSingleLine(content); // First, temporarily replace valid