Compare commits

...

179 Commits

Author SHA1 Message Date
Vinlic科技
3b8bf35c65
Update README.md 2024-12-30 11:53:44 +08:00
Vinlic科技
d43ce6c41d
Update README.md 2024-12-18 23:01:57 +08:00
Vinlic科技
856c1420b2
Update README.md 2024-12-18 10:10:33 +08:00
Vinlic科技
9f58f1858f
Update README.md 2024-12-17 17:59:40 +08:00
Vinlic
1375e7c6c4 支持探索版和K1模型,修复图像解析能力 2024-12-17 17:08:09 +08:00
Vinlic科技
1dd7f89cbc
Update README.md 2024-12-14 02:06:35 +08:00
Vinlic科技
cc198adfbd
Merge pull request #149 from Alex-Yanggg/patch-2
Update README_EN.md
2024-12-12 11:23:24 +08:00
Vinlic科技
06119ed0a1
Merge pull request #150 from Alex-Yanggg/patch-1
Update README.md
2024-12-12 11:23:03 +08:00
Alex
e1a68de548
Update README_EN.md
修正目录层级关系
2024-12-12 14:20:50 +11:00
Alex
22b3a4b3b7
Update README.md
修正目录层级关系
2024-12-12 14:20:11 +11:00
Vinlic科技
c8bb4e64ee
Merge pull request #148 from Alex-Yanggg/master
Update Readme for English and Chinese
2024-12-12 10:49:07 +08:00
Alex
3e8efee623
Update README.md
Update README.md
2024-12-12 13:45:02 +11:00
Alex
63e6189c63
Update README_EN.md
24-12-12
2024-12-12 13:37:41 +11:00
Vinlic科技
f133a9bc01
Update README.md 2024-12-04 17:04:17 +08:00
Vinlic科技
7bc0585352
Update README.md 2024-12-04 17:03:59 +08:00
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
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
Vinlic
82a8359634 Release 0.0.31 2024-04-28 14:16:27 +08:00
Vinlic
7275ab7e11 Merge branch 'master' of https://github.com/LLM-Red-Team/kimi-free-api 2024-04-28 14:14:28 +08:00
Vinlic
d862808226 update README 2024-04-28 14:14:13 +08:00
Vinlic
7cc6033201 支持原生多轮对话 2024-04-28 14:11:16 +08:00
Vinlic科技
8f72c5de78
Merge pull request #89 from KPCOFGS/master
更新了英文的README_EN.md
2024-04-28 03:29:25 +08:00
Shixian Sheng
72df4e1fc1
Update README_EN.md 2024-04-27 12:18:13 -04:00
Vinlic科技
9b00be5883
Update README.md 2024-04-26 16:49:17 +08:00
Vinlic科技
61cc3a4655
Update README.md 2024-04-26 16:48:30 +08:00
Vinlic科技
1aa45264f1
Merge pull request #86 from Yanyutin753/main
Create sync.yml to update code
2024-04-25 15:17:58 +08:00
Yanyutin753
56caa486c8 Create sync.yml to update code 2024-04-25 15:14:06 +08:00
Vinlic
2aa6465a36 Release 0.0.30 2024-04-25 10:49:26 +08:00
Vinlic
09250f208a Merge branch 'master' of https://github.com/LLM-Red-Team/kimi-free-api 2024-04-25 10:49:17 +08:00
Vinlic
a2d5ab9390 修复某些大文件无法正常上传处理问题 2024-04-25 10:47:57 +08:00
Vinlic科技
fe584180b1
Merge pull request #84 from KPCOFGS/master
更新了中英文README.md文件
2024-04-25 08:59:42 +08:00
Shi Sheng
c1c601b498
Update README_EN.md 2024-04-24 20:51:11 -04:00
Shi Sheng
b9caca3289
Update README.md 2024-04-24 15:41:33 -04:00
Shi Sheng
2b32fc66f4
Update README_EN.md 2024-04-24 15:36:38 -04:00
Shi Sheng
bffd5a24a3
Update README_EN.md 2024-04-24 15:22:32 -04:00
Vinlic科技
95f8c4e3e3
Merge pull request #83 from KPCOFGS/master
更新了中英文的README文件
2024-04-24 19:53:15 +08:00
Shi Sheng
0632d8111e
Update README.md 2024-04-24 07:48:16 -04:00
Shi Sheng
f1aa2e822c
Update README_EN.md 2024-04-24 07:48:08 -04:00
Vinlic科技
53436b5f21
Update README.md 2024-04-24 14:33:24 +08:00
Vinlic科技
e8284288c9
Merge pull request #81 from Yanyutin753/tem-main
feat support /v1/models to be better use lobechat
2024-04-24 13:34:13 +08:00
Clivia
04db70bec5
Merge branch 'LLM-Red-Team:master' into tem-main 2024-04-24 13:31:23 +08:00
Yanyutin753
f7c1fa7be3 feat support /v1/models to be better use lobechat 2024-04-24 13:30:46 +08:00
Vinlic科技
b9d479b9f6
Merge pull request #80 from KPCOFGS/master
更新了中英文的README文件
2024-04-24 13:29:41 +08:00
Shi Sheng
c9c26fdd31
Update README_EN.md 2024-04-23 08:26:15 -04:00
Shi Sheng
43e14b6e3e
Update README.md 2024-04-23 08:22:38 -04:00
Shi Sheng
65a3fed83b
Update README_EN.md 2024-04-23 08:20:52 -04:00
Shi Sheng
4a225853af
Update README.md 2024-04-23 08:20:28 -04:00
Shi Sheng
6b343f4094
Update README_EN.md 2024-04-23 08:17:49 -04:00
Shi Sheng
e8c6622e83
Update README_EN.md 2024-04-23 08:15:43 -04:00
Shi Sheng
ae6dc4a79f
Update README_EN.md 2024-04-23 08:09:42 -04:00
Shi Sheng
bdb8ced5ce
Update README.md 2024-04-23 08:08:49 -04:00
Shi Sheng
a0c1bba3c9
Update README.md 2024-04-23 08:08:00 -04:00
Shi Sheng
c6da81a53e
Update README.md 2024-04-23 08:06:25 -04:00
Vinlic科技
77d42d9484
Update README.md 2024-04-22 16:43:00 +08:00
Vinlic科技
d73a9bc95d
Merge pull request #72 from XunjunYin/master
Update: README.md typo
2024-04-20 16:51:35 +08:00
Xunjun Yin
65f45697e8
Update: README.md typo 2024-04-20 16:34:55 +08:00
Vinlic
875bb55f21 修补一些请求特征 2024-04-19 16:51:55 +08:00
Vinlic
cbf215d8a8 Merge branch 'master' of https://github.com/LLM-Red-Team/kimi-free-api 2024-04-17 12:24:11 +08:00
Vinlic
7c3bc3c0d8 Release 0.0.27 2024-04-17 12:18:41 +08:00
Vinlic
ae8e8316e4 优化检索引用连接展示,避免url解析错误 2024-04-17 12:18:17 +08:00
Vinlic科技
e1b7e55e70
Update README.md 2024-04-17 01:10:10 +08:00
Vinlic科技
e1710ee95a
Update README.md 2024-04-17 01:00:05 +08:00
Vinlic
d14d062078 Release 0.0.26 2024-04-13 02:14:48 +08:00
Vinlic
1a3327cc8d 修复多轮对话下,无法重复唤起联网检索的问题 2024-04-13 02:14:28 +08:00
Vinlic科技
cfec318bd0
Merge pull request #56 from MichaelYuhe/master
docs: add deploy to Zeabur guide
2024-04-12 15:24:08 +08:00
Yuhang
1d18ac3f6b
add deploy to Zeabur in Readme_en 2024-04-12 15:11:31 +08:00
Yuhang
b52e84bda0
add deploy to Zeabur in Readme 2024-04-12 15:10:35 +08:00
Vinlic
ee7cb9fdff Merge branch 'master' of https://github.com/Vinlic/kimi-free-api 2024-04-12 13:17:46 +08:00
Vinlic
a12a967202 update README 2024-04-12 13:17:23 +08:00
Vinlic科技
bff5623f73
update README 2024-04-11 18:53:03 +08:00
Vinlic
2d2454b65b update README 2024-04-11 15:03:04 +08:00
Vinlic
4642939835 update README 2024-04-11 14:28:32 +08:00
Vinlic
87593a270a 添加Render部署 2024-04-11 14:28:16 +08:00
Vinlic
ce89c29b05 添加Render部署 2024-04-11 14:27:27 +08:00
Vinlic
3bb36fbbf0 Merge branch 'master' of https://github.com/Vinlic/kimi-free-api 2024-04-11 13:55:22 +08:00
Vinlic
3b3584bf4f Release 0.0.25 2024-04-11 13:54:50 +08:00
Vinlic
d1e0fcad2b 支持vercel部署 2024-04-11 13:54:34 +08:00
Vinlic
674647e108 npm切换到yarn,加快容器构建 2024-04-11 13:54:16 +08:00
Vinlic科技
e244052c6a
Merge pull request #54 from khazic/master
新增的
2024-04-11 10:32:52 +08:00
khazic
6ced4e76d2 新增的 2024-04-11 10:25:54 +08:00
Vinlic科技
4a1d39bdd8
Merge pull request #53 from khazic/master
readme 入口
2024-04-11 10:19:19 +08:00
khazic
2cc8c2e13d readme 入口 2024-04-11 10:15:05 +08:00
Vinlic科技
1ab9e980cf
Merge pull request #52 from khazic/master
写了README_EN
2024-04-11 10:13:20 +08:00
khazic
97cc86f718 写了README_EN 2024-04-11 10:09:13 +08:00
Vinlic
d4f6fee14d update README 2024-04-10 18:31:52 +08:00
Vinlic
e157e40525 增加refresh_token存活检测 2024-04-10 18:22:00 +08:00
Vinlic
d08a4b2130 Release 0.0.24 2024-04-10 17:57:16 +08:00
Vinlic
31298c9566 update Dockerfile 2024-04-10 17:56:40 +08:00
Vinlic
fe63c20198 Release 0.0.23 2024-04-09 10:47:40 +08:00
Vinlic
72e29e4168 增加日志提醒错误请求地址 2024-04-09 10:47:28 +08:00
Vinlic
9fd7ae890b 首轮不注入注意力prompt 2024-04-08 22:26:05 +08:00
Vinlic
f5bea5ea68 Release 0.0.22 2024-04-08 22:24:13 +08:00
Vinlic
0b2c8434c9 首轮不注入注意力prompt 2024-04-08 22:23:54 +08:00
Vinlic
520f26f72f Release 0.0.21 2024-04-06 00:16:18 +08:00
Vinlic科技
462c64656e
Merge pull request #42 from Yanyutin753/master
optimize code in messagesPrepare
2024-04-06 00:09:24 +08:00
Yanyutin753
cda36ed4fc fix the position of "\n" 2024-04-05 19:12:47 +08:00
Yanyutin753
70ea39591b optimize code in messagesPrepare 2024-04-05 18:54:04 +08:00
Vinlic
11a145924f 加大文件上传超时时间 2024-04-05 01:16:05 +08:00
Vinlic
1b2b7927ee Release 0.0.20 2024-04-03 00:00:46 +08:00
Vinlic
66cddd522b 修改日志输出和注意力注入prompt 2024-04-02 23:27:38 +08:00
Vinlic科技
ff59201961
Merge pull request #38 from Yanyutin753/transfer
优化降低传文件上下文混淆问题
2024-04-02 23:17:13 +08:00
Yanyutin753
6853087757 优化降低传文件上下文混淆问题 2024-04-02 23:13:00 +08:00
Yanyutin753
1e09d807e6 打印上传消息日志 2024-04-02 21:15:36 +08:00
Yanyutin753
66067b4dd9 通过添加prompt改善传文件时的上下文问题 2024-04-02 20:54:46 +08:00
Vinlic
1534fbc77a Release 0.0.19 2024-04-01 22:53:18 +08:00
Vinlic科技
1e55571b2d
Merge pull request #37 from Yanyutin753/transfer
feat the context transfer files
2024-04-01 22:48:00 +08:00
Yanyutin753
4380d0c05c feat the context transfer files 2024-04-01 22:33:34 +08:00
Vinlic
b7946835a8 Release 0.0.18 2024-04-01 15:46:48 +08:00
Vinlic
4a3168845e Release 0.0.17 2024-04-01 15:46:25 +08:00
Vinlic
ae541f533e 处理有几率遇到�输出的情况 2024-04-01 15:46:12 +08:00
Vinlic
980b506e94 update README 2024-03-31 04:25:02 +08:00
Vinlic
f7b6a9e64a update README 2024-03-31 03:46:36 +08:00
Vinlic
b71e8d4b24 update README 2024-03-29 12:01:24 +08:00
Vinlic
f9daf10455 update README 2024-03-29 11:29:00 +08:00
Vinlic
a387e133fb update README 2024-03-25 04:17:04 +08:00
Vinlic科技
c6e6c7e660
Merge pull request #19 from khazic/master
nb vlao
2024-03-21 19:22:18 +08:00
khazic
ff54eb3ebb nb 2024-03-21 19:16:14 +08:00
Vinlic科技
eccce82ade
Merge pull request #16 from peanut996/master
添加health check api
2024-03-20 13:47:06 +08:00
peanut996
4fe9b654f5 添加health check api 2024-03-20 13:46:21 +08:00
Vinlic
7cbebf780c update README 2024-03-20 01:46:22 +08:00
Vinlic
909796bd91 支持模型名称包含silent_search来静默搜索不输出搜索过程 2024-03-20 01:37:25 +08:00
Vinlic
b8134a64a5 Release 0.0.15 2024-03-19 15:56:49 +08:00
Vinlic
c9b3574b0b 增加伪装请求,企图降低封号几率 2024-03-19 15:56:27 +08:00
Vinlic
eef674eac8 处理token统计为0导致部分客户端无法识别问题 2024-03-17 02:23:29 +08:00
Vinlic
e530317486 update README 2024-03-16 14:02:21 +08:00
Vinlic
a5beade70a Release 0.0.13 2024-03-16 04:47:15 +08:00
Vinlic
1395278a6e 增加流响应错误时重试机制 2024-03-16 04:46:39 +08:00
Vinlic
08a4b2e720 update README 2024-03-16 04:46:28 +08:00
Vinlic科技
2f26d29de1
Merge pull request #8 from Yanyutin753/master
作者大大,pr一个github action实现自动打包docker镜像
2024-03-15 19:09:22 +08:00
Yanyutin753
3bb24b26d3 feat docker-image.yml 2024-03-15 18:55:12 +08:00
Yanyutin753
dd8bb923a8 feat github action 2024-03-15 18:54:10 +08:00
Vinlic
b3b6daf1ef Release 0.0.12 2024-03-15 18:48:57 +08:00
Vinlic
25606dc1ea 请求载荷大小限制提高到100mb,增加新的异常信息 2024-03-15 18:34:55 +08:00
Vinlic
fc5c13b650 Release 0.0.11 2024-03-14 23:38:30 +08:00
Vinlic
4949b16091 支持多路refresh_token 2024-03-14 23:21:22 +08:00
Vinlic
17809274a5 update 2024-03-14 15:52:27 +08:00
Vinlic
228d18712b 补充Nginx反代优化 2024-03-14 15:09:46 +08:00
Vinlic
2da3e804f3 增加响应耗时比较 2024-03-14 14:43:30 +08:00
Vinlic
efdf5a229c 流传输耗时显示 2024-03-13 22:58:50 +08:00
Vinlic
4083abf4e0 Release 0.0.10 2024-03-13 22:47:50 +08:00
Vinlic
153ebdc1c8 添加流传输完毕提示 2024-03-13 22:44:14 +08:00
Vinlic
c54f89e9f8 修复新token的存储 2024-03-13 22:39:35 +08:00
Vinlic
75cfa446ca Release 0.0.9 2024-03-13 18:43:12 +08:00
Vinlic
28bd87e7f0 token刷新请求并发合并处理 2024-03-13 18:41:07 +08:00
Vinlic
b4e8b489ec headers补充 2024-03-13 17:31:46 +08:00
Vinlic
2f2f9d0d5d update README 2024-03-13 02:05:03 +08:00
Vinlic
71792733c2 update README 2024-03-12 16:45:19 +08:00
Vinlic
d21c50b7bb update README 2024-03-12 16:42:44 +08:00
Vinlic
168d02158b update README 2024-03-12 13:46:06 +08:00
Vinlic
71511061dc add LICENSE 2024-03-12 13:42:51 +08:00
Vinlic
2d1161f843 update README 2024-03-11 18:32:43 +08:00
Vinlic
f2982886ba update README 2024-03-11 18:20:40 +08:00
Vinlic
c972b87450 update README 2024-03-11 18:18:19 +08:00
Vinlic
1ffc8af307 update README 2024-03-11 18:16:43 +08:00
Vinlic
733831668e update README 2024-03-11 18:06:51 +08:00
Vinlic
cd0449d05e update README 2024-03-11 17:58:40 +08:00
Vinlic
f35f29784c update README 2024-03-11 13:55:01 +08:00
Vinlic
84353391cd 支持解析BASE64文件数据 2024-03-11 13:35:50 +08:00
Vinlic
e193e905f3 移除调试 2024-03-11 10:26:37 +08:00
Vinlic
0783ba52be update README 2024-03-11 10:26:14 +08:00
Vinlic
438830bc01 支持与gpt4v兼容的图像解析和文件解读,增加usage字段兼容,完善文件处理流程,补充注释 2024-03-11 10:25:56 +08:00
Vinlic
99e1a4812a 支持文档解读能力 2024-03-11 01:33:54 +08:00
Vinlic
04c399eeef update README 2024-03-10 16:54:03 +08:00
Vinlic
1f806a6b16 update README 2024-03-10 16:50:45 +08:00
Vinlic
4993d043ab 二阶段构建减少镜像体积 2024-03-10 16:42:07 +08:00
Vinlic
dc7a953e4f add Dockerfile 2024-03-10 16:16:08 +08:00
Vinlic
3dbabb0d47 移除配置 2024-03-10 15:36:26 +08:00
Vinlic
cc0ea384a7 修复url解析 2024-03-10 14:42:34 +08:00
36 changed files with 4430 additions and 284 deletions

