<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Google I/O 2026深度复盘：Gemini 3.5、Omni视频模型与Spark Agent三箭齐发，Hassabis宣称"站在奇点的山麓" - Markdown</title>
    <style>
        body { 
            font-family: monospace; 
            white-space: pre-wrap; 
            word-wrap: break-word; 
            padding: 0; 
            background-color: #e5e5e5;
            color: #24292f;
            margin: 0;
            display: flex;
            flex-direction: column;
            align-items: center;
            min-height: 100vh;
        }
        .markdown-body {
            box-sizing: border-box;
            width: 100%;
            max-width: 980px;
            margin: 2em auto;
            padding: 45px;
            background-color: #fff;
            border: 1px solid #d0d7de;
            border-radius: 6px;
            font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;
            white-space: normal;
            box-shadow: 0 4px 12px rgba(0,0,0,0.05);
        }
        @media (prefers-color-scheme: dark) {
            body {
                background-color: #010409;
                color: #c9d1d9;
            }
            .markdown-body {
                background-color: #0d1117;
                border-color: #30363d;
                box-shadow: 0 4px 12px rgba(0,0,0,0.3);
            }
        }
        @media (max-width: 767px) {
            .markdown-body {
                padding: 15px;
                margin: 0;
                border-radius: 0;
                border-left: none;
                border-right: none;
            }
        }
    </style>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.5.0/github-markdown.min.css">
</head>
<body>---
title: 'Google I/O 2026深度复盘：Gemini 3.5、Omni视频模型与Spark Agent三箭齐发，Hassabis宣称"站在奇点的山麓"'
description: 'Google I/O 2026正式发布Gemini 3.5 Flash、Gemini Omni视频生成模型、Gemini Spark个人AI Agent及Android XR智能眼镜。DeepMind CEO Hassabis在keynote中宣称人类正"站在奇点的山麓"。Gemini月活达9亿，AI Search迎来25年来最大变革。'
pubDate: 2026-05-21
tags: ['AI', '分析', 'Google', 'Gemini', 'Google IO', 'AI Agent', '智能眼镜', '行业动态']
---
如昨日报道所述，Google I/O 2026是Google在AI竞赛中夺回话语权的关键时刻。现在，尘埃落定。Google没有发布外界预期的"Gemini 4.0"，而是祭出了三张更具战略深度的王牌：**Gemini 3.5 Flash——超越前代Pro的编码和Agent模型；Gemini Omni——从任意输入生成视频的全新多模态模型；Gemini Spark——基于Gemini 3.5的个人AI Agent，可以24/7在云端代你执行任务。**

而在keynote的最后几分钟，Google DeepMind CEO Demis Hassabis抛出了一个让全场倒吸一口凉气的判断："**当我们回顾此刻，会意识到我们正站在奇点的山麓。**"与此同时，Google宣布Gemini月活用户已达9亿——但与ChatGPT的9亿周活相比，这个数字的含金量仍存争议。

---

## Gemini 3.5 Flash：不是4.0，但比3.1 Pro更强

### 发生了什么

