* 计算消息数组的token数量 * @param {Array} messages - 消息数组 * @param {string} model - 模型名称 * @returns {number} 总token数量
(messages, model = 'gpt-3.5-turbo')
| 29 | * @param {string} model - 模型名称 |
| 30 | * @returns {number} 总token数量 |
| 31 | */ |
| 32 | function countMessagesTokens(messages, model = 'gpt-3.5-turbo') { |
| 33 | if (!Array.isArray(messages)) return 0 |
| 34 | |
| 35 | let totalTokens = 0 |
| 36 | |
| 37 | // 每条消息的基础开销(根据OpenAI文档) |
| 38 | const messageOverhead = 4 // 每条消息约4个token的格式开销 |
| 39 | |
| 40 | for (const message of messages) { |
| 41 | totalTokens += messageOverhead |
| 42 | |
| 43 | // 角色token |
| 44 | if (message.role) { |
| 45 | totalTokens += countTokens(message.role, model) |
| 46 | } |
| 47 | |
| 48 | // 内容token |
| 49 | if (typeof message.content === 'string') { |
| 50 | totalTokens += countTokens(message.content, model) |
| 51 | } else if (Array.isArray(message.content)) { |
| 52 | for (const item of message.content) { |
| 53 | if (item.text) { |
| 54 | totalTokens += countTokens(item.text, model) |
| 55 | } |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | // 函数调用等其他字段的token计算 |
| 60 | if (message.function_call) { |
| 61 | totalTokens += countTokens(JSON.stringify(message.function_call), model) |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | // 对话的额外开销 |
| 66 | totalTokens += 2 // 对话开始和结束的token |
| 67 | |
| 68 | return totalTokens |
| 69 | } |
| 70 | |
| 71 | /** |
no test coverage detected