Giter Site home page Giter Site logo

llm-red-team / kimi-free-api Goto Github PK

View Code? Open in Web Editor NEW
2.9K 24.0 426.0 1.14 MB

🚀 KIMI AI 长文本大模型逆向API白嫖测试【特长:长文本解读整理】,支持高速流式输出、智能体对话、联网搜索、长文档解读、图像OCR、多轮对话,零配置部署,多路token支持,自动清理会话痕迹。

Home Page: https://udify.app/chat/Po0F6BMJ15q5vu2P

License: GNU General Public License v3.0

TypeScript 99.25% Dockerfile 0.48% HTML 0.27%
chatbot chatgpt-api kimi-ai llm moonshot kimi-api chat-api

kimi-free-api's Introduction

KIMI AI Free 服务


[ 中文 | English ]

支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持长文档解读、支持图像OCR,零配置部署,多路token支持,自动清理会话痕迹。

与ChatGPT接口完全兼容。

还有以下七个free-api欢迎关注:

阶跃星辰 (跃问StepChat) 接口转API step-free-api

阿里通义 (Qwen) 接口转API qwen-free-api

智谱AI (智谱清言) 接口转API glm-free-api

秘塔AI (Metaso) 接口转API metaso-free-api

讯飞星火(Spark)接口转API spark-free-api

MiniMax(海螺AI)接口转API hailuo-free-api

聆心智能 (Emohaa) 接口转API emohaa-free-api

目录

免责声明

逆向API是不稳定的,建议前往MoonshotAI官方 https://platform.moonshot.cn/ 付费使用API,避免封禁的风险。

本组织和个人不接受任何资金捐助和交易,此项目是纯粹研究交流学习性质!

仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!

仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!

仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!

在线体验

此链接仅临时测试功能,不可长期使用,长期使用请自行部署。

https://udify.app/chat/Po0F6BMJ15q5vu2P

效果示例

验明正身Demo

验明正身

多轮对话Demo

多轮对话

联网搜索Demo

联网搜索

智能体对话Demo

此处使用 翻译通 智能体。

智能体对话

长文档解读Demo

长文档解读

图像OCR Demo

图像解析

响应流畅度一致

响应流畅度一致

接入准备

kimi.moonshot.cn 获取refresh_token

进入kimi随便发起一个对话,然后F12打开开发者工具,从Application > Local Storage中找到refresh_token的值,这将作为Authorization的Bearer Token值:Authorization: Bearer TOKEN

example0

如果你看到的refresh_token是一个数组,请使用.拼接起来再使用。

example8

多账号接入

目前kimi限制普通账号每3小时内只能进行30轮长文本的问答(短文本不限),你可以通过提供多个账号的refresh_token并使用,拼接提供:

Authorization: Bearer TOKEN1,TOKEN2,TOKEN3

每次请求服务会从中挑选一个。

Docker部署

请准备一台具有公网IP的服务器并将8000端口开放。

拉取镜像并启动服务

docker run -it -d --init --name kimi-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/kimi-free-api:latest

查看服务实时日志

docker logs -f kimi-free-api

重启服务

docker restart kimi-free-api

停止服务

docker stop kimi-free-api

Docker-compose部署

version: '3'

services:
  kimi-free-api:
    container_name: kimi-free-api
    image: vinlic/kimi-free-api:latest
    restart: always
    ports:
      - "8000:8000"
    environment:
      - TZ=Asia/Shanghai

Render部署

注意:部分部署区域可能无法连接kimi,如容器日志出现请求超时或无法连接(新加坡实测不可用)请切换其他区域部署! 注意:免费账户的容器实例将在一段时间不活动时自动停止运行,这会导致下次请求时遇到50秒或更长的延迟,建议查看Render容器保活

  1. fork本项目到你的github账号下。

  2. 访问 Render 并登录你的github账号。

  3. 构建你的 Web Service(New+ -> Build and deploy from a Git repository -> Connect你fork的项目 -> 选择部署区域 -> 选择实例类型为Free -> Create Web Service)。

  4. 等待构建完成后,复制分配的域名并拼接URL访问即可。

Vercel部署

注意:Vercel免费账户的请求响应超时时间为10秒,但接口响应通常较久,可能会遇到Vercel返回的504超时错误!

请先确保安装了Node.js环境。

npm i -g vercel --registry http://registry.npmmirror.com
vercel login
git clone https://github.com/LLM-Red-Team/kimi-free-api
cd kimi-free-api
vercel --prod

Zeabur部署

注意:免费账户的容器实例可能无法稳定运行

Deploy on Zeabur

原生部署

请准备一台具有公网IP的服务器并将8000端口开放。

请先安装好Node.js环境并且配置好环境变量,确认node命令可用。

安装依赖

npm i

安装PM2进行进程守护

npm i -g pm2

编译构建,看到dist目录就是构建完成

npm run build

启动服务

pm2 start dist/index.js --name "kimi-free-api"

查看服务实时日志

pm2 logs kimi-free-api

重启服务

pm2 reload kimi-free-api

停止服务

pm2 stop kimi-free-api

