@hashgraphonline/conversational-agent
Version:
Hashgraph Online conversational AI agent implementing HCS-10 communication, HCS-2 registries, and content inscription on Hedera
125 lines (124 loc) • 3.64 kB
JavaScript
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 (error) {
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=index12.js.map