Skip to content

什么是代码块?

在聊天消息(包括开场白与 AI 回复)中,代码块不会以纯代码文本显示,而会渲染成一个真正可交互的网页——按钮可以点击、动画可以播放,任何你能用前端技术(HTML、CSS、JavaScript)实现的界面都可以出现在消息里。

配合 开放能力,代码块还能与聊天页面交互——例如把选项文本填入输入框、切换开场白版本。所有开放能力函数都只能写在代码块中调用。

怎么写代码块

把完整的网页代码包进围栏代码块,就会渲染成可交互的网页。语言标记写 html 最常用,也是推荐写法:

markdown
```html
<!doctype html>
<html>
  <head>
    <style>
      button { padding: 8px 16px; }
    </style>
  </head>
  <body>
    <button onclick="this.textContent = '已点击'">点击</button>
  </body>
</html>
```

偶尔也会有 xml、无标记或其他语言标记的写法——只要是围栏代码块、内容是完整网页,同样会被识别:

markdown
```xml
<!doctype html>
<html>
  <body>...</body>
</html>
```

注意:只写 <div><button> 等裸片段且未标 html 的代码块不会被识别,请始终按完整网页编写。

展示效果

代码块总是占据聊天气泡的最大宽度,高度随内容自动撑开。

运行环境与限制

代码块运行在独立的沙盒中,应把自己视为一个小型独立网页,通过开放能力函数请求聊天页面操作,而不是查找或修改聊天页面的内容。

脚本

  • 支持经典内联脚本,onclick 等内联事件处理器会保留
  • 所有 <script> 会统一移动到文档底部执行,不保留原来在代码中的位置。依赖「脚本必须先于某个后续 DOM 节点运行」的代码,需要改为在 DOM 创建后执行,或监听 DOMContentLoaded
  • <script src="..."> 外部脚本不会加载;type="module" 等脚本属性不会保留
  • evalFunctionwindow.openprint 等能力被屏蔽

网络与资源

  • fetchXMLHttpRequest、WebSocket 等网络连接会被拒绝
  • 图片支持 data:blob:、HTTP 和 HTTPS;音视频支持 HTTP 和 HTTPS;字体支持 data:、HTTP 和 HTTPS
  • 内联样式与 HTTP/HTTPS 外部样式表可用

存储

  • localStorage / sessionStorage 是仅当前代码块可见的内存实现,消息重新渲染后即重置,不能用于持久存储
  • 不提供 IndexedDB

页面访问

  • 代码块无法访问聊天页面的 DOM 和状态;parenttop 都指向代码块自身
  • 与聊天页面的交互只能通过 开放能力 函数

样式限制

  • position: fixed 会被改为 position: absolute
  • 大于 999z-index 会被压到 999

小提示

  • 按完整网页编写并标 html 语言标记,是最可靠的写法
  • 代码块的核心逻辑不要依赖网络请求和持久存储