[Google官方博客](https://blog.google/innovation-and-ai/technology/ai/google-io-2026-all-our-announcements/)、[The Verge](https://www.theverge.com/tech/933415/google-io-2026-biggest-announcements-ai-gemini)和[9to5Google](https://9to5google.com/2026/05/19/google-io-2026-news/)确认：Google发布了**Gemini 3.5 Flash**，而非此前广泛预期的"Gemini 4.0"。

**核心数据：**

| 指标 | 详情 |
|------|------|
| 模型名称 | Gemini 3.5 Flash（Pro版本下月发布） |
| 基准测试 | 编码、Agent和多模态任务**超越Gemini 3.1 Pro** |
| 速度 | 输出token速度比其他前沿模型快**4倍** |
| 成本 | "不到其他前沿模型一半" |
| 安全性 | 改进防护栏，减少有害内容生成和误判 |
| 部署范围 | 即日起成为Gemini App和AI Mode搜索的**默认模型** |

值得注意的是，Google没有发布"Gemini 4.0"这个品牌名称，而是选择了"3.5"——这在技术上更准确（架构迭代而非全新一代），但在营销上可能不如"4.0"抢眼。此前，美国财政部长Bessent曾公开预计Google将发布"大的阶跃式跳跃"——3.5的命名是否意味着这一跳跃尚未到来？

### 为什么这很重要

**Flash超越Pro是一个重要的能力跃迁。** 在Google的模型命名体系中，Flash一直代表"快速但便宜"的版本，Pro代表"强大但昂贵"的版本。当Flash在编码和Agent任务上超越上一代Pro时，这意味着Google的模型效率正在大幅提升——更便宜的模型正在追上更贵的模型的能力上限。

**"4倍输出速度、一半成本"的定价策略直指Anthropic和OpenAI。** Google正在用典型的"Android策略"——通过规模和效率优势将成本压到竞争者无法匹敌的水平。如果Gemini 3.5 Flash在能力上接近Claude Opus 4.7或GPT-5.5，但成本只有一半，这对开发者而言是一个极具吸引力的选择。

**Google Antigravity 2.0的同步更新强化了开发者生态。** [TechCrunch报道](https://techcrunch.com/2026/05/19/google-launches-antigravity-2-0-with-an-updated-desktop-app-and-cli-tool-at-io-2026/)确认，Google Antigravity 2.0全面升级——从单仓库工具进化为多仓库工作空间，新增桌面应用和CLI工具。这直接对标Cursor、Windsurf和Claude Code。Google正在构建一个从模型到开发工具的完整闭环。

### 历史上类似的情况

**2019年Google I/O——Pixel 3a发布。** 当时Google用"中端价格、旗舰体验"的Pixel 3a证明了低价不等于低质。Gemini 3.5 Flash的"Flash价格、Pro性能"策略如出一辙。但与手机硬件不同，AI模型的竞争是动态的——Anthropic和OpenAI不会坐视Google的成本优势。

---

## Gemini Omni：从任意输入生成视频，编辑只需"对话"

### 发生了什么

Google发布了一个全新的模型系列**Gemini Omni**——不是Gemini 3.5的子版本，而是一个独立的产品线。[Engadget](https://www.engadget.com/2176896/everything-google-announced-io-2026-gemini-omni-spark/)和[9to5Google](https://9to5google.com/2026/05/19/google-io-2026-news/)详细描述了其能力：

| 功能 | 详情 |
|------|------|
| 输入 | 文本、图片、音频、视频——**任意组合** |
| 输出 | 首发支持**视频生成**；图片和音频输出"即将推出" |
| 编辑方式 | **对话式**——用自然语言指令修改视频中的场景、角度、光线、角色 |
| 一致性 | 多轮编辑中**角色和风格保持一致** |
| 个性化 | 可创建拥有用户声音和外貌的**数字人像** |
| 水印 | 所有生成内容内嵌**SynthID**数字水印 |
| 部署 | Omni Flash即日起在Gemini App、Google Flow、YouTube Shorts上线 |

Google还发布了**Flow和Flow Music的移动端应用**——Flow在Android上线beta版（iOS即将推出），Flow Music在iOS上线（Android即将推出）。

### 为什么这很重要

**Omni是Google对Sora、Runway和Pika的全面回应。** 但它的差异化在于"对话式编辑"——不是一次性生成视频然后重做，而是像和导演对话一样逐步修改。这种交互范式如果成功，将视频制作从"参数调整"转变为"创意对话"。

**"任意输入到视频"的能力意味着Google正在定义多模态AI的新范式。** 此前的视频生成模型（如Sora）主要从文本生成视频。Omni允许混合输入——一段文字描述、一张角色照片、一段参考音频、加上一个视频素材——然后生成融合所有这些元素的视频输出。这是"多模态"从"理解"走向"创作"的关键跨越。

**YouTube Shorts的集成是一个分发优势。** OpenAI有ChatGPT的分发渠道，但Google有YouTube——全球最大的视频平台。当Omni的能力直接嵌入YouTube Shorts创作工具时，视频AI生成的用户触达将实现指数级增长。

### 历史上类似的情况

**2023年ChatGPT的爆发式增长。** OpenAI的成功很大程度上归功于将强大的AI能力包装成一个任何人都能用的对话界面。Omni正在尝试复制这一模式——不是把视频生成做成专业工具，而是做成"跟AI聊天就能改视频"的消费级产品。关键区别在于：ChatGPT解决了"AI能做什么"的问题，而Omni需要解决"AI生成的视频是否足够好"的问题。

---

## Gemini Spark：Google的AI Agent野心终于落地

### 发生了什么

Google发布了**Gemini Spark**——一个基于Gemini 3.5的个人AI Agent，被描述为"你的24/7个人AI Agent"。[Engadget](https://www.engadget.com/2176896/everything-google-announced-io-2026-gemini-omni-spark/)详细报道了其功能：

| 功能 | 详情 |
|------|------|
| 运行方式 | **云端运行**——不需要保持手机或电脑开启 |
| 底层模型 | Gemini 3.5 + Google Antigravity |
| 集成范围 | Gmail、Docs等Google Workspace应用；今夏扩展至**第三方应用（通过MCP协议）** |
| 确认机制 | 发送邮件、完成购买、添加日程等操作**须用户确认** |
| 第三方合作 | Canva、OpenTable、Instacart |
| 上线时间 | 下周面向AI Ultra订阅用户（美国）；桌面版今夏推出 |

Google还发布了**Android Halo**——一个在手机屏幕顶部显示Agent任务进度的UI组件，让你"在任何界面都能看到Agent在做什么"。

Spark的具体用例包括：
- 监控信用卡账单中的隐藏订阅费用
- 追踪孩子学校发来的邮件更新
- 从Gmail中提取项目笔记并自动创建Google Doc

### 为什么这很重要

**Spark是Google对Anthropic的Mythos和OpenAI的Workspace Agents的直接回应。** 如4月23日报道所述，AI Agent是2026年AI竞赛的核心战场。Google的优势在于生态——Gmail、Docs、Calendar、YouTube、Search——这些都是Spark可以触及的数据源和操作界面。Anthropic和OpenAI没有如此广泛的消费者产品线。

**MCP协议的采用是一个重要信号。** Spark将通过MCP（Model Context Protocol）接入第三方应用。MCP是Anthropic提出的开放协议——Google选择支持而非对抗，意味着AI Agent的互操作性正在成为行业共识。这对用户而言是好消息——你的Agent不会被锁定在一个生态里。

**"云端运行"是关键差异化。** 不需要保持设备开启意味着Spark可以真正实现"24/7"——在半夜监控价格变化，在你开会时整理邮件。这是Agent从"辅助工具"走向"数字分身"的第一步。

---

## Demis Hassabis的"奇点山麓"宣言：谨慎还是警告？

### 发生了什么

[Business Insider](https://www.businessinsider.com/deepmind-ceo-demis-hassabis-predicts-ai-singularity-google-io-2026-5)和[The Verge](https://www.theverge.com/tech/933415/google-io-2026-biggest-announcements-ai-gemini)确认：Google DeepMind CEO Demis Hassabis在I/O 2026 keynote的压轴环节中说出了那句让全场观众倒吸一口凉气的话——

> "**当我们回顾此刻，会意识到我们正站在奇点的山麓。**"

在同一环节，Hassabis还透露了更紧迫的警告：

- AI将使人类"减少自私"
- AGI"就在地平线上"，将是"人类发明过的最深远、最具影响力的技术"
- 他**对生物安全和网络安全风险表示了紧迫关注**："可能在接下来两三年内，我们会看到一些非常严重的（风险事件）"
- Google正在将AI应用于科学前沿：**WeatherNext**（天气预报）、蛋白质科学等

### 为什么这很重要

**这是首位大型科技公司高管在主要产品发布会上公开使用"奇点"一词。** "奇点"（Singularity）长期以来是科幻小说和边缘学术圈的概念——指AI超越人类智能后导致不可预测变化的那个时刻。Hassabis不是在播客或学术论文中说这番话——他是在Google年度最重要的产品发布会的压轴环节，面对全球数百万直播观众说的。

**"山麓"这个词暗示他认为奇点还没到来，但已经能看到它了。** 这比说"奇点即将到来"更为具体——它描绘了一个地理性的画面：我们已经走出了平原，进入了山丘地带，而前方是真正的山峰。Hassabis同时警告生物安全和网络安全风险在"两三年内"会变得非常严重——这为他的"山麓"判断添加了紧迫性。

**与Hassabis以往的风格形成鲜明对比。** 作为诺贝尔化学奖得主，Hassabis一直以谨慎和理性著称。他过去多次回避关于AGI时间表的直接回答。此次在I/O上如此直白地使用"奇点"一词，要么反映了Google内部对AI进展速度的真实判断，要么是一场精心计算的营销——用"末日感"为产品发布制造戏剧性。

---

## 其他重要动态

### Gemini月活9亿 vs ChatGPT周活9亿：用户数据的"猫鼠游戏"

[Reuters](https://www.reuters.com/business/google-expected-court-coders-consumers-io-conference-2026-05-19/)确认：Google CEO Sundar Pichai在I/O上宣布**Gemini月活用户已达9亿**——较去年5月的约4亿翻了一倍多。但[AOL](https://www.aol.com/articles/googles-latest-ai-push-runs-133440000.html)指出，**ChatGPT的9亿是周活用户（weekly active users）**，而Gemini的9亿是月活（monthly）。两者统计口径不同，直接比较可能误导。值得注意的是，今年3月本站曾报道ChatGPT月活为9.56亿（MAU），此次AOL引用的9亿周活可能来自不同统计周期或来源，读者在对比时应注意数据口径的差异。

### AI Search迎来"25年来最大变革"

Google发布了"智能搜索框"——可以用图片、文件、视频甚至Chrome标签作为搜索输入，AI会"预判你的意图"。此外，**信息Agent**可以24/7在后台监控你关心的主题（新闻、股价、体育赛事等），**Vibe Coding**直接集成在搜索中——用户可以通过自然语言在Search中构建自定义"mini apps"（如婚礼策划仪表盘、健身追踪器）。这对依赖搜索流量的内容发布者构成了新的生存威胁。

### Android XR智能眼镜：今秋上市，支持iPhone配对

Samsung与Google合作的Android XR智能眼镜确认**今秋上市**（如[5月18日前瞻报道](/blog/2026-05-18-google-io-gemini-4-anthropic-900b-meta-avocado-delay)所述，合作方包括Gentle Monster和Warby Parker，iPhone配对能力也是当时已预期的亮点）。此次I/O确认了具体时间表和部分细节。

### Microsoft同日发布Surface Pro 12和Surface Laptop 8

[The Verge](https://www.theverge.com/news/933269/microsoft-surface-pro-12-surface-laptop-8-specs-pricing-release-date)报道：Microsoft在Google I/O同日发布了Surface Pro 12和Surface Laptop 8，搭载Intel Core Ultra Series 3芯片。Surface Pro 12起售价$799.99，顶配（Core Ultra 7/64GB/1TB）$4,399.99。两款设备均定位Copilot+ PC——Microsoft与Google的AI硬件竞争正在从云端延伸到终端。

---

## 行业趋势

**Google正在用"生态战争"取代"模型战争"。** 回看I/O 2026的所有发布——从Gemini 3.5 Flash的默认部署，到Omni嵌入YouTube Shorts，到Spark打通Gmail/Docs/Calendar，到Search中的Agent和Vibe Coding，再到XR眼镜和Android Halo——Google不是在卖一个模型，而是在构建一个**AI渗透到每一个触点的完整体验**。这是Anthropic和OpenAI无法复制的优势：它们没有搜索、没有邮件、没有视频平台、没有移动操作系统。

**Agent竞赛进入"产品化"阶段。** 如4月23日OpenAI和Google同日发布AI Agent产品时所述，Agent是2026年的核心战场。现在三家（OpenAI的Workspace Agents、Anthropic的Mythos、Google的Spark）都已亮牌。关键区别在于：Google有Android Halo和全设备覆盖，Anthropic有企业级安全和MCP协议，OpenAI有ChatGPT的用户基础和Jony Ive的硬件设计。谁能在"信任+便利"的平衡点上做得最好，谁就能赢得这一轮。

**Hassabis的"两三年"生物安全警告值得认真对待。** 这不是随机发言——Hassabis是诺贝尔奖得主，他的判断基于Google DeepMind对前沿AI能力的第一手认知。如果他认为两三年内会出现"非常严重"的生物和网络安全风险事件，政策制定者应该提前准备，而不是等到事件发生后才反应。

---

## 关键要点

- **Google I/O 2026发布Gemini 3.5 Flash而非预期的Gemini 4.0**——但Flash在编码和Agent任务上超越了前代Pro，速度4倍、成本减半，即日起成为默认模型
- **Gemini Omni是最大的技术突破**——从任意输入组合（文本/图片/音频/视频）生成视频，支持对话式多轮编辑，集成YouTube Shorts分发
- **Gemini Spark标志着Google正式进入AI Agent竞赛**——云端运行的24/7个人Agent，集成Gmail/Docs，通过MCP协议接入第三方应用
- **Hassabis宣称人类"站在奇点的山麓"**，并警告两三年内将出现严重的生物和网络安全风险——大型科技公司高管首次在产品发布会上使用"奇点"一词
- **AI Search迎来25年来最大变革**——智能搜索框、信息Agent、Vibe Coding构建mini apps，直接挑战内容发布者的流量模式

---

## 常见问题

### Google为什么发布Gemini 3.5而不是预期的Gemini 4.0？

Google可能认为3.5的架构迭代尚未达到"4.0"级别的能力跃迁。选择"3.5"在技术上更准确——Flash超越了前代Pro，但可能还没有在所有维度上实现质变。这也可能暗示Google正在为年底的"4.0"积蓄更大的发布势能。

### Gemini Omni和Sora有什么区别？

最核心的区别是"对话式编辑"——Omni允许用户通过多轮自然语言对话逐步修改视频（改变角度、风格、角色等），每次编辑基于上一次的结果累积。而Sora主要是一次性生成。此外，Omni支持"任意输入组合"（混合文本、图片、音频、视频），而Sora以文本输入为主。

### Gemini Spark和其他AI Agent（如Workspace Agents、Mythos）有什么不同？

Spark的最大优势是Google生态的广度——它可以直接访问Gmail、Docs、Calendar等数十亿用户日常使用的应用。OpenAI的Workspace Agents依赖合作方生态，Mythos侧重企业级安全。Spark的另一个差异化是"云端运行"——不需要保持设备开启，真正实现24/7。

### Hassabis说"奇点山麓"是在炒作还是真实判断？

Hassabis是诺贝尔化学奖得主，以谨慎著称。他在I/O keynote（而非学术论文）中使用"奇点"一词，结合他对"两三年内"生物和网络安全风险的紧迫警告，更可能反映了Google DeepMind内部对AI进展速度的真实评估。但作为产品发布会的压轴环节，营销成分也不可忽视。

### Android XR智能眼镜能和iPhone配对意味着什么？

这意味着Google正在走"开放平台"路线，与Apple Vision Pro的"封闭生态"形成鲜明对比。支持iPhone配对意味着Google不打算把XR眼镜局限于Android用户——这是一种以AI服务为核心、而非以操作系统为核心的策略。

---

## 参考资料

- [100 things we announced at I/O 2026 - Google Blog](https://blog.google/innovation-and-ai/technology/ai/google-io-2026-all-our-announcements/)
- [The 13 biggest announcements at Google I/O 2026 - The Verge](https://www.theverge.com/tech/933415/google-io-2026-biggest-announcements-ai-gemini)
- [Everything Google announced at I/O 2026 - 9to5Google](https://9to5google.com/2026/05/19/google-io-2026-news/)
- [Everything announced at Google I/O 2026 - Engadget](https://www.engadget.com/2176896/everything-google-announced-io-2026-gemini-omni-spark/)
- [Google launches Antigravity 2.0 at I/O 2026 - TechCrunch](https://techcrunch.com/2026/05/19/google-launches-antigravity-2-0-with-an-updated-desktop-app-and-cli-tool-at-io-2026/)
- [Google courts coders and consumers at I/O - Reuters](https://www.reuters.com/business/google-expected-court-coders-consumers-io-conference-2026-05-19/)
- [Google I/O 2026: 5 Biggest Takeaways - Business Insider](https://www.businessinsider.com/google-io-2026-5-biggest-takeaways-ai-advances-2026-5)
- [DeepMind CEO Hassabis predicts AI singularity at Google I/O - Business Insider](https://www.businessinsider.com/deepmind-ceo-demis-hassabis-predicts-ai-singularity-google-io-2026-5)
- [Google I/O 2026 Live: Everything Announced - PCMag](https://www.pcmag.com/news/google-io-2026-live-everything-announced-gemini-omni-search-android-xr)
- [Microsoft Surface Pro 12 and Surface Laptop 8 - The Verge](https://www.theverge.com/news/933269/microsoft-surface-pro-12-surface-laptop-8-specs-pricing-release-date)
- [Google Antigravity Blog: google-io-2026](https://antigravity.google/blog/google-io-2026)
- [Google I/O 2026 Developer Highlights - Google Blog](https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/)
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
    document.addEventListener("DOMContentLoaded", () => {
        try {
            const rawMarkdown = document.body.innerText;
            const isDark = window.matchMedia("(prefers-color-scheme: dark)").matches;

            let webUrl = window.location.pathname;
            if (webUrl.endsWith('/index.md')) {
                webUrl = webUrl.substring(0, webUrl.length - 'index.md'.length) || '/';
            } else {
                webUrl = webUrl.replace(/.md$/, '');
            }
            const linkColor = isDark ? '#58a6ff' : '#0969da';
            const navHtml = 
                '<div style="margin-bottom: 24px; font-size: 14px; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif;">' +
                    '<a href="/index.md" style="color: ' + linkColor + '; text-decoration: none;">← Back to Home</a>' +
                    '<span style="margin: 0 8px; color: ' + (isDark ? '#484f58' : '#d0d7de') + ';">|</span>' +
                    '<a href="' + webUrl + '" style="color: ' + linkColor + '; text-decoration: none;">Switch to Web View</a>' +
                '</div>';

            let contentToRender = rawMarkdown;
            let frontmatterHtml = '';
            
            const fmMatch = rawMarkdown.match(/^---\s*[\r\n]+([\s\S]*?)[\r\n]+---\s*/);
            
            if (fmMatch) {
                contentToRender = rawMarkdown.substring(fmMatch[0].length);
                const yamlText = fmMatch[1];
                
                const borderColor = isDark ? '#30363d' : '#d0d7de';
                const bgColor = isDark ? '#161b22' : '#f6f8fa';
                const keyColor = isDark ? '#8b949e' : '#57606a';
                const valColor = isDark ? '#c9d1d9' : '#24292f';

                const rows = yamlText.split('\n')
                    .filter(line => line.trim() && line.includes(':'))
                    .map(line => {
                        const splitIdx = line.indexOf(':');
                        const key = line.slice(0, splitIdx).trim();
                        let val = line.slice(splitIdx + 1).trim();
                        if ((val.startsWith("'") && val.endsWith("'")) || (val.startsWith('"') && val.endsWith('"'))) {
                            val = val.slice(1, -1);
                        }
                        
                        return '<tr>' +
                            '<td style="white-space:nowrap; padding:8px 12px; color:' + keyColor + '; font-weight:600; border-bottom:1px solid ' + borderColor + '; width:1%;">' + key + '</td>' +
                            '<td style="padding:8px 12px; color:' + valColor + '; border-bottom:1px solid ' + borderColor + ';">' + val + '</td>' +
                        '</tr>';
                    }).join('');
                
                if (rows) {
                    frontmatterHtml = 
                        '<div style="margin-bottom: 32px; border:1px solid ' + borderColor + '; border-radius:6px; overflow:hidden; background-color:' + bgColor + ';">' +
                            '<table style="width:100%; border-collapse:collapse; font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif; font-size:13px;">' +
                                rows +
                            '</table>' +
                        '</div>';
                }
            }
            
            const renderedHtml = marked.parse(contentToRender);
            
            const wrapper = document.createElement('article');
            wrapper.className = 'markdown-body';
            wrapper.innerHTML = navHtml + frontmatterHtml + renderedHtml;
            
            document.body.innerHTML = '';
            document.body.appendChild(wrapper);
        } catch (e) {
            console.error("Markdown rendering failed", e);
        }
    });
</script>
</body>
</html>