Skip to main content
Version: v2.x

Custom Response Renderers

The examples in this page show how to create custom message renderer for streamed and batched data.

Renderers For Streamed Data

Data is streamed to the custom component as it's being generated.

import { AiChat, ResponseRenderer } from '@nlux/react';
import { useChatAdapter } from '@nlux/langchain-react';
import '@nlux/themes/nova.css';

import { personaOptions } from './personas';
import { WavesBackground } from './waves';

const ColourfulResponseRenderer: ResponseRenderer<string> = (props) => (
    <div className="colourful-response-renderer">

        {/* Option 1 — Use containerRef to render message using NLUX markdown parser: */}
        <div className="response-container" ref={ props.containerRef }/>

        {/* Or option 2 — Render the content array yourself:
           <div className="response-container">{props.content}</div> */}

        <div className="rating-container">
            What do you think of this response?
            &nbsp;
            <button onClick={() => console.log('I like it!')}>👍</button>
            <button onClick={() => console.log('I love it!')}>❤️</button>
            <button onClick={() => console.log('I hate it!')}>😵</button>
        </div>
        <WavesBackground/>
    </div>
); 

export default () => {
    // LangServe adapter that connects to a demo LangChain Runnable API
    const adapter = useChatAdapter({
        url: 'https://pynlux.api.nlkit.com/pirate-speak'
    });

  return (
    <AiChat
      messageOptions={{
        // Custom response renderer for the assistant's messages
        responseRenderer: ColourfulResponseRenderer
      }}
      adapter={ adapter }
      personaOptions={ personaOptions }
      displayOptions={{ colorScheme: 'dark' }}
      conversationOptions={{ layout: 'list' }}
    />
  );
};

Renderers For Batched Data

The data is batched and sent to the custom component all at once.
The renderer displays the data that's present in the content prop.

import { AiChat, ResponseRenderer } from '@nlux/react';
import { useChatAdapter } from '@nlux/langchain-react';
import '@nlux/themes/nova.css';

import { personaOptions } from './personas';
import { WavesBackground } from './waves';

const ColourfulResponseRenderer: ResponseRenderer<string> = (props) => (
    <div className="colourful-response-renderer">
        <div className="response-container">{props.content}</div>
        <div className="rating-container">
            What do you think of this response?
            &nbsp;
            <button onClick={() => console.log('I like it!')}>👍</button>
            <button onClick={() => console.log('I love it!')}>❤️</button>
            <button onClick={() => console.log('I hate it!')}>😵</button>
        </div>
        <WavesBackground/>
    </div>
);

export default () => {
    // LangServe adapter that connects to a demo LangChain Runnable API
    const adapter = useChatAdapter({
        url: 'https://pynlux.api.nlkit.com/pirate-speak',
        dataTransferMode: 'batch'
    });

  return (
    <AiChat
      messageOptions={{
        // Custom response renderer for the assistant's messages
        responseRenderer: ColourfulResponseRenderer
      }}
      adapter={ adapter }
      personaOptions={ personaOptions }
      displayOptions={{ colorScheme: 'dark' }}
      conversationOptions={{ layout: 'list' }}
    />
  );
};