diff --git a/README.md b/README.md index c726d6c..0029fd2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,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支持,自动清理会话痕迹。 与ChatGPT接口完全兼容。 @@ -15,6 +15,7 @@ * [在线体验](#在线体验) * [效果示例](#效果示例) * [接入准备](#接入准备) + * [多账号接入](#多账号接入) * [Docker部署](#Docker部署) * [Docker-compose部署](#Docker-compose部署) * [原生部署](#原生部署) @@ -69,10 +70,18 @@ https://udify.app/chat/Po0F6BMJ15q5vu2P 从 [kimi.moonshot.cn](https://kimi.moonshot.cn) 获取refresh_token -进入kimi随便发起一个对话,然后F12打开开发者工具,从Application > Local Storage中找到refresh_token的值,这将作为Authorization的Bearer KEY值。 +进入kimi随便发起一个对话,然后F12打开开发者工具,从Application > Local Storage中找到refresh_token的值,这将作为Authorization的Bearer Token值:`Authorization: Bearer TOKEN` ![example0](./doc/example-0.png) +### 多账号接入 + +目前kimi限制普通账号每3小时内只能进行30轮长文本的问答,你可以通过提供多个账号的refresh_token并使用`,`拼接提供: + +`Authorization: Bearer TOKEN1,TOKEN2,TOKEN3` + +每次请求服务会从中挑选一个。 + ## Docker部署 请准备一台具有公网IP的服务器并将8000端口开放。 diff --git a/src/api/controllers/chat.ts b/src/api/controllers/chat.ts index ef83cfb..e798dea 100644 --- a/src/api/controllers/chat.ts +++ b/src/api/controllers/chat.ts @@ -619,8 +619,18 @@ function createTransStream(convId: string, stream: any, endCallback?: Function) return transStream; } +/** + * Token切分 + * + * @param authorization 认证字符串 + */ +function tokenSplit(authorization: string) { + return authorization.replace('Bearer ', '').split(','); +} + export default { createConversation, createCompletion, - createCompletionStream + createCompletionStream, + tokenSplit }; diff --git a/src/api/routes/chat.ts b/src/api/routes/chat.ts index 59a1414..5f2346b 100644 --- a/src/api/routes/chat.ts +++ b/src/api/routes/chat.ts @@ -15,17 +15,19 @@ export default { request .validate('body.messages', _.isArray) .validate('headers.authorization', _.isString) - const token = request.headers.authorization; - const refreshToken = token.replace('Bearer ', ''); + // refresh_token切分 + const tokens = chat.tokenSplit(request.headers.authorization); + // 随机挑选一个refresh_token + const token = _.sample(tokens); const messages = request.body.messages; if (request.body.stream) { - const stream = await chat.createCompletionStream(request.body.messages, refreshToken, request.body.use_search); + const stream = await chat.createCompletionStream(request.body.messages, token, request.body.use_search); return new Response(stream, { type: "text/event-stream" }); } else - return await chat.createCompletion(messages, refreshToken, request.body.use_search); + return await chat.createCompletion(messages, token, request.body.use_search); } }