Discourse AI - Web Artifacts

AIアーティファクトとは?

AIアーティファクトは、ユーザーがDiscourseの投稿内で動的なウェブベースのコンポーネントを作成、埋め込み、操作できるようにする強力なツールです。これらのコンポーネントには、カスタムのHTMLCSSJavaScriptを含めることができ、以下のようなさまざまなユースケースを可能にします。

  • インタラクティブなクイズやフォームの埋め込み。
  • 豊富なグラフィックやアニメーションを使用したデータの視覚化。
  • 軽量なWebアプリケーションやツールの統合。
  • Webフレームワーク、JavaScriptライブラリなどについて学習するためのツール。

AIアーティファクトは、安全なブラウジング体験を確保しつつ、対話性(インタラクティビティ)を追加することで、Discourseの投稿をシームレスに強化します。


サイト設定

管理者はいくつかの設定を構成できます。

1. 機能の有効化

  • 設定: discourse_ai_enabled
    • AIアーティファクトが機能するように、このグローバル設定を有効にしてください。

2. セキュリティモード

  • 設定: ai_artifact_security
    • オプション:
      • disabled: アーティファクトシステムを無効にします。
      • lax: アーティファクトはユーザーの操作を必要とせずに投稿内に自動的に表示されます。
      • hybrid: デフォルトでは、アーティファクトは実行にクリックが必要ですが、投稿作成者は埋め込みマークアップに data-ai-artifact-autorun を追加することで、特定の一部のアーティファクトを即座に実行させることができます。
      • strict: ユーザーは、「表示」または「実行」ボタンをクリックしてブラウザでアーティファクトを明示的にアクティブ化する必要があります。この設定は、セキュリティを重視する環境に推奨されます。(デフォルト)

3. アーティファクト作成者へのアクセス

  • デフォルトでは、アーティファクト作成者ペルソナスタッフユーザーのみに制限されています。この制限により、信頼できる個人だけがアーティファクトを作成でき、不適切または悪意のある使用のリスクを最小限に抑えることができます。
  • より広範なアクセスが必要な場合は、サイト管理者が手動で権限を設定する必要があります。

投稿でのAIアーティファクトの使用

アーティファクトは、アーティファクト作成者ペルソナによってオンデマンドで自動的に作成されます。

<div class="ai-artifact" data-ai-artifact-version="3" data-ai-artifact-id="71"></div>
<small>上記のアーティファクトはGPT-4oとanime.jsライブラリを使用して生成されました</small>

作成されると、それらはあなたとアーティファクト作成者ペルソナに対してプライベートになります。AI会話を共有できるユーザー(ai bot public sharing allowed groups に属するユーザー)は、会話を共有することでアーティファクトを公開することもできます。

共有されたら、次のHTMLマークアップを使用して投稿にレンダリングできます。

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

(ここで、バージョンとアーティファクトIDは、バージョン管理されたアーティファクトのものです)

セキュリティに関する考慮事項

AIアーティファクトはカスタムで記述されたHTML、CSS、JavaScriptを実行できるため、Discourseは堅牢な保護措置を実装しています。

1. iFrame内でのサンドボックス化

  • アーティファクトは、sandbox属性を持つ分離された iframe コンテナ内でレンダリングされ、以下のような潜在的に危険な操作を制限します。
    • クロスサイトスクリプティング。
    • 外部サイトやAPIへのアクセス。

2. コンテンツセキュリティポリシー (CSP)

3. セキュリティモード

  • 厳格モード (Strict Mode): アーティファクトが完全に信頼できない環境に推奨されます。ユーザーは、アーティファクトがレンダリングされる前に、ブラウザで手動でアクティブ化する必要があります。

4. アクセスと権限

  • アーティファクトは以下にのみ表示されます。
    • その作成者。
    • 関連する投稿を表示する適切な権限を持つユーザー(例:プライベートメッセージ)。
  • パブリックアーティファクトは、AI会話を共有することによって明示的にマークされる必要があります。

5. 長さの制限

  • アーティファクト内のHTML、CSS、JavaScriptのサイズは、それぞれ64 KBに制限されます。これにより、コンポーネントが軽量に保たれ、ユーザーやシステムに負担をかけないようにします。

アーティファクトのストレージ

Webアーティファクトは、オプションでユーザーごとのデータを保存できます。これを行うには、アーティファクト作成者に「ユーザー ストレージを使用する」などのヒントを与えます。

