| | const { v4: uuidv4 } = require('uuid'); |
| | const zlib = require('zlib'); |
| | const $root = require('./message.js'); |
| |
|
| | const regex = /<\|BEGIN_SYSTEM\|>.*?<\|END_SYSTEM\|>.*?<\|BEGIN_USER\|>.*?<\|END_USER\|>/s; |
| |
|
| | async function stringToHex(messages, modelName) { |
| | const formattedMessages = messages.map((msg) => ({ |
| | ...msg, |
| | role: msg.role === 'user' ? 1 : 2, |
| | message_id: uuidv4(), |
| | })); |
| |
|
| | const message = { |
| | messages: formattedMessages, |
| | instructions: { |
| | instruction: 'Always respond in 中文', |
| | }, |
| | projectPath: '/path/to/project', |
| | model: { |
| | name: modelName, |
| | empty: '', |
| | }, |
| | requestId: uuidv4(), |
| | summary: '', |
| | conversationId: uuidv4(), |
| | }; |
| | const errMsg = $root.ChatMessage.verify(message); |
| | if (errMsg) throw Error(errMsg); |
| |
|
| | const messageInstance = $root.ChatMessage.create(message); |
| |
|
| | const buffer = $root.ChatMessage.encode(messageInstance).finish(); |
| | const hexString = (buffer.length.toString(16).padStart(10, '0') + buffer.toString('hex')).toUpperCase(); |
| |
|
| | return Buffer.from(hexString, 'hex'); |
| | } |
| |
|
| | async function chunkToUtf8String(chunk) { |
| | try { |
| | let hex = Buffer.from(chunk).toString('hex'); |
| | console.log("debug [42] :", hex) |
| | |
| | let offset = 0; |
| | let results = []; |
| |
|
| | while (offset < hex.length) { |
| | if (offset + 10 > hex.length) break; |
| |
|
| | const dataLength = parseInt(hex.slice(offset, offset + 10), 16); |
| | offset += 10; |
| |
|
| | if (offset + dataLength * 2 > hex.length) break; |
| |
|
| | const messageHex = hex.slice(offset, offset + dataLength * 2); |
| | offset += dataLength * 2; |
| |
|
| | console.log("debug [57] :", messageHex) |
| | const messageBuffer = Buffer.from(messageHex, 'hex'); |
| | const message = $root.ResMessage.decode(messageBuffer); |
| | results.push(message.msg); |
| | } |
| |
|
| | if (results.length == 0) { |
| | console.log("debug [63] :", chunk) |
| | return gunzip(chunk); |
| | } |
| | return results.join(''); |
| | } catch (err) { |
| | console.log("debug [68] :", chunk) |
| | return gunzip(chunk); |
| | } |
| | } |
| |
|
| | function gunzip(chunk) { |
| | return new Promise((resolve, reject) => { |
| | zlib.gunzip(chunk.slice(5), (err, decompressed) => { |
| | if (err) { |
| | resolve(''); |
| | } else { |
| | const text = decompressed.toString('utf-8'); |
| | |
| | if (regex.test(text)) { |
| | resolve(''); |
| | } else { |
| | resolve(text); |
| | } |
| | } |
| | }); |
| | }); |
| | } |
| |
|
| | function getRandomIDPro({ size, dictType, customDict }) { |
| | let random = ''; |
| | if (!customDict) { |
| | switch (dictType) { |
| | case 'alphabet': |
| | customDict = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
| | break; |
| | case 'max': |
| | customDict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-'; |
| | break; |
| | default: |
| | customDict = '0123456789'; |
| | } |
| | } |
| | for (; size--; ) random += customDict[(Math.random() * customDict.length) | 0]; |
| | return random; |
| | } |
| |
|
| | module.exports = { |
| | stringToHex, |
| | chunkToUtf8String, |
| | getRandomIDPro, |
| | }; |