Frontend LLM Output Handler
Goal
Enhance existing frontend code to support the rendering of complex LLM response strings.
- Input: Frontend code (JavaScript, React, TypeScript).
- Output: Enhanced frontend code with integrated capabilities for parsing Markdown, rendering LaTeX math formulas, and displaying interactive code blocks.
Dependencies
The implementation uses the following packages:
- Markdown:
marked
- Math/LaTeX:
katex
- Sanitization:
dompurify
- Syntax Highlighting:
highlight.js
- React Styling:
styled-components
- DOM Utility:
jQuery (optional, for non-React implementations)
Instructions
To enhance frontend components for AI-generated responses, follow this 4-step integration pipeline:
1. Pre-processing (Math Compatibility)
AI models often produce single backslashes in LaTeX (e.g., \frac). Most Markdown parsers consume these as escape characters. You must normalize them before parsing.
// Normalize backslashes for KaTeX compatibility
const normalized = rawText.replace(/\\/g, '');
2. Markdown Parsing
Use a robust parser like marked. Ensure you handle the output as an HTML string.
3. Code Block Decoration
AI responses frequently contain code. Enhance standard output by wrapping it in a container with a language label to improve readability and visual structure.
4. Security & Post-processing
- Sanitize with Config: ALWAYS use
DOMPurify. Ensure your configuration allows the specific tags and attributes you've added (e.g., class).DOMPurify.sanitize(html, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'img', 'code', 'pre', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'div', 'span', 'table', 'thead', 'tbody', 'tr', 'th', 'td'],
ALLOWED_ATTR: ['src', 'alt', 'class', 'href', 'style']
});
- Math Rendering (KaTeX): Call
renderMathInElement after the content is added to the DOM. You MUST specify delimiters so the renderer knows what to look for:renderMathInElement(container, {
delimiters: [
{ left: '$$', right: '$$', display: true },
{ left: '$', right: '$', display: false },
{ left: '\\(', right: '\\)', display: false },
{ left: '\\[', right: '\\]', display: true }
],
throwOnError: false
});
Performance & UX Tips (React)
- Memoization: Use
useMemo to wrap the parsing logic and React.memo for message components. This prevents expensive re-parsing of the entire chat history when new messages arrive.
- Auto-scroll: Implement a
useEffect that monitors the message list and updates scrollTop to keep the latest AI response in view.
1---2name: frontend-llm-output-handler3description: Guide for enhancing frontend code with the capability to render AI/LLM outputs (Markdown, LaTeX, code blocks) securely and accurately in the UI.4---56# Frontend LLM Output Handler78## Goal9Enhance existing frontend code to support the rendering of complex LLM response strings.1011- **Input**: Frontend code (JavaScript, React, TypeScript).12- **Output**: Enhanced frontend code with integrated capabilities for parsing Markdown, rendering LaTeX math formulas, and displaying interactive code blocks.1314## Dependencies15The implementation uses the following packages:16- **Markdown**: `marked`17- **Math/LaTeX**: `katex`18- **Sanitization**: `dompurify`19- **Syntax Highlighting**: `highlight.js`20- **React Styling**: `styled-components`21- **DOM Utility**: `jQuery` (optional, for non-React implementations)2223## Instructions2425To enhance frontend components for AI-generated responses, follow this 4-step integration pipeline:2627### 1. Pre-processing (Math Compatibility)28AI models often produce single backslashes in LaTeX (e.g., `\frac`). Most Markdown parsers consume these as escape characters. You must normalize them before parsing.2930```javascript31// Normalize backslashes for KaTeX compatibility32const normalized = rawText.replace(/\\/g, '');33```3435### 2. Markdown Parsing36Use a robust parser like `marked`. Ensure you handle the output as an HTML string.3738### 3. Code Block Decoration39AI responses frequently contain code. Enhance standard output by wrapping it in a container with a language label to improve readability and visual structure.4041### 4. Security & Post-processing42- **Sanitize with Config**: ALWAYS use `DOMPurify`. Ensure your configuration allows the specific tags and attributes you've added (e.g., `class`).43 ```javascript44 DOMPurify.sanitize(html, {45 ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'img', 'code', 'pre', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'div', 'span', 'table', 'thead', 'tbody', 'tr', 'th', 'td'],46 ALLOWED_ATTR: ['src', 'alt', 'class', 'href', 'style']47 });48 ```49- **Math Rendering (KaTeX)**: Call `renderMathInElement` after the content is added to the DOM. You MUST specify delimiters so the renderer knows what to look for:50 ```javascript51 renderMathInElement(container, {52 delimiters: [53 { left: '$$', right: '$$', display: true },54 { left: '$', right: '$', display: false },55 { left: '\\(', right: '\\)', display: false },56 { left: '\\[', right: '\\]', display: true }57 ],58 throwOnError: false59 });60 ```6162## Performance & UX Tips (React)63- **Memoization**: Use `useMemo` to wrap the parsing logic and `React.memo` for message components. This prevents expensive re-parsing of the entire chat history when new messages arrive.64- **Auto-scroll**: Implement a `useEffect` that monitors the message list and updates `scrollTop` to keep the latest AI response in view.65