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 会自动显示在帖子中,无需用户交互。
      • strict: 用户必须通过点击“查看”或“运行”按钮在浏览器中显式激活 artifacts。建议在注重安全的坏境中使用此设置。(默认)

3. Artifact Creator 访问权限

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

在帖子中使用 AI Artifacts

Artifacts 由 Artifact Creator persona 按需自动创建。

Above artifact was generated using GPT-4o and the anime.js library

创建后,它们仅对您和 Artifact Creator persona 私有。能够共享 AI 对话的用户(属于 ai bot public sharing allowed groups 的用户)也可以通过共享对话来公开 artifact。

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

<div> class="ai-artifact" data-ai-artifact-version="3" data-ai-artifact-id="71"></div>

(其中 version 和 artifact id 是您的版本化 artifact)

安全注意事项

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

1. iFrame 中的沙箱

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

2. 内容安全策略 (CSP)

3. 安全模式

  • 严格模式: 建议在不完全信任 artifacts 的坏境中使用。用户需要在浏览器中手动激活 artifacts,然后才能渲染它们。

4. 访问和权限

  • Artifacts 仅对以下用户可见:
    • 它们的创建者。
    • 具有查看相关帖子(例如,私信)的正确权限的用户。
  • 公共 artifacts 必须通过共享 AI 对话显式标记为公共。

5. 长度限制

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

Artifact 存储

Web artifacts 可以选择存储每个用户的数据。为此,请在提示 artifact creator 时使用“使用用户存储”或类似的提示。

此系统允许存储键值对:

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

键值对相对于 artifact 产生的帖子是安全的,但是如果您公开共享 artifact,则所有用户都可以添加键。

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

  • ai_artifact_kv_value_max_length(默认情况下,项目可能仅为 5000 个字母或更短)
  • ai_artifact_max_keys_per_user_per_artifact(默认 100)

常见问题解答

谁可以创建 AI Artifacts?

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

如果我点击 Artifact 会怎样?

  • lax 模式下,artifacts 会自动显示。
  • 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 创建存在大量的试错过程,实验是关键。

21 个赞

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