このシステムでは、キーと値のペアを保存できます。

  • プライベート(管理者と特定のユーザーのみが閲覧可能)
  • パブリック(匿名ユーザーを含むすべてのユーザーが閲覧可能)

キーと値のペアは、アーティファクトが生成された投稿に対して保護されますが、アーティファクトを公開共有すると、すべての人(匿名ユーザーを含む)がキーを追加できるようになります。

ストレージを制御するために、非表示の設定を使用できます。

  • ai_artifact_kv_value_max_length(デフォルトではアイテムは5000文字以下でなければなりません)
  • ai_artifact_max_keys_per_user_per_artifact(デフォルトはアーティファクトごとにユーザー100キー)

よくある質問 (FAQ)

誰がAIアーティファクトを作成できますか?

デフォルトでは、スタッフユーザー(例:管理者やモデレーター)のみがアーティファクト作成者ペルソナを通じてアーティファクトを作成できます。このペルソナは、HTML、CSS、JavaScriptを使用して対話型のWebウィジェットを設計するプロセスを簡素化します。

アーティファクトをクリックするとどうなりますか?

  • laxモードでは、アーティファクトは自動的に表示されます。
  • hybridモードでは、デフォルトでクリックが必要ですが、埋め込みに data-ai-artifact-autorun が含まれている場合は自動実行される可能性があります。
  • strictモードでは、「実行」ボタンをクリックすることでアーティファクトがアクティブ化され、ブラウザでの読み込みが可能になります。

AIアーティファクトは安全ですか?

はい。AIアーティファクトは厳密に制御された環境で実行されます。

  • サンドボックス化されており、iframeメッセージングを介してのみ、Discourseアプリケーションやユーザーコンテキストと直接対話することはできません。
  • 厳格モードにより、アクティベーションを制御できます。
  • アーティファクトはデフォルトでプライベートであり、グローバルアクセスを与えるには明示的に共有する必要があります。

アーティファクトのソースコードを見ることはできますか?

はい。Discourse AIがアーティファクトを生成する際、完全なマークアップ、CSS、JavaScriptが含まれます。

サポートされているLLMは何ですか?

アーティファクトは、設定されている任意のLLMを使用して生成できますが、特定のLLMはアーティファクト作成に特化し、より微調整されています。

o3、Anthropic Claude Sonnet 3.7 - 4.0、GPT-4.1、Gemini Pro 2.5などで良好な結果が得られています。一般的に、より高度なモデルの方が優れています。

アーティファクト作成には試行錯誤の要素が大きく関わってくるため、実験が鍵となります。

「いいね!」 23

アーティファクトのプライバシー設定をもう少し細かく制御できるようになると、特定のグループとだけ共有できるようになり、非常に便利です。これは、現在のカテゴリ権限の仕組みと非常によく似ています :smiley:

グループをボットのPMに追加するとうまくいくかもしれません。

「いいね!」 1

試してみて、ここで報告します。私には、アーティファクトが1つのプライベートカテゴリーの1つのグループのみがアクセスできる必要があるニッチなユースケースがあります。

「いいね!」 1

Web Artifact Creator ボットをプライベートカテゴリの新しいトピックでメンションしました。このグループはそのカテゴリにアクセスできるため、私と特定のグループのみが閲覧できるアーティファクトを作成できます。しかし、アーティファクトの iframe ウィンドウには、ユーザーが特定のページにアクセスできない場合に表示されるデフォルトの「おっと!そのページは存在しないか、プライベートです。」しか表示されません。

そこで、誰がそのトピックを閲覧できるかを確認するためにデータエクスプローラークエリを作成しました。データベースによると、そのアーティファクトを 閲覧できるはずの グループのユーザーは、閲覧できると表示されています。

これはバグでしょうか?

私の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 (
  -- クリエイターは常にアクセスできます
  SELECT
    ai.creator_id as user_id,
    'Creator' as access_reason
  FROM artifact_info ai

  UNION

  -- プライベートメッセージにアクセスできるユーザー
  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

  -- プライベートメッセージにアクセスできるグループのメンバー
  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

  -- プライベートカテゴリにアクセスできるユーザー
  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) -- 完全アクセスまたは作成/返信/表示
  
  UNION

  -- トピックが公開されている場合(制限がなく、プライベートメッセージではない場合)のすべてのユーザー
  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