8 Commits
0.0.2 ... 0.0.5

Author SHA1 Message Date
Vinlic
cc0ea384a7 修复url解析 2024-03-10 14:42:34 +08:00
Vinlic
6284628d99 修复多轮对话 2024-03-09 16:48:25 +08:00
Vinlic
399242b09e Release 0.0.3 2024-03-09 15:37:07 +08:00
Vinlic
d13ba31d0e 修复问题 2024-03-09 15:36:42 +08:00
Vinlic
c8c215448f update README 2024-03-09 15:17:22 +08:00
Vinlic
f3dae64a4c update README 2024-03-09 15:15:16 +08:00
Vinlic
376c48e8e5 update README 2024-03-09 15:13:46 +08:00
Vinlic
8c4c6408ba update README 2024-03-09 15:12:29 +08:00
5 changed files with 23 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
# KIMI Free 服务
# KIMI AI Free 服务
## 声明
@@ -10,13 +10,16 @@
## 在线体验
此链接仅临时测试功能,不可长期使用,长期使用请自行部署
此链接仅临时测试功能,不可长期使用,长期使用请自行部署
https://udify.app/chat/Po0F6BMJ15q5vu2P
![example1](./doc/example-1.png)
![example2](./doc/example-2.png)
## 接入准备
从kimi获取refresh_token进入kimi随便发起一个对话然后F12打开开发者工具从Application > Local Storage中找到refresh_token的值这将作为API_KEY。
[kimi.moonshot.cn](https://kimi.moonshot.cn) 获取refresh_token进入kimi随便发起一个对话然后F12打开开发者工具从Application > Local Storage中找到refresh_token的值这将作为API_KEY。
## 安装

BIN
doc/example-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
doc/example-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

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

View File

@@ -85,7 +85,7 @@ async function createCompletion(messages: any[], refreshToken: string, useSearch
const convId = await createConversation(`cmpl-${util.uuid(false)}`, refreshToken);
const token = await acquireToken(refreshToken);
const result = await axios.post(`https://kimi.moonshot.cn/api/chat/${convId}/completion/stream`, {
messages,
messages: messagesPrepare(messages),
use_search: useSearch
}, {
headers: {
@@ -107,7 +107,7 @@ async function createCompletionStream(messages: any[], refreshToken: string, use
const convId = await createConversation(`cmpl-${util.uuid(false)}`, refreshToken);
const token = await acquireToken(refreshToken);
const result = await axios.post(`https://kimi.moonshot.cn/api/chat/${convId}/completion/stream`, {
messages,
messages: messagesPrepare(messages),
use_search: useSearch
}, {
headers: {
@@ -124,6 +124,19 @@ async function createCompletionStream(messages: any[], refreshToken: string, use
});
}
function messagesPrepare(messages: any[]) {
const content = messages.reduce((content, message) => {
return content += `${message.role || 'user'}:${wrapUrlsToTags(message.content)}\n`;
}, '');
return [
{ role: 'user', content }
]
}
function wrapUrlsToTags(content: string) {
return content.replace(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi, url => `<url id="" type="url" status="" title="" wc="">${url}</url>`);
}
function checkResult(result: AxiosResponse, refreshToken: string) {
if(result.status == 401) {
accessTokenMap.delete(refreshToken);
@@ -161,7 +174,7 @@ async function receiveStream(convId: string, stream: any) {
data.choices[0].message.content += result.text;
}
else if (result.event == 'all_done' || result.event == 'error') {
data.choices[0].message.content += '\n[内容由于不合规被停止生成,我们换个话题吧]' + (refContent ? `\n\n搜索结果来自\n${refContent}` : '');
data.choices[0].message.content += (result.event == 'error' ? '\n[内容由于不合规被停止生成,我们换个话题吧]' : '') + (refContent ? `\n\n搜索结果来自\n${refContent}` : '');
refContent = '';
resolve(data);
}