Conversation Manager

Conversation Manager 管理多轮对话的状态、Token 预算和自动压缩。

核心组件

TokenTracker

追踪对话的 token 使用情况:

import { TokenTracker } from 'claude-code-sdk-ts'

const tracker = new TokenTracker(100000) // 预算 100K tokens
tracker.addUsage({ inputTokens: 1500, outputTokens: 500 })
console.log(tracker.usage) // { inputTokens: 1500, outputTokens: 500 }
console.log(tracker.remaining) // 98000
console.log(tracker.percentage) // 2

CircularBuffer

固定大小的循环缓冲区,用于管理消息历史:

import { CircularBuffer } from 'claude-code-sdk-ts'

const buffer = new CircularBuffer(100) // 最多 100 条消息
buffer.push({ role: 'user', content: 'Hello' })
buffer.push({ role: 'assistant', content: 'Hi!' })
console.log(buffer.toArray())
// [{ role: 'user', content: 'Hello' }, { role: 'assistant', content: 'Hi!' }]

TokenBudget

自动计算并管理 token 预算:

import { TokenBudget, parseTokenBudget } from 'claude-code-sdk-ts'

// 解析预算字符串
const budget = parseTokenBudget('100K') // { maxTokens: 100000 }
const budget2 = parseTokenBudget('50%') // 按比例

// 获取预算续言消息
const continuation = getBudgetContinuationMessage(budget)

AutoCompactor

当对话接近 token 预算上限时自动压缩历史:

import { AutoCompactor } from 'claude-code-sdk-ts'

const compactor = new AutoCompactor({
  maxTokens: 100000,
  compactThreshold: 0.8,  // 达到 80% 触发压缩
})

// 检查是否需要压缩
if (compactor.shouldCompact(currentTokens)) {
  const summary = await compactor.compact(messages, llmConnector)
  console.log('压缩后摘要:', summary)
}

MicroCompactor

用于更细粒度的消息级压缩:

import { MicroCompactor } from 'claude-code-sdk-ts'

const micro = new MicroCompactor({ maxTokens: 80000 })
const compacted = await micro.compactIfNeeded(messages, currentTokens)

ConversationManager 完整示例

import { ConversationManager, estimateContextTokens } from 'claude-code-sdk-ts'

const manager = new ConversationManager({
  maxTokens: 100000,
  autoCompact: true,
})

// 添加消息
manager.addMessage('user', 'Hello!')
manager.addMessage('assistant', 'Hi! How can I help?')

// 获取当前上下文的预估 token 数
const tokens = estimateContextTokens(manager.getMessages())
console.log(`当前上下文约 ${tokens} tokens`)