Discourse AI - 网页文物

什么是 AI Artifacts?

AI Artifacts 是一种强大的工具,它允许用户直接在 Discourse 帖子中创建、嵌入和交互基于 Web 的动态组件。这些组件可以包含自定义的 HTMLCSSJavaScript,从而实现各种用例,例如:

  • 嵌入交互式测验或表单。
  • 使用丰富的图形和动画可视化数据。
  • 集成轻量级 Web 应用程序或工具。
  • 作为一个学习 Web 框架、JavaScript 库等的工具。

AI Artifacts 通过增加交互性同时确保安全的浏览体验,无缝增强 Discourse 帖子。


站点设置

管理员可以配置多项设置:

1. 启用功能

  • 设置: discourse_ai_enabled
    • 确保此全局设置已启用,AI Artifacts 才能正常工作。

2. 安全模式

  • 设置: ai_artifact_security
    • 选项:
      • disabled:禁用 Artifact 系统
      • lax:Artifacts 自动出现在帖子中,无需用户交互。
      • hybrid:Artifacts 默认需要点击才能运行,但帖子作者可以在嵌入标记中添加 data-ai-artifact-autorun 使特定 Artifacts 立即运行。
      • strict:用户必须通过点击“查看”或“运行”按钮明确激活 Artifacts。此设置推荐用于注重安全的环境。(默认)

3. Artifact 创建者访问权限

  • 默认情况下,Artifact 创建者角色限于工作人员用户。此限制确保只有受信任的个人才能创建 Artifacts,从而最大限度地降低不当或恶意使用的风险。
  • 如果需要更广泛的访问权限,站点管理员需要手动配置权限。

在帖子中使用 AI Artifacts

Artifacts 由 Artifact 创建者角色按需自动创建。

<div class="ai-artifact" data-ai-artifact-version="3" data-ai-artifact-id="71"></div>
<small>上方的 Artifact 是使用 GPT-4o 和 anime.js 库生成的</small>

创建后,它们对您和 Artifact 创建者角色是私有的。能够共享 AI 对话的用户(属于 ai bot public sharing allowed groups 的用户)也可以通过共享对话使 Artifact 公开。

共享后,您可以使用以下 HTML 标记在帖子中渲染它:

&lt;div class="ai-artifact" data-ai-artifact-version="3" data-ai-artifact-id="71"&gt;&lt;/div&gt;

(其中版本和 Artifact ID 是您的版本化 Artifact)

安全注意事项

鉴于 AI Artifacts 可以执行自定义编写的 HTML、CSS 和 JavaScript,Discourse 实施了强大的保护措施:

1. iFrame 中的沙箱化

  • Artifacts 渲染在隔离的 iframe 容器内,并带有 sandbox 属性,以限制潜在的不安全操作,例如:
    • 跨站脚本攻击。
    • 访问外部站点或 API。

2. 内容安全策略 (CSP)

3. 安全模式

  • 严格模式: 推荐用于未完全信任 Artifacts 的环境。用户需要先在浏览器中手动激活 Artifacts,然后才能渲染它们。

4. 访问和权限

  • Artifacts 仅对以下人员可见:
    • 其创建者。
    • 具有查看相关帖子权限的用户(例如,私人消息)。
  • 公开的 Artifacts 必须通过共享 AI 对话明确标记为公开。

5. 长度限制

  • Artifact 中 HTML、CSS 和 JavaScript 的大小上限为 64 KB。这确保了组件保持轻量级,不会给用户或系统带来负担。

Artifact 存储

Web Artifacts 可以选择存储每个用户的数据。要执行此操作,请提示 Artifact 创建者“使用用户存储”或类似信息。

该系统允许存储键值对:

  • 私有(仅对管理员和特定用户可见)
  • 公共(对包括匿名用户在内的所有用户可见)

键值对相对于生成 Artifact 的帖子是安全的,但是如果您公开共享 Artifact,则允许所有用户添加键。

要控制存储,您可以使用隐藏设置:

  • ai_artifact_kv_value_max_length(默认项目长度可能仅为 5000 个字符或更短)
  • ai_artifact_max_keys_per_user_per_artifact(默认 100)

常见问题解答 (FAQ)

谁可以创建 AI Artifacts?

默认情况下,只有工作人员用户(例如,管理员或版主)可以通过 Artifact 创建者角色创建 Artifacts。此角色简化了使用 HTML、CSS 和 JavaScript 设计交互式 Web 小部件的过程。