9
.dockerignore Normal file
View File

@ -0,0 +1,9 @@
logs
dist
doc
node_modules
.vscode
.git
.gitignore
README.md
*.tar.gz

46
.github/workflows/docker-image.yml vendored Normal file
View File

@ -0,0 +1,46 @@
name: Build and Push Docker Image
on:
release:
types: [created]
workflow_dispatch:
inputs:
tag:
description: 'Tag Name'
required: true
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Set tag name
id: tag_name
run: |
if [ "${{ github.event_name }}" = "release" ]; then
echo "::set-output name=tag::${GITHUB_REF#refs/tags/}"
elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "::set-output name=tag::${{ github.event.inputs.tag }}"
fi
- name: Build and push Docker image with Release tag
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: |
vinlic/kimi-free-api:${{ steps.tag_name.outputs.tag }}
vinlic/kimi-free-api:latest
platforms: linux/amd64,linux/arm64
build-args: TARGETPLATFORM=${{ matrix.platform }}

48
.github/workflows/sync.yml vendored Normal file
View File

@ -0,0 +1,48 @@
name: Upstream Sync
permissions:
contents: write
issues: write
actions: write
on:
schedule:
- cron: '0 * * * *' # every hour
workflow_dispatch:
jobs:
sync_latest_from_upstream:
name: Sync latest commits from upstream repo
runs-on: ubuntu-latest
if: ${{ github.event.repository.fork }}
steps:
- uses: actions/checkout@v4
- name: Clean issue notice
uses: actions-cool/issues-helper@v3
with:
actions: 'close-issues'
labels: '🚨 Sync Fail'
- name: Sync upstream changes
id: sync
uses: aormsby/Fork-Sync-With-Upstream-action@v3.4
with:
upstream_sync_repo: LLM-Red-Team/kimi-free-api
upstream_sync_branch: master
target_sync_branch: master
target_repo_token: ${{ secrets.GITHUB_TOKEN }} # automatically generated, no need to set
test_mode: false
- name: Sync check
if: failure()
uses: actions-cool/issues-helper@v3
with:
actions: 'create-issue'
title: '🚨 同步失败 | Sync Fail'
labels: '🚨 Sync Fail'
body: |
Due to a change in the workflow file of the LLM-Red-Team/kimi-free-api upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork. Please refer to the detailed [Tutorial][tutorial-en-US] for instructions.
由于 LLM-Red-Team/kimi-free-api 上游仓库的 workflow 文件变更,导致 GitHub 自动暂停了本次自动更新,你需要手动 Sync Fork 一次,

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
dist/ dist/
node_modules/ node_modules/
logs/ logs/
.vercel