推荐使用客户端

使用以下二次开发客户端接入free-api系列项目更快更简单,支持文档/图像上传!

Clivia 二次开发的LobeChat https://github.com/Yanyutin753/lobe-chat

时光@ 二次开发的ChatGPT Web https://github.com/SuYxh/chatgpt-web-sea

接口列表

目前支持与openai兼容的 /v1/chat/completions 接口,可自行使用与openai或其他兼容的客户端接入接口,或者使用 dify 等线上服务接入使用。

对话补全

对话补全接口,与openai的 chat-completions-api 兼容。

POST /v1/chat/completions

header 需要设置 Authorization 头部:

Authorization: Bearer [refresh_token]

请求数据:

{
    // model随意填写,如果不希望输出检索过程模型名称请包含silent_search
    // 如果使用kimi+智能体,model请填写智能体ID,就是浏览器地址栏上尾部的一串英文+数字20个字符的ID
    "model": "kimi",
    // 目前多轮对话基于消息合并实现,某些场景可能导致能力下降且受单轮最大Token数限制
    // 如果您想获得原生的多轮对话体验,可以传入首轮消息获得的id,来接续上下文,注意如果使用这个,首轮必须传none,否则第二轮会空响应!
    // "conversation_id": "cnndivilnl96vah411dg",
    "messages": [
        {
            "role": "user",
            "content": "测试"
        }
    ],
    // 是否开启联网搜索,默认false
    "use_search": true,
    // 如果使用SSE流请设置为true,默认false
    "stream": false
}

响应数据:

{
    // 如果想获得原生多轮对话体验,此id,你可以传入到下一轮对话的conversation_id来接续上下文
    "id": "cnndivilnl96vah411dg",
    "model": "kimi",
    "object": "chat.completion",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "你好!我是Kimi,由月之暗面科技有限公司开发的人工智能助手。我擅长中英文对话,可以帮助你获取信息、解答疑问,还能阅读和理解你提供的文件和网页内容。如果你有任何问题或需要帮助,随时告诉我!"
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 2
    },
    "created": 1710152062
}

文档解读

提供一个可访问的文件URL或者BASE64_URL进行解析。

POST /v1/chat/completions

header 需要设置 Authorization 头部:

Authorization: Bearer [refresh_token]

请求数据:

{
    // 模型名称随意填写,如果不希望输出检索过程模型名称请包含silent_search
    "model": "kimi",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "file",
                    "file_url": {
                        "url": "https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf"
                    }
                },
                {
                    "type": "text",
                    "text": "文档里说了什么?"
                }
            ]
        }
    ],
    // 建议关闭联网搜索,防止干扰解读结果
    "use_search": false
}

响应数据:

{
    "id": "cnmuo7mcp7f9hjcmihn0",
    "model": "kimi",
    "object": "chat.completion",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "文档中包含了几个古代魔法咒语的例子,这些咒语来自古希腊和罗马时期的魔法文本,被称为PGM(Papyri Graecae Magicae)。以下是文档中提到的几个咒语的内容:\n\n1. 第一个咒语(PMG 4.1390 – 1495)描述了一个仪式,要求留下一些你吃剩的面包,将其分成七块小片,然后去到英雄、角斗士和那些死于非命的人被杀的地方。对面包片念咒并扔出去,然后从仪式地点捡起一些被污染的泥土扔进你心仪的女人的家中,之后去睡觉。咒语的内容是向命运女神(Moirai)、罗马的命运女神(Fates)和自然力量(Daemons)祈求,希望他们帮助实现愿望。\n\n2. 第二个咒语(PMG 4.1342 – 57)是一个召唤咒语,通过念出一系列神秘的名字和词语来召唤一个名为Daemon的存在,以使一个名为Tereous的人(由Apia所生)受到精神和情感上的折磨,直到她来到施法者Didymos(由Taipiam所生)的身边。\n\n3. 第三个咒语(PGM 4.1265 – 74)提到了一个名为NEPHERIĒRI的神秘名字,这个名字与爱神阿佛洛狄忒(Aphrodite)有关。为了赢得一个美丽女人的心,需要保持三天的纯洁,献上乳香,并在献祭时念出这个名字。然后,在接近那位女士时,心中默念这个名字七次,连续七天这样做,以期成功。\n\n4. 第四个咒语(PGM 4.1496 – 1)描述了在燃烧没药(myrrh)时念诵的咒语。这个咒语是向没药祈祷,希望它能够像“肉食者”和“心灵点燃者”一样,吸引一个名为[名字]的女人(她的母亲名为[名字]),让她无法安坐、饮食、注视或亲吻其他人,而是让她的心中只有施法者,直到她来到施法者身边。\n\n这些咒语反映了古代人们对魔法和超自然力量的信仰,以及他们试图通过这些咒语来影响他人情感和行为的方式。"
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 2
    },
    "created": 100920
}

图像OCR

提供一个可访问的图像URL或者BASE64_URL进行解析。

此格式兼容 gpt-4-vision-preview API格式,您也可以用这个格式传送文档进行解析。

