|
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, |
|
}; |