4 Commits

Author SHA1 Message Date
Vinlic
984d724367 Release 0.0.33 2024-04-30 11:54:17 +08:00
Vinlic
889c874264 支持kimi+智能体调用 2024-04-30 11:53:51 +08:00
Vinlic
6105410dd2 Release 0.0.32 2024-04-28 17:54:44 +08:00
Vinlic
01ff5c250a 处理首轮传送文件时导致对话合并问题 2024-04-28 17:54:31 +08:00
4 changed files with 31 additions and 30 deletions

View File

@@ -11,7 +11,7 @@
![](https://img.shields.io/github/forks/llm-red-team/kimi-free-api.svg)
![](https://img.shields.io/docker/pulls/vinlic/kimi-free-api.svg)
支持高速流式输出、支持多轮对话、支持联网搜索、支持长文档解读、支持图像解析零配置部署多路token支持自动清理会话痕迹。
支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持长文档解读、支持图像解析零配置部署多路token支持自动清理会话痕迹。
与ChatGPT接口完全兼容。
@@ -85,6 +85,12 @@ https://udify.app/chat/Po0F6BMJ15q5vu2P
![联网搜索](./doc/example-2.png)
### 智能体对话Demo
此处使用 [翻译通](https://kimi.moonshot.cn/chat/coo6l3pkqq4ri39f36bg) 智能体。
![智能体对话](./doc/example-7.png)
### 长文档解读Demo
![长文档解读](./doc/example-5.png)
@@ -269,7 +275,8 @@ Authorization: Bearer [refresh_token]
请求数据:
```json
{
// 模型名称随意填写如果不希望输出检索过程模型名称请包含silent_search
// model随意填写如果不希望输出检索过程模型名称请包含silent_search
// 如果使用kimi+智能体model请填写智能体ID就是浏览器地址栏上尾部的一串英文+数字20个字符的ID
"model": "kimi",
// 目前多轮对话基于消息合并实现某些场景可能导致能力下降且受单轮最大Token数限制
// 如果您想获得原生的多轮对话体验可以传入首轮消息获得的id来接续上下文注意如果使用这个首轮必须传none否则第二轮会空响应

BIN
doc/example-7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

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

View File

@@ -261,12 +261,8 @@ async function createCompletion(model = MODEL_NAME, messages: any[], refreshToke
userId
} = await acquireToken(refreshToken);
const sendMessages = messagesPrepare(messages, !!refConvId);
console.log(convId, {
messages: sendMessages,
refs,
use_search: useSearch
});
const result = await axios.post(`https://kimi.moonshot.cn/api/chat/${convId}/completion/stream`, {
kimiplus_id: /^[0-9a-z]{20}$/.test(model) ? model : undefined,
messages: sendMessages,
refs,
use_search: useSearch
@@ -343,6 +339,7 @@ async function createCompletionStream(model = MODEL_NAME, messages: any[], refre
} = await acquireToken(refreshToken);
const sendMessages = messagesPrepare(messages, !!refConvId);
const result = await axios.post(`https://kimi.moonshot.cn/api/chat/${convId}/completion/stream`, {
kimiplus_id: /^[0-9a-z]{20}$/.test(model) ? model : undefined,
messages: sendMessages,
refs,
use_search: useSearch
@@ -461,12 +458,25 @@ function extractRefFileUrls(messages: any[]) {
* @param isRefConv 是否为引用会话
*/
function messagesPrepare(messages: any[], isRefConv = false) {
let content;
if (isRefConv || messages.length < 2) {
content = messages.reduce((content, message) => {
if (_.isArray(message.content)) {
return message.content.reduce((_content, v) => {
if (!_.isObject(v) || v['type'] != 'text') return _content;
return _content + `${v["text"] || ""}\n`;
}, content);
}
return content += `${message.role == 'user' ? wrapUrlsToTags(message.content) : message.content}\n`;
}, '')
logger.info("\n透传内容\n" + content);
}
else {
// 注入消息提升注意力
let latestMessage = messages[messages.length - 1];
let hasFileOrImage = Array.isArray(latestMessage.content)
&& latestMessage.content.some(v => (typeof v === 'object' && ['file', 'image_url'].includes(v['type'])));
// 第二轮开始注入system prompt
if (messages.length > 2) {
if (hasFileOrImage) {
let newFileMessage = {
"content": "关注用户最新发送文件和消息",
@@ -482,22 +492,6 @@ function messagesPrepare(messages: any[], isRefConv = false) {
messages.splice(messages.length - 1, 0, newTextMessage);
logger.info("注入提升尾部消息注意力system prompt");
}
}
let content;
if (isRefConv || messages.length < 2) {
content = messages.reduce((content, message) => {
if (_.isArray(message.content)) {
return message.content.reduce((_content, v) => {
if (!_.isObject(v) || v['type'] != 'text') return _content;
return _content + `${v["text"] || ""}\n`;
}, content);
}
return content += `${message.role == 'user' ? wrapUrlsToTags(message.content) : message.content}\n`;
}, '')
logger.info("\n透传内容\n" + content);
}
else {
content = messages.reduce((content, message) => {
if (_.isArray(message.content)) {
return message.content.reduce((_content, v) => {