POST /v1/chat/completions

header 需要设置 Authorization 头部:

Authorization: Bearer [refresh_token]

请求数据:

{
    // 模型名称随意填写,如果不希望输出检索过程模型名称请包含silent_search
    "model": "kimi",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://www.moonshot.cn/assets/logo/normal-dark.png"
                    }
                },
                {
                    "type": "text",
                    "text": "图像描述了什么?"
                }
            ]
        }
    ],
    // 建议关闭联网搜索,防止干扰解读结果
    "use_search": false
}

响应数据:

{
    "id": "cnn6l8ilnl92l36tu8ag",
    "model": "kimi",
    "object": "chat.completion",
    "choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "图像中展示了“Moonshot AI”的字样,这可能是月之暗面科技有限公司(Moonshot AI)的标志或者品牌标识。通常这样的图像用于代表公司或产品,传达品牌信息。由于图像是PNG格式,它可能是一个透明背景的logo,用于网站、应用程序或其他视觉材料中。"
            },
            "finish_reason": "stop"
        }
    ],
    "usage": {
        "prompt_tokens": 1,
        "completion_tokens": 1,
        "total_tokens": 2
    },
    "created": 1710123627
}

refresh_token存活检测

检测refresh_token是否存活,如果存活live为true,否则为false,请不要频繁(小于10分钟)调用此接口。

POST /token/check

请求数据:

{
    "token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..."
}

响应数据:

{
    "live": true
}

注意事项

Nginx反代优化

如果您正在使用Nginx反向代理kimi-free-api,请添加以下配置项优化流的输出效果,优化体验感。

# 关闭代理缓冲。当设置为off时,Nginx会立即将客户端请求发送到后端服务器,并立即将从后端服务器接收到的响应发送回客户端。
proxy_buffering off;
# 启用分块传输编码。分块传输编码允许服务器为动态生成的内容分块发送数据,而不需要预先知道内容的大小。
chunked_transfer_encoding on;
# 开启TCP_NOPUSH,这告诉Nginx在数据包发送到客户端之前,尽可能地发送数据。这通常在sendfile使用时配合使用,可以提高网络效率。
tcp_nopush on;
# 开启TCP_NODELAY,这告诉Nginx不延迟发送数据,立即发送小数据包。在某些情况下,这可以减少网络的延迟。
tcp_nodelay on;
# 设置保持连接的超时时间,这里设置为120秒。如果在这段时间内,客户端和服务器之间没有进一步的通信,连接将被关闭。
keepalive_timeout 120;

Token统计

由于推理侧不在kimi-free-api,因此token不可统计,将以固定数字返回!!!!!

Star History

Star History Chart

kimi-free-api's People

Contributors

khazic avatar kpcofgs avatar michaelyuhe avatar peanut996 avatar vinlic avatar xunjunyin avatar yanyutin753 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kimi-free-api's Issues

账号达到限制频率

作者您好,我在本地使用docker部署后,经过100轮的长对话后,提示
WechatIMG875
我该如何操作

[请求glm失败]: bad request

curl --location 'http://localhost:8000/v1/chat/completions'
--header 'Authorization: Bearer eyJhbGciOiJIUxxxxxx'
--header 'Content-Type: application/json'
--data '{
"model": "kimi",
"messages": [
{
"role": "user",
"content": [
{
"type": "file",
"file_url": {
"url": "https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf"
}
},
{
"type": "text",
"text": "文档里说了什么?"
}
]
}
],
"use_search": false
}'

响应结果:
{
"code": -2001,
"message": "[请求glm失败]: bad request",
"data": null
}

docker部署后使用非流式访问报错

佬,用docker部署之后使用非流式访问会报错,报错日志为

`

�[96m[2024-03-30 17:08:29.653][info][index<1203,20>] [ { role: 'system', prompt: 'hi' } ]�[39m

�[96m[2024-03-30 17:08:29.656][info][index<1119,18>] Refresh token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.省略...�[39m

�[32m[2024-03-30 17:08:30.354][success][index<1144,20>] Refresh successful�[39m

�[91m[2024-03-30 17:08:30.592][error][index<1230,22>] Stream response error: Cannot read properties of undefined (reading 'replace')�[39m

�[93m[2024-03-30 17:08:30.593][warning][index<1231,22>] Try again after 5s...�[39m

�[96m[2024-03-30 17:08:35.594][info][index<1203,20>] [ { role: 'system', prompt: 'hi' } ]�[39m

�[91m[2024-03-30 17:08:36.290][error][index<1230,22>] Stream response error: Cannot read properties of undefined (reading 'replace')�[39m

�[93m[2024-03-30 17:08:36.291][warning][index<1231,22>] Try again after 5s...�[39m

�[96m[2024-03-30 17:08:41.291][info][index<1203,20>] [ { role: 'system', prompt: 'hi' } ]�[39m

�[91m[2024-03-30 17:08:42.616][error][index<1230,22>] Stream response error: Cannot read properties of undefined (reading 'replace')�[39m

�[93m[2024-03-30 17:08:42.617][warning][index<1231,22>] Try again after 5s...�[39m

�[96m[2024-03-30 17:08:47.617][info][index<1203,20>] [ { role: 'system', prompt: 'hi' } ]�[39m

�[91m[2024-03-30 17:08:48.344][error][index<1032,28>] TypeError: Cannot read properties of undefined (reading 'replace')

    at wrapUrlsToTags (file:///dist/index.js:1311:18)

    at file:///dist/index.js:1303:53

    at Array.reduce (<anonymous>)

    at messagesPrepare (file:///dist/index.js:1295:28)

    at file:///dist/index.js:1209:17

    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

    at async /completions (file:///dist/index.js:1586:16)�[39m

�[96m[2024-03-30 17:08:48.347][info][index<985,30>] <- POST /v1/chat/completions 18698ms�[39m

`

