9 Commits

Author SHA1 Message Date
Vinlic科技
38d59e20fc Merge pull request #141 from Yanyutin753/优化web搜索输出
🦄 优化web搜索输出
2024-10-27 21:12:00 +08:00
Clivia
bc37f56d1f 🦄 优化web搜索输出
🦄 优化web搜索输出
2024-10-27 20:13:20 +08:00
Vinlic
b2ae0554ee Release 0.0.34 2024-07-12 11:02:43 +08:00
Vinlic
399de41b61 补充请求新增项 2024-07-12 11:02:36 +08:00
Vinlic科技
44316372a5 Update README.md 2024-05-15 13:35:10 +08:00
Vinlic科技
fcc2c9f795 Update README.md 2024-05-10 15:52:03 +08:00
Vinlic科技
a626a78553 Update README.md 2024-05-10 15:51:38 +08:00
Vinlic科技
5f2eb803aa Update README.md 2024-05-04 17:06:02 +08:00
Vinlic科技
684aedae1c Update README.md 2024-05-04 17:05:50 +08:00
3 changed files with 35 additions and 12 deletions

View File

@@ -11,11 +11,11 @@
![](https://img.shields.io/github/forks/llm-red-team/kimi-free-api.svg) ![](https://img.shields.io/github/forks/llm-red-team/kimi-free-api.svg)
![](https://img.shields.io/docker/pulls/vinlic/kimi-free-api.svg) ![](https://img.shields.io/docker/pulls/vinlic/kimi-free-api.svg)
支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持长文档解读、支持图像解析零配置部署多路token支持自动清理会话痕迹。 支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持长文档解读、支持图像OCR零配置部署多路token支持自动清理会话痕迹。
与ChatGPT接口完全兼容。 与ChatGPT接口完全兼容。
还有以下个free-api欢迎关注 还有以下个free-api欢迎关注
阶跃星辰 (跃问StepChat) 接口转API [step-free-api](https://github.com/LLM-Red-Team/step-free-api) 阶跃星辰 (跃问StepChat) 接口转API [step-free-api](https://github.com/LLM-Red-Team/step-free-api)
@@ -27,6 +27,10 @@
讯飞星火Spark接口转API [spark-free-api](https://github.com/LLM-Red-Team/spark-free-api) 讯飞星火Spark接口转API [spark-free-api](https://github.com/LLM-Red-Team/spark-free-api)
MiniMax海螺AI接口转API [hailuo-free-api](https://github.com/LLM-Red-Team/hailuo-free-api)
深度求索DeepSeek接口转API [deepseek-free-api](https://github.com/LLM-Red-Team/deepseek-free-api)
聆心智能 (Emohaa) 接口转API [emohaa-free-api](https://github.com/LLM-Red-Team/emohaa-free-api) 聆心智能 (Emohaa) 接口转API [emohaa-free-api](https://github.com/LLM-Red-Team/emohaa-free-api)
## 目录 ## 目录
@@ -95,7 +99,7 @@ https://udify.app/chat/Po0F6BMJ15q5vu2P
![长文档解读](./doc/example-5.png) ![长文档解读](./doc/example-5.png)
### 图像解析Demo ### 图像OCR Demo
![图像解析](./doc/example-3.png) ![图像解析](./doc/example-3.png)
@@ -384,7 +388,7 @@ Authorization: Bearer [refresh_token]
} }
``` ```
### 图像解析 ### 图像OCR
提供一个可访问的图像URL或者BASE64_URL进行解析。 提供一个可访问的图像URL或者BASE64_URL进行解析。

View File

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

View File

@@ -137,6 +137,7 @@ async function getUserInfo(accessToken: string, refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: 'https://kimi.moonshot.cn/', Referer: 'https://kimi.moonshot.cn/',
'X-Msh-Platform': 'web',
'X-Traffic-Id': `7${util.generateRandomString({ length: 18, charset: 'numeric' })}`, 'X-Traffic-Id': `7${util.generateRandomString({ length: 18, charset: 'numeric' })}`,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -153,18 +154,21 @@ async function getUserInfo(accessToken: string, refreshToken: string) {
* *
* @param refreshToken 用于刷新access_token的refresh_token * @param refreshToken 用于刷新access_token的refresh_token
*/ */
async function createConversation(name: string, refreshToken: string) { async function createConversation(model: string, name: string, refreshToken: string) {
const { const {
accessToken, accessToken,
userId userId
} = await acquireToken(refreshToken); } = await acquireToken(refreshToken);
const result = await axios.post('https://kimi.moonshot.cn/api/chat', { const result = await axios.post('https://kimi.moonshot.cn/api/chat', {
born_from: '',
is_example: false, is_example: false,
kimiplus_id: /^[0-9a-z]{20}$/.test(model) ? model : 'kimi',
name name
}, { }, {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: 'https://kimi.moonshot.cn/', Referer: 'https://kimi.moonshot.cn/',
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -193,6 +197,7 @@ async function removeConversation(convId: string, refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/chat/${convId}`, Referer: `https://kimi.moonshot.cn/chat/${convId}`,
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -221,6 +226,7 @@ async function promptSnippetSubmit(query: string, refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: 'https://kimi.moonshot.cn/', Referer: 'https://kimi.moonshot.cn/',
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -253,7 +259,7 @@ async function createCompletion(model = MODEL_NAME, messages: any[], refreshToke
.catch(err => logger.error(err)); .catch(err => logger.error(err));
// 创建会话 // 创建会话
const convId = /[0-9a-zA-Z]{20}/.test(refConvId) ? refConvId : await createConversation("未命名会话", refreshToken); const convId = /[0-9a-zA-Z]{20}/.test(refConvId) ? refConvId : await createConversation(model, "未命名会话", refreshToken);
// 请求流 // 请求流
const { const {
@@ -262,15 +268,17 @@ async function createCompletion(model = MODEL_NAME, messages: any[], refreshToke
} = await acquireToken(refreshToken); } = await acquireToken(refreshToken);
const sendMessages = messagesPrepare(messages, !!refConvId); const sendMessages = messagesPrepare(messages, !!refConvId);
const result = await axios.post(`https://kimi.moonshot.cn/api/chat/${convId}/completion/stream`, { const result = await axios.post(`https://kimi.moonshot.cn/api/chat/${convId}/completion/stream`, {
kimiplus_id: /^[0-9a-z]{20}$/.test(model) ? model : undefined, kimiplus_id: /^[0-9a-z]{20}$/.test(model) ? model : 'kimi',
messages: sendMessages, messages: sendMessages,
refs, refs,
is_pro_search: false,
use_search: useSearch use_search: useSearch
}, { }, {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/chat/${convId}`, Referer: `https://kimi.moonshot.cn/chat/${convId}`,
'Priority': 'u=1, i', 'Priority': 'u=1, i',
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -330,7 +338,7 @@ async function createCompletionStream(model = MODEL_NAME, messages: any[], refre
.catch(err => logger.error(err)); .catch(err => logger.error(err));
// 创建会话 // 创建会话
const convId = /[0-9a-zA-Z]{20}/.test(refConvId) ? refConvId : await createConversation("未命名会话", refreshToken); const convId = /[0-9a-zA-Z]{20}/.test(refConvId) ? refConvId : await createConversation(model, "未命名会话", refreshToken);
// 请求流 // 请求流
const { const {
@@ -350,6 +358,7 @@ async function createCompletionStream(model = MODEL_NAME, messages: any[], refre
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/chat/${convId}`, Referer: `https://kimi.moonshot.cn/chat/${convId}`,
'Priority': 'u=1, i', 'Priority': 'u=1, i',
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -397,6 +406,7 @@ async function fakeRequest(refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/`, Referer: `https://kimi.moonshot.cn/`,
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
} }
@@ -539,6 +549,7 @@ async function preSignUrl(filename: string, refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/`, Referer: `https://kimi.moonshot.cn/`,
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -624,6 +635,7 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
'Content-Type': mimeType, 'Content-Type': mimeType,
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/`, Referer: `https://kimi.moonshot.cn/`,
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
}, },
@@ -645,6 +657,7 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/`, Referer: `https://kimi.moonshot.cn/`,
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
} }
@@ -666,6 +679,7 @@ async function uploadFile(fileUrl: string, refreshToken: string) {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
Referer: `https://kimi.moonshot.cn/`, Referer: `https://kimi.moonshot.cn/`,
'X-Msh-Platform': 'web',
'X-Traffic-Id': userId, 'X-Traffic-Id': userId,
...FAKE_HEADERS ...FAKE_HEADERS
} }
@@ -709,6 +723,7 @@ function checkResult(result: AxiosResponse, refreshToken: string) {
* @param stream 消息流 * @param stream 消息流
*/ */
async function receiveStream(model: string, convId: string, stream: any) { async function receiveStream(model: string, convId: string, stream: any) {
let webSearchCount = 0;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
// 消息初始化 // 消息初始化
const data = { const data = {
@@ -742,8 +757,10 @@ async function receiveStream(model: string, convId: string, stream: any) {
resolve(data); resolve(data);
} }
// 处理联网搜索 // 处理联网搜索
else if (!silentSearch && result.event == 'search_plus' && result.msg && result.msg.type == 'get_res') else if (!silentSearch && result.event == 'search_plus' && result.msg && result.msg.type == 'get_res'){
refContent += `${result.msg.title} - ${result.msg.url}\n`; webSearchCount += 1;
refContent += `【检索 ${webSearchCount}】 [${result.msg.title}](${result.msg.url})\n\n`;
}
// else // else
// logger.warn(result.event, result); // logger.warn(result.event, result);
} }
@@ -774,6 +791,7 @@ function createTransStream(model: string, convId: string, stream: any, endCallba
const created = util.unixTimestamp(); const created = util.unixTimestamp();
// 创建转换流 // 创建转换流
const transStream = new PassThrough(); const transStream = new PassThrough();
let webSearchCount = 0;
let searchFlag = false; let searchFlag = false;
const silentSearch = model.indexOf('silent_search') != -1; const silentSearch = model.indexOf('silent_search') != -1;
!transStream.closed && transStream.write(`data: ${JSON.stringify({ !transStream.closed && transStream.write(`data: ${JSON.stringify({
@@ -833,6 +851,7 @@ function createTransStream(model: string, convId: string, stream: any, endCallba
else if (!silentSearch && result.event == 'search_plus' && result.msg && result.msg.type == 'get_res') { else if (!silentSearch && result.event == 'search_plus' && result.msg && result.msg.type == 'get_res') {
if (!searchFlag) if (!searchFlag)
searchFlag = true; searchFlag = true;
webSearchCount += 1;
const data = `data: ${JSON.stringify({ const data = `data: ${JSON.stringify({
id: convId, id: convId,
model, model,
@@ -840,7 +859,7 @@ function createTransStream(model: string, convId: string, stream: any, endCallba
choices: [ choices: [
{ {
index: 0, delta: { index: 0, delta: {
content: `检索 ${result.msg.title} - ${result.msg.url} ...\n` content: `检索 ${webSearchCount}】 [${result.msg.title}](${result.msg.url})\n`
}, finish_reason: null }, finish_reason: null
} }
], ],