Spaces:
Running
Running
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, | |
}; |