请问佬,您部署的会出现这个问题嘛? 还是我哪里部署错了

作者大大,由于上传文件较大,可以调高这个值吗

        this.requestBody = Object.assign(requestBody || {}, {
            enableTypes: ['json', 'form', 'text', 'xml'],
            encoding: 'utf-8',
            formLimit: '10mb',
            jsonLimit: '10mb',
            textLimit: '10mb',
            xmlLimit: '10mb',
            formidable: {
                maxFileSize: '30mb'
            },
            multipart: true,
            parsedMethods: ['POST', 'PUT', 'PATCH']
        });

希望调高一点,不会报错

NextChat 和 直接curl调接口都返回:Maximum number of redirects exceeded,今天拉的代码本地运行

启动方式

npm i
npm i -g pm2
npm run build
pm2 start dist/index.js --name "kimi-free-api"
pm2 logs kimi-free-api

访问:http://localhost:8000/

kimi-free-api已启动!
请通过LobeChat / NextChat / Dify等客户端或OpenAI SDK接入!

curl测试方式

❯ curl http://localhost:8000/v1/chat/completions
-H "Content-Type: application/json"
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ1c2VyLWNlbnRlciIsImV4cCI6MTcyMDUwOTg3NCwiaWF0IjoxNzEyNzMzODc0LCJqdGkiOiJjb2IzdGNoa3FxNG44aW1wZmduMCIsInR5cCI6InJlZnJlc2giLCJzdWIiOiJjbmFtNmdwa3FxNGhrMGd2b2M0ZyIsInNwYWNlX2lkIjoiY25hbTZncGtxcTRoazBndm9jNDAiLCJhYnN0cmFjdF91c2VyX2lkIjoiY25hbTZncGtxcTRoazBndm9jM2cifQ.LDG9T-v_csI55hbJSmyTZTDoQDn6w5Sr8le6A0wL4f7xNLe8sykpp_b1b4FbneYcRP74nit-XypWJzBNWt1axxx"
-d '{
"model": "kimi",
"messages": [
{
"role": "user",
"content": "测试"
}
],
"use_search": false,
"stream": false}'

{"code":-1000,"message":"Maximum number of redirects exceeded","data":null}

token获取

2024-04-10 token

日志