21
Dockerfile Normal file
View File

@ -0,0 +1,21 @@
FROM node:lts AS BUILD_IMAGE
WORKDIR /app
COPY . /app
RUN yarn install --registry https://registry.npmmirror.com/ && yarn run build
FROM node:lts-alpine
COPY --from=BUILD_IMAGE /app/public /app/public
COPY --from=BUILD_IMAGE /app/configs /app/configs
COPY --from=BUILD_IMAGE /app/package.json /app/package.json
COPY --from=BUILD_IMAGE /app/dist /app/dist
COPY --from=BUILD_IMAGE /app/node_modules /app/node_modules
WORKDIR /app
EXPOSE 8000
CMD ["npm", "start"]

674
LICENSE Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

461
README.md
View File

@ -1,27 +1,209 @@
# KIMI AI Free 服务 # KIMI AI Free 服务
## 声明
仅限自用,禁止对外提供服务,否则风险自担! <hr>
仅限自用,禁止对外提供服务,否则风险自担! <span>[ 中文 | <a href="README_EN.md">English</a> ]</span>
仅限自用,禁止对外提供服务,否则风险自担!
## 在线体验 [![](https://img.shields.io/github/license/llm-red-team/kimi-free-api.svg)](LICENSE)
![](https://img.shields.io/github/stars/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)
此链接仅临时测试功能,不可长期使用,长期使用请自行部署。 支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持探索版、支持K1思考模型、支持长文档解读、支持图像解析零配置部署多路token支持自动清理会话痕迹
https://udify.app/chat/Po0F6BMJ15q5vu2P 与ChatGPT接口完全兼容。
![example1](./doc/example-1.png) 还有以下十个free-api欢迎关注
![example2](./doc/example-2.png)
阶跃星辰 (跃问StepChat) 接口转API [step-free-api](https://github.com/LLM-Red-Team/step-free-api)
阿里通义 (Qwen) 接口转API [qwen-free-api](https://github.com/LLM-Red-Team/qwen-free-api)
智谱AI (智谱清言) 接口转API [glm-free-api](https://github.com/LLM-Red-Team/glm-free-api)
秘塔AI (Metaso) 接口转API [metaso-free-api](https://github.com/LLM-Red-Team/metaso-free-api)
字节跳动豆包接口转API [doubao-free-api](https://github.com/LLM-Red-Team/doubao-free-api)
字节跳动即梦AI接口转API [jimeng-free-api](https://github.com/LLM-Red-Team/jimeng-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)(当前不可用)
## 目录
* [免责声明](#免责声明)
* [效果示例](#效果示例)
* [接入准备](#接入准备)
* [多账号接入](#多账号接入)
* [Docker部署](#Docker部署)
* [Docker-compose部署](#Docker-compose部署)
* [Render部署](#Render部署)
* [Vercel部署](#Vercel部署)
* [Zeabur部署](#Zeabur部署)
* [原生部署](#原生部署)
* [推荐使用客户端](#推荐使用客户端)
* [接口列表](#接口列表)
* [对话补全](#对话补全)
* [文档解读](#文档解读)
* [图像解析](#图像解析)
* [refresh_token存活检测](#refresh_token存活检测)
* [注意事项](#注意事项)
* [Nginx反代优化](#Nginx反代优化)
* [Token统计](#Token统计)
* [Star History](#star-history)
## 免责声明
**逆向API是不稳定的建议前往MoonshotAI官方 https://platform.moonshot.cn/ 付费使用API避免封禁的风险。**
**本组织和个人不接受任何资金捐助和交易,此项目是纯粹研究交流学习性质!**
**仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!**
**仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!**
**仅限自用,禁止对外提供服务或商用,避免对官方造成服务压力,否则风险自担!**
## 效果示例
### 验明正身Demo
![验明正身](./doc/example-1.png)
### 多轮对话Demo
![多轮对话](./doc/example-6.png)
### 联网搜索Demo
![联网搜索](./doc/example-2.png)
### 智能体对话Demo
此处使用 [翻译通](https://kimi.moonshot.cn/chat/coo6l3pkqq4ri39f36bg) 智能体。
![智能体对话](./doc/example-7.png)
### 长文档解读Demo
![长文档解读](./doc/example-5.png)
### 图像OCR Demo
![图像解析](./doc/example-3.png)
### 响应流畅度一致
![响应流畅度一致](https://github.com/LLM-Red-Team/kimi-free-api/assets/20235341/48c7ec00-2b03-46c4-95d0-452d3075219b)
## 接入准备 ## 接入准备
从 [kimi.moonshot.cn](https://kimi.moonshot.cn) 获取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`的值这将作为Authorization的Bearer Token值`Authorization: Bearer TOKEN`
![example0](./doc/example-0.png)
如果你看到的`refresh_token`是一个数组,请使用`.`拼接起来再使用。
![example8](./doc/example-8.jpg)
### 多账号接入
目前kimi限制普通账号每3小时内只能进行30轮长文本的问答短文本不限你可以通过提供多个账号的refresh_token并使用`,`拼接提供:
`Authorization: Bearer TOKEN1,TOKEN2,TOKEN3`
每次请求服务会从中挑选一个。
## Docker部署
请准备能够部署Docker镜像且能够访问网络的设备或服务器并将8000端口开放。
拉取镜像并启动服务
```shell
docker run -it -d --init --name kimi-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/kimi-free-api:latest
```
查看服务实时日志
```shell
docker logs -f kimi-free-api
```
重启服务
```shell
docker restart kimi-free-api
```
停止服务
```shell
docker stop kimi-free-api
```
### Docker-compose部署
```yaml
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容器保活](https://github.com/LLM-Red-Team/free-api-hub/#Render%E5%AE%B9%E5%99%A8%E4%BF%9D%E6%B4%BB)**
1. fork本项目到你的github账号下。
2. 访问 [Render](https://dashboard.render.com/) 并登录你的github账号。
3. 构建你的 Web ServiceNew+ -> Build and deploy from a Git repository -> Connect你fork的项目 -> 选择部署区域 -> 选择实例类型为Free -> Create Web Service
4. 等待构建完成后复制分配的域名并拼接URL访问即可。
### Vercel部署
**注意Vercel免费账户的请求响应超时时间为10秒但接口响应通常较久可能会遇到Vercel返回的504超时错误**
请先确保安装了Node.js环境。
```shell
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](https://zeabur.com/button.svg)](https://zeabur.com/templates/GRFYBP)
## 原生部署
请准备一台具有公网IP的服务器并将8000端口开放。
请先安装好Node.js环境并且配置好环境变量确认node命令可用。 请先安装好Node.js环境并且配置好环境变量确认node命令可用。
@ -67,11 +249,23 @@ pm2 reload kimi-free-api
pm2 stop kimi-free-api pm2 stop kimi-free-api
``` ```
## 发起请求 ## 推荐使用客户端
目前支持与openai兼容的 `/v1/chat/completions` 接口 使用以下二次开发客户端接入free-api系列项目更快更简单支持文档/图像上传!
POST /v1/chat/completions 由 [Clivia](https://github.com/Yanyutin753/lobe-chat) 二次开发的LobeChat [https://github.com/Yanyutin753/lobe-chat](https://github.com/Yanyutin753/lobe-chat)
由 [时光@](https://github.com/SuYxh) 二次开发的ChatGPT Web [https://github.com/SuYxh/chatgpt-web-sea](https://github.com/SuYxh/chatgpt-web-sea)
## 接口列表
目前支持与openai兼容的 `/v1/chat/completions` 接口可自行使用与openai或其他兼容的客户端接入接口或者使用 [dify](https://dify.ai/) 等线上服务接入使用。
### 对话补全
对话补全接口与openai的 [chat-completions-api](https://platform.openai.com/docs/guides/text-generation/chat-completions-api) 兼容。
**POST /v1/chat/completions**
header 需要设置 Authorization 头部: header 需要设置 Authorization 头部:
@ -79,25 +273,250 @@ header 需要设置 Authorization 头部:
Authorization: Bearer [refresh_token] Authorization: Bearer [refresh_token]
``` ```
JSON数据 请求数据:
```json ```json
{ {
// 模型名称
// kimi默认模型
// kimi-search联网检索模型
// kimi-research探索版模型
// kimi-k1K1模型
// kimi-math数学模型
// kimi-silent不输出检索过程模型
// search/research/k1/math/silent可自由组合使用
// 如果使用kimi+智能体model请填写智能体ID就是浏览器地址栏上尾部的一串英文+数字20个字符的ID
"model": "kimi",
// 目前多轮对话基于消息合并实现某些场景可能导致能力下降且受单轮最大Token数限制
// 如果您想获得原生的多轮对话体验可以传入首轮消息获得的id来接续上下文注意如果使用这个首轮必须传none否则第二轮会空响应
// "conversation_id": "cnndivilnl96vah411dg",
"messages": [ "messages": [
{ {
"role": "user", "role": "user",
"content": "测试" "content": "测试"
} }
], ],
// 如果使用SSE流请设置为true // 是否开启联网搜索默认false
"use_search": true,
// 如果使用SSE流请设置为true默认false
"stream": false "stream": false
} }
``` ```
## 部署 响应数据:
```json
{
// 如果想获得原生多轮对话体验此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
}
```
请准备一台具有公网IP的服务器按照[安装](#安装)步骤部署好服务并将8000端口开放。 ### 文档解读
自行使用与openai或其他兼容的客户端接入接口。 提供一个可访问的文件URL或者BASE64_URL进行解析
或者使用dify线上服务接入使用。 **POST /v1/chat/completions**
header 需要设置 Authorization 头部:
```
Authorization: Bearer [refresh_token]
```
请求数据:
```json
{
// 模型名称
// kimi默认模型
// kimi-search联网检索模型
// kimi-research探索版模型
// kimi-k1K1模型
// kimi-math数学模型
// kimi-silent不输出检索过程模型
// search/research/k1/math/silent可自由组合使用
// 如果使用kimi+智能体model请填写智能体ID就是浏览器地址栏上尾部的一串英文+数字20个字符的ID
"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
}
```
响应数据:
```json
{
"id": "cnmuo7mcp7f9hjcmihn0",
"model": "kimi",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "文档中包含了几个古代魔法咒语的例子这些咒语来自古希腊和罗马时期的魔法文本被称为PGMPapyri 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](https://platform.openai.com/docs/guides/vision) API格式您也可以用这个格式传送文档进行解析。
**POST /v1/chat/completions**
header 需要设置 Authorization 头部:
```
Authorization: Bearer [refresh_token]
```
请求数据:
```json
{
// 模型名称
// kimi默认模型
// kimi-search联网检索模型
// kimi-research探索版模型
// kimi-k1K1模型
// kimi-math数学模型
// kimi-silent不输出检索过程模型
// search/research/k1/math/silent可自由组合使用
// 如果使用kimi+智能体model请填写智能体ID就是浏览器地址栏上尾部的一串英文+数字20个字符的ID
"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
}
```
响应数据:
```json
{
"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**
请求数据:
```json
{
"token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..."
}
```
响应数据:
```json
{
"live": true
}
```
## 注意事项
### Nginx反代优化
如果您正在使用Nginx反向代理kimi-free-api请添加以下配置项优化流的输出效果优化体验感。
```nginx
# 关闭代理缓冲。当设置为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](https://api.star-history.com/svg?repos=LLM-Red-Team/kimi-free-api&type=Date)](https://star-history.com/#LLM-Red-Team/kimi-free-api&Date)

504
README_EN.md Normal file
View File

@ -0,0 +1,504 @@
# KIMI AI Free Service
<hr>
[![](https://img.shields.io/github/license/llm-red-team/kimi-free-api.svg)](LICENSE)
![](https://img.shields.io/github/stars/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)
Supports high-speed streaming output, multi-turn dialogues, internet search, long document reading, image analysis, zero-configuration deployment, multi-token support, and automatic session trace cleanup.
Fully compatible with the ChatGPT interface.
Also, the following free APIs are available for your attention:
StepFun (StepChat) API to API [step-free-api](https://github.com/LLM-Red-Team/step-free-api)
Ali Tongyi (Qwen) API to API [qwen-free-api](https://github.com/LLM-Red-Team/qwen-free-api)
ZhipuAI (ChatGLM) API to API [glm-free-api](https://github.com/LLM-Red-Team/glm-free-api)
Meta Sota (metaso) API to API [metaso-free-api](https://github.com/LLM-Red-Team/metaso-free-api)
Iflytek Spark (Spark) API to API [spark-free-api](https://github.com/LLM-Red-Team/spark-free-api)
Lingxin Intelligence (Emohaa) API to API [emohaa-free-api](https://github.com/LLM-Red-Team/emohaa-free-api) (OUT OF ORDER)
## Table of Contents
* [Announcement](#Announcement)
* [Online experience](#Online-Experience)
* [Effect Examples](#Effect-Examples)
* [Access preparation](#Access-Preparation)
* [Multiple account access](#Multi-Account-Access)
* [Docker Deployment](#Docker-Deployment)
* [Docker-compose Deployment](#Docker-compose-Deployment)
* [Render Deployment](Render-Deployment)
* [Vercel Deployment](#Vercel-Deployment)
* [Zeabur Deployment](#Zeabur-Deployment)
* [Native Deployment](#Native-Deployment)
* [Interface List](#Interface-List)
* [Conversation completion](#conversation-completion)
* [Document Interpretation](#document-interpretation)
* [Image analysis](#image-analysis)
* [refresh_token survival detection](#refresh_token-survival-detection)
* [Precautions](#Precautions)
* [Nginx anti-generation optimization](#Nginx-anti-generation-optimization)
* [Token statistics](#Token-statistics)
* [Star History](#star-history)
## Announcement
**This API is unstable. So we highly recommend you go to the [MoonshotAI](https://platform.moonshot.cn/) use the offical API, avoiding banned.**
**This organization and individuals do not accept any financial donations and transactions. This project is purely for research, communication, and learning purposes!**
**For personal use only, it is forbidden to provide services or commercial use externally to avoid causing service pressure on the official, otherwise, bear the risk yourself!**
**For personal use only, it is forbidden to provide services or commercial use externally to avoid causing service pressure on the official, otherwise, bear the risk yourself!**
**For personal use only, it is forbidden to provide services or commercial use externally to avoid causing service pressure on the official, otherwise, bear the risk yourself!**
## Online Experience
This link is only for temporary testing of functions and cannot be used for a long time. For long-term use, please deploy by yourself.
https://udify.app/chat/Po0F6BMJ15q5vu2P
## Effect Examples
### Identity Verification
![Identity Verification](./doc/example-1.png)
### Multi-turn Dialogue
![Multi-turn Dialogue](./doc/example-6.png)
### Internet Search
![Internet Search](./doc/example-2.png)
### Long Document Reading
![Long Document Reading](./doc/example-5.png)
### Image Analysis
![Image Analysis](./doc/example-3.png)
### Consistent Responsiveness
![Consistent Responsiveness](https://github.com/LLM-Red-Team/kimi-free-api/assets/20235341/48c7ec00-2b03-46c4-95d0-452d3075219b)
## Access Preparation
Get the `refresh_token` from [kimi.moonshot.cn](https://kimi.moonshot.cn)
Start a conversation with kimi at will, then open the developer tool with F12, and find the value of `refresh_token` from Application > Local Storage, which will be used as the value of the Bearer Token in Authorization: `Authorization: Bearer TOKEN`
![example0](./doc/example-0.png)
If you see `refresh_token` as an array, please use `.` to join it before using.
![example8](./doc/example-8.jpg)
### Multi-Account Access
Currently, kimi limits ordinary accounts to only 30 rounds of long-text Q&A within every 3 hours (short text is unlimited). You can provide multiple account refresh_tokens and use `,` to join them:
`Authorization: Bearer TOKEN1,TOKEN2,TOKEN3`
The service will pick one each time a request is made.
## Docker Deployment
Please prepare a server with a public IP and open port 8000.
Pull the image and start the service
```shell
docker run -it -d --init --name kimi-free-api -p 8000:8000 -e TZ=Asia/Shanghai vinlic/kimi-free-api:latest
```
check real-time service logs
```shell
docker logs -f kimi-free-api
```
Restart service
```shell
docker restart kimi-free-api
```
Shut down service
```shell
docker stop kimi-free-api
```
### Docker-compose Deployment
```yaml
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 Deployment
**Attention: Some deployment regions may not be able to connect to Kimi. If container logs show request timeouts or connection failures (Singapore has been tested and found unavailable), please switch to another deployment region!**
**Attention Container instances for free accounts will automatically stop after a period of inactivity, which may result in a 50-second or longer delay during the next request. It is recommended to check [Render Container Keepalive](https://github.com/LLM-Red-Team/free-api-hub/#Render%E5%AE%B9%E5%99%A8%E4%BF%9D%E6%B4%BB)**
1. Fork this project to your GitHub account.
2. Visit [Render](https://dashboard.render.com/) and log in with your GitHub account.
3. Build your Web Service (New+ -> Build and deploy from a Git repository -> Connect your forked project -> Select deployment region -> Choose instance type as Free -> Create Web Service).
4. After the build is complete, copy the assigned domain and append the URL to access it.
### Vercel Deployment
**Note: Vercel free accounts have a request response timeout of 10 seconds, but interface responses are usually longer, which may result in a 504 timeout error from Vercel!**
Please ensure that Node.js environment is installed first.
```shell
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 Deployment
[![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/GRFYBP)
## Native Deployment
Please prepare a server with a public IP and open port 8000.
Please install the Node.js environment and configure the environment variables first, and confirm that the node command is available.
Install dependencies
```shell
npm i
```
Install PM2 for process guarding
```shell
npm i -g pm2
```
Compile and build. When you see the dist directory, the build is complete.
```shell
npm run build
```
Start service
```shell
pm2 start dist/index.js --name "kimi-free-api"
```
View real-time service logs
```shell
pm2 logs kimi-free-api
```
Restart service
```shell
pm2 reload kimi-free-api
```
Shut down service
```shell
pm2 stop kimi-free-api
```
## Recommended Clients
Using the following second-developed clients for free-api series projects is faster and easier, and supports document/image uploads!
[Clivia](https://github.com/Yanyutin753/lobe-chat)'s modified LobeChat [https://github.com/Yanyutin753/lobe-chat](https://github.com/Yanyutin753/lobe-chat)
[Time@](https://github.com/SuYxh)'s modified ChatGPT Web [https://github.com/SuYxh/chatgpt-web-sea](https://github.com/SuYxh/chatgpt-web-sea)
## interface list
Currently, the `/v1/chat/completions` interface compatible with openai is supported. You can use the client access interface compatible with openai or other clients, or use online services such as [dify](https://dify.ai/) Access and use.
### Conversation completion
Conversation completion interface, compatible with openai's [chat-completions-api](https://platform.openai.com/docs/guides/text-generation/chat-completions-api).
**POST /v1/chat/completions**
The header needs to set the Authorization header:
```
Authorization: Bearer [refresh_token]
```
Request data:
```json
{
// Model name
// kimi: default model
// kimi-search: online search model
// kimi-research: exploration version model
// kimi-k1: K1 model
// kimi-math: math model
// kimi-silent: model without search process output
// search/research/k1/math/silent: can be freely combined
// If using kimi+agent, fill in the agent ID for model, which is the 20-character ID of letters and numbers at the end of the browser address bar
"model": "kimi",
"messages": [
{
"role": "user",
"content": "test"
}
],
// Whether to enable online search, default false
"use_search": true,
// If using SSE stream, please set it to true, the default is false
"stream": false
}
```
Response data:
```json
{
"id": "cnndivilnl96vah411dg",
"model": "kimi",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! I am Kimi, an artificial intelligence assistant developed by Dark Side of the Moon Technology Co., Ltd. I am good at conversation in Chinese and English. I can help you obtain information, answer questions, and read and understand the documents you provide. and web content. If you have any questions or need help, feel free to let me know!"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1,
"completion_tokens": 1,
"total_tokens": 2
},
"created": 1710152062
}
```
### Document interpretation
Provide an accessible file URL or BASE64_URL to parse.
**POST /v1/chat/completions**
The header needs to set the Authorization header:
```
Authorization: Bearer [refresh_token]
```
Request data:
```json
{
// Model name
// kimi: default model
// kimi-search: online search model
// kimi-research: exploration version model
// kimi-k1: K1 model
// kimi-math: math model
// kimi-silent: model without search process output
// search/research/k1/math/silent: can be freely combined
// If using kimi+agent, fill in the agent ID for model, which is the 20-character ID of letters and numbers at the end of the browser address bar
"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": "What does the document say?"
}
]
}
],
// It is recommended to turn off online search to prevent interference in interpreting results.
"use_search": false
}
```
Response data:
```json
{
"id": "cnmuo7mcp7f9hjcmihn0",
"model": "kimi",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "The document contains several examples of ancient magical spells from magical texts from the ancient Greek and Roman periods known as PGM (Papyri Graecae Magicae). The following are examples of several spells mentioned in the document Contents:\n\n1. The first spell (PMG 4.1390 1495) describes a ritual that requires leaving some of your leftover bread, dividing it into seven small pieces, and then going to the heroes, gladiators, and those who died violent deaths The place where people were killed. Spell a spell on the piece of bread and throw it out, then pick up some contaminated soil from the ritual site and throw it into the home of the woman you like, then go to sleep. The content of the spell is to pray to the goddess of fate (Moirai), The Roman goddesses of Fates and the forces of nature (Daemons) were invoked to help make wishes come true.\n\n2. The second incantation (PMG 4.1342 57) was a summoning spell performed by speaking a series of mystical names and Words to summon a being called Daemon to cause a person named Tereous (born from Apia) to be mentally and emotionally tortured until she came to the spellcaster Didymos (born from Taipiam).\n \n3. The third spell (PGM 4.1265 74) mentions a mysterious name called NEPHERIĒRI, which is related to Aphrodite, the goddess of love. In order to win the heart of a beautiful woman, one needs to keep it for three days of purity, offer frankincense and recite the name while offering the offering. Then, as you approach the lady, recite the name silently seven times in your mind and do this for seven consecutive days with the hope of success.\n\n4. The fourth mantra ( PGM 4.1496 1) describes an incantation recited while burning myrrh. This incantation is a prayer to myrrh in the hope that it will attract a person named [name ] woman (her mother's name was [name]), making her unable to sit, eat, look at or kiss other people, but instead had only the caster in her mind until she came to the caster.\n\nThese Spells reflect ancient people's beliefs in magic and supernatural powers, and the ways in which they attempted to influence the emotions and behavior of others through these spells."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1,
"completion_tokens": 1,
"total_tokens": 2
},
"created": 100920
}
```
### Image analysis
Provide an accessible image URL or BASE64_URL to parse.
This format is compatible with the [gpt-4-vision-preview](https://platform.openai.com/docs/guides/vision) API format. You can also use this format to transmit documents for parsing.
**POST /v1/chat/completions**
The header needs to set the Authorization header:
```
Authorization: Bearer [refresh_token]
```
Request data:
```json
{
// Model name
// kimi: default model
// kimi-search: online search model
// kimi-research: exploration version model
// kimi-k1: K1 model
// kimi-math: math model
// kimi-silent: model without search process output
// search/research/k1/math/silent: can be freely combined
// If using kimi+agent, fill in the agent ID for model, which is the 20-character ID of letters and numbers at the end of the browser address bar
"model": "kimi",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://www.moonshot.cn/assets/logo/normal-dark.png"
}
},
{
"type": "text",
"text": "What does the image describe?"
}
]
}
],
// It is recommended to turn off online search to prevent interference in interpreting results.
"use_search": false
}
```
Response data:
```json
{
"id": "cnn6l8ilnl92l36tu8ag",
"model": "kimi",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "The image shows the words "Moonshot AI", which may be the logo or brand identity of Dark Side of the Moon Technology Co., Ltd. (Moonshot AI). Usually such images are used to represent a company or product and convey brand information .Since the image is in PNG format, it could be a logo with a transparent background, used on a website, app, or other visual material."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1,
"completion_tokens": 1,
"total_tokens": 2
},
"created": 1710123627
}
```
### refresh_token survival detection
Check whether refresh_token is alive. If live is not true, otherwise it is false. Please do not call this interface frequently (less than 10 minutes).
**POST /token/check**
Request data:
```json
{
"token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9..."
}
```
Response data:
```json
{
"live": true
}
```
## Notification
### Nginx anti-generation optimization
If you are using Nginx reverse proxy kimi-free-api, please add the following configuration items to optimize the output effect of the stream and optimize the experience.
```nginx
# Turn off proxy buffering. When set to off, Nginx will immediately send client requests to the backend server and immediately send responses received from the backend server back to the client.
proxy_buffering off;
# Enable chunked transfer encoding. Chunked transfer encoding allows servers to send data in chunks for dynamically generated content without knowing the size of the content in advance.
chunked_transfer_encoding on;
# Turn on TCP_NOPUSH, which tells Nginx to send as much data as possible before sending the packet to the client. This is usually used in conjunction with sendfile to improve network efficiency.
tcp_nopush on;
# Turn on TCP_NODELAY, which tells Nginx not to delay sending data and to send small data packets immediately. In some cases, this can reduce network latency.
tcp_nodelay on;
#Set the timeout to keep the connection, here it is set to 120 seconds. If there is no further communication between client and server during this time, the connection will be closed.
keepalive_timeout 120;
```
### Token statistics
Since the inference side is not in kimi-free-api, the token cannot be counted and will be returned as a fixed number!!!!!
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=LLM-Red-Team/kimi-free-api&type=Date)](https://star-history.com/#LLM-Red-Team/kimi-free-api&Date)

View File

@ -1,8 +0,0 @@
chatCompletion:
provider: zhipuai
model: glm-4
apiKey: 99b6167d7f421fc2187785503d2ffe9f.WncREpjXE26ediTw
contextLength: 131072
maxToken: 8192
concurrencyLimit: 5
waitReponseTimeout: 30000

BIN
doc/example-0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
doc/example-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

BIN
doc/example-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

BIN
doc/example-6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

BIN
doc/example-7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
doc/example-8.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,7 +1,7 @@
{ {
"name": "kimi-free-api", "name": "kimi-free-api",
"version": "0.0.3", "version": "0.0.36",
"description": "Kimi Free Server", "description": "Kimi Free API Server",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",
"module": "dist/index.mjs", "module": "dist/index.mjs",
@ -13,8 +13,8 @@
"dist/" "dist/"
], ],
"scripts": { "scripts": {
"dev": "tsup src/index.ts --format cjs,esm --sourcemap --dts --publicDir public --watch --onSuccess \"node dist/index.js\"", "dev": "tsup src/index.ts --format cjs,esm --sourcemap --dts --publicDir public --watch --onSuccess \"node --enable-source-maps --no-node-snapshot dist/index.js\"",
"start": "node dist/index.js", "start": "node --enable-source-maps --no-node-snapshot dist/index.js",
"build": "tsup src/index.ts --format cjs,esm --sourcemap --dts --clean --publicDir public" "build": "tsup src/index.ts --format cjs,esm --sourcemap --dts --clean --publicDir public"
}, },
"author": "Vinlic", "author": "Vinlic",
@ -27,7 +27,6 @@
"date-fns": "^3.3.1", "date-fns": "^3.3.1",
"eventsource-parser": "^1.1.2", "eventsource-parser": "^1.1.2",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"https-proxy-agent": "^7.0.4",
"koa": "^2.15.0", "koa": "^2.15.0",
"koa-body": "^5.0.0", "koa-body": "^5.0.0",
"koa-bodyparser": "^4.4.1", "koa-bodyparser": "^4.4.1",
@ -38,7 +37,6 @@
"mime": "^4.0.1", "mime": "^4.0.1",
"minimist": "^1.2.8", "minimist": "^1.2.8",
"randomstring": "^1.3.0", "randomstring": "^1.3.0",
"socks-proxy-agent": "^8.0.2",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"yaml": "^2.3.4" "yaml": "^2.3.4"
}, },

10
public/welcome.html Normal file
View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>🚀 服务已启动</title>
</head>
<body>
<p>kimi-free-api已启动<br>请通过LobeChat / NextChat / Dify等客户端或OpenAI SDK接入</p>
</body>
</html>

View File

@ -2,5 +2,9 @@ export default {
API_TEST: [-9999, 'API异常错误'], API_TEST: [-9999, 'API异常错误'],
API_REQUEST_PARAMS_INVALID: [-2000, '请求参数非法'], API_REQUEST_PARAMS_INVALID: [-2000, '请求参数非法'],
API_REQUEST_FAILED: [-2001, '请求失败'], API_REQUEST_FAILED: [-2001, '请求失败'],
API_TOKEN_EXPIRES: [-2002, 'Token已失效'] API_TOKEN_EXPIRES: [-2002, 'Token已失效'],
API_FILE_URL_INVALID: [-2003, '远程文件URL非法'],
API_FILE_EXECEEDS_SIZE: [-2004, '远程文件超出大小'],
API_CHAT_STREAM_PUSHING: [-2005, '已有对话流正在输出'],
API_RESEARCH_EXCEEDS_LIMIT: [-2006, '探索版使用量已达到上限']
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
export default interface IStreamMessage {
id: string;
model: string;
object: string;
choices: {
index: number;
message: {
role: string;
content: string;
};
finish_reason: string;
}[];
usage: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
segment_id?: string;
created: number;
}

View File

@ -13,20 +13,26 @@ export default {
'/completions': async (request: Request) => { '/completions': async (request: Request) => {
request request
.validate('body.conversation_id', v => _.isUndefined(v) || _.isString(v))
.validate('body.messages', _.isArray) .validate('body.messages', _.isArray)
.validate('headers.authorization', _.isString) .validate('headers.authorization', _.isString)
const token = request.headers.authorization; // refresh_token切分
const refreshToken = token.replace('Bearer ', ''); const tokens = chat.tokenSplit(request.headers.authorization);
logger.info(`Refresh token: ${refreshToken}`); // 随机挑选一个refresh_token
const messages = request.body.messages; const token = _.sample(tokens);
if (request.body.stream) { let { model, conversation_id: convId, messages, stream, use_search } = request.body;
const stream = await chat.createCompletionStream(request.body.messages, refreshToken, request.body.use_search);
if(use_search)
model = 'kimi-search';
if (stream) {
const stream = await chat.createCompletionStream(model, messages, token, convId);
return new Response(stream, { return new Response(stream, {
type: "text/event-stream" type: "text/event-stream"
}); });
} }
else else
return await chat.createCompletion(messages, refreshToken, request.body.use_search); return await chat.createCompletion(model, messages, token, convId);
} }
} }

View File

@ -1,5 +1,27 @@
import fs from 'fs-extra';
import Response from '@/lib/response/Response.ts';
import chat from "./chat.ts"; import chat from "./chat.ts";
import ping from "./ping.ts";
import token from './token.ts';
import models from './models.ts';
export default [ export default [
chat {
get: {
'/': async () => {
const content = await fs.readFile('public/welcome.html');
return new Response(content, {
type: 'html',
headers: {
Expires: '-1'
}
});
}
}
},
chat,
ping,
token,
models
]; ];

41
src/api/routes/models.ts Normal file
View File

@ -0,0 +1,41 @@
import _ from 'lodash';
export default {
prefix: '/v1',
get: {
'/models': async () => {
return {
"data": [
{
"id": "moonshot-v1",
"object": "model",
"owned_by": "kimi-free-api"
},
{
"id": "moonshot-v1-8k",
"object": "model",
"owned_by": "kimi-free-api"
},
{
"id": "moonshot-v1-32k",
"object": "model",
"owned_by": "kimi-free-api"
},
{
"id": "moonshot-v1-128k",
"object": "model",
"owned_by": "kimi-free-api"
},
{
"id": "moonshot-v1-vision",
"object": "model",
"owned_by": "kimi-free-api"
}
]
};
}
}
}

6
src/api/routes/ping.ts Normal file
View File

@ -0,0 +1,6 @@
export default {
prefix: '/ping',
get: {
'': async () => "pong"
}
}

25
src/api/routes/token.ts Normal file
View File

@ -0,0 +1,25 @@
import _ from 'lodash';
import Request from '@/lib/request/Request.ts';
import Response from '@/lib/response/Response.ts';
import chat from '@/api/controllers/chat.ts';
import logger from '@/lib/logger.ts';
export default {
prefix: '/token',
post: {
'/check': async (request: Request) => {
request
.validate('body.token', _.isString)
const live = await chat.getTokenLiveStatus(request.body.token);
return {
live
}
}
}
}

View File

@ -6,7 +6,6 @@ import "@/lib/initialize.ts";
import server from "@/lib/server.ts"; import server from "@/lib/server.ts";
import routes from "@/api/routes/index.ts"; import routes from "@/api/routes/index.ts";
import logger from "@/lib/logger.ts"; import logger from "@/lib/logger.ts";
import util from "@/lib/util.ts";
const startupTime = performance.now(); const startupTime = performance.now();
@ -23,7 +22,7 @@ const startupTime = performance.now();
await server.listen(); await server.listen();
config.service.bindAddress && config.service.bindAddress &&
logger.success("service bind address:", config.service.bindAddress); logger.success("Service bind address:", config.service.bindAddress);
})() })()
.then(() => .then(() =>
logger.success( logger.success(

View File

@ -1,6 +1,5 @@
import serviceConfig from "./configs/service-config.ts"; import serviceConfig from "./configs/service-config.ts";
import systemConfig from "./configs/system-config.ts"; import systemConfig from "./configs/system-config.ts";
import apiConfig from "./configs/api-config.ts";
class Config { class Config {
@ -10,9 +9,6 @@ class Config {
/** 系统配置 */ /** 系统配置 */
system = systemConfig; system = systemConfig;
/** API配置 */
api = apiConfig;
} }
export default new Config(); export default new Config();

View File

@ -1,85 +0,0 @@
import path from 'path';
import fs from 'fs-extra';
import yaml from 'yaml';
import _ from 'lodash';
import environment from '@/lib/environment.ts';
const CONFIG_PATH = path.join(path.resolve(), 'configs/', environment.env, "/api.yml");
export interface ProxyAgent {
enable?: boolean;
protocol?: string;
host?: string;
port?: number;
}
export class ChatCompletionConfig {
/** 服务提供商 */
provider: string;
/** 调用地址 */
url: string;
/** API密钥 */
apiKey: string;
/** API版本号 */
apiVersion: string;
/** 模型名称 */
model: string;
/** 上下文长度 */
contextLength: number;
/** 单次最大token数 */
maxToken: number;
/** 并行请求数 */
concurrencyLimit: number;
/** 等待响应超时时间(毫秒) */
waitReponseTimeout: number;
/** 网络代理 */
proxyAgent: ProxyAgent | null;
constructor(options?: any) {
const { provider, url, apiKey, apiVersion, model, contextLength, concurrencyLimit, waitReponseTimeout, proxyAgent } = options || {};
this.provider = _.defaultTo(provider, 'zhipuai');
this.url = _.defaultTo(url, 'https://open.bigmodel.cn/api/paas/v4/chat/completions');
this.apiKey = _.defaultTo(apiKey, '');
this.apiVersion = _.defaultTo(apiVersion, '');
this.model = _.defaultTo(model, 'glm-4');
this.contextLength = _.defaultTo(contextLength, 131072);
this.concurrencyLimit = _.defaultTo(concurrencyLimit, 100);
this.waitReponseTimeout = _.defaultTo(waitReponseTimeout, 30000);
this.proxyAgent = _.defaultTo(proxyAgent, null);
}
static create(value) {
return ChatCompletionConfig.isInstance(value) ? value : new ChatCompletionConfig(value);
}
static isInstance(value) {
return value instanceof ChatCompletionConfig;
}
}
/**
* API配置
*/
export class APIConfig {
/** 聊天补全配置 */
chatCompletion: ChatCompletionConfig;
constructor(options?: any) {
const { chatCompletion } = options || {};
this.chatCompletion = ChatCompletionConfig.create(chatCompletion);
}
static load() {
if(!fs.pathExistsSync(CONFIG_PATH)) return new APIConfig();
const data = yaml.parse(fs.readFileSync(CONFIG_PATH).toString());
return new APIConfig(data);
}
}
export default APIConfig.load();

View File

@ -44,12 +44,12 @@ export class SystemConfig {
this.requestBody = Object.assign(requestBody || {}, { this.requestBody = Object.assign(requestBody || {}, {
enableTypes: ['json', 'form', 'text', 'xml'], enableTypes: ['json', 'form', 'text', 'xml'],
encoding: 'utf-8', encoding: 'utf-8',
formLimit: '10mb', formLimit: '100mb',
jsonLimit: '10mb', jsonLimit: '100mb',
textLimit: '10mb', textLimit: '100mb',
xmlLimit: '10mb', xmlLimit: '100mb',
formidable: { formidable: {
maxFileSize: '30mb' maxFileSize: '100mb'
}, },
multipart: true, multipart: true,
parsedMethods: ['POST', 'PUT', 'PATCH'] parsedMethods: ['POST', 'PUT', 'PATCH']

View File

@ -29,6 +29,11 @@ export default class Exception extends Error {
this.errmsg = _errmsg || errmsg; this.errmsg = _errmsg || errmsg;
} }
compare(exception: (string | number)[]) {
const [errcode] = exception as [number, string];
return this.errcode == errcode;
}
setHTTPStatusCode(value: number) { setHTTPStatusCode(value: number) {
this.httpStatusCode = value; this.httpStatusCode = value;
return this; return this;

View File

@ -9,13 +9,15 @@ import { format as dateFormat } from 'date-fns';
import config from './config.ts'; import config from './config.ts';
import util from './util.ts'; import util from './util.ts';
const isVercelEnv = process.env.VERCEL;
class LogWriter { class LogWriter {
#buffers = []; #buffers = [];
constructor() { constructor() {
fs.ensureDirSync(config.system.logDirPath); !isVercelEnv && fs.ensureDirSync(config.system.logDirPath);
this.work(); !isVercelEnv && this.work();
} }
push(content) { push(content) {
@ -24,16 +26,16 @@ class LogWriter {
} }
writeSync(buffer) { writeSync(buffer) {
fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer); !isVercelEnv && fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer);
} }
async write(buffer) { async write(buffer) {
await fs.appendFile(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer); !isVercelEnv && await fs.appendFile(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), buffer);
} }
flush() { flush() {
if(!this.#buffers.length) return; if(!this.#buffers.length) return;
fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), Buffer.concat(this.#buffers)); !isVercelEnv && fs.appendFileSync(path.join(config.system.logDirPath, `/${util.getDateString()}.log`), Buffer.concat(this.#buffers));
} }
work() { work() {

View File

@ -15,7 +15,7 @@ export default class FailureBody extends Body {
else if(error instanceof APIException || error instanceof Exception) else if(error instanceof APIException || error instanceof Exception)
({ errcode, errmsg, data, httpStatusCode } = error); ({ errcode, errmsg, data, httpStatusCode } = error);
else if(_.isError(error)) else if(_.isError(error))
error = new Exception(EX.SYSTEM_ERROR, error.message); ({ errcode, errmsg, data, httpStatusCode } = new Exception(EX.SYSTEM_ERROR, error.message));
super({ super({
code: errcode || -1, code: errcode || -1,
message: errmsg || 'Internal error', message: errmsg || 'Internal error',

View File

@ -73,7 +73,11 @@ class Server {
this.app.use((ctx: any) => { this.app.use((ctx: any) => {
const request = new Request(ctx); const request = new Request(ctx);
logger.debug(`-> ${ctx.request.method} ${ctx.request.url} request is not supported - ${request.remoteIP || "unknown"}`); logger.debug(`-> ${ctx.request.method} ${ctx.request.url} request is not supported - ${request.remoteIP || "unknown"}`);
const failureBody = new FailureBody(new Exception(EX.SYSTEM_NOT_ROUTE_MATCHING, "Request is not supported")); // const failureBody = new FailureBody(new Exception(EX.SYSTEM_NOT_ROUTE_MATCHING, "Request is not supported"));
// const response = new Response(failureBody);
const message = `[请求有误]: 正确请求为 POST -> /v1/chat/completions当前请求为 ${ctx.request.method} -> ${ctx.request.url} 请纠正`;
logger.warn(message);
const failureBody = new FailureBody(new Error(message));
const response = new Response(failureBody); const response = new Response(failureBody);
response.injectTo(ctx); response.injectTo(ctx);
if(config.system.requestLog) if(config.system.requestLog)

View File

@ -12,10 +12,7 @@ import CRC32 from 'crc-32';
import randomstring from 'randomstring'; import randomstring from 'randomstring';
import _ from 'lodash'; import _ from 'lodash';
import { CronJob } from 'cron'; import { CronJob } from 'cron';
import { SocksProxyAgent } from 'socks-proxy-agent';
import { HttpsProxyAgent } from 'https-proxy-agent';
import type { ProxyAgent } from './configs/api-config.ts';
import HTTP_STATUS_CODE from './http-status-codes.ts'; import HTTP_STATUS_CODE from './http-status-codes.ts';
const autoIdMap = new Map(); const autoIdMap = new Map();
@ -50,6 +47,17 @@ const util = {
return value.headers ? (value.headers["content-type"] || value.headers["Content-Type"]) : null; return value.headers ? (value.headers["content-type"] || value.headers["Content-Type"]) : null;
}, },
generateCookie() {
const timestamp = util.unixTimestamp();
const items = [
`Hm_lvt_358cae4815e85d48f7e8ab7f3680a74b=${timestamp - Math.round(Math.random() * 2592000)}`,
`_ga=GA1.1.${util.generateRandomString({ length: 10, charset: 'numeric' })}.${timestamp - Math.round(Math.random() * 2592000)}`,
`_ga_YXD8W70SZP=GS1.1.${timestamp - Math.round(Math.random() * 2592000)}.1.1.${timestamp - Math.round(Math.random() * 2592000)}.0.0.0`,
`Hm_lpvt_358cae4815e85d48f7e8ab7f3680a74b=${timestamp - Math.round(Math.random() * 2592000)}`
];
return items.join('; ');
},
mimeToExtension(value: string) { mimeToExtension(value: string) {
let extension = mime.getExtension(value); let extension = mime.getExtension(value);
if(extension == "mpga") if(extension == "mpga")
@ -67,21 +75,6 @@ const util = {
return new CronJob(cronPatterns, () => callback(), null, false, "Asia/Shanghai"); return new CronJob(cronPatterns, () => callback(), null, false, "Asia/Shanghai");
}, },
createProxyAgent(options: ProxyAgent) {
const { enable, protocol, host, port } = options;
if(enable === false)
return null;
switch(protocol) {
case "socks5":
return new SocksProxyAgent(`${protocol}://${host}:${port}`);
case "http":
case "https":
return new HttpsProxyAgent(`${protocol}://${host}:${port}`);
default:
throw new Error(`protocol ${protocol} is not supported`);
}
},
getDateString(format = "yyyy-MM-dd", date = new Date()) { getDateString(format = "yyyy-MM-dd", date = new Date()) {
return dateFormat(date, format); return dateFormat(date, format);
}, },
@ -154,18 +147,18 @@ const util = {
return !_.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value); return !_.isUndefined(value) && /^[a-zA-Z0-9\/\+]+(=?)+$/.test(value);
}, },
isBASE64Image(value) { isBASE64Data(value) {
return /^data:image/.test(value); return /^data:/.test(value);
}, },
extractBASE64ImageFormat(value): string | null { extractBASE64DataFormat(value): string | null {
const match = value.trim().match(/^data:image\/(.+);base64,/); const match = value.trim().match(/^data:(.+);base64,/);
if(!match) return null; if(!match) return null;
return match[1]; return match[1];
}, },
removeBASE64ImageHeader(value): string { removeBASE64DataHeader(value): string {
return value.replace(/^data:image\/(.+);base64,/, ""); return value.replace(/^data:(.+);base64,/, "");
}, },
isDataString(value): boolean { isDataString(value): boolean {

27
vercel.json Normal file
View File

@ -0,0 +1,27 @@
{
"builds": [
{
"src": "./dist/*.html",
"use": "@vercel/static"
},
{
"src": "./dist/index.js",
"use": "@vercel/node"
}
],
"routes": [
{
"src": "/",
"dest": "/dist/welcome.html"
},
{
"src": "/(.*)",
"dest": "/dist",
"headers": {
"Access-Control-Allow-Credentials": "true",
"Access-Control-Allow-Methods": "GET,OPTIONS,PATCH,DELETE,POST,PUT",
"Access-Control-Allow-Headers": "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version, Content-Type, Authorization"
}
}
]
}

1555
yarn.lock Normal file

File diff suppressed because it is too large Load Diff