Discourse AI - Web アーティファクト

AI アーティファクトとは何ですか?

AI アーティファクトは、Discourse の投稿内でダイナミックな Web ベースのコンポーネントを直接作成、埋め込み、対話することを可能にする強力なツールです。これらのコンポーネントには、カスタム 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 アーティファクトの使用

アーティファクトは、必要に応じてアーティファクト作成者エージェントによって自動的に作成されます。

上記のアーティファクトは GPT-4o と anime.js ライブラリを使用して生成されました

作成されると、それらはあなたとアーティファクト作成者エージェントのみにプライベートになります。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 コンテナ内でレンダリングされ、以下の潜在的に危険な操作を制限します:
    • クロスサイトスクリプティング(XSS)。
    • 外部サイトや API へのアクセス。

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

3. セキュリティモード

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

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