N8N Web Chat Interface Displays Unwanted Bullet Points on Every Response Line

Describe the problem/error/question

Description:
When using the N8N Web Chat interface, responses generated by the AI are rendered with bullet points on nearly every line, even when the user request is simply to highlight important sections of the response.
This behavior appears to be specific to the Web Chat interface and does not occur when interacting with the same workflow natively inside the n8n environment the N8N Canvas environment. In the Canvas chat window, responses are formatted correctly and do not contain excessive or unnecessary bullet points.
Environment:

  • N8N Version: 1.123.64
  • Deployment: Azure Cloud Environment
    Workflow Configuration:
  • Chat Trigger
  • AI Agent
  • OpenAI Chat Model
  • Simple Memory
  • Think Model
    Additional Information:
    The AI Agent’s System Message explicitly instructs the model not to use bullet points. Despite this configuration, responses displayed through the Web Chat interface continue to show bullet points on nearly every line.

What is the error message (if any)?

Please share your workflow

(Select the nodes on your canvas and use the keyboard shortcuts CMD+C/CTRL+C and CMD+V/CTRL+V to copy and paste the workflow.)

Share the output returned by the last node

Information on your n8n setup

  • n8n version:
  • Database (default: SQLite):
  • n8n EXECUTIONS_PROCESS setting (default: own, main):
  • Running n8n via (Docker, npm, n8n cloud, desktop app):
  • Operating system:

Hi @rajeevdas25 Welcome!
The web chat renders the agent reply as Markdown, so any line the model starts with - or * turns into a bullet, while the editor chat panel styles those list items differently and looks clean. Open the last execution and read the AI Agent’s raw output string: if the lines carry - or * , the model is still emitting list markers and the System Message isn’t holding it.
Strip them in the workflow instead of asking the model. Set the Chat Trigger Response Mode to “When Last Node Finishes” (on “Streaming response” nothing after the agent runs), then add a Code node after the AI Agent:

const text = $json.output
  .replace(/^[ \t]*[-*+][ \t]+/gm, '')
  .replace(/^[ \t]*\d+\.[ \t]+/gm, '');
return [{ json: { output: text } }];

If you’re embedding @n8n/chat on your own page and want to keep the Markdown, remove the markers with CSS loaded after the widget stylesheet:

.chat-message-markdown ul,
.chat-message-markdown ol {
  list-style: none;
  padding-left: 0;
}

Hi @Anshul_Namdev,

Thank you for your response.

To provide a bit more clarity and context: the output itself is well-formatted Markdown and displays correctly within the N8N application. However, when it renders in the N8N chat interface, the formatting is entirely lost—this includes titles, headers, and bullet points, rather than just the issue of extra bullets.

We did not experience this behavior in our previous deployment (which we set up two months ago). This issue began occurring after we upgraded to version 1.123.64.

Thank you for your help.

Best

Hi @rajeevdas25,

This sounds more like a Web Chat Markdown-rendering issue than an AI Agent prompt issue.

The first thing I would check is the raw value returned by the workflow before it reaches the Web Chat UI. If the Canvas output contains normal paragraphs, but the embedded Web Chat displays bullets on almost every line, then the formatting is probably being introduced during Markdown parsing/rendering in the chat widget rather than by the model itself.

A few useful tests:

  1. Temporarily disable streaming in the Chat Trigger/Web Chat configuration, if enabled, and compare the result.

  2. Add an Edit Fields or Code node immediately before the response is returned, and inspect the exact output string.

  3. Check whether each line begins with -, *, •, or another list marker in the raw output.

  4. Return a controlled test response such as:

    First paragraph.\n\nSecond paragraph.\n\nImportant: this is highlighted without a list.

  5. Test the same workflow with a minimal chain:

    Chat Trigger → AI Agent → Chat Model

    Temporarily disconnect Simple Memory and the Think Model to rule out one of them modifying or reformatting the final message.

  6. Try returning plain text with Markdown removed before the Web Chat response.

For example, as a diagnostic Code node:

const value =
  $json.output ??
  $json.text ??
  $json.response ??
  '';

const cleaned = String(value)
  .replace(/^\s*[-*•]\s+/gm, '')
  .replace(/\n{3,}/g, '\n\n');

return [{ json: { output: cleaned } }];

Hi @rajeevdas25
With streaming on, the chat widget parses the reply chunk by chunk as it arrives, so the blank lines that separate headings, lists and paragraphs get dropped between chunks and the whole message collapses into flat text. The canvas panel receives the finished string in one piece, which is why the same output renders correctly there.
Send the reply as one complete message instead of a stream. Set the Chat Trigger Response Mode to “Using Response Nodes”, then add a Chat node after the AI Agent with Operation set to “Send Message” and the message set to the agent output:

{{ $json.output }}

The text leaves as a single string, so the markdown is parsed whole and headers and lists survive. The Chat node needs the Chat Trigger Mode to be hosted, it isn’t supported when Mode is “Embedded”.