跳至主要內容

TokenLimiterProcessor

TokenLimiterProcessor 會限制訊息的 token 數量。它可用作輸入、每步輸入及輸出 Processor:

  • 輸入 ProcessorprocessInput):在 agentic loop 開始前篩選歷史訊息,使其符合 context window 限制,並優先保留較近期的訊息
  • 每步輸入 ProcessorprocessInputStep):在多步 Agent Workflow 的每一步修剪訊息,避免 Tool 觸發額外 LLM 呼叫時 token 數量無限增長
  • 輸出 Processor:透過串流或非串流方式限制所產生回應的 token 數量,並提供可設定的策略來處理超出限制的情況

使用範例
使用範例 的直接連結

import { TokenLimiterProcessor } from '@mastra/core/processors'

const processor = new TokenLimiterProcessor({
limit: 1000,
strategy: 'truncate',
countMode: 'cumulative',
})

建構函數參數
建構函數參數 的直接連結

options:

number | Options
可以是代表 token 限制的簡單數值,亦可以是設定選項物件
number | Options

limit:

number
回應所允許的 token 數量上限

encoding?:

TiktokenBPE
可選用的編碼。預設為 gpt-5.1 所使用的 o200k_base

strategy?:

'truncate' | 'abort'
達到 token 限制時採用的策略:'truncate' 會停止發出 chunk,'abort' 會呼叫 abort() 以停止串流

countMode?:

'cumulative' | 'part'
決定從串流開始計算 token,還是只計算目前 part:'cumulative' 會計算從開始起的所有 token,'part' 則只計算目前 part 中的 token

trimMode?:

'best-fit' | 'contiguous'
控制超出 token 限制時修剪訊息的方式:'best-fit' 會盡量保留最多訊息(可能產生間斷),'contiguous' 會在遇到第一則無法容納的訊息時停止,確保對話記錄保留連續的末段

傳回值
傳回值 的直接連結

id:

string
設為 'token-limiter' 的 Processor 識別碼

name?:

string
可選的 Processor 顯示名稱

processInput:

(args: { messages: MastraDBMessage[]; abort: (reason?: string) => never }) => Promise<MastraDBMessage[]>
在 agentic loop 開始前篩選輸入訊息,使其符合 token 限制;優先保留較近期訊息,同時保留系統訊息

processInputStep:

(args: ProcessInputStepArgs) => Promise<void>
在 agentic loop 的每一步(包括 Tool 呼叫的延續步驟)修剪訊息,令對話維持在 token 限制內。它會直接修改 messageList,先移除最舊的訊息,同時保留系統訊息。

processOutputStream:

(args: ProcessOutputStreamArgs) => Promise<ChunkType | null>
處理串流輸出 part,以限制串流期間的 token 數量。只有文字和物件 part 會計入限制並可被扣起;生命週期、推理及 Tool part 一律會通過。

processOutputResult:

(args: { messages: MastraDBMessage[]; abort: (reason?: string) => never }) => Promise<MastraDBMessage[]>
處理最終輸出結果,以限制非串流情況下的 token 數量

getMaxTokens:

() => number
取得 token 數量上限

輸出串流行為
輸出串流行為 的直接連結

用作輸出 Processor 時,只有承載所產生輸出的 part 才會計入限制:text-deltaobject。生命週期 part(例如 step-start)、推理 delta、回應中繼資料及 Tool part(tool-calltool-result)既不會計算,亦不會被扣起,因此 Tool 呼叫總能傳到 agentic loop 並獲執行。

使用預設的 truncate 策略時,Processor 首次扣起輸出,便會在串流中發出暫時性的 data-token-limit-reached part:

for await (const part of stream.fullStream) {
if (part.type === 'data-token-limit-reached') {
console.log('output truncated at', part.data.limit, 'tokens')
}
}

錯誤行為
錯誤行為 的直接連結

用作輸入 Processor(包括 processInputprocessInputStep)時,TokenLimiterProcessor 會在以下情況拋出 TripWire 錯誤:

  • 訊息為空:如果沒有任何訊息可供處理,便會拋出 TripWire,因為你無法在沒有訊息的情況下傳送 LLM 請求。
  • 系統訊息超出限制:如果單是系統訊息已超出 token 限制,便會拋出 TripWire,因為你無法傳送只有系統訊息、而沒有使用者/助理訊息的 LLM 請求。
import { TripWire } from '@mastra/core/agent'

try {
await agent.generate('Hello')
} catch (error) {
if (error instanceof TripWire) {
console.log('Token limit error:', error.message)
}
}

進階使用範例
進階使用範例 的直接連結

用作輸入 Processor(限制 context window)
用作輸入 Processor(限制 context window) 的直接連結

使用 inputProcessors 限制傳送到模型的歷史訊息,有助保持在 context window 限制內:

src/mastra/agents/context-limited-agent.ts
import { Agent } from '@mastra/core/agent'
import { Memory } from '@mastra/memory'
import { TokenLimiterProcessor } from '@mastra/core/processors'

export const agent = new Agent({
id: 'context-limited-agent',
name: 'context-limited-agent',
instructions: 'You are a helpful assistant',
model: 'openai/gpt-5.6-sol',
memory: new Memory({/* ... */}),
inputProcessors: [
new TokenLimiterProcessor({ limit: 4000 }), // Limits historical messages to ~4000 tokens
],
})

用作每步輸入 Processor(限制多步驟的 token 增長)
用作每步輸入 Processor(限制多步驟的 token 增長) 的直接連結

當 Agent 在多個步驟中使用 Tool(例如 maxSteps > 1)時,每一步都會累積之前所有步驟的對話記錄。使用 inputProcessors,亦可限制 agentic loop 每一步的 token 數量。TokenLimiterProcessor 會自動套用於初始輸入及其後每一步:

src/mastra/agents/multi-step-agent.ts
import { Agent } from '@mastra/core/agent'
import { TokenLimiterProcessor } from '@mastra/core/processors'

export const agent = new Agent({
id: 'multi-step-agent',
name: 'multi-step-agent',
instructions: 'You are a helpful research assistant with access to tools',
model: 'openai/gpt-5.6-sol',
inputProcessors: [
new TokenLimiterProcessor({ limit: 8000 }), // Applied at every step
],
})

// Each tool call step will be limited to ~8000 input tokens
const result = await agent.generate('Research this topic using your tools', {
maxSteps: 10,
})

用作輸出 Processor(限制回應長度)
用作輸出 Processor(限制回應長度) 的直接連結

使用 outputProcessors 限制所產生回應的長度:

src/mastra/agents/response-limited-agent.ts
import { Agent } from '@mastra/core/agent'
import { TokenLimiterProcessor } from '@mastra/core/processors'

export const agent = new Agent({
id: 'response-limited-agent',
name: 'response-limited-agent',
instructions: 'You are a helpful assistant',
model: 'openai/gpt-5.6-sol',
outputProcessors: [
new TokenLimiterProcessor({
limit: 1000,
strategy: 'truncate',
countMode: 'cumulative',
}),
],
})