Discourse AI - Artefatti Web

Cosa Sono gli Artefatti AI?

Gli Artefatti AI sono strumenti potenti che consentono agli utenti di creare, incorporare e interagire con componenti web dinamici direttamente all’interno di un post di Discourse. Questi componenti possono contenere HTML, CSS e JavaScript personalizzati, abilitando una varietà di casi d’uso come:

  • Incorporare quiz o moduli interattivi.
  • Visualizzare dati con grafici e animazioni ricche.
  • Integrare applicazioni o strumenti web leggeri.
  • Uno strumento per apprendere framework web, librerie JavaScript e altro ancora.

Gli Artefatti AI migliorano senza soluzione di continuità i post di Discourse aggiungendo interattività e garantendo al contempo un’esperienza di navigazione sicura.


Impostazioni del Sito

Gli amministratori possono configurare diverse impostazioni:

1. Abilitazione della Funzionalità

  • Impostazione: discourse_ai_enabled
    • Assicurati che questa impostazione globale sia abilitata affinché gli Artefatti AI funzionino.

2. Modalità di Sicurezza

  • Impostazione: ai_artifact_security
    • Opzioni:
      • disabled: Disabilita il sistema degli artefatti
      • lax: Gli artefatti appaiono automaticamente nei post senza richiedere l’interazione dell’utente.
      • hybrid: Per impostazione predefinita, gli artefatti richiedono un clic per essere eseguiti, ma gli autori dei post possono aggiungere data-ai-artifact-autorun al markup di incorporamento per far sì che artefatti specifici vengano eseguiti immediatamente.
      • strict: Gli utenti devono attivare esplicitamente gli artefatti nel loro browser cliccando su un pulsante “Visualizza” o “Esegui”. Questa impostazione è consigliata per ambienti sensibili alla sicurezza. (predefinita)

3. Accesso al Creatore di Artefatti

  • Per impostazione predefinita, la persona Creatore di Artefatti è riservata solo agli utenti dello staff. Questa restrizione assicura che solo le persone fidate possano creare artefatti, minimizzando il rischio di utilizzo improprio o dannoso.
  • Se è richiesto un accesso più ampio, le autorizzazioni devono essere configurate manualmente da un amministratore del sito.

Utilizzo degli Artefatti AI nei Post

Gli artefatti vengono creati automaticamente dalla persona Creatore di Artefatti su richiesta.

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

L’artefatto sopra è stato generato utilizzando GPT-4o e la libreria anime.js

Una volta creati, sono privati per te e per la persona Creatore di Artefatti. Gli utenti che possono condividere conversazioni AI (quelli che appartengono ai gruppi ai bot public sharing allowed) possono anche rendere pubblico un artefatto condividendo la conversazione.

Una volta condiviso, puoi utilizzare il seguente markup HTML per renderlo in un post:

\

``

(dove la versione e l’ID dell’artefatto sono il tuo artefatto con versione)

Considerazioni sulla Sicurezza

Dato che gli Artefatti AI possono eseguire HTML, CSS e JavaScript scritti su misura, Discourse ha implementato solide misure di salvaguardia:

1. Sandboxing in iFrame

  • Gli artefatti vengono renderizzati all’interno di contenitori iframe isolati con attributi sandbox per limitare operazioni potenzialmente non sicure come:
    • Scripting inter-sito (Cross-site scripting).
    • Accesso a siti o API esterne.

2. Content Security Policy (CSP)

3. Modalità di Sicurezza

  • Modalità Stretta (Strict Mode): Questa è raccomandata per ambienti in cui gli artefatti non sono completamente attendibili. Gli utenti dovranno attivare manualmente gli artefatti nel loro browser prima che vengano renderizzati.

4. Accesso e Autorizzazioni

  • Gli artefatti sono visibili solo a:
    • Il loro creatore.
    • Utenti con le autorizzazioni corrette per visualizzare il post associato (ad esempio, messaggi privati).
  • Gli artefatti pubblici devono essere esplicitamente contrassegnati come tali condividendo la conversazione AI.

5. Limiti di Lunghezza

  • La dimensione di HTML, CSS e JavaScript in un artefatto è limitata a 64 KB ciascuno. Ciò assicura che i componenti rimangano leggeri e non appesantiscano gli utenti o i sistemi.

Archiviazione degli Artefatti

Gli artefatti web possono facoltativamente archiviare dati per utente. Per fare ciò, suggerisci al creatore dell’artefatto di usare “usa archiviazione utente” o simile.

Questo sistema consente di archiviare coppie chiave-valore:

  • Private (visibili solo agli amministratori e a utenti specifici)
  • Pubbliche (visibili a tutti gli utenti, inclusi quelli anonimi)