0|kimi-free-api  |     _currentUrl: 'https://kimi.moonshot.cn/api/chat',
0|kimi-free-api  |     _timeout: null,
0|kimi-free-api  |     _isRedirect: true,
0|kimi-free-api  |     [Symbol(shapeMode)]: true,
0|kimi-free-api  |     [Symbol(kCapture)]: false
0|kimi-free-api  |   },
0|kimi-free-api  |   cause: Error [ERR_FR_TOO_MANY_REDIRECTS]: Maximum number of redirects exceeded
0|kimi-free-api  |       at RedirectableRequest._processResponse (/GitHub/kimi-free-api/node_modules/follow-redirects/index.js:413:11)
0|kimi-free-api  |       at ClientRequest.RedirectableRequest._onNativeResponse (/GitHub/kimi-free-api/node_modules/follow-redirects/index.js:91:12)
0|kimi-free-api  |       at Object.onceWrapper (node:events:634:26)
0|kimi-free-api  |       at ClientRequest.emit (node:events:519:28)
0|kimi-free-api  |       at HTTPParser.parserOnIncomingClient [as onIncoming] (node:_http_client:693:27)
0|kimi-free-api  |       at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17)
0|kimi-free-api  |       at Socket.socketOnData (node:_http_client:535:22)
0|kimi-free-api  |       at Socket.emit (node:events:519:28)
0|kimi-free-api  |       at addChunk (node:internal/streams/readable:559:12)
0|kimi-free-api  |       at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) {
0|kimi-free-api  |     code: 'ERR_FR_TOO_MANY_REDIRE

NextChat也一样

ETIMEDOUT

挂在azure的北美服务器上,连接不上。kimi是否限制了呢(自己本地的mac正常运行)

[2024-03-26 06:59:31.579][info][chat.ts<175,12>] [ { role: 'user', content: 'Say this is a test' } ]
[2024-03-26 06:59:31.581][info][chat.ts<55,10>] Refresh token:
[2024-03-26 06:59:32.617][error][chat.ts<183,28>] AxiosError [AggregateError]:
at Function.AxiosError.from (file:///home/azureuser/mydoc/gpt/kimi-free-api/node_modules/axios/lib/core/AxiosError.js:89:14)
at RedirectableRequest.handleRequestError (file:///home/azureuser/mydoc/gpt/kimi-free-api/node_modules/axios/lib/adapters/http.js:610:25)
at RedirectableRequest.emit (node:events:531:35)
at ClientRequest.eventHandlers. (/home/azureuser/mydoc/gpt/kimi-free-api/node_modules/follow-redirects/index.js:38:24)
at ClientRequest.emit (node:events:519:28)
at TLSSocket.socketErrorListener (node:_http_client:500:9)
at TLSSocket.emit (node:events:519:28)
at emitErrorNT (node:internal/streams/destroy:169:8)
at emitErrorCloseNT (node:internal/streams/destroy:128:3)
at processTicksAndRejections (node:internal/process/task_queues:82:21)
at Axios.request (file:///home/azureuser/mydoc/gpt/kimi-free-api/node_modules/axios/lib/core/Axios.js:45:41)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at file:///home/azureuser/mydoc/gpt/kimi-free-api/src/api/controllers/chat.ts:57:20
at requestToken (file:///home/azureuser/mydoc/gpt/kimi-free-api/src/api/controllers/chat.ts:56:18)
at acquireToken (file:///home/azureuser/mydoc/gpt/kimi-free-api/src/api/controllers/chat.ts:106:14)
at fakeRequest (file:///home/azureuser/mydoc/gpt/kimi-free-api/src/api/controllers/chat.ts:301:17) {
code: 'ETIMEDOUT',
errors: [
Error: connect ETIMEDOUT 103.143.17.170:443
at createConnectionError (node:net:1646:14)
at Timeout.internalConnectMultipleTimeout (node:net:1705:38)
at listOnTimeout (node:internal/timers:575:11)
at processTimers (node:internal/timers:514:7) {
errno: -110,
code: 'ETIMEDOUT',
syscall: 'connect',
address: '103.143.17.170',
port: 443
},
Error: connect ENETUNREACH 240e:940:e009:143:6::2008:443 - Local (:::0)
at internalConnectMultiple (node:net:1180:16)
at Timeout.internalConnectMultipleTimeout (node:net:1710:5)
at listOnTimeout (node:internal/timers:575:11)
at processTimers (node:internal/timers:514:7) {
errno: -101,
code: 'ENETUNREACH',
syscall: 'connect',
address: '240e:940:e009:143:6::2008',
port: 443
}
],
config: {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
adapter: [ 'xhr', 'http' ],
transformRequest: [ [Function: transformRequest] ],
transformResponse: [ [Function: transformResponse] ],
timeout: 15000,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
env: { FormData: [Function], Blob: [class Blob] },
validateStatus: [Function: validateStatus],
headers: Object [AxiosHeaders] {
Accept: '/',
'Content-Type': undefined,
Authorization: 'Bearer
Referer: 'https://kimi.moonshot.cn/',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9',
Origin: 'https://kimi.moonshot.cn',
'R-Timezone': 'Asia/Shanghai',
'Sec-Ch-Ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
},
method: 'get',
url: 'https://kimi.moonshot.cn/api/auth/token/refresh',
data: undefined
},
request: <ref *1> Writable {
_events: {
close: undefined,
error: [Function: handleRequestError],
prefinish: undefined,
finish: undefined,
drain: undefined,
response: [Function: handleResponse],
socket: [Array],
timeout: undefined,
abort: undefined
},
_writableState: WritableState {
highWaterMark: 16384,
length: 0,
corked: 0,
onwrite: [Function: bound onwrite],
writelen: 0,
bufferedIndex: 0,
pendingcb: 0,
[Symbol(kState)]: 17580812,
[Symbol(kBufferedValue)]: null
},
_maxListeners: undefined,
_options: {
maxRedirects: 21,
maxBodyLength: Infinity,
protocol: 'https:',
path: '/api/auth/token/refresh',
method: 'GET',
headers: [Object: null prototype],
agents: [Object],
auth: undefined,
family: undefined,
beforeRedirect: [Function: dispatchBeforeRedirect],
beforeRedirects: [Object],
hostname: 'kimi.moonshot.cn',
port: '',
agent: undefined,
nativeProtocols: [Object],
pathname: '/api/auth/token/refresh'
},
_ended: true,
_ending: true,
_redirectCount: 0,
_redirects: [],
_requestBodyLength: 0,
_requestBodyBuffers: [],
_eventsCount: 3,
_onNativeResponse: [Function (anonymous)],
_currentRequest: ClientRequest {
_events: [Object: null prototype],
_eventsCount: 7,
_maxListeners: undefined,
outputData: [],
outputSize: 0,
writable: true,
destroyed: false,
_last: true,
chunkedEncoding: false,
shouldKeepAlive: true,
maxRequestsOnConnectionReached: false,
_defaultKeepAlive: true,
useChunkedEncodingByDefault: false,
sendDate: false,
_removedConnection: false,
_removedContLen: false,
_removedTE: false,
strictContentLength: false,
_contentLength: 0,
_hasBody: true,
_trailer: '',
finished: true,
_headerSent: true,
_closed: false,
_header: 'GET /api/auth/token/refresh HTTP/1.1\r\n' +
'Accept: /\r\n' +
'Authorization: Bearer
\r\n' +
'Referer: https://kimi.moonshot.cn/\r\n' +
'Accept-Encoding: gzip, deflate, br, zstd\r\n' +
'Accept-Language: zh-CN,zh;q=0.9\r\n' +
'Origin: https://kimi.moonshot.cn\r\n' +
'R-Timezone: Asia/Shanghai\r\n' +
'Sec-Ch-Ua: "Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"\r\n' +
'Sec-Ch-Ua-Mobile: ?0\r\n' +
'Sec-Ch-Ua-Platform: "Windows"\r\n' +
'Sec-Fetch-Dest: empty\r\n' +
'Sec-Fetch-Mode: cors\r\n' +
'Sec-Fetch-Site: same-origin\r\n' +
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36\r\n' +
'Host: kimi.moonshot.cn\r\n' +
'Connection: keep-alive\r\n' +
'\r\n',
_keepAliveTimeout: 0,
_onPendingData: [Function: nop],
agent: [Agent],
socketPath: undefined,
method: 'GET',
maxHeaderSize: undefined,
insecureHTTPParser: undefined,
joinDuplicateHeaders: undefined,
path: '/api/auth/token/refresh',
_ended: false,
res: null,
aborted: false,
timeoutCb: [Function: emitRequestTimeout],
upgradeOrConnect: false,
parser: null,
maxHeadersCount: null,
reusedSocket: false,
host: 'kimi.moonshot.cn',
protocol: 'https:',
_redirectable: [Circular *1],
[Symbol(shapeMode)]: false,
[Symbol(kCapture)]: false,
[Symbol(kBytesWritten)]: 0,
[Symbol(kNeedDrain)]: false,
[Symbol(corked)]: 0,
[Symbol(kChunkedBuffer)]: [],
[Symbol(kChunkedLength)]: 0,
[Symbol(kSocket)]: [TLSSocket],
[Symbol(kOutHeaders)]: [Object: null prototype],
[Symbol(errored)]: null,
[Symbol(kHighWaterMark)]: 16384,
[Symbol(kRejectNonStandardBodyWrites)]: false,
[Symbol(kUniqueHeaders)]: null
},
_currentUrl: 'https://kimi.moonshot.cn/api/auth/token/refresh',
_timeout: null,
[Symbol(shapeMode)]: true,
[Symbol(kCapture)]: false
},
cause: AggregateError:
at internalConnectMultiple (node:net:1116:18)
at internalConnectMultiple (node:net:1184:5)
at Timeout.internalConnectMultipleTimeout (node:net:1710:5)
at listOnTimeout (node:internal/timers:575:11)
at processTimers (node:internal/timers:514:7) {
code: 'ETIMEDOUT',
[errors]: [ [Error], [Error] ]
}
}[2024-03-26 06:59:32.881][error][chat.ts<219,16>] Stream response error: [2024-03-26 06:59:32.885][warning][chat.ts<220,16>] Try again after 5s...
[2024-03-26 06:59:37.885][info][chat.ts<175,12>] [ { role: 'user', content: 'Say this is a test' } ]
[2024-03-26 06:59:38.145][error][chat.ts<219,16>] Stream response error: [2024-03-26 06:59:38.148][warning][chat.ts<220,16>] Try again after 5s...

本地调试kimi无法打开链接

本地调试部分链接无法访问,但是使用https://udify.app/chat/Po0F6BMJ15q5vu2P中交互输入同样内容则可以访问

问题链接:https://mp.weixin.qq.com/s?__biz=MjM5MzA0NDM0MA==&mid=2661070761&idx=1&sn=ed5d0ad11bfccc85d1a6d863f0b57088&chksm=bdf515b28a829ca4fcee2f5786a3a30fa280d6064a153153a3b3c75b80f85dbdf3b2e6a06a83#rd
本地调试,调用http://10.252.83.158:8000/v1/chat/completions:
请求参数

{
    "model": "kimi",
    "messages": [
        {
            "role": "user",
            "content": "https://mp.weixin.qq.com/s?__biz=MjM5MzA0NDM0MA==&mid=2661070761&idx=1&sn=ed5d0ad11bfccc85d1a6d863f0b57088&chksm=bdf515b28a829ca4fcee2f5786a3a30fa280d6064a153153a3b3c75b80f85dbdf3b2e6a06a83#rd 内容是什么"
        }
    ],
    "use_search": false,
    "stream": false
}

响应:

"choices": [
        {
            "index": 0,
            "message": {
                "role": "assistant",
                "content": "您提供的链接内容显示为“当前环境异常,完成验证后即可继续访问。”这表明该网页需要进行某种形式的验证才能查看完整内容。由于我无法进行此类验证,因此无法提供该网页的详细信息或回答与该网页内容相关的问题。\n\n如果您有其他问题或需要帮助,请随时告诉我,我会尽力提供帮助。"
            },
            "finish_reason": "stop"
        }
    ]

这个原因是什么?

如何正确的在new-api等中转api里正确设置

大佬,我是用了
docker run -it -d --init --name kimi-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/kimi-free-api:latest命令一键部署的,完了之后nginx反代了ip+端口,之后在new-api中设置如图
image
nextchat自定了了模型的名字kimi
image
但是不能用,辛苦大佬看下哪里有问题,close的中一个issues也没搞清楚

an example may be helpful for you

I wrote an example in Python with streamlit, may be help for you

import streamlit as st
import requests
import base64
import json
import os

api_key = ""
base_url = "http://localhost:8000/v1/chat/completions"
model = "assistant"
plain_text = ["txt","c","cpp","py","js","java"]


show_chat = st.container()

if "message_history" not in st.session_state:
    st.session_state.message_history = []
    st.session_state.message_history_init = []
if "use_search" not in st.session_state:
    st.session_state.use_search = True
if "file_upload" not in st.session_state:
    st.session_state.file_upload = None


def process_files(files:list):
    # Processing images exclusively
    files = [(f.name,f.name.split(".")[-1],f.getvalue()) for f in files]
    
    # we need base64 encoded files:pdf、doc、xlsx、ppt、txt
    files_base64 = []
    f_file = []
    for fb in files:
        isimage = False
        fb_base64 = base64.b64encode(fb[2]).decode('utf-8')
        # fb_base64 = fb[2]
        if fb[1] == "png":
            url = f"data:image/png;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "jpg" or fb[1] == "jpeg":
            url = f"data:image/jpeg;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "gif":
            url = f"data:image/gif;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "webp":
            url = f"data:image/webp;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "bmp ":
            url = f"data:image/bmp;base64,{fb_base64}"
            isimage = True
        elif fb[1] == "pdf":
            url = f"data:application/pdf;base64,{fb_base64}"
        elif fb[1] == "doc":
            url = f"data:application/msword;base64,{fb_base64}"
        elif fb[1] == "docx":
            url = f"data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,{fb_base64}"
        elif fb[1] == "xls":
            url = f"data:application/vnd.ms-excel;base64,{fb_base64}"
        elif fb[1] == "xlsx":
            url = f"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{fb_base64}"
        elif fb[1] == "ppt":
            url = f"data:application/vnd.ms-powerpoint;base64,{fb_base64}"
        elif fb[1] == "pptx":
            url = f"data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,{fb_base64}"
        elif fb[1] == "html":
            url = f"data:text/html;base64,{fb_base64}"
        elif fb[1] == "js":
            url = f"data:text/javascript;base64,{fb_base64}"
        elif fb[1] == "css":
            url = f"data:text/css;base64,{fb_base64}"
        elif fb[1] in plain_text:
            url = f"data:text/plain;base64,{fb_base64}"
        else:
            st.error("不支持这种格式")
            return [],[]
        if isimage:
            files_base64.append({
                "type": "image_url",
                "image_url": {
                    "url": url,
                }
            })
            f_file.append({
                "type": "image_url",
                "image_url": {
                    "url": fb[2],
                }
            })
        else:
            files_base64.append({
                "type": "file",
                "file_url": {
                    "url": url,
                }
            })
            f_file.append({
                "type": "file",
                "file_url": {
                    "url": fb[0],
                }
            })
    return files_base64,f_file


def generate_response(message_history,use_search):
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {api_key}"
    }
    payload = {
        "model":model,
        "messages": message_history,
        "use_search":use_search,
        "stream":False
    }
    with requests.post(base_url, json=payload, headers=headers) as response:
        data = json.loads(response.content)["choices"][0]["message"]["content"]
    return data


def show_chat_history(message_history):
    for message in message_history:
        if message["role"] == "user":
            with show_chat.chat_message("user"):
                if isinstance( message["content"],list):
                    for content in message["content"]:
                        if content["type"] == "text":
                            st.write(content["text"])
                        if content["type"] == "image_url":
                            st.image(content["image_url"]["url"])
                        if content["type"] == "file":
                            with st.container(border=True):
                                st.write(content["file_url"]["url"])
                else:
                    st.write(message["content"])

        else:
            with show_chat.chat_message(model):
                st.write(message["content"])


def change_use_search():
    st.session_state.use_search = not st.session_state.use_search


with st.sidebar:
    st.session_state.use_search = st.toggle("**Offine || Online**",value=st.session_state.use_search,on_change=change_use_search)
    st.session_state.file_upload = st.file_uploader("**Upload Files**",accept_multiple_files=True,label_visibility="visible")
    st.button("**Clear Chat**",key="ClearChat",use_container_width=True)
    st.button("**ShowChat**",key="ShowChat",use_container_width=True,type="primary")
    if st.session_state.get("ClearChat"):
        st.session_state.message_history = []
        st.session_state.message_history_init = []
    if st.session_state.get("ShowChat"):
        show_chat_history(st.session_state.message_history_init)

prompt = st.chat_input("Send your message")
if prompt:
    message = {
            "role": "user",
            "content": [
                {
                    "type":"text",
                    "text":prompt
                },
            ]
        }
    message_init = {
            "role": "user",
            "content": [
                {
                    "type":"text",
                    "text":prompt
                },
            ]
        }
    if st.session_state.file_upload:
        fb_base64,fb = process_files(st.session_state.file_upload)
        message["content"] += fb_base64
        message_init["content"] += fb
        st.session_state.use_search = False
    st.session_state.message_history.append(message)
    st.session_state.message_history_init.append(message_init)
    print(st.session_state.message_history)
    show_chat_history(st.session_state.message_history_init)

    response = generate_response(st.session_state.message_history,st.session_state.use_search)
    st.session_state.message_history.append({"role": model,"content":response})
    st.session_state.message_history_init.append({"role": model,"content":response})
    with show_chat:
        with st.chat_message(model):
            st.write(response)

报错返回:Service Suspended

首次试用,提取refresh_token,用这方式调用,好使、api返回了模型回答结果。

os.environ["OPENAI_BASE_URL"] = "https://kimi-free-api-nut5.onrender.com/v1"
os.environ["OPENAI_API_KEY"] = refresh_token
然后
response = OpenAI().chat.completions.create(
model=model,
messages=[
{"role": "user", "content": '你是谁'},
]
)

但是,过几小时后再次试(此前提取refresh_token的win10、edge关机重启过),再次调用,就这报错如下了,已经尝试了刷新页面、重新登录kimi.moonshot.cn发起聊天后再次提取 refresh_token,但都是这报错,求教应如何使用:

raise self._make_status_error_from_response(err.response) from None

openai.InternalServerError:

<title>Service Suspended</title> This service has been suspended.

请问怎么通过openai接口调用

你好,根据readme在docker上部署了kimi-free-api,并获取到了refresh_token,但是下面的程序跑不通,请问是哪里出了问题呢?
def test():
import openai
client = openai.OpenAI(
api_key="refresh_token对应的值",
base_url="http://localhost:8000/v1"
)
role = "You are a professional senior scholar and evaluator"
prompt = "who are you"
result = client.chat.completions.create(
model='kimi',
messages=[{"role": "system", "content": role},
{"role": "user", "content":prompt}],
)
answer = result.choices[0].message.content.lower()
return answer

作者大大,可以适配一下类似于gpt-4-vision-preview的模型嘛,这样一定很吸引人

  • 调用方式同官方 gpt-4-vision-preview API
  • 接口URI:/v1/chat/completions
  • 请求方式:POST
  • 请求体格式示例(以 url 形式传入文件):
{
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "这个pdf里写了什么,用中文回复"
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://bitcoin.org/bitcoin.pdf"
                    }
                }
            ]
        }
    ],
    "stream": false,
    "model": "gpt-4",
    "temperature": 0.5,
    "presence_penalty": 0,
    "frequency_penalty": 0,
    "top_p": 1
}

