UNPKG

@hashgraphonline/conversational-agent

Version:

Hashgraph Online conversational AI agent implementing HCS-10 communication, HCS-2 registries, and content inscription on Hedera. https://hol.org

125 lines (124 loc) 3.63 kB
import { encoding_for_model } from "tiktoken"; const _TokenCounter = class _TokenCounter { constructor(modelName = "gpt-4o") { this.modelName = String(modelName); try { this.encoding = encoding_for_model(modelName); } catch { this.encoding = encoding_for_model("gpt-4o"); this.modelName = "gpt-4o"; } } /** * Count tokens in raw text content * @param text - The text to count tokens for * @returns Number of tokens */ countTokens(text) { if (!text || text.trim() === "") { return 0; } try { const tokens = this.encoding.encode(text); return tokens.length; } catch { return Math.ceil(text.split(/\s+/).length * 1.3); } } /** * Count tokens for a single chat message including role overhead * @param message - The message to count tokens for * @returns Number of tokens including message formatting overhead */ countMessageTokens(message) { const contentTokens = this.countTokens(String(message.content ?? "")); const roleTokens = this.countTokens(this.getMessageRole(message)); return contentTokens + roleTokens + _TokenCounter.MESSAGE_OVERHEAD + _TokenCounter.ROLE_OVERHEAD; } /** * Count tokens for multiple messages * @param messages - Array of messages to count * @returns Total token count for all messages */ countMessagesTokens(messages) { if (!messages || messages.length === 0) { return 0; } let total = 0; for (const message of messages) { total += this.countMessageTokens(message); } return total; } /** * Estimate tokens for system prompt * System prompts have slightly different overhead in chat completions * @param systemPrompt - The system prompt text * @returns Estimated token count */ estimateSystemPromptTokens(systemPrompt) { if (!systemPrompt || systemPrompt.trim() === "") { return 0; } const contentTokens = this.countTokens(systemPrompt); const roleTokens = this.countTokens("system"); return contentTokens + roleTokens + _TokenCounter.MESSAGE_OVERHEAD + _TokenCounter.ROLE_OVERHEAD; } /** * Get total context size estimate including system prompt and messages * @param systemPrompt - System prompt text * @param messages - Conversation messages * @returns Total estimated token count */ estimateContextSize(systemPrompt, messages) { const systemTokens = this.estimateSystemPromptTokens(systemPrompt); const messageTokens = this.countMessagesTokens(messages); const completionOverhead = 10; return systemTokens + messageTokens + completionOverhead; } /** * Get the role string for a message * @param message - The message to get the role for * @returns Role string ('user', 'assistant', 'system', etc.) */ getMessageRole(message) { const messageType = message._getType(); switch (messageType) { case "human": return "user"; case "ai": return "assistant"; case "system": return "system"; case "function": return "function"; case "tool": return "tool"; default: return "user"; } } /** * Get the model name being used for token counting * @returns The tiktoken model name */ getModelName() { return this.modelName; } /** * Clean up encoding resources */ dispose() { try { this.encoding.free(); } catch { } } }; _TokenCounter.MESSAGE_OVERHEAD = 3; _TokenCounter.ROLE_OVERHEAD = 1; let TokenCounter = _TokenCounter; export { TokenCounter }; //# sourceMappingURL=index20.js.map