Store Chat Messages & State Without Managing Infrastructure.Check Out DialogueDB
Skip to content

Dialogue

The Dialogue class manages conversation history for multi-turn LLM interactions. It's used internally by state, but you can also use it independently with createDialogue.

Creating a dialogue

ts
import { createDialogue } from "llm-exe";

const dialogue = createDialogue("chat");

Adding messages

All message methods return this for chaining:

ts
dialogue
  .setSystemMessage("You are a helpful assistant.")
  .setUserMessage("What is TypeScript?")
  .setAssistantMessage("TypeScript is a typed superset of JavaScript.");

Available methods

MethodDescription
setUserMessage(content, name?)Add a user message. Content can be a string or detailed content array.
setAssistantMessage(content)Add an assistant message. Accepts a string or OutputResultsText.
setSystemMessage(content)Add a system message.
setToolMessage(content, name, id?)Add a tool/function result message.
setToolCallMessage({ name, arguments, id? })Add a tool call (function invocation) message.
setFunctionCallMessage(input)Add a function call message (legacy format also supported).
setMessageTurn(user, assistant, system?)Add a complete turn (user + assistant + optional system).
setHistory(messages)Load an array of messages into the dialogue.
getHistory()Get all messages as an IChatMessages array.
addFromOutput(output)Add messages from an LLM OutputResult or BaseLlCall.

Adding LLM output directly

After making an LLM call, you can add the response to dialogue history automatically:

ts
const output = await llm.call(prompt);
dialogue.addFromOutput(output);

This handles both text responses and tool/function calls, adding them in the order they were returned.

Loading existing history

Use setHistory to load a full conversation from an array:

ts
dialogue.setHistory([
  { role: "user", content: "Hi" },
  { role: "assistant", content: "Hello! How can I help?" },
  { role: "user", content: "Tell me a joke" },
]);

Using with state

Dialogues integrate with the state module:

ts
import { createState } from "llm-exe";

const state = createState();
const chatHistory = state.createDialogue("chatHistory");

chatHistory.setUserMessage("Hello!");
chatHistory.setAssistantMessage("Hi there!");

// Retrieve later
const history = state.getDialogue("chatHistory").getHistory();

Examples

ts
const chatHistory = createDialogue("chat")
.setUserMessage("Hey anyone there?")
.setAssistantMessage("Yep! Whats up?")

const history = chatHistory.getHistory()
[
  {
    "role": "user",
    "content": "Hey anyone there?"
  },
  {
    "role": "assistant",
    "content": "Yep! Whats up?"
  }
]
ts
const function_call = {
  name: "get_weather",
  arguments: '{"city": "Cleveland"}',
};
  
const chatHistory = createDialogue("chat")
.setUserMessage("What is the weather in Cleveland?")
.setFunctionCallMessage({ function_call })
.setFunctionMessage('{ "weather": "Cold, rainy" }', "get_weather")
.setAssistantMessage("Looks like normal weather in Cleveland");

const history = chatHistory.getHistory()
[
  {
    "role": "user",
    "content": "What is the weather in Cleveland?"
  },
  {
    "role": "function_call",
    "function_call": {
      "name": "get_weather",
      "arguments": "{\"city\": \"Cleveland\"}"
    },
    "content": null
  },
  {
    "role": "function",
    "name": "get_weather",
    "content": "{ \"weather\": \"Cold, rainy\" }"
  },
  {
    "role": "assistant",
    "content": "Looks like normal weather in Cleveland"
  }
]