Salut Anton !
Migrer de Mattermost vers Discourse est tout à fait faisable, mais cela nécessitera la création d’un script d’importation personnalisé, car il n’existe pas encore de script prêt à l’emploi (voir les scripts d’importation disponibles ici). Vous pouvez étudier les scripts existants à titre de référence, mais veuillez vérifier attentivement leurs dates de dernière mise à jour et adapter en conséquence, car certains pourraient contenir des références obsolètes aux tables de Discourse.
Une pull request avec un script d’importation Mattermost serait très appréciée par la communauté !
Mapping des canaux et des données
Vous pouvez tout importer sous forme de canaux de discussion, mais vous pouvez également les mapper à d’autres types :
- Canaux en tant que Catégories : Importez chaque canal Mattermost comme une catégorie Discourse. Les fils de discussion au sein des canaux peuvent devenir des sujets, chaque message étant un post. Alternativement, les messages individuels peuvent être l’OP des sujets.
- Canaux en tant que Sujets : Une autre approche consiste à faire de chaque canal Mattermost un seul sujet, les messages étant des réponses. Les fils de discussion seront alors affichés séquentiellement.
- Messages privés : Ils peuvent également être importés sous forme de messages privés. C’est une bonne idée pour les discussions qui nécessitent d’être archivées.
Réfléchissez bien à l’approche qui convient le mieux à votre communauté et au volume de contenu.
Titres des sujets
Lorsque vous mappez une discussion à des sujets et des posts, vous devez créer les titres pour chaque sujet. Une façon incroyable de le faire est d’utiliser Discourse AI pour générer les titres avec le contexte réel du sujet.
Générer des titres de sujets à l’aide de l’IA
EN BREF, utilisez cette méthode :
def gen_title(llm, system_prompt, topic)
begin
content = topic.posts.map(&:cooked).join("\n").slice(0..10_000)
message = [{type: :user, content: content}]
prompt = DiscourseAi::Completions::Prompt.new(system_prompt, messages: message)
title = llm.generate(
prompt,
user: Discourse.system_user,
temperature: 0.3,
feature_name: "ai_helper"
)
topic.title = title
topic.save!
puts "Topic: #{topic.id}, changed sucessfully."
rescue ActiveRecord::RecordInvalid
puts "validation error"
end
end
Cela nécessite un LLM et un prompt maître
llm = DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model)
system_prompt = <<-PROMPT
Je veux que vous agissiez en tant que générateur de titres pour des textes écrits. Je vais vous fournir un texte, et vous générerez un titre. Veuillez garder le titre concis, moins de 20 mots, et veiller à ce que le sens soit maintenu. Le titre utilisera le type de langue du sujet. Je veux que vous répondiez uniquement par le titre proposé et rien d'autre, n'écrivez pas d'explications. N'utilisez jamais de deux-points dans le titre. Utilisez toujours la casse de phrase, en commençant par une majuscule, ne commencez jamais le titre par une minuscule. Les noms propres dans le titre peuvent avoir une majuscule, et les acronymes comme LLM peuvent utiliser des majuscules. Formatez certains titres comme des questions, d'autres comme des affirmations. Assurez-vous d'utiliser des points d'interrogation si le titre est une question.
PROMPT
Ensuite, vous pouvez boucler sur une liste de sujets comme vous le souhaitez :
# tout générer
Topic
.joins(:_custom_fields)
.where('topic_custom_fields.name = ?', 'import_id')
.find_each { |topic| gen_title(llm, system_prompt, topic) }
# filtrer les MP
Topic
.joins(:_custom_fields)
.where('topic_custom_fields.name = ?', 'import_id')
.where.not(archetype: "private_message")
.find_each { |topic| gen_title(llm, system_prompt, topic) }
Considérations importantes
- Réactions : Mattermost prend en charge plusieurs réactions par message. Si vous importez en tant que posts Discourse, vous devrez limiter à une seule, sauf si vous mappez vers Discourse Chat (qui prend en charge plusieurs réactions nativement).
- Émojis personnalisés : Vous pouvez importer des émojis personnalisés, consultez la documentation du plugin Discourse Reactions.
- Équipes et Permissions : Les “équipes” de Mattermost ne correspondent pas directement à Discourse, mais vous pouvez configurer des catégories/canaux avec des contrôles d’accès appropriés basés sur les groupes.
- Pièces jointes : Les pièces jointes de Mattermost (images et documents) ne sont pas intégrées au contenu comme dans Discourse. Lors de l’importation, vous devrez ajouter des liens vers les pièces jointes (Markdown) ou les intégrer dans le corps des messages.
Matériaux de référence
Nous avons de l’expérience dans les migrations de plateformes de chat. Si vous souhaitez l’aide de notre équipe, consultez notre page de services de migration Discourse.
Si vous avez des questions spécifiques pendant le développement du script ou lors des décisions de mappage, n’hésitez pas à demander sur Meta pour obtenir des conseils !