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

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

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

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

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


サイト設定

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

1. 機能の有効化

  • 設定: discourse_ai_enabled
    • AIアーティファクトを機能させるには、このグローバル設定が有効になっていることを確認してください。

2. セキュリティモード

  • 設定: ai_artifact_security
    • オプション:
      • disabled: アーティファクトシステムを無効にする
      • lax: ユーザーの操作を必要とせずに、アーティファクトが投稿に自動的に表示されます。
      • strict: ユーザーは、「表示」または「実行」ボタンをクリックして、ブラウザで明示的にアーティファクトをアクティブにする必要があります。この設定は、セキュリティを重視する環境に推奨されます。(デフォルト)

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

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

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

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

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

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

作成されると、それらはあなたとアーティファクト作成者ペルソナの間でのみプライベートになります。会話を共有できるユーザー(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. セキュリティモード

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

4. アクセスと権限

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

5. 長さ制限

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

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

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

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

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

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

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

  • ai_artifact_kv_value_max_length(デフォルトではアイテムは5000文字以下である必要があります)
  • ai_artifact_max_keys_per_user_per_artifact(デフォルトは100)

FAQ

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

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

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

  • laxモードでは、アーティファクトが自動的に表示されます。
  • 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などで良好な結果が得られています。一般的に、より高度なモデルの方が優れています。

アーティファクト作成には試行錯誤が多く伴うため、実験が鍵となります。

「いいね!」 21

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