可以不用考虑逆向上传文件的api,可以直接把这种形式的请求,把url提取到,合并text的消息,一起发过去,当让也可以逆向文件上传接口,希望大大能适配!!!

每一轮会话好像只有第一次提问才能触发联网检索

联网检索好像只有在每次的会话上第一次提问的时候才会触发,后续问答就不会调用搜索了。我是在Windows系统上原生部署的
我想让它每次会话都能大概率调用网络检索
我没有编程基础,望大佬海涵

不适配chatgpt on wechat

大佬好,我根据说明配置了这个项目,在将其接入chatgpt on wechat项目时,报错,如下:
[INFO][2024-03-11 08:29:29][chat_gpt_bot.py:49] - [CHATGPT] query=你好
[WARNING][2024-03-11 08:29:29][chat_gpt_session.py:83] - num_tokens_from_messages() is not implemented for model kimi. Returning num tokens assuming gpt-3.5-turbo.
[ERROR][2024-03-11 08:29:33][chat_gpt_bot.py:154] - [CHATGPT] Exception: 'usage'
Traceback (most recent call last):
File "/data/my_soft/xxxxxxxxxxxxxxxx/bot/chatgpt/chat_gpt_bot.py", line 127, in reply_text
"total_tokens": response["usage"]["total_tokens"],
KeyError: 'usage'

请问这是什么原因?ps:其他openai的模型,如gpt-4-mobile、gpt-4等是可以用的

Chat调用API超时

通过chatgpt-next-web调用API接口,api.openai.com:443 <--socket error or timeout!超时

小白求教,部署完成后下一步?

想用api批量生成回复,已经完成部署,不需要UI,可以跳过Dify之类的平台自己发请求接回复吗?可以的话想要用openai提供的python代码类似的实现。根据Dify的示例代码尝试下面的命令,求教正确的url.

usr@DESKTOP:~.../kimi-free-api$ curl -X POST "[my_pm2_home]/v1/chat/completions" --header 'Authorization: Bearer eyJ...' --header 'Content-Type: application/json' --data-raw '{}'

curl: (3) URL rejected: No host part in the URL

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.