¡Hola Anton!
Migrar de Mattermost a Discourse es ciertamente factible, pero requerirá la creación de un script de importación personalizado, ya que aún no hay un script prefabricado disponible (ver scripts de importación disponibles aquí). Puedes estudiar los scripts existentes como referencia, pero por favor, verifica sus fechas de última actualización y adáptalos en consecuencia, ya que algunos podrían tener referencias obsoletas a las tablas de Discourse.
¡Una solicitud de extracción (pull request) con un script de importación de Mattermost sería muy bienvenida por la comunidad!
Mapeo de Canales y Datos
Puedes importar todo como canales de chat, pero también puedes mapearlos como otros tipos:
- Canales como Categorías: Importa cada canal de Mattermost como una categoría de Discourse. Los hilos dentro de los canales pueden convertirse en temas, con cada mensaje como una publicación. Alternativamente, las publicaciones individuales pueden ser el OP (Original Poster) de los temas.
- Canales como Temas: Otro enfoque es hacer de cada canal de Mattermost un solo tema, con los mensajes como respuestas; en este caso, los hilos se mostrarán en secuencia.
- Mensajes Directos (DMs): También se pueden importar como mensajes privados. Es una buena idea para discusiones que necesitan ser archivadas.
Piensa detenidamente qué enfoque se adapta mejor a tu comunidad y al volumen de contenido.
Títulos de Temas
Al mapear un chat a temas y publicaciones, tienes que crear los títulos para cada tema. Una forma increíble de hacerlo es usando Discourse AI para generar los títulos con el contexto real del tema.
Generación de Títulos de Temas con IA
EN RESUMEN: usa este método:
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
Necesita un LLM y un prompt maestro
llm = DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model)
system_prompt = <<-PROMPT
Quiero que actúes como un generador de títulos para textos escritos. Te proporcionaré un texto y generarás un título. Por favor, mantén el título conciso, por debajo de 20 palabras, y asegúrate de que el significado se mantenga. El título utilizará el tipo de idioma del tema. Quiero que solo respondas con el título propuesto y nada más, no escribas explicaciones. Nunca uses dos puntos en el título. Usa siempre mayúsculas al inicio de la frase, comenzando el título con una letra mayúscula, nunca empieces el título con una letra minúscula. Los nombres propios en el título pueden tener mayúscula, y las siglas como LLM pueden usar mayúsculas. Formatea algunos títulos como preguntas, otros como afirmaciones. Asegúrate de usar signos de interrogación si el título es una pregunta.
PROMPT
Luego puedes iterar sobre una lista de temas como prefieras:
# generar todo
Topic
.joins(:_custom_fields)
.where('topic_custom_fields.name = ?', 'import_id')
.find_each { |topic| gen_title(llm, system_prompt, topic) }
# filtrar PMs
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) }
Consideraciones Importantes
- Reacciones: Mattermost soporta múltiples reacciones por publicación. Si importas como publicaciones de Discourse, necesitarás limitar a una, a menos que mapees a Discourse Chat (que soporta múltiples reacciones de forma nativa).
- Emojis Personalizados: Puedes traer emojis personalizados, consulta la documentación del plugin Discourse Reactions.
- Equipos y Permisos: Los “equipos” de Mattermost no se mapean directamente a Discourse, pero puedes configurar categorías/canales con controles de acceso apropiados basados en grupos.
- Archivos Adjuntos: Los archivos adjuntos de Mattermost (imágenes y documentos) no se incrustan en el contenido como en Discourse. Al importar, necesitarás añadir enlaces a los archivos adjuntos (Markdown) o incrustarlos en los cuerpos de las publicaciones.
Materiales de Referencia
Tenemos experiencia en migraciones de plataformas de chat, si deseas ayuda de nuestro equipo, consulta nuestra página de servicios de migración de Discourse.
Si tienes preguntas específicas durante el desarrollo del script o las decisiones de mapeo, ¡no dudes en preguntar en Meta para obtener orientación!