[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-vercel--streamdown":3,"tool-vercel--streamdown":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":79,"owner_email":80,"owner_twitter":79,"owner_website":81,"owner_url":82,"languages":83,"stars":104,"forks":105,"last_commit_at":106,"license":107,"difficulty_score":10,"env_os":108,"env_gpu":109,"env_ram":110,"env_deps":111,"category_tags":119,"github_topics":120,"view_count":10,"oss_zip_url":79,"oss_zip_packed_at":79,"status":16,"created_at":124,"updated_at":125,"faqs":126,"releases":155},1034,"vercel\u002Fstreamdown","streamdown","A drop-in replacement for react-markdown, designed for AI-powered streaming.","Streamdown 是一个专为AI流式传输优化的Markdown渲染工具，可直接替代 react-markdown。它针对AI模型输出的流式内容设计，能优雅处理不完整或未终止的Markdown块，确保格式在数据逐步到达时依然正确呈现。传统解析器在流式场景下常因数据不完整导致渲染错误，而Streamdown通过流式优化和remend库支持，有效解决了这一问题。\n\n该工具适合需要处理AI生成流式文本的开发者，尤其适用于构建聊天界面、内容展示等场景。支持GitHub语法高亮、数学公式渲染、Mermaid图表等高级功能，同时提供安全渲染和性能优化。其设计兼容shadcn\u002Fui组件系统，通过CSS变量保证样式一致性。\n\n对于依赖AI模型输出的开发者、研究人员或需要集成Markdown渲染的前端工程师而言，Streamdown提供了稳定可靠的解决方案，兼顾功能全面性与使用便捷性。","# Streamdown\n\nA drop-in replacement for react-markdown, designed for AI-powered streaming.\n\n[![npm version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fstreamdown)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fstreamdown)\n\n## Overview\n\nFormatting Markdown is easy, but when you tokenize and stream it, new challenges arise. Streamdown is built specifically to handle the unique requirements of streaming Markdown content from AI models, providing seamless formatting even with incomplete or unterminated Markdown blocks.\n\nStreamdown powers the [AI Elements Message](https:\u002F\u002Fai-sdk.dev\u002Felements\u002Fcomponents\u002Fmessage) component but can be installed as a standalone package for your own streaming needs.\n\n## Features\n\n- 🚀 **Drop-in replacement** for `react-markdown`\n- 🔄 **Streaming-optimized** - Handles incomplete Markdown gracefully\n- 🎨 **Unterminated block parsing** - Build with `remend` for better streaming quality\n- 📊 **GitHub Flavored Markdown** - Tables, task lists, and strikethrough support\n- 🔢 **Math rendering** - LaTeX equations via KaTeX\n- 📈 **Mermaid diagrams** - Render Mermaid diagrams as code blocks with a button to render them\n- 🎯 **Code syntax highlighting** - Beautiful code blocks with Shiki\n- 🛡️ **Security-first** - Built with `rehype-harden` for safe rendering\n- ⚡ **Performance optimized** - Memoized rendering for efficient updates\n\n## Installation\n\n```bash\nnpm i streamdown\n```\n\nThen, update your Tailwind `globals.css` to include the following so that Tailwind can detect the utility classes used by Streamdown.\n\n```css\n@source \"..\u002Fnode_modules\u002Fstreamdown\u002Fdist\u002F*.js\";\n```\n\nThe path must be relative from your CSS file to the `node_modules` folder containing `streamdown`. In a standard Next.js project where `globals.css` lives in `app\u002F`, the default path above should work.\n\nIf you install optional Streamdown plugins, add their matching `@source` lines from the relevant plugin docs (`\u002Fdocs\u002Fplugins\u002Fcode`, `\u002Fdocs\u002Fplugins\u002Fcjk`, `\u002Fdocs\u002Fplugins\u002Fmath`, `\u002Fdocs\u002Fplugins\u002Fmermaid`). Only include plugin `@source` entries for packages that are actually installed.\n\nExample:\n\n```css\n@source \"..\u002Fnode_modules\u002F@streamdown\u002Fcode\u002Fdist\u002F*.js\";\n```\n\n\n### Monorepo setup\n\nIn a monorepo (npm workspaces, Turbo, pnpm, etc.), dependencies are typically hoisted to the root `node_modules`. You need to adjust the relative path to point there:\n\n```\nmonorepo\u002F\n├── node_modules\u002Fstreamdown\u002F  ← hoisted here\n├── apps\u002F\n│   └── web\u002F\n│       └── app\u002F\n│           └── globals.css   ← your CSS file\n```\n\n```css\n\u002F* apps\u002Fweb\u002Fapp\u002Fglobals.css → 3 levels up to reach root node_modules *\u002F\n@source \"..\u002F..\u002F..\u002Fnode_modules\u002Fstreamdown\u002Fdist\u002F*.js\";\n```\n\nAdjust the number of `..\u002F` segments based on where your CSS file lives relative to the root `node_modules`. If you install Streamdown plugins, add their respective `@source` entries only when those packages are installed.\n\n### CSS Custom Properties (Design Tokens)\n\nStreamdown components are built using shadcn\u002Fui's design system and rely on CSS custom properties for colors, border radius, and spacing. Without these variables defined, components may render with missing backgrounds, borders, or incorrect spacing.\n\nIf you are already using shadcn\u002Fui, these variables are set up automatically. If not, add the following minimal set to your global CSS:\n\n```css\n:root {\n  --background: oklch(1 0 0);\n  --foreground: oklch(0.145 0 0);\n  --card: oklch(1 0 0);\n  --card-foreground: oklch(0.145 0 0);\n  --muted: oklch(0.97 0 0);\n  --muted-foreground: oklch(0.556 0 0);\n  --border: oklch(0.922 0 0);\n  --input: oklch(0.922 0 0);\n  --primary: oklch(0.205 0 0);\n  --primary-foreground: oklch(0.985 0 0);\n  --radius: 0.625rem;\n}\n\n.dark {\n  --background: oklch(0.145 0 0);\n  --foreground: oklch(0.985 0 0);\n  --card: oklch(0.205 0 0);\n  --card-foreground: oklch(0.985 0 0);\n  --muted: oklch(0.269 0 0);\n  --muted-foreground: oklch(0.708 0 0);\n  --border: oklch(0.269 0 0);\n  --input: oklch(0.269 0 0);\n  --primary: oklch(0.985 0 0);\n  --primary-foreground: oklch(0.205 0 0);\n  --radius: 0.625rem;\n}\n```\n\nYou can also use the shadcn\u002Fui [theme generator](https:\u002F\u002Fui.shadcn.com\u002Fthemes) to create a custom palette and copy the generated CSS variables directly into your project.\n\n## Usage\n\nHere's how you can use Streamdown in your React application with the AI SDK:\n\n```tsx\nimport { useChat } from \"@ai-sdk\u002Freact\";\nimport { Streamdown } from \"streamdown\";\nimport { code } from \"@streamdown\u002Fcode\";\nimport { mermaid } from \"@streamdown\u002Fmermaid\";\nimport { math } from \"@streamdown\u002Fmath\";\nimport { cjk } from \"@streamdown\u002Fcjk\";\nimport \"katex\u002Fdist\u002Fkatex.min.css\";\nimport \"streamdown\u002Fstyles.css\";\n\nexport default function Chat() {\n  const { messages, status } = useChat();\n\n  return (\n    \u003Cdiv>\n      {messages.map(message => (\n        \u003Cdiv key={message.id}>\n          {message.role === 'user' ? 'User: ' : 'AI: '}\n          {message.parts.map((part, index) =>\n            part.type === 'text' ? (\n              \u003CStreamdown\n                key={index}\n                animated\n                plugins={{ code, mermaid, math, cjk }}\n                isAnimating={status === 'streaming'}\n              >\n                {part.text}\n              \u003C\u002FStreamdown>\n            ) : null,\n          )}\n        \u003C\u002Fdiv>\n      ))}\n    \u003C\u002Fdiv>\n  );\n}\n```\n\nFor more info, see the [documentation](https:\u002F\u002Fstreamdown.ai\u002Fdocs).\n","# Streamdown\n\nreact-markdown 的即插即用替换方案，专为 AI 驱动的流式传输设计。\n\n[![npm version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fstreamdown)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fstreamdown)\n\n## 概述\n\nMarkdown 格式化简单，但当进行分词和流式传输时会遇到新挑战。Streamdown 专门针对从 AI 模型流式传输 Markdown 内容的特殊需求构建，即使在不完整或未终止的 Markdown 块情况下也能实现无缝格式化。\n\nStreamdown 为 [AI Elements Message](https:\u002F\u002Fai-sdk.dev\u002Felements\u002Fcomponents\u002Fmessage) 组件提供动力，但也可以作为独立包安装以满足您的流式传输需求。\n\n## 功能\n\n- 🚀 **即插即用替换** `react-markdown`\n- 🔄 **流式优化** - 优雅处理不完整的 Markdown\n- 🎨 **未终止块解析** - 使用 `remend` 构建以提升流式传输质量\n- 📊 **GitHub 风格 Markdown** - 支持表格、任务列表和删除线\n- 🔢 **数学渲染** - 通过 KaTeX 渲染 LaTeX 公式\n- 📈 **Mermaid 图表** - 作为代码块渲染 Mermaid 图表，并提供渲染按钮\n- 🎯 **代码语法高亮** - 使用 Shiki 实现美观的代码块\n- 🛡️ **安全优先** - 使用 `rehype-harden` 构建安全渲染\n- ⚡ **性能优化** - 使用记忆化渲染实现高效更新\n\n## 安装\n\n```bash\nnpm i streamdown\n```\n\n然后更新您的 Tailwind `globals.css` 以包含以下内容，使 Tailwind 能够检测 Streamdown 使用的实用类。\n\n```css\n@source \"..\u002Fnode_modules\u002Fstreamdown\u002Fdist\u002F*.js\";\n```\n\n路径必须从您的 CSS 文件到包含 `streamdown` 的 `node_modules` 文件夹相对。在标准 Next.js 项目中，`globals.css` 位于 `app\u002F` 目录下，上述默认路径应正常工作。\n\n如果您安装了可选的 Streamdown 插件，请从相关插件文档（`\u002Fdocs\u002Fplugins\u002Fcode`、`\u002Fdocs\u002Fplugins\u002Fcjk`、`\u002Fdocs\u002Fplugins\u002Fmath`、`\u002Fdocs\u002Fplugins\u002Fmermaid`）添加对应的 `@source` 行。仅包含实际安装的插件的 `@source` 条目。\n\n示例：\n\n```css\n@source \"..\u002Fnode_modules\u002F@streamdown\u002Fcode\u002Fdist\u002F*.js\";\n```\n\n\n### 单体仓库设置\n\n在单体仓库（npm 工作区、Turbo、pnpm 等）中，依赖项通常被提升到根 `node_modules`。您需要调整相对路径以指向那里：\n\n```\nmonorepo\u002F\n├── node_modules\u002Fstreamdown\u002F  ← 提升到这里\n├── apps\u002F\n│   └── web\u002F\n│       └── app\u002F\n│           └── globals.css   ← 您的 CSS 文件\n```\n\n```css\n\u002F* apps\u002Fweb\u002Fapp\u002Fglobals.css → 3 层到根 node_modules *\u002F\n@source \"..\u002F..\u002F..\u002Fnode_modules\u002Fstreamdown\u002Fdist\u002F*.js\";\n```\n\n根据您的 CSS 文件与根 `node_modules` 的相对位置调整 `..\u002F` 段数。如果安装了 Streamdown 插件，请仅在相应包实际安装时添加对应的 `@source` 条目。\n\n### CSS 自定义属性（设计令牌）\n\nStreamdown 组件基于 shadcn\u002Fui 的设计系统构建，并依赖 CSS 自定义属性用于颜色、圆角和间距。如果没有定义这些变量，组件可能会渲染出缺失的背景、边框或错误的间距。\n\n如果您已经使用 shadcn\u002Fui，这些变量会自动设置。如果未使用，请在全局 CSS 中添加以下最小集：\n\n```css\n:root {\n  --background: oklch(1 0 0);\n  --foreground: oklch(0.145 0 0);\n  --card: oklch(1 0 0);\n  --card-foreground: oklch(0.145 0 0);\n  --muted: oklch(0.97 0 0);\n  --muted-foreground: oklch(0.556 0 0);\n  --border: oklch(0.922 0 0);\n  --input: oklch(0.922 0 0);\n  --primary: oklch(0.205 0 0);\n  --primary-foreground: oklch(0.985 0 0);\n  --radius: 0.625rem;\n}\n\n.dark {\n  --background: oklch(0.145 0 0);\n  --foreground: oklch(0.985 0 0);\n  --card: oklch(0.205 0 0);\n  --card-foreground: oklch(0.985 0 0);\n  --muted: oklch(0.269 0 0);\n  --muted-foreground: oklch(0.708 0 0);\n  --border: oklch(0.269 0 0);\n  --input: oklch(0.269 0 0);\n  --primary: oklch(0.985 0 0);\n  --primary-foreground: oklch(0.205 0 0);\n  --radius: 0.625rem;\n}\n```\n\n您也可以使用 shadcn\u002Fui [主题生成器](https:\u002F\u002Fui.shadcn.com\u002Fthemes) 创建自定义调色板，并将生成的 CSS 变量直接复制到项目中。\n\n## 使用方式\n\n以下是您在 React 应用中使用 Streamdown 与 AI SDK 的示例：\n\n```tsx\nimport { useChat } from \"@ai-sdk\u002Freact\";\nimport { Streamdown } from \"streamdown\";\nimport { code } from \"@streamdown\u002Fcode\";\nimport { mermaid } from \"@streamdown\u002Fmermaid\";\nimport { math } from \"@streamdown\u002Fmath\";\nimport { cjk } from \"@streamdown\u002Fcjk\";\nimport \"katex\u002Fdist\u002Fkatex.min.css\";\nimport \"streamdown\u002Fstyles.css\";\n\nexport default function Chat() {\n  const { messages, status } = useChat();\n\n  return (\n    \u003Cdiv>\n      {messages.map(message => (\n        \u003Cdiv key={message.id}>\n          {message.role === 'user' ? 'User: ' : 'AI: '}\n          {message.parts.map((part, index) =>\n            part.type === 'text' ? (\n              \u003CStreamdown\n                key={index}\n                animated\n                plugins={{ code, mermaid, math, cjk }}\n                isAnimating={status === 'streaming'}\n              >\n                {part.text}\n              \u003C\u002FStreamdown>\n            ) : null,\n          )}\n        \u003C\u002Fdiv>\n      ))}\n    \u003C\u002Fdiv>\n  );\n}\n```\n\n更多信息请查看 [文档](https:\u002F\u002Fstreamdown.ai\u002Fdocs)。","# Streamdown 快速上手指南\n\n## 环境准备\n- **系统要求**：Node.js 14+\n- **前置依赖**：\n  - React（用于渲染）\n  - Tailwind CSS（需配置全局样式）\n  - shadcn\u002Fui（可选，用于设计系统）\n\n## 安装步骤\n1. 安装核心包：\n   ```bash\n   npm install streamdown\n   ```\n   （可选）使用国内镜像加速：\n   ```bash\n   npm config set registry https:\u002F\u002Fregistry.npmmirror.com\n   ```\n\n2. 配置 Tailwind 全局样式：\n   在 `globals.css` 添加：\n   ```css\n   @source \"..\u002Fnode_modules\u002Fstreamdown\u002Fdist\u002F*.js\";\n   ```\n   若使用 monorepo 结构，需调整路径指向根 `node_modules`（如 `..\u002F..\u002F..\u002Fnode_modules\u002Fstreamdown\u002Fdist\u002F*.js`）。\n\n3. 安装可选插件（如需）：\n   ```bash\n   npm install @streamdown\u002Fcode @streamdown\u002Fmermaid @streamdown\u002Fmath @streamdown\u002Fcjk\n   ```\n   对应添加插件样式引用（如 `@source \"..\u002Fnode_modules\u002F@streamdown\u002Fcode\u002Fdist\u002F*.js\";`）。\n\n## 基本使用\n```tsx\nimport { useChat } from \"@ai-sdk\u002Freact\";\nimport { Streamdown } from \"streamdown\";\nimport { code, mermaid, math, cjk } from \"@streamdown\u002F...\";\n\nexport default function Chat() {\n  const { messages } = useChat();\n  return (\n    \u003Cdiv>\n      {messages.map(message => (\n        \u003Cdiv key={message.id}>\n          {message.role === 'user' ? 'User: ' : 'AI: '}\n          {message.parts.map((part, index) =>\n            part.type === 'text' ? (\n              \u003CStreamdown\n                key={index}\n                animated\n                plugins={{ code, mermaid, math, cjk }}\n              >\n                {part.text}\n              \u003C\u002FStreamdown>\n            ) : null,\n          )}\n        \u003C\u002Fdiv>\n      ))}\n    \u003C\u002Fdiv>\n  );\n}\n```\n\n> 注意：需同时引入 KaTeX 和 Streamdown 样式：\n```js\nimport \"katex\u002Fdist\u002Fkatex.min.css\";\nimport \"streamdown\u002Fstyles.css\";\n```","一个AI聊天应用开发人员正在构建实时对话界面，需要将AI生成的Markdown内容流式传输到前端并保持格式正确。\n\n### 没有 streamdown 时  \n- 当AI生成的Markdown内容在流式传输中不完整时，react-markdown会抛出解析错误导致页面崩溃  \n- 未终止的代码块或列表项无法正确解析，导致格式错乱（如代码块中间断开、列表项缺失）  \n- 频繁的重新渲染导致性能下降，特别是在高并发场景下  \n- 未处理的Markdown语法可能引入XSS漏洞，存在安全隐患  \n- 不同组件间的样式不一致，影响整体视觉体验  \n\n### 使用 streamdown 后  \n- 自动处理不完整的Markdown内容，即使中间断开也能保持格式正确  \n- 支持未终止的代码块和列表项解析，确保流式传输时格式稳定  \n- 通过memoized渲染优化性能，减少不必要的组件更新  \n- 内置安全机制防止非法语法注入，保障渲染安全性  \n- 与shadcn\u002Fui设计系统深度集成，实现统一的样式和交互体验  \n\nstreamdown通过流式渲染优化和安全机制，解决了AI生成内容在实时传输中的格式稳定性与安全性问题。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fvercel_streamdown_d98e075b.png","vercel","Vercel","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fvercel_d9ebfb29.png","Develop. Preview. Ship. Creators of Next.js.",null,"contactus@vercel.com","https:\u002F\u002Fvercel.com","https:\u002F\u002Fgithub.com\u002Fvercel",[84,88,92,96,100],{"name":85,"color":86,"percentage":87},"TypeScript","#3178c6",87.8,{"name":89,"color":90,"percentage":91},"MDX","#fcb32c",10.2,{"name":93,"color":94,"percentage":95},"HTML","#e34c26",1.1,{"name":97,"color":98,"percentage":99},"CSS","#663399",0.6,{"name":101,"color":102,"percentage":103},"JavaScript","#f1e05a",0.2,4917,252,"2026-04-04T17:20:12","NOASSERTION","Linux, macOS, Windows","未说明","16GB+",{"notes":112,"python":109,"dependencies":113},"建议使用 conda 管理环境，首次运行需下载约 5GB 模型文件",[114,115,116,117,118],"react","react-markdown","shiki","katex","mermaid",[15,13,14],[121,122,123],"ai","markdown","streaming","2026-03-27T02:49:30.150509","2026-04-06T06:44:07.666196",[127,132,137,142,147,151],{"id":128,"question_zh":129,"answer_zh":130,"source_url":131},4615,"如何解决Streamdown无法正确显示数学公式的问题？","维护者在评论中指出，默认情况下`singleDollarTextMath`设置为`false`以避免与货币符号冲突。可通过启用该选项解决：\n\n```tsx\nimport { createMathPlugin } from \"@streamdown\u002Fmath\";\n\nconst math = createMathPlugin({\n  singleDollarTextMath: true,\n});\n\n\u003CStreamdown plugins={{ math }}>{children}\u003C\u002FStreamdown>\n```\n若使用LLM输出，可让模型将美元符号转义为`\\$`。","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fissues\u002F159",{"id":133,"question_zh":134,"answer_zh":135,"source_url":136},4616,"tel链接为什么被Streamdown默认阻止？","根据文档，Streamdown默认允许http、https、mailto等协议，但tel链接需手动配置。可通过以下方式解决：\n\n```tsx\nimport {defaultRehypePlugins, Streamdown} from \"streamdown\";\nimport {harden} from \"rehype-harden\";\n\n\u003CStreamdown\n  rehypePlugins={[\n    defaultRehypePlugins.raw,\n    [\n      harden,\n      {\n        allowedProtocols: [\n          'http',\n          'https',\n          'mailto',\n          'tel',\n        ],\n      },\n    ],\n  ]}\n>Here is [a link](https:\u002F\u002Fexample.com) for you\u003C\u002FStreamdown>\n```\n注意：需确保`rehypePlugins`覆盖默认过滤器。","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fissues\u002F373",{"id":138,"question_zh":139,"answer_zh":140,"source_url":141},4617,"Streamdown日志为何会大量输出导致系统崩溃？","问题由Nitro版本兼容性引起。升级Nitro到最新版本可解决：\n\n```bash\nnpm install nitro@latest\n```\n若已升级仍存在问题，可尝试完全卸载Streamdown后重装，或检查项目中是否存在其他日志相关依赖。","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fissues\u002F211",{"id":143,"question_zh":144,"answer_zh":145,"source_url":146},4618,"如何让Streamdown正确渲染内联数学公式？","默认情况下内联数学公式会被视为文本，需显式启用`singleDollarTextMath`：\n\n```tsx\nimport { createMathPlugin } from \"@streamdown\u002Fmath\";\n\nconst math = createMathPlugin({\n  singleDollarTextMath: true,\n});\n\n\u003CStreamdown plugins={{ math }}>{children}\u003C\u002FStreamdown>\n```\n若使用LLM生成内容，建议让模型将美元符号转义为`\\$`以避免冲突。","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fissues\u002F108",{"id":148,"question_zh":149,"answer_zh":150,"source_url":136},4619,"如何配置Streamdown允许渲染tel链接？","通过自定义`rehypePlugins`覆盖默认过滤器，添加tel协议到允许列表：\n\n```tsx\nimport {defaultRehypePlugins, Streamdown} from \"streamdown\";\nimport {harden} from \"rehype-harden\";\n\n\u003CStreamdown\n  rehypePlugins={[\n    defaultRehypePlugins.raw,\n    [\n      harden,\n      {\n        allowedProtocols: [\n          'http',\n          'https',\n          'mailto',\n          'tel',\n        ],\n      },\n    ],\n  ]}\n>Here is [a link](tel:01392498505) for you\u003C\u002FStreamdown>\n```\n注意：需确保`rehypePlugins`配置覆盖默认过滤器。",{"id":152,"question_zh":153,"answer_zh":154,"source_url":146},4620,"Streamdown的数学公式配置如何影响货币符号？","默认情况下，`singleDollarTextMath`设置为`false`以避免将货币符号（如$20）误判为数学公式。若需启用内联数学公式，需显式配置：\n\n```tsx\nconst math = createMathPlugin({\n  singleDollarTextMath: true,\n});\n\n\u003CStreamdown plugins={{ math }}>{children}\u003C\u002FStreamdown>\n```\n若使用LLM生成内容，建议让模型将美元符号转义为`\\$`以避免冲突。",[156,161,166,171,176,181,186,191,196,201,206,211,216,221,226,231,235,240,245,249],{"id":157,"version":158,"summary_zh":159,"released_at":160},104081,"streamdown@2.5.0","### Minor Changes\n\n-   d6666b6: Add `lineNumbers` prop to disable line numbers in code blocks\n-   d4ec6c0: Add `meta` prop to `CustomRendererProps`. Custom renderers now receive the raw metastring from the code fence (everything after the language identifier, e.g. ```` ```rust {1} title=\"foo\" ```` → `meta = '{1} title=\"foo\"'`). The prop is optional (`meta?: string`) and is `undefined` when no metastring is present. Existing custom renderers are unaffected.\n\n### Patch Changes\n\n-   ac8d839: Add staggered `animation-delay` to streaming word\u002Fcharacter animations so new content cascades in sequentially instead of all animating simultaneously. Configurable via the new `stagger` option (default 40ms). Set `stagger: 0` to restore the previous behavior.\n\n-   add5374: Enable horizontal scrolling on code blocks so long lines are accessible instead of being clipped by `overflow-hidden`.\n\n-   75845c0: Fix unnecessary re-renders of code blocks during streaming updates.\n\n    **Problem:** In streaming mode, when new content arrives (e.g. a paragraph is appended), completed code blocks that haven't changed were still re-rendering. This happened because the `Streamdown` component used inline object literals as default parameter values for `linkSafety` (`{ enabled: true }`). Every time `children` changed and `Streamdown` re-rendered, these inline defaults created new references, which caused the `contextValue` useMemo to recompute a new `StreamdownContext` object. Since React propagates context changes through `memo` boundaries, any context consumer inside a memoized `Block` (such as `CodeBlock`) would re-render even though the block's own props were unchanged.\n\n    **Fix:** Extract the inline default values for `linkSafety` into module-level constants (`defaultLinkSafetyConfig`). This ensures referential stability across renders, so `contextValue` only recomputes when the actual values change — not just because `children` updated.\n\n-   8b1c262: fix: prepend UTF-8 BOM to CSV downloads for Excel compatibility\n\n    -   `save()` now prepends `\\uFEFF` for `text\u002Fcsv` string content so Excel on\n        Windows detects UTF-8 encoding instead of falling back to ANSI.\n    -   `TableDownloadButton` refactored to use `save()` instead of inline Blob\n        creation, ensuring the public API also gets the BOM fix.\n\n-   b105c64: Fix custom tag content being prematurely split when content follows the opening tag on the same line and contains double newlines (`\\n\\n`). The preprocessor now ensures proper HTML block structure so the parser treats the entire tag as a single unit.\n\n-   9e6f991: Increase dropdown z-index for table copy and download menus to prevent clipping by surrounding elements.\n\n-   9c18748: docs: document required CSS custom properties (shadcn\u002Fui design tokens) in README\n\n-   7b62e9a: Replace Tailwind v4-only `*:last:` and `*:first:` variant syntax with `[&>*:last-child]:` and `[&>*:first-child]:` arbitrary variants for compatibility with both Tailwind CSS v3 and v4. Fixes caret rendering on every line instead of only the last child in v3.\n\n-   Updated dependencies [e50b0c4]\n\n-   Updated dependencies [716a5f0]\n    -   remend@1.3.0\n","2026-03-17T17:35:16",{"id":162,"version":163,"summary_zh":164,"released_at":165},104082,"remend@1.3.0","### Minor Changes\n\n-   e50b0c4: Add opt-in inline KaTeX completion (`$formula` → `$formula$`) via a new `inlineKatex` option that defaults to `false` to avoid ambiguity with currency symbols. Also fixes block KaTeX completion when streaming produces a partial closing `$`.\n-   716a5f0: Escape single `~` between word characters to prevent false strikethrough rendering (e.g. `20~25°C` no longer renders as strikethrough). Adds a new `singleTilde` option (enabled by default) that can be disabled via `{ singleTilde: false }`.\n","2026-03-17T17:35:13",{"id":167,"version":168,"summary_zh":169,"released_at":170},104083,"@streamdown\u002Fcode@1.1.1","### Patch Changes\n\n-   651873d: Fall back to plain text highlighting when the code block language identifier is unknown or truncated mid-stream, preventing Shiki from throwing on unsupported language names.\n","2026-03-17T17:35:10",{"id":172,"version":173,"summary_zh":174,"released_at":175},104084,"@streamdown\u002Fcjk@1.0.3","### Patch Changes\n\n-   6f1ea07: Updated `remark-cjk-friendly` and `remark-cjk-friendly-gfm-strikethrough` from v1.x to v2.x. The only breaking change in v2.0.0 is dropping Node.js 16 support, which Streamdown has already dropped (requires Node.js ≥18), so there is no actual impact. The actual code is identical to the latest v1.x release (v2.0.1 only added the ability to import package.json).\n","2026-03-17T17:35:19",{"id":177,"version":178,"summary_zh":179,"released_at":180},104085,"streamdown@2.4.0","### Minor Changes\n\n-   5edff75: Clarified Tailwind `@source` configuration for Streamdown and optional plugins.\n    Updated documentation to keep the global `@source` for core `streamdown` only, move plugin `@source` guidance to plugin docs with examples, and add a caveat to include plugin entries only if installed.\n\n-   57cd3b5: Add support for custom starting line numbers in code blocks via the `startLine` meta option.\n\n    Code blocks can now specify a starting line number in the meta string:\n\n    ````md\n    ```js startLine=10\n    const x = 1;\n    ```\n    ````\n\n    This renders line numbers beginning at 10 instead of the default 1. The feature works by parsing the `startLine=N` value from the fenced-code meta string and applying `counter-reset: line N-1` to the `\u003Ccode>` element.\n\n-   57cd3b5: Add support for customizing icons via the `icons` prop on `\u003CStreamdown>`.\n\n    Users can override any subset of the built-in icons (copy, download, zoom, etc.) by passing a `Partial\u003CIconMap>`:\n\n    ```tsx\n    import { Streamdown, type IconMap } from \"streamdown\";\n\n    \u003CStreamdown icons={{ CheckIcon: MyCheckIcon }}>{content}\u003C\u002FStreamdown>;\n    ```\n\n    Unspecified icons fall back to defaults.\n\n-   01d27e9: Add support for custom Shiki themes via a `themes` option on `createCodePlugin`, accepting a `[light, dark]` pair of bundled theme names or full theme registration objects.\n\n-   2cf559d: Add a virtual `inlineCode` key to the `components` prop, allowing inline code spans to be styled independently from fenced code blocks without manually detecting block vs. inline context.\n\n-   27c7b03: Export table action components (`TableCopyDropdown`, `TableDownloadButton`, `TableDownloadDropdown`) and utilities (`extractTableDataFromElement`, `tableDataToCSV`, `tableDataToTSV`, `tableDataToMarkdown`, `escapeMarkdownTableCell`, `TableData`), enabling custom table overrides to preserve copy\u002Fdownload interactivity.\n\n-   fb76275: Add a fullscreen overlay for tables with Escape\u002Fbackdrop-click to close and scroll locking, controlled via `controls.table.fullscreen`. Copy and download controls remain available in the fullscreen view.\n\n-   b392fbe: Add `literalTagContent` prop that accepts an array of custom HTML tag names (e.g. `['mention']`) whose children should be treated as plain text, escaping markdown metacharacters so user-supplied labels aren't interpreted as formatting.\n\n-   c4c86fa: Add a `dir` prop that accepts `\"ltr\"`, `\"rtl\"`, or `\"auto\"`. When set to `\"auto\"`, each block's text direction is detected by scanning for the first strong Unicode character (Arabic, Hebrew, Thaana, etc.).\n\n-   00872f0: Add a `prefix` prop that prepends a namespace to all generated Tailwind utility classes (e.g. `flex` becomes `tw:flex`), enabling Tailwind v4's `prefix()` feature for projects that need to avoid class name collisions.\n\n-   401b901: Add support for custom renderers via `plugins.renderers`, allowing fenced code blocks with specific languages to be rendered by a custom component instead of the default `CodeBlock`.\n\n### Patch Changes\n\n-   f398611: Add `onAnimationStart` and `onAnimationEnd` callback props that fire when streaming animation begins and completes, useful for coordinating UI state with the animation lifecycle.\n\n-   f2a7e51: Fix empty lines in syntax-highlighted code blocks collapsing into nothing by rendering a newline character for empty token rows, preserving whitespace when copying.\n\n-   9ba8511: fix: prevent ordered list animation retrigger during streaming\n\n    When streaming content contains multiple ordered (or unordered) lists,\n    the Marked lexer merges them into a single block. As each new item appears\n    the block is re-processed through the rehype pipeline, re-creating all\n    `data-sd-animate` spans. This caused already-visible characters to re-run\n    their CSS entry animation.\n\n    Two changes address the root cause:\n\n    1.  **Per-block `prevContentLength` tracking** – each `Block` component\n        now keeps a `useRef` with the content length from its previous render.\n        Before each render the `animatePlugin.setPrevContentLength(n)` method is\n        called so the rehype plugin can detect which text-node positions were\n        already rendered. Characters whose cumulative hast-text offset falls below\n        the previous raw-content length receive `--sd-duration:0ms`, making them\n        appear in their final state instantly rather than re-animating.\n\n    2.  **Stable `animatePlugin` reference** – the `animatePlugin` `useMemo`\n        now uses value-based dependency comparison instead of reference equality\n        for the `animated` option object. This prevents the plugin from being\n        recreated on every parent re-render when the user passes an inline object\n        literal (e.g. `animated={{ animation: 'fadeIn' }}`). A stable reference\n        is required because the rehype processor cache uses the function name as\n        its key and always returns the first cached closure; only the original\n ","2026-03-05T19:04:15",{"id":182,"version":183,"summary_zh":184,"released_at":185},104086,"remend@1.2.2","### Patch Changes\n\n-   a725579: Fix emphasis completion handlers incorrectly closing bold\u002Fitalic\u002Fstrikethrough markers that appear inside complete inline code spans (e.g. `` `**bold` `` no longer gets a stray `**` appended outside the backticks).\n","2026-03-05T19:04:18",{"id":187,"version":188,"summary_zh":189,"released_at":190},104087,"@streamdown\u002Fcode@1.1.0","### Minor Changes\n\n-   01d27e9: Add support for custom Shiki themes via a `themes` option on `createCodePlugin`, accepting a `[light, dark]` pair of bundled theme names or full theme registration objects.\n","2026-03-05T19:04:21",{"id":192,"version":193,"summary_zh":194,"released_at":195},104088,"streamdown@2.3.0","### Minor Changes\n\n-   3657e42: Add `useIsCodeFenceIncomplete` hook for detecting incomplete code fences during streaming\n\n    Custom components can now detect when the code fence in their block is still being streamed. This is useful for deferring expensive renders (syntax highlighting, Mermaid diagrams) until the code block is complete.\n\n    ```tsx\n    import { useIsCodeFenceIncomplete } from \"streamdown\";\n\n    const MyCodeBlock = ({ children }) => {\n      const isIncomplete = useIsCodeFenceIncomplete();\n\n      if (isIncomplete) {\n        return \u003Cdiv>Loading code...\u003C\u002Fdiv>;\n      }\n\n      return (\n        \u003Cpre>\n          \u003Ccode>{children}\u003C\u002Fcode>\n        \u003C\u002Fpre>\n      );\n    };\n    ```\n\n    The hook returns `true` when:\n\n    -   Streaming is active (`isAnimating={true}`)\n    -   The component is in the last block being streamed\n    -   That block has an unclosed code fence\n\n    The default code block component now uses this hook to set a `data-incomplete` attribute when incomplete, enabling CSS-based loading states.\n\n-   32fb079: fix: hide download button on broken images and display a custom \"Image not available\" message instead\n\n-   d73d7bb: Make the action buttons in code block header sticky.\n    Ensures copy buttons remain accessible for long code blocks.\n    Improves usability when viewing large snippets.\n\n-   15645da: Move code block lazy loading to the highlighting layer so block shells render immediately with plain text content before syntax colors resolve. This improves visual stability and removes the spinner fallback for standard code blocks.\n\n### Patch Changes\n\n-   0987479: fix: codeblock highlight flicker while streaming\n-   5d438ca: Add support for copying table data as Markdown in TableCopyDropdown.\n    Introduces a Markdown copy option alongside existing formats.\n    Allows users to quickly copy tables in valid Markdown format.\n-   ce9b4c2: Fix syntax highlighting\n-   ba03332: Redesign Mermaid diagram\n-   6e91867: fix nested same-tag HTML block parsing in parseMarkdownIntoBlocks\n-   7f9127b: Add `normalizeHtmlIndentation` prop to prevent indented HTML tags from being treated as code blocks\n-   fdef60d: Bump rehype-harden to fix \"can't access property \"type\", node is undefined\"\n-   1abbf1e: Redesign table\n-   fb9f97c: handle custom tags with blank lines in content\n-   Updated dependencies [6374fbf]\n    -   remend@1.2.1\n","2026-02-19T16:42:16",{"id":197,"version":198,"summary_zh":199,"released_at":200},104089,"remend@1.2.1","### Patch Changes\n\n-   6374fbf: Fix stray asterisks stemming from mermaid diagrams\n","2026-02-19T16:42:13",{"id":202,"version":203,"summary_zh":204,"released_at":205},104090,"@streamdown\u002Fcode@1.0.3","### Patch Changes\n\n-   c597336: Use JS engine\n","2026-02-19T16:42:10",{"id":207,"version":208,"summary_zh":209,"released_at":210},104091,"streamdown@2.2.0","### Minor Changes\n\n-   c1e1e66: Bake animate into streamdown as built-in `animated` prop\n\n### Patch Changes\n\n-   d5fe6d6: fix: properly handle HTML void elements in parse-blocks\n\n-   6bb03ca: fix: escape HTML when rehype-raw is omitted (#330)\n\n-   a12de57: Custom tags in components\n\n-   83f043c: Fix: certain LaTeX syntaxes e.g. (...) are not rendering\n\n-   aabb9ab: Fix $$ inside code blocks being treated as math delimiters\n\n    Code blocks can contain `$$` as shell syntax (e.g., `pstree -p $$` for current process ID). The math block merging logic was incorrectly counting `$$` inside code blocks, causing subsequent content to be merged as if it were part of a math block.\n\n    Added tracking of previous token type to skip math merging when the previous block was a code block.\n\n-   9f72224: Fix footnote detection incorrectly matching regex character classes\n\n    The footnote reference and definition patterns were too permissive, using `[^\\]\\s]` which matches any character except `]` and whitespace. This caused regex negated character classes like `[^\\s...]` in code blocks to be incorrectly detected as footnotes, resulting in the entire document being returned as a single block.\n\n    Updated the patterns to only match valid footnote identifiers (alphanumeric characters, underscores, and hyphens) using `[\\w-]` instead.\n\n-   6b42a85: Remove CJS builds\n\n-   aeadcd6: Fix single-line indented code blocks\n\n-   82bc4a6: Fix tel links being blocked by default\n\n-   fd5533c: fix: Tables cause vertical scroll trap\n\n-   e633ff7: Strip trailing newlines in code blocks\n\n-   6be5da8: Fix carets and dark code blocks on Tailwind v3\n\n-   573ece6: Add documentation for monorepos\n\n-   48756b5: Extend ReactMarkdown props\n\n-   Updated dependencies [c347b53]\n\n-   Updated dependencies [6b42a85]\n\n-   Updated dependencies [4fffb9f]\n\n-   Updated dependencies [3e6a77d]\n    -   remend@1.2.0\n","2026-02-09T17:31:53",{"id":212,"version":213,"summary_zh":214,"released_at":215},104092,"remend@1.2.0","### Minor Changes\n\n-   3e6a77d: Handle incomplete HTML tags\n\n### Patch Changes\n\n-   c347b53: Fix whitespace-bound asterisks\n-   6b42a85: Remove CJS builds\n-   4fffb9f: Repair comparison operators in list items\n","2026-02-09T17:31:39",{"id":217,"version":218,"summary_zh":219,"released_at":220},104093,"@streamdown\u002Fmermaid@1.0.2","### Patch Changes\n\n-   ac25c6b: Fix incorrect zoom-out icon SVG in Mermaid preview plugin.\n-   6b42a85: Remove CJS builds\n-   a1e2fad: Patch upstream security vulnerability\n","2026-02-09T17:31:50",{"id":222,"version":223,"summary_zh":224,"released_at":225},104094,"@streamdown\u002Fmath@1.0.2","### Patch Changes\n\n-   6b42a85: Remove CJS builds\n","2026-02-09T17:31:47",{"id":227,"version":228,"summary_zh":229,"released_at":230},104095,"@streamdown\u002Fcode@1.0.2","### Patch Changes\n\n-   c995fb7: Add bundled-language aliases for common JavaScript, TypeScript, and shell code fence labels.\n-   6b42a85: Remove CJS builds\n","2026-02-09T17:31:44",{"id":232,"version":233,"summary_zh":224,"released_at":234},104096,"@streamdown\u002Fcjk@1.0.2","2026-02-09T17:31:41",{"id":236,"version":237,"summary_zh":238,"released_at":239},104097,"streamdown@2.1.0","## What's Changed\r\n* Switch to plugin architecture by @haydenbleasel in https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fpull\u002F352\r\n* Version Packages by @streamdown-github-app[bot] in https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fpull\u002F353\r\n\r\n\r\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fvercel\u002Fstreamdown\u002Fcompare\u002Fstreamdown@2.0.1...streamdown@2.1.0","2026-01-20T02:00:20",{"id":241,"version":242,"summary_zh":243,"released_at":244},104098,"@streamdown\u002Fmermaid@1.0.1","### Patch Changes\n\n-   0b80aed: Plugins\n","2026-01-19T05:18:26",{"id":246,"version":247,"summary_zh":243,"released_at":248},104099,"@streamdown\u002Fmath@1.0.1","2026-01-19T05:18:29",{"id":250,"version":251,"summary_zh":243,"released_at":252},104100,"@streamdown\u002Fcode@1.0.1","2026-01-19T05:18:20"]