ConversationManager
High-level conversation controller built on top of ArlopassClient. Handles context-window management, summarization, tool calling, and message pinning.
import { ConversationManager } from "@arlopass/web-sdk";
Constructor options
| Prop | Type | Default | Description |
|---|---|---|---|
clientrequired |
ArlopassClient |
— | Connected ArlopassClient instance. |
maxTokens |
number |
— | Context window limit in tokens. Auto-detected from the selected model if omitted. |
reserveOutputTokens |
number |
1024 |
Tokens reserved for the model's response. |
systemPrompt |
string |
— | System prompt prepended to every request. |
summarize |
boolean |
false |
Enable automatic summarization when the context window fills. |
summarizationPrompt |
string |
"Summarize the following conversation concisely…" | Custom prompt used for summarization. |
tools |
ToolDefinition[] |
[] |
Tool definitions the model can call. |
maxToolRounds |
number |
5 |
Maximum consecutive tool-call rounds before returning text. |
primeTools |
boolean |
false |
Enable tool priming for all messages globally. |
hideToolCalls |
boolean |
false |
Strip tool-call markup from responses globally. |
Properties
| Prop | Type | Default | Description |
|---|---|---|---|
maxTokens |
number |
— | Configured context window limit (readonly getter). |
Methods
| Prop | Type | Default | Description |
|---|---|---|---|
send |
(content: string, options?: PinOptions) => Promise<ChatMessage> |
— | Send a user message and receive a complete response. Executes tool calls automatically if handlers are defined. |
stream |
(content: string, options?: PinOptions) => AsyncIterable<ConversationStreamEvent> |
— | Send a user message and stream the response. Yields chunk, done, tool_call, tool_result, and tool_priming_* events. |
addMessage |
(message: ChatMessage, options?: PinOptions) => void |
— | Manually add a message to the conversation history. |
getMessages |
() => readonly ChatMessage[] |
— | Get all messages including the system prompt. |
getContextWindow |
() => readonly ChatMessage[] |
— | Get the messages that would be sent in the next request (after summarization/truncation). |
getTokenCount |
() => number |
— | Estimated total tokens in the current context window. |
getContextInfo |
() => ContextWindowInfo |
— | Returns a snapshot of context window usage: maxTokens, usedTokens, reservedOutputTokens, remainingTokens, and usageRatio (0–1). |
setPin |
(index: number, pinned: boolean) => void |
— | Toggle pin status of a message by index. Pinned messages survive summarization. |
clear |
() => void |
— | Remove all messages from the conversation. |
submitToolResult |
(toolCallId: string, result: string) => void |
— | Submit a result for a manual tool call (tools without a handler). |
PinOptions
Options passed to send, stream, and addMessage.
| Prop | Type | Default | Description |
|---|---|---|---|
pinned |
boolean |
— | Pin the message so it survives context-window summarization. |
primeTools |
boolean |
— | Force tool priming for this message (overrides manager-level setting). |
hideToolCalls |
boolean |
— | Hide tool call markup for this message (overrides manager-level setting). |
ConversationStreamEvent
Discriminated union yielded by stream(). Extends the base ChatStreamEvent with tool and priming events.
type ConversationStreamEvent =
| { type: "chunk"; delta: string; index: number; correlationId: string }
| { type: "done"; correlationId: string }
| {
type: "tool_call";
toolCallId: string;
name: string;
arguments: Record<string, unknown>;
matchRange: { start: number; end: number };
}
| { type: "tool_result"; toolCallId: string; name: string; result: string }
| { type: "tool_priming_start"; message: string }
| { type: "tool_priming_match"; tools: readonly string[] }
| { type: "tool_priming_end" };
ContextWindowInfo
Returned by getContextInfo(). Provides a snapshot of context window usage — useful for building token meters, "context full" warnings, and adaptive UI that responds to how much space is left.
type ContextWindowInfo = Readonly<{
maxTokens: number; // Context window size for the model
usedTokens: number; // Tokens currently in the context window
reservedOutputTokens: number; // Tokens reserved for model output
remainingTokens: number; // Tokens left for new input
usageRatio: number; // 0–1 fraction of input budget used
}>;
Example
const manager = new ConversationManager({
client,
systemPrompt: "You are a helpful assistant.",
tools: [
{ name: "search", description: "Search", handler: async () => "results" },
],
});
// Non-streaming
const reply = await manager.send("What is the weather?");
// Streaming
for await (const event of manager.stream("Tell me more")) {
if (event.type === "chunk") process.stdout.write(event.delta);
if (event.type === "tool_call") console.log("Tool:", event.name);
}
// Context window usage
const info = manager.getContextInfo();
console.log(
`${info.usedTokens}/${info.maxTokens} tokens (${Math.round(info.usageRatio * 100)}%)`,
);
console.log(`${info.remainingTokens} tokens remaining for input`);