cursor / utils.js
wIK5Ez2o's picture
Update utils.js
87b8fba verified
raw
history blame
3.07 kB
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,
};