diff --git a/agent/canvas.py b/agent/canvas.py index 302b98c5f..7fc642456 100644 --- a/agent/canvas.py +++ b/agent/canvas.py @@ -166,7 +166,10 @@ class Canvas: return n["data"]["name"] return "" - def run(self, **kwargs): + def run(self, running_hint_text = "is running...🕞", **kwargs): + if not running_hint_text or not isinstance(running_hint_text, str): + running_hint_text = "is running...🕞" + if self.answer: cpn_id = self.answer[0] self.answer.pop(0) @@ -208,7 +211,7 @@ class Canvas: if c not in waiting: waiting.append(c) continue - yield "*'{}'* is running...🕞".format(self.get_component_name(c)) + yield "*'{}'* {}".format(self.get_component_name(c), running_hint_text) if cpn.component_name.lower() == "iteration": st_cpn = cpn.get_start() diff --git a/api/apps/canvas_app.py b/api/apps/canvas_app.py index efb1e1cd3..b55ab0d5d 100644 --- a/api/apps/canvas_app.py +++ b/api/apps/canvas_app.py @@ -113,6 +113,7 @@ def getsse(canvas_id): def run(): req = request.json stream = req.get("stream", True) + running_hint_text = req.get("running_hint_text", "") e, cvs = UserCanvasService.get_by_id(req["id"]) if not e: return get_data_error_result(message="canvas not found.") @@ -138,7 +139,7 @@ def run(): def sse(): nonlocal answer, cvs try: - for ans in canvas.run(stream=True): + for ans in canvas.run(running_hint_text = running_hint_text, stream=True): if ans.get("running_status"): yield "data:" + json.dumps({"code": 0, "message": "", "data": {"answer": ans["content"], @@ -176,7 +177,7 @@ def run(): resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8") return resp - for answer in canvas.run(stream=False): + for answer in canvas.run(running_hint_text = running_hint_text, stream=False): if answer.get("running_status"): continue final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" diff --git a/web/src/locales/de.ts b/web/src/locales/de.ts index 6458e2057..31bd415a4 100644 --- a/web/src/locales/de.ts +++ b/web/src/locales/de.ts @@ -106,7 +106,8 @@ export default { disabled: 'Deaktiviert', action: 'Aktion', parsingStatus: 'Analysestatus', - parsingStatusTip: 'Die Verarbeitungszeit für Dokumente variiert je nach mehreren Faktoren. Das Aktivieren von Funktionen wie Knowledge Graph, RAPTOR, automatischer Frage- oder Schlüsselwort-Extraktion verlängert die Bearbeitungszeit deutlich. Wenn der Fortschrittsbalken stehen bleibt, konsultieren Sie bitte diese beiden FAQs: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + parsingStatusTip: + 'Die Verarbeitungszeit für Dokumente variiert je nach mehreren Faktoren. Das Aktivieren von Funktionen wie Knowledge Graph, RAPTOR, automatischer Frage- oder Schlüsselwort-Extraktion verlängert die Bearbeitungszeit deutlich. Wenn der Fortschrittsbalken stehen bleibt, konsultieren Sie bitte diese beiden FAQs: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', processBeginAt: 'Beginn', processDuration: 'Dauer', progressMsg: 'Fortschritt', @@ -343,7 +344,8 @@ export default { {cluster_content} Das oben Genannte ist der Inhalt, den Sie zusammenfassen müssen.`, maxToken: 'Maximale Token', - maxTokenTip: 'Die maximale Anzahl an Token pro generiertem Zusammenfassungs-Chunk.', + maxTokenTip: + 'Die maximale Anzahl an Token pro generiertem Zusammenfassungs-Chunk.', maxTokenMessage: 'Maximale Token sind erforderlich', threshold: 'Schwellenwert', thresholdTip: @@ -1227,6 +1229,7 @@ export default { promptTip: 'Verwenden Sie den Systemprompt, um die Aufgabe für das LLM zu beschreiben, festzulegen, wie es antworten soll, und andere verschiedene Anforderungen zu skizzieren. Der Systemprompt wird oft in Verbindung mit Schlüsseln (Variablen) verwendet, die als verschiedene Dateninputs für das LLM dienen. Verwenden Sie einen Schrägstrich `/` oder die (x)-Schaltfläche, um die zu verwendenden Schlüssel anzuzeigen.', promptMessage: 'Prompt ist erforderlich', + runningHintText: 'läuft...🕞', }, footer: { profile: 'Alle Rechte vorbehalten @ React', diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index b98574c60..2d72199b8 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -1262,6 +1262,7 @@ This delimiter is used to split the input text into several text pieces echo of knowledgeBasesTip: 'Select the knowledge bases to associate with this chat assistant, or choose variables containing knowledge base IDs below.', knowledgeBaseVars: 'Knowledge base variables', + runningHintText: 'is running...🕞', }, }, }; diff --git a/web/src/locales/es.ts b/web/src/locales/es.ts index 91bc53466..d3c7061a5 100644 --- a/web/src/locales/es.ts +++ b/web/src/locales/es.ts @@ -95,7 +95,8 @@ export default { disabled: 'Deshabilitar', action: 'Acción', parsingStatus: 'Estado de análisis', - parsingStatusTip: 'El tiempo de procesamiento de documentos varía según varios factores. Activar funciones como Knowledge Graph, RAPTOR, extracción automática de preguntas o de palabras clave aumentará significativamente el tiempo de procesamiento. Si la barra de progreso se detiene, consulte estas dos preguntas frecuentes: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + parsingStatusTip: + 'El tiempo de procesamiento de documentos varía según varios factores. Activar funciones como Knowledge Graph, RAPTOR, extracción automática de preguntas o de palabras clave aumentará significativamente el tiempo de procesamiento. Si la barra de progreso se detiene, consulte estas dos preguntas frecuentes: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', processBeginAt: 'Proceso iniciado en', processDuration: 'Duración del proceso', progressMsg: 'Mensaje de progreso', @@ -185,7 +186,8 @@ export default { setAnOpenerTip: '¿Cómo quieres dar la bienvenida a tus clientes?', knowledgeBases: 'Bases de conocimiento', knowledgeBasesMessage: 'Por favor selecciona', - knowledgeBasesTip: 'Selecciona las bases de conocimiento asociadas. Una base de conocimientos vacía no aparecerá en la lista desplegable.', + knowledgeBasesTip: + 'Selecciona las bases de conocimiento asociadas. Una base de conocimientos vacía no aparecerá en la lista desplegable.', system: 'prompt del sistema', systemInitialValue: `Eres un asistente inteligente. Por favor resume el contenido de la base de conocimiento para responder la pregunta. Enumera los datos en la base de conocimiento y responde con detalle. Cuando todo el contenido de la base de conocimiento sea irrelevante para la pregunta, tu respuesta debe incluir la frase "¡La respuesta que buscas no se encuentra en la base de conocimiento!". Las respuestas necesitan considerar el historial de chat. Aquí está la base de conocimiento: @@ -854,6 +856,7 @@ export default { note: 'Nota', noteDescription: 'Nota', notePlaceholder: 'Por favor ingresa una nota', + runningHintText: 'está corriendo...🕞', }, footer: { profile: 'Todos los derechos reservados @ React', diff --git a/web/src/locales/id.ts b/web/src/locales/id.ts index 2bf6dcb21..f63829e5b 100644 --- a/web/src/locales/id.ts +++ b/web/src/locales/id.ts @@ -100,7 +100,8 @@ export default { disabled: 'Nonaktifkan', action: 'Aksi', parsingStatus: 'Status Parsing', - parsingStatusTip: 'Waktu pemrosesan dokumen bervariasi tergantung beberapa faktor. Mengaktifkan fitur seperti Knowledge Graph, RAPTOR, Ekstraksi Pertanyaan Otomatis, atau Ekstraksi Kata Kunci Otomatis akan secara signifikan menambah waktu pemrosesan. Jika bilah kemajuan macet, silakan lihat dua FAQ berikut: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + parsingStatusTip: + 'Waktu pemrosesan dokumen bervariasi tergantung beberapa faktor. Mengaktifkan fitur seperti Knowledge Graph, RAPTOR, Ekstraksi Pertanyaan Otomatis, atau Ekstraksi Kata Kunci Otomatis akan secara signifikan menambah waktu pemrosesan. Jika bilah kemajuan macet, silakan lihat dua FAQ berikut: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', processBeginAt: 'Proses Dimulai Pada', processDuration: 'Durasi Proses', progressMsg: 'Pesan Kemajuan', @@ -299,7 +300,8 @@ export default { {cluster_content} Di atas adalah konten yang perlu Anda rangkum.`, maxToken: 'Token maksimum', - maxTokenTip: 'Jumlah maksimum token per potongan ringkasan yang dihasilkan.', + maxTokenTip: + 'Jumlah maksimum token per potongan ringkasan yang dihasilkan.', maxTokenMessage: 'Token maksimum diperlukan', threshold: 'Ambang batas', thresholdTip: @@ -356,7 +358,8 @@ export default { setAnOpenerTip: 'Bagaimana Anda ingin menyambut klien Anda?', knowledgeBases: 'Basis Pengetahuan', knowledgeBasesMessage: 'Silakan pilih', - knowledgeBasesTip: 'Pilih basis pengetahuan yang terkait. Basis pengetahuan yang kosong tidak akan muncul di daftar dropdown.', + knowledgeBasesTip: + 'Pilih basis pengetahuan yang terkait. Basis pengetahuan yang kosong tidak akan muncul di daftar dropdown.', system: 'Prompt Sistem', systemInitialValue: `Anda adalah asisten cerdas. Silakan rangkum konten basis pengetahuan untuk menjawab pertanyaan. Silakan daftar data di basis pengetahuan dan jawab secara detail. Ketika semua konten basis pengetahuan tidak relevan dengan pertanyaan, jawaban Anda harus menyertakan kalimat "Jawaban yang Anda cari tidak ditemukan di basis pengetahuan!" Jawaban perlu mempertimbangkan riwayat obrolan. Berikut adalah basis pengetahuan: @@ -1015,6 +1018,7 @@ export default { promptTip: 'Gunakan prompt sistem untuk menjelaskan tugas untuk LLM, tentukan bagaimana harus merespons, dan menguraikan persyaratan lainnya. Prompt sistem sering digunakan bersama dengan kunci (variabel), yang berfungsi sebagai berbagai input data untuk LLM. Gunakan garis miring `/` atau tombol (x) untuk menampilkan kunci yang digunakan.', promptMessage: 'Prompt diperlukan', + runningHintText: 'sedang berjalan...🕞', }, footer: { profile: 'Semua hak dilindungi @ React', diff --git a/web/src/locales/ja.ts b/web/src/locales/ja.ts index 6cb19381a..07b894d0f 100644 --- a/web/src/locales/ja.ts +++ b/web/src/locales/ja.ts @@ -100,7 +100,8 @@ export default { disabled: '無効', action: 'アクション', parsingStatus: 'パースステータス', - parsingStatusTip: 'ドキュメントの解析時間はさまざまな要因によって異なります。Knowledge Graph、RAPTOR、自動質問抽出、自動キーワード抽出などの機能を有効にすると、処理時間が大幅に増加します。進行バーが止まった場合は、次の2つのFAQをご参照ください: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + parsingStatusTip: + 'ドキュメントの解析時間はさまざまな要因によって異なります。Knowledge Graph、RAPTOR、自動質問抽出、自動キーワード抽出などの機能を有効にすると、処理時間が大幅に増加します。進行バーが止まった場合は、次の2つのFAQをご参照ください: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', processBeginAt: 'プロセス開始時刻', processDuration: '処理時間', progressMsg: '進行状況メッセージ', @@ -297,7 +298,8 @@ export default { maxTokenTip: '生成された要約チャンクごとの最大トークン数。', maxTokenMessage: '最大トークン数は必須です', threshold: 'しきい値', - thresholdTip: 'RAPTORでは、チャンクは意味的な類似性によってクラスタリングされます。しきい値パラメータは、チャンクをまとめるために必要な最小限の類似度を設定します。しきい値が高いほど各クラスタ内のチャンク数は少なくなり、しきい値が低いほど多くのチャンクが1つのクラスタに含まれます。', + thresholdTip: + 'RAPTORでは、チャンクは意味的な類似性によってクラスタリングされます。しきい値パラメータは、チャンクをまとめるために必要な最小限の類似度を設定します。しきい値が高いほど各クラスタ内のチャンク数は少なくなり、しきい値が低いほど多くのチャンクが1つのクラスタに含まれます。', thresholdMessage: 'しきい値は必須です', maxCluster: '最大クラスター数', maxClusterTip: '作成するクラスタの最大数。', @@ -354,7 +356,8 @@ export default { setAnOpenerTip: 'お客様をどのように歓迎しますか?', knowledgeBases: 'ナレッジベース', knowledgeBasesMessage: '選択してください', - knowledgeBasesTip: '関連付けるナレッジベースを選択してください。空のナレッジベースはドロップダウンリストに表示されません。', + knowledgeBasesTip: + '関連付けるナレッジベースを選択してください。空のナレッジベースはドロップダウンリストに表示されません。', system: 'システムプロンプト', systemInitialValue: `あなたはインテリジェントなアシスタントです。質問に答えるためにナレッジベースの内容を要約してください。ナレッジベースのデータをリストし、詳細に答えてください。すべてのナレッジベースの内容が質問に関連しない場合、回答には「ナレッジベースにはお探しの回答が見つかりません!」という文を含める必要があります。回答はチャット履歴を考慮する必要があります。 こちらがナレッジベースです: @@ -1083,6 +1086,7 @@ export default { promptTip: 'LLMのタスクを説明し、どのように応答すべきかを指定し、他のさまざまな要件を概説するためにシステムプロンプトを使用します。システムプロンプトは、LLMのさまざまなデータ入力として機能するキー(変数)と共に使用されることがよくあります。使用するキーを表示するには、スラッシュ `/` または (x) ボタンを使用します。', promptMessage: 'プロンプトは必須です', + runningHintText: '動作中です...🕞 ', }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/locales/pt-br.ts b/web/src/locales/pt-br.ts index 900bf3021..6700a3dd4 100644 --- a/web/src/locales/pt-br.ts +++ b/web/src/locales/pt-br.ts @@ -103,7 +103,8 @@ export default { disabled: 'Desabilitar', action: 'Ação', parsingStatus: 'Status da análise', - parsingStatusTip: 'O tempo de processamento do documento varia conforme vários fatores. Ativar recursos como Knowledge Graph, RAPTOR, Extração Automática de Perguntas ou Extração Automática de Palavras-chave aumentará significativamente o tempo de processamento. Se a barra de progresso travar, consulte estas duas FAQs: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + parsingStatusTip: + 'O tempo de processamento do documento varia conforme vários fatores. Ativar recursos como Knowledge Graph, RAPTOR, Extração Automática de Perguntas ou Extração Automática de Palavras-chave aumentará significativamente o tempo de processamento. Se a barra de progresso travar, consulte estas duas FAQs: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', processBeginAt: 'Início em', processDuration: 'Duração', progressMsg: 'Progresso', @@ -274,7 +275,8 @@ export default { maxTokenTip: 'O número máximo de tokens por chunk de resumo gerado.', maxTokenMessage: 'O número máximo de tokens é obrigatório', threshold: 'Limite', - thresholdTip: 'No RAPTOR, os chunks são agrupados de acordo com sua similaridade semântica. O parâmetro de Limite define a similaridade mínima necessária para que os chunks sejam agrupados. Um Limite mais alto significa menos chunks em cada grupo, enquanto um Limite mais baixo significa mais chunks por grupo.', + thresholdTip: + 'No RAPTOR, os chunks são agrupados de acordo com sua similaridade semântica. O parâmetro de Limite define a similaridade mínima necessária para que os chunks sejam agrupados. Um Limite mais alto significa menos chunks em cada grupo, enquanto um Limite mais baixo significa mais chunks por grupo.', thresholdMessage: 'O limite é obrigatório', maxCluster: 'Máximo de clusters', maxClusterTip: 'O número máximo de clusters a serem criados.', @@ -1127,6 +1129,7 @@ export default { promptTip: 'Use o prompt do sistema para descrever a tarefa para o LLM, especificar como ele deve responder e esboçar outros requisitos diversos. O prompt do sistema é frequentemente usado em conjunto com chaves (variáveis), que servem como várias entradas de dados para o LLM. Use uma barra `/` ou o botão (x) para mostrar as chaves a serem usadas.', promptMessage: 'O prompt é obrigatório', + runningHintText: 'está rodando...🕞', }, footer: { profile: 'Todos os direitos reservados @ React', diff --git a/web/src/locales/vi.ts b/web/src/locales/vi.ts index 9c8d71cc9..5e795259a 100644 --- a/web/src/locales/vi.ts +++ b/web/src/locales/vi.ts @@ -106,7 +106,8 @@ export default { disabled: 'Tắt', action: 'Hành động', parsingStatus: 'Trạng thái phân tích cú pháp', - parsingStatusTip: 'Thời gian xử lý tài liệu thay đổi tùy theo nhiều yếu tố. Bật các tính năng như Knowledge Graph, RAPTOR, Trích xuất Câu hỏi Tự động hoặc Trích xuất Từ khóa Tự động sẽ làm tăng đáng kể thời gian xử lý. Nếu thanh tiến trình bị dừng, vui lòng tham khảo hai câu hỏi thường gặp sau: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', + parsingStatusTip: + 'Thời gian xử lý tài liệu thay đổi tùy theo nhiều yếu tố. Bật các tính năng như Knowledge Graph, RAPTOR, Trích xuất Câu hỏi Tự động hoặc Trích xuất Từ khóa Tự động sẽ làm tăng đáng kể thời gian xử lý. Nếu thanh tiến trình bị dừng, vui lòng tham khảo hai câu hỏi thường gặp sau: https://ragflow.io/docs/dev/faq#why-does-my-document-parsing-stall-at-under-one-percent.', processBeginAt: 'Bắt đầu xử lý lúc', processDuration: 'Thời gian xử lý', progressMsg: 'Thông báo tiến trình', @@ -307,7 +308,8 @@ export default { maxTokenTip: 'Số lượng token tối đa cho mỗi đoạn tóm tắt được tạo ra.', maxTokenMessage: 'Số token tối đa là bắt buộc', threshold: 'Ngưỡng', - thresholdTip: 'Trong RAPTOR, các đoạn văn bản được nhóm lại dựa trên sự tương đồng ngữ nghĩa của chúng. Tham số Ngưỡng thiết lập mức độ tương đồng tối thiểu cần thiết để các đoạn được nhóm lại với nhau. Ngưỡng càng cao thì mỗi nhóm sẽ có ít đoạn hơn, còn ngưỡng càng thấp thì mỗi nhóm sẽ có nhiều đoạn hơn.', + thresholdTip: + 'Trong RAPTOR, các đoạn văn bản được nhóm lại dựa trên sự tương đồng ngữ nghĩa của chúng. Tham số Ngưỡng thiết lập mức độ tương đồng tối thiểu cần thiết để các đoạn được nhóm lại với nhau. Ngưỡng càng cao thì mỗi nhóm sẽ có ít đoạn hơn, còn ngưỡng càng thấp thì mỗi nhóm sẽ có nhiều đoạn hơn.', thresholdMessage: 'Ngưỡng là bắt buộc', maxCluster: 'Cụm tối đa', maxClusterTip: 'Số lượng cụm tối đa được tạo ra.', @@ -397,7 +399,8 @@ export default { setAnOpenerTip: 'Bạn muốn chào đón khách hàng của mình như thế nào?', knowledgeBases: 'Cơ sở kiến thức', knowledgeBasesMessage: 'Vui lòng chọn', - knowledgeBasesTip: 'Chọn các cơ sở kiến thức liên kết. Cơ sở tri thức trống sẽ không xuất hiện trong danh sách thả xuống.', + knowledgeBasesTip: + 'Chọn các cơ sở kiến thức liên kết. Cơ sở tri thức trống sẽ không xuất hiện trong danh sách thả xuống.', system: 'Hệ thống', systemInitialValue: `Bạn là một trợ lý thông minh. Vui lòng tóm tắt nội dung của cơ sở kiến thức để trả lời câu hỏi. Vui lòng liệt kê dữ liệu trong cơ sở kiến thức và trả lời chi tiết. Khi tất cả nội dung cơ sở kiến thức không liên quan đến câu hỏi, câu trả lời của bạn phải bao gồm câu "Câu trả lời bạn đang tìm kiếm không được tìm thấy trong cơ sở kiến thức!" Câu trả lời cần xem xét lịch sử trò chuyện. Đây là cơ sở kiến thức: @@ -1153,6 +1156,7 @@ export default { promptTip: 'Sử dụng lời nhắc hệ thống để mô tả nhiệm vụ cho LLM, chỉ định cách nó nên phản hồi và phác thảo các yêu cầu khác nhau. Lời nhắc hệ thống thường được sử dụng kết hợp với các khóa (biến), đóng vai trò là các đầu vào dữ liệu khác nhau cho LLM. Sử dụng dấu gạch chéo `/` hoặc nút (x) để hiển thị các khóa cần sử dụng.', promptMessage: 'Nhắc nhở là bắt buộc', + runningHintText: 'đang chạy...🕞', }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/locales/zh-traditional.ts b/web/src/locales/zh-traditional.ts index 5e5df03a9..694b76fa6 100644 --- a/web/src/locales/zh-traditional.ts +++ b/web/src/locales/zh-traditional.ts @@ -1158,6 +1158,7 @@ export default { promptMessage: '提示詞是必填項', promptTip: '系統提示為大型模型提供任務描述、規定回覆方式,以及設定其他各種要求。系統提示通常與 key(變數)合用,透過變數設定大型模型的輸入資料。你可以透過斜線或 (x) 按鈕顯示可用的 key。', + runningHintText: '正在運行...🕞', }, footer: { profile: '“保留所有權利 @ react”', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index c9d0b4f2c..776d6c870 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -1217,6 +1217,7 @@ General:实体和关系提取提示来自 GitHub - microsoft/graphrag:基于 '系统提示为大模型提供任务描述、规定回复方式,以及设置其他各种要求。系统提示通常与 key (变量)合用,通过变量设置大模型的输入数据。你可以通过斜杠或者 (x) 按钮显示可用的 key。', knowledgeBasesTip: '选择关联的知识库,或者在下方选择包含知识库ID的变量。', knowledgeBaseVars: '知识库变量', + runningHintText: '正在运行中...🕞', }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/pages/flow/chat/hooks.ts b/web/src/pages/flow/chat/hooks.ts index d360671f2..dc4fda33d 100644 --- a/web/src/pages/flow/chat/hooks.ts +++ b/web/src/pages/flow/chat/hooks.ts @@ -6,6 +6,7 @@ import { useSendMessageWithSse, } from '@/hooks/logic-hooks'; import { Message } from '@/interfaces/database/chat'; +import i18n from '@/locales/config'; import api from '@/utils/api'; import { message } from 'antd'; import trim from 'lodash/trim'; @@ -66,6 +67,9 @@ export const useSendNextMessage = () => { const params: Record = { id: flowId, }; + params.running_hint_text = i18n.t('flow.runningHintText', { + defaultValue: 'is running...🕞', + }); if (message.content) { params.message = message.content; params.message_id = message.id;