Skip to content

Conversation ​

The conversation is the message history maintained by the server. After connect(), the client mirrors it locally and keeps it in sync as new messages arrive.

Reading ​

ts
client.getConversation();            // Conversation | null — metadata
client.getConversationMessages();    // ConversationMessage[] — copy

getConversationMessages() returns a copy — mutating the array has no effect on the client's internal state. getConversation() returns the live metadata object, so treat it as read-only and use the setters or events if you need to change something.

Sending a message ​

ts
await client.engageAutopilot('What is the weather in Berlin?');

This is the high-level entry point: post the message and let the autopilot take over (the server returns immediately, the streamed reply arrives over the socket).

For more control:

ts
await client.interactWithConversation({
  role: 'user',
  message: 'hello',
  // …any payload your server accepts
});

engageAutopilot is a thin wrapper around interactWithConversation that adds async: true.

Mutating local state directly ​

ts
client.addConversationMessage({
  role: 'assistant',
  creator: 'autopilot',
  message: 'Optimistic local update',
});

client.updateConversationMessage(0, { /* … */ });
client.clearConversationMessages();

These do not round-trip to the server — they only update the local store. Useful for optimistic UI; use sparingly.

Resetting ​

ts
await client.resetConversation();

Asks the server to wipe the conversation. The client clears its local copy when the server confirms.

Re-fetching ​

ts
const fresh = await client.fetchConversation(
  'https://llmor.example.com/v1/conversations/<token>',
);

Performs the same HTTP fetch as connect() does internally, without touching the socket. Mostly useful for tools and inspection.

Re-syncing from the socket ​

ts
client.requestConversationState();

Asks the server to re-send its current snapshot. The client emits conversationLoaded when it arrives.

Events you can listen to ​

ts
client.on('conversationLoaded', ({ conversation, messages }) => { /* … */ });
client.on('messageAdded', ({ message, index }) => { /* … */ });
client.on('messageUpdated', ({ message, index }) => { /* … */ });
client.on('conversationCleared', () => { /* … */ });

For streaming progress on the next assistant message (chunks arriving in real time), see Streaming.

Enriching messages for display ​

The server represents a tool result as a separate tool message whose function_response is the id of the call it answers. To render a call together with its result, pair them with the exported helper:

ts
import { enrichMessagesWithFunctionResults } from '@llmor/autopilot-core';

const enriched = enrichMessagesWithFunctionResults(messages);
// assistant messages now carry the result on each function_calls[] entry,
// with status flipped to 'completed' once a result is present.

It is pure and non-mutating (the inputs are untouched). The Vue store's visibleMessages uses it for you, so you only need it when rendering messages without the store.