Le coppie chiave-valore sono protette rispetto al post da cui l’artefatto ha avuto origine, tuttavia se condividi pubblicamente un artefatto, tutti saranno autorizzati ad aggiungere chiavi.

Per controllare l’archiviazione puoi utilizzare le impostazioni nascoste:

  • ai_artifact_kv_value_max_length (per impostazione predefinita, gli elementi possono avere solo 5000 caratteri o meno)
  • ai_artifact_max_keys_per_user_per_artifact (predefinito 100)

FAQ

Chi Può Creare Artefatti AI?

Per impostazione predefinita, solo gli utenti dello staff (ad esempio, amministratori o moderatori) possono creare artefatti tramite la Persona Creatore di Artefatti. Questa persona semplifica il processo di progettazione di widget web interattivi utilizzando HTML, CSS e JavaScript.

Cosa Succede Se Clicco su un Artefatto?

  • In modalità lax, gli artefatti appaiono automaticamente.
  • In modalità hybrid, gli artefatti richiedono un clic per impostazione predefinita, ma possono essere eseguiti automaticamente se l’incorporamento include data-ai-artifact-autorun.
  • In modalità strict, cliccando sul pulsante “Esegui” si attiva l’artefatto e si consente il caricamento nel tuo browser.

Gli Artefatti AI Sono Sicuri?

Sì. Gli Artefatti AI vengono eseguiti in ambienti strettamente controllati:

  • Sono isolati (sandboxed) e non possono interagire direttamente con l’applicazione Discourse o con il contesto utente, solo tramite messaggistica iframe.
  • La modalità strict ti dà il controllo sull’attivazione.
  • Gli artefatti sono privati per impostazione predefinita; devi condividerli attivamente per concedere l’accesso globale.

Posso vedere il codice sorgente degli Artefatti?

Sì. Quando Discourse AI genera artefatti, includerà il markup, il css e il JavaScript completi.

Quali LLM sono supportati?

Gli artefatti possono essere generati utilizzando qualsiasi LLM che hai configurato, tuttavia vari LLM sono specializzati e ottimizzati per la creazione di artefatti.

Abbiamo riscontrato buoni risultati con o3, Anthropic Claude Sonnet 3.7 - 4.0, GPT-4.1, Gemini Pro 2.5 e altri. In generale, i modelli più avanzati funzioneranno meglio.

C’è un grande aspetto di tentativi ed errori con la creazione di artefatti, la sperimentazione è fondamentale.

23 Mi Piace

Sarebbe davvero bello avere un controllo leggermente più granulare sulla privacy degli artefatti in modo che possano essere condivisi solo con determinati gruppi. Molto simile a come funzionano attualmente le autorizzazioni per categoria :smiley:

Penso che se aggiungi il gruppo al pm del bot potrebbe funzionare?

1 Mi Piace

Ho intenzione di provarlo e riferire qui. Ho un caso d’uso di nicchia che richiede che gli artefatti siano accessibili solo a un gruppo in una categoria privata

1 Mi Piace

Ho taggato il bot Web Artifact Creator in un nuovo argomento in una categoria privata a cui il gruppo ha accesso in modo che possa creare un artefatto visibile solo a me e a quel particolare gruppo. Tuttavia, la finestra dell’iframe dell’artefatto mostra solo il messaggio predefinito " Oops! That page doesn’t exist or is private." che appare quando un utente non ha accesso a una particolare pagina.

Quindi ho creato una query di esplorazione dati per verificare chi potesse visualizzare quell’argomento e gli utenti di quel gruppo che dovrebbero essere in grado di vedere l’artefatto sono effettivamente mostrati come in grado di visualizzarlo secondo il database.

Quindi forse questo è un bug?

La mia query 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 (
  -- Il creatore ha sempre accesso
  SELECT 
    ai.creator_id as user_id,
    'Accesso Creatore' as access_reason
  FROM artifact_info ai
  
  UNION
  
  -- Utenti con accesso ai messaggi privati
  SELECT 
    tau.user_id,
    'Accesso Messaggio Privato' 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
  
  -- Membri del gruppo con accesso ai messaggi privati
  SELECT 
    gu.user_id,
    'Accesso Gruppo Messaggio Privato' 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
  
  -- Utenti con accesso a categorie ristrette
  SELECT 
    gu.user_id,
    'Accesso Gruppo Categoria' 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) -- accesso completo o crea/rispondi/vedi
  
  UNION
  
  -- Tutti gli utenti se l'argomento è pubblico (non ristretto e non messaggio privato)
  SELECT 
    u.id as user_id,
    'Accesso Pubblico' 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