Olá Anton!
Migrar do Mattermost para o Discourse é certamente viável, mas exigirá a criação de um script de importação personalizado, pois ainda não existe um script pronto (veja os scripts de importação disponíveis aqui). Você pode estudar os scripts existentes como referência, mas verifique as datas de última atualização e adapte-os conforme necessário, pois alguns podem ter referências desatualizadas às tabelas do Discourse.
Um pull request com um script de importação do Mattermost seria muito bem-vindo pela comunidade!
Mapeamento de Canais e Dados
Você pode importar tudo como canais de chat, mas também pode mapeá-los como outros tipos:
- Canais como Categorias: Importe cada canal do Mattermost como uma categoria do Discourse. As threads dentro dos canais podem se tornar tópicos, com cada mensagem como uma postagem. Alternativamente, postagens individuais podem ser o OP dos tópicos.
- Canais como Tópicos: Outra abordagem é fazer de cada canal do Mattermost um único tópico, com mensagens como respostas; as threads serão exibidas em sequência neste caso.
- DMs: Eles também podem ser importados como mensagens privadas. É uma boa ideia para discussões que precisam ser arquivadas.
Pense cuidadosamente sobre qual abordagem se adapta melhor à sua comunidade e ao volume de conteúdo.
Títulos de Tópicos
Ao mapear um chat para tópicos e postagens, você precisa criar os títulos para cada tópico. Uma maneira incrível de fazer isso é usar Discourse AI para gerar os títulos com contexto real para o tópico.
Gerando títulos de tópicos usando IA
RESUMO: use 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
Precisa de um LLM e um prompt mestre
llm = DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model)
system_prompt = <<-PROMPT
Quero que você atue como um gerador de títulos para textos escritos. Fornecerei um texto,
e você gerará um título. Por favor, mantenha o título conciso, com menos de 20 palavras,
e garanta que o significado seja mantido. O título utilizará o tipo de linguagem do tópico.
Quero que você responda apenas com o título proposto e nada mais, não escreva explicações.
Nunca use dois pontos no título. Sempre use caixa de frase, com uma letra maiúscula no
início do título, nunca comece o título com uma letra minúscula. Nomes próprios no título
podem ter letra maiúscula, e acrônimos como LLM podem usar letras maiúsculas. Formate alguns títulos
como perguntas, outros como afirmações. Certifique-se de usar pontos de interrogação se o título for uma pergunta.
PROMPT
Então você pode iterar sobre uma lista de tópicos como preferir:
# gerar tudo
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) }
Considerações Importantes
- Reações: O Mattermost suporta múltiplas reações por postagem. Se importar como postagens do Discourse, você precisará limitar a uma, a menos que esteja mapeando para o Discourse Chat (que suporta múltiplas reações nativamente).
- Emojis Personalizados: Você pode trazer emojis personalizados, veja a documentação do plugin Discourse Reactions.
- Equipes e Permissões: As “equipes” do Mattermost não se mapeiam diretamente para o Discourse, mas você pode configurar categorias/canais com controles de acesso apropriados baseados em grupos.
- Anexos: Os anexos do Mattermost (imagens e documentos) não são incorporados ao conteúdo como no Discourse. Ao importar, você precisará anexar links de anexos (Markdown) ou incorporá-los nos corpos das postagens.
Materiais de Referência
Temos experiência com migrações de plataformas de chat, se você desejar ajuda de nossa equipe, consulte nossa página de serviços de migração do Discourse.
Se você tiver perguntas específicas durante o desenvolvimento do script ou nas decisões de mapeamento, sinta-se à vontade para perguntar no Meta para obter orientação!