如果我点击 Artifact 会发生什么?

  • lax 模式下,Artifacts 会自动显示。
  • hybrid 模式下,Artifacts 默认需要点击,但如果嵌入包含 data-ai-artifact-autorun,它们可以自动运行。
  • strict 模式下,点击“运行”按钮会激活 Artifact,允许它在您的浏览器中加载。

AI Artifacts 安全吗?

是的。AI Artifacts 在严格控制的环境中运行:

  • 它们被沙箱化,不能直接与 Discourse 应用程序或用户上下文交互,只能通过 iframe 消息传递。
  • 严格模式让您控制激活。
  • Artifacts 默认是私有的,您需要主动共享才能授予全局访问权限。

我能看到 Artifacts 的源代码吗?

是的。当 Discourse AI 生成 Artifacts 时,它会包含完整的标记、CSS 和 JavaScript。

支持哪些 LLM?

Artifacts 可以使用您配置的任何 LLM 生成,但各种 LLM 在 Artifact 创建方面有所专长和更精细的调整。

我们使用 o3、Anthropic Claude Sonnet 3.7 - 4.0、GPT-4.1、Gemini Pro 2.5 等获得了良好的效果。一般来说,更先进的模型效果会更好。

Artifact 创建有大量的试错成分,实验是关键。

23 个赞

能够对构件隐私进行更细粒度的控制,以便它们只能与特定组共享,那将是非常棒的。这与类别权限目前的工作方式非常相似 :smiley:

我认为如果你把群组添加到机器人的私聊中,它可能会起作用?

1 个赞

我会测试一下,然后在这里汇报。我有一个特殊的用例,需要工件只能由一个私有类别中的一个组访问。

1 个赞

所以我将 Web Artifact Creator 机器人标记在一个私有类别的新主题中,该群组可以访问该类别,以便它可以创建一个仅我与该特定群组可见的工件。但是,工件 iframe 窗口仅显示当用户无法访问某个页面时弹出的默认“糟糕!该页面不存在或为私有。”

所以我创建了一个数据探索器查询来检查谁可以查看该主题,并且根据数据库,_应该能够_查看该工件的群组中的用户确实显示为可以查看它。

所以也许这是一个 bug?

我的 SQL 查询
-- [params]
-- int :artifact_id = 22

WITH artifact_info AS (
  SELECT
    a.id,
    a.user_id as creator_id,
    a.post_id,
    p.topic_id,
    t.category_id,
    t.archetype,
    c.read_restricted,
    t.title as topic_title
  FROM ai_artifacts a
  LEFT JOIN posts p ON a.post_id = p.id
  LEFT JOIN topics t ON p.topic_id = t.id
  LEFT JOIN categories c ON t.category_id = c.id
  WHERE a.id = :artifact_id
),
users_with_access AS (
  -- Creator always has access
  SELECT
    ai.creator_id as user_id,
    'Creator' as access_reason
  FROM artifact_info ai

  UNION

  -- Users with access to private messages
  SELECT
    tau.user_id,
    'Private Message Access' as access_reason
  FROM artifact_info ai
  JOIN topic_allowed_users tau ON ai.topic_id = tau.topic_id
  WHERE ai.archetype = 'private_message'

  UNION

  -- Group members with access to private messages
  SELECT
    gu.user_id,
    'Private Message Group Access' as access_reason
  FROM artifact_info ai
  JOIN topic_allowed_groups tag ON ai.topic_id = tag.topic_id
  JOIN group_users gu ON tag.group_id = gu.group_id
  WHERE ai.archetype = 'private_message'

  UNION

  -- Users with access to restricted categories
  SELECT
    gu.user_id,
    'Category Group Access' as access_reason
  FROM artifact_info ai
  JOIN category_groups cg ON ai.category_id = cg.category_id
  JOIN group_users gu ON cg.group_id = gu.group_id
  WHERE ai.read_restricted = true
    AND ai.archetype != 'private_message'
    AND cg.permission_type IN (1, 2) -- full access or create/reply/see

  UNION

  -- All users if topic is public (not restricted and not private message)
  SELECT
    u.id as user_id,
    'Public Access' as access_reason
  FROM artifact_info ai
  CROSS JOIN users u
  WHERE (ai.read_restricted = false OR ai.read_restricted IS NULL)
    AND (ai.archetype != 'private_message' OR ai.archetype IS NULL)
    AND u.active = true
)

SELECT
  u.id as user_id,
  u.username,
  u.name,
  u.trust_level,
  uwa.access_reason,
  ai.topic_title
FROM users_with_access uwa
JOIN users u ON uwa.user_id = u.id
CROSS JOIN artifact_info ai
WHERE u.active = true
ORDER BY u.username