8 Commits

Author SHA1 Message Date
Vinlic
66cddd522b 修改日志输出和注意力注入prompt 2024-04-02 23:27:38 +08:00
Vinlic科技
ff59201961 Merge pull request #38 from Yanyutin753/transfer
优化降低传文件上下文混淆问题
2024-04-02 23:17:13 +08:00
Yanyutin753
6853087757 优化降低传文件上下文混淆问题 2024-04-02 23:13:00 +08:00
Yanyutin753
1e09d807e6 打印上传消息日志 2024-04-02 21:15:36 +08:00
Yanyutin753
66067b4dd9 通过添加prompt改善传文件时的上下文问题 2024-04-02 20:54:46 +08:00
Vinlic
1534fbc77a Release 0.0.19 2024-04-01 22:53:18 +08:00
Vinlic科技
1e55571b2d Merge pull request #37 from Yanyutin753/transfer
feat the context transfer files
2024-04-01 22:48:00 +08:00
Yanyutin753
4380d0c05c feat the context transfer files 2024-04-01 22:33:34 +08:00
2 changed files with 60 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "kimi-free-api",
"version": "0.0.18",
"version": "0.0.19",
"description": "Kimi Free API Server",
"type": "module",
"main": "dist/index.js",

View File

@@ -328,9 +328,15 @@ async function fakeRequest(refreshToken: string) {
* @param messages 参考gpt系列消息格式多轮对话请完整提供上下文
*/
function extractRefFileUrls(messages: any[]) {
return messages.reduce((urls, message) => {
if (_.isArray(message.content)) {
message.content.forEach(v => {
const urls = [];
// 如果没有消息,则返回[]
if (!messages.length) {
return urls;
}
// 只获取最新的消息
const lastMessage = messages[messages.length - 1];
if (_.isArray(lastMessage.content)) {
lastMessage.content.forEach(v => {
if (!_.isObject(v) || !['file', 'image_url'].includes(v['type']))
return;
// kimi-free-api支持格式
@@ -341,8 +347,8 @@ function extractRefFileUrls(messages: any[]) {
urls.push(v['image_url']['url']);
});
}
logger.info("本次请求上传:" + urls.length + "个文件");
return urls;
}, []);
}
/**
@@ -356,17 +362,53 @@ function extractRefFileUrls(messages: any[]) {
* @param messages 参考gpt系列消息格式多轮对话请完整提供上下文
*/
function messagesPrepare(messages: any[]) {
const content = messages.reduce((content, message) => {
if (_.isArray(message.content)) {
// 先剔除所有的 base64 数据
let validMessages = messages.map((message) => {
if (Array.isArray(message.content)) {
message.content = message.content.filter(v => {
if (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])) {
// 如果内容是 base64 数据,就剔除
return !util.isBASE64Data(v['url']);
}
// 如果不是 base64 数据,就保留
return true;
});
}
return message;
});
// 检查最新消息是否含有"type": "image_url"或"type": "file",如果有则注入消息
let latestMessage = validMessages[validMessages.length - 1];
let hasFileOrImage = Array.isArray(latestMessage.content)
&& latestMessage.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])));
if (hasFileOrImage) {
let newFileMessage = {
"content": "关注用户最新发送的文件和消息",
"role": "system"
};
validMessages.splice(validMessages.length - 1, 0, newFileMessage);
logger.info("注入提升尾部文件注意力system prompt");
} else {
let newTextMessage = {
"content": "关注用户最新的消息",
"role": "system"
};
validMessages.splice(validMessages.length - 1, 0, newTextMessage);
logger.info("注入提升尾部消息注意力system prompt");
}
const content = validMessages.reduce((content, message) => {
if (Array.isArray(message.content)) {
return message.content.reduce((_content, v) => {
if (!_.isObject(v) || v['type'] != 'text')
return _content;
return _content + (v['text'] || '');
return _content + ('user:' + v['text'] || '') + "\n";
}, content);
}
return content += `${message.role || 'user'}:${wrapUrlsToTags(message.content)}\n`;
}, '');
logger.info("\n对话合并\n" + content);
return [
{ role: 'user', content }
]