import { createDecorator } from '#/_base/di/instantiation'; import type { AgentContext } from '#/agent/agentContext/agentContext'; import type { ContextSize, TokenCountingRequest, TokenCountingStrategy, } from '#/agent/tokenCounting/tokenCounting'; import type { Message } from '#/llm-adapter/contract/message'; import type { ToolDescription as Tool } from '#human/llm/message'; import type { TokenUsage } from '#human/llm/usage'; export interface TokenCountingRebaseInput { readonly length: number; readonly tokens: number; readonly measured: boolean; } export interface ISessionTokenCountingService { readonly _serviceBrand: undefined; readonly strategy: TokenCountingStrategy; get(agent: AgentContext, start?: number, end?: number): ContextSize; measured( agent: AgentContext, input: readonly Message[], output: readonly Message[], usage: TokenUsage, ): void; latestMeasured(agent: AgentContext): number; statusSize(agent: AgentContext): number; recordTruncation(agent: AgentContext, cutIndex: number): void; rebase(agent: AgentContext, input: TokenCountingRebaseInput): void; requestSize(request: TokenCountingRequest): number; estimateText(text: string): number; estimateMessage(message: Message): number; estimateMessages(messages: readonly Message[]): number; estimateTools(tools: readonly Tool[]): number; } export const ISessionTokenCountingService = createDecorator('sessionTokenCountingService');