From 96cc81a1f7edbb4f25e56426039da0370ac0b65a Mon Sep 17 00:00:00 2001
From: arch3rPro <30855883+arch3rPro@users.noreply.github.com>
Date: Sat, 26 Jul 2025 15:20:59 +0800
Subject: [PATCH] feat: add app New-API
---
README.md | 23 +++++
apps/new-api/0.8.7.5-allinone/data.yml | 28 +++++
.../0.8.7.5-allinone/docker-compose.yml | 59 +++++++++++
apps/new-api/0.8.7.5/data.yml | 17 ++++
apps/new-api/0.8.7.5/docker-compose.yml | 25 +++++
apps/new-api/README.en.md | 96 ++++++++++++++++++
apps/new-api/README.md | 96 ++++++++++++++++++
apps/new-api/data.yml | 19 ++++
apps/new-api/latest/data.yml | 17 ++++
apps/new-api/latest/docker-compose.yml | 25 +++++
apps/new-api/logo.png | Bin 0 -> 9597 bytes
11 files changed, 405 insertions(+)
create mode 100644 apps/new-api/0.8.7.5-allinone/data.yml
create mode 100644 apps/new-api/0.8.7.5-allinone/docker-compose.yml
create mode 100644 apps/new-api/0.8.7.5/data.yml
create mode 100644 apps/new-api/0.8.7.5/docker-compose.yml
create mode 100644 apps/new-api/README.en.md
create mode 100644 apps/new-api/README.md
create mode 100644 apps/new-api/data.yml
create mode 100644 apps/new-api/latest/data.yml
create mode 100644 apps/new-api/latest/docker-compose.yml
create mode 100644 apps/new-api/logo.png
diff --git a/README.md b/README.md
index 9272e3d..64752e8 100644
--- a/README.md
+++ b/README.md
@@ -414,6 +414,29 @@ AI驱动的开源代码知识库与文档协作平台,支持多模型、多数
+
+
+
+
+
+
+ New-API
+
+
+🍥 新一代大模型网关与AI资产管理系统,支持多种模型统一调用
+
+0.8.7.5 • [官网链接](https://docs.newapi.pro/)
+
+ |
+
+
+ |
+
+
+ |
+
+
+
#### 🎵 多媒体管理
diff --git a/apps/new-api/0.8.7.5-allinone/data.yml b/apps/new-api/0.8.7.5-allinone/data.yml
new file mode 100644
index 0000000..659e02f
--- /dev/null
+++ b/apps/new-api/0.8.7.5-allinone/data.yml
@@ -0,0 +1,28 @@
+additionalProperties:
+ formFields:
+ - default: newapi
+ edit: true
+ envKey: PANEL_DB_NAME
+ labelEn: Database
+ labelZh: 数据库名
+ random: true
+ required: true
+ rule: paramCommon
+ type: text
+ - default: newapi
+ edit: true
+ envKey: PANEL_DB_ROOT_PASSWORD
+ labelEn: Password
+ labelZh: 数据库密码
+ random: true
+ required: true
+ rule: paramComplexity
+ type: password
+ - default: 3000
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
diff --git a/apps/new-api/0.8.7.5-allinone/docker-compose.yml b/apps/new-api/0.8.7.5-allinone/docker-compose.yml
new file mode 100644
index 0000000..9614eea
--- /dev/null
+++ b/apps/new-api/0.8.7.5-allinone/docker-compose.yml
@@ -0,0 +1,59 @@
+services:
+ new-api:
+ image: calciumion/new-api:v0.8.7.5
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ ports:
+ - ${PANEL_APP_PORT_HTTP}:3000
+ networks:
+ - 1panel-network
+ command: --log-dir /app/logs
+ volumes:
+ - ./data:/data
+ - ./logs:/app/logs
+ environment:
+ - SQL_DSN=root:${PANEL_DB_ROOT_PASSWORD}@tcp(${CONTAINER_NAME}-mysql:3306)/${PANEL_DB_NAME} # 修改此行,或注释掉以使用 SQLite 作为数据库
+ - TZ=Asia/Shanghai
+ - REDIS_CONN_STRING=redis://${CONTAINER_NAME}-redis
+ - ERROR_LOG_ENABLED=true # 是否启用错误日志记录
+ # - STREAMING_TIMEOUT=120 # 流模式无响应超时时间,单位秒,默认120秒,如果出现空补全可以尝试改为更大值
+ # - SESSION_SECRET=random_string # 多机部署时设置,必须修改这个随机字符串!!!!!!!
+ # - NODE_TYPE=slave # Uncomment for slave node in multi-node deployment
+ # - SYNC_FREQUENCY=60 # Uncomment if regular database syncing is needed
+ # - FRONTEND_BASE_URL=https://openai.justsong.cn # Uncomment for multi-node deployment with front-end URL
+ depends_on:
+ - redis
+ - mysql
+ healthcheck:
+ test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $$2}'"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ labels:
+ createdBy: "Apps"
+
+ mysql:
+ image: mysql:8.2
+ container_name: ${CONTAINER_NAME}-mysql
+ restart: always
+ volumes:
+ - mysql_data:/var/lib/mysql
+ environment:
+ - MYSQL_ROOT_PASSWORD=${PANEL_DB_ROOT_PASSWORD} # MySQL root用户密码
+ - MYSQL_DATABASE=${PANEL_DB_NAME} # 创建的数据库名
+ networks:
+ - 1panel-network
+
+ redis:
+ image: redis:latest
+ container_name: ${CONTAINER_NAME}-redis
+ restart: always
+ networks:
+ - 1panel-network
+
+volumes:
+ mysql_data:
+
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/new-api/0.8.7.5/data.yml b/apps/new-api/0.8.7.5/data.yml
new file mode 100644
index 0000000..47b7d31
--- /dev/null
+++ b/apps/new-api/0.8.7.5/data.yml
@@ -0,0 +1,17 @@
+additionalProperties:
+ formFields:
+ - default: 3000
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TZ
+ labelEn: Time Zone
+ labelZh: 时区
+ required: true
+ type: text
diff --git a/apps/new-api/0.8.7.5/docker-compose.yml b/apps/new-api/0.8.7.5/docker-compose.yml
new file mode 100644
index 0000000..d050988
--- /dev/null
+++ b/apps/new-api/0.8.7.5/docker-compose.yml
@@ -0,0 +1,25 @@
+services:
+ new-api:
+ image: calciumion/new-api:v0.8.7.5
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ ports:
+ - ${PANEL_APP_PORT_HTTP}:3000
+ networks:
+ - 1panel-network
+ command: --log-dir /app/logs
+ volumes:
+ - ./data:/data
+ - ./logs:/app/logs
+ environment:
+ - TZ=${TZ}
+# - SESSION_SECRET=${SESSION_SECRET}
+# - REDIS_CONN_STRING=redis://redis
+# - NODE_TYPE=slave # 多机部署时从节点取消注释该行
+# - SYNC_FREQUENCY=60 # 需要定期从数据库加载数据时取消注释该行
+# - FRONTEND_BASE_URL=https://openai.justsong.cn # 多机部署时从节点取消注释该行
+ labels:
+ createdBy: "Apps"
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/new-api/README.en.md b/apps/new-api/README.en.md
new file mode 100644
index 0000000..9caab0f
--- /dev/null
+++ b/apps/new-api/README.en.md
@@ -0,0 +1,96 @@
+# New API
+
+🍥 Next-Generation Large Model Gateway and AI Asset Management System
+
+> The next-generation LLM gateway and AI asset management system supports multiple languages.
+
+
+
+
+
+
+
+## 📝 Project Description
+
+> [!NOTE]
+> This is an open-source project developed based on [One API](https://github.com/songquanpeng/one-api)
+
+> [!IMPORTANT]
+> - This project is for personal learning purposes only, with no guarantee of stability or technical support.
+> - Users must comply with OpenAI's [Terms of Use](https://openai.com/policies/terms-of-use) and **applicable laws and regulations**, and must not use it for illegal purposes.
+> - According to the [《Interim Measures for the Management of Generative Artificial Intelligence Services》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm), please do not provide any unregistered generative AI services to the public in China.
+
+## 📚 Documentation
+
+For detailed documentation, please visit our official Wiki: [https://docs.newapi.pro/](https://docs.newapi.pro/)
+
+You can also access the AI-generated DeepWiki:
+[](https://deepwiki.com/QuantumNous/new-api)
+
+## ✨ Key Features
+
+New API offers a wide range of features, please refer to [Features Introduction](https://docs.newapi.pro/wiki/features-introduction) for details:
+
+1. 🎨 Brand new UI interface
+2. 🌍 Multi-language support
+3. 💰 Online recharge functionality (YiPay)
+4. 🔍 Support for querying usage quotas with keys (works with [neko-api-key-tool](https://github.com/Calcium-Ion/neko-api-key-tool))
+5. 🔄 Compatible with the original One API database
+6. 💵 Support for pay-per-use model pricing
+7. ⚖️ Support for weighted random channel selection
+8. 📈 Data dashboard (console)
+9. 🔒 Token grouping and model restrictions
+10. 🤖 Support for more authorization login methods (LinuxDO, Telegram, OIDC)
+11. 🔄 Support for Rerank models (Cohere and Jina), [API Documentation](https://docs.newapi.pro/api/jinaai-rerank)
+12. ⚡ Support for OpenAI Realtime API (including Azure channels), [API Documentation](https://docs.newapi.pro/api/openai-realtime)
+13. ⚡ Support for Claude Messages format, [API Documentation](https://docs.newapi.pro/api/anthropic-chat)
+14. Support for entering chat interface via /chat2link route
+15. 🧠 Support for setting reasoning effort through model name suffixes:
+ 1. OpenAI o-series models
+ - Add `-high` suffix for high reasoning effort (e.g.: `o3-mini-high`)
+ - Add `-medium` suffix for medium reasoning effort (e.g.: `o3-mini-medium`)
+ - Add `-low` suffix for low reasoning effort (e.g.: `o3-mini-low`)
+ 2. Claude thinking models
+ - Add `-thinking` suffix to enable thinking mode (e.g.: `claude-3-7-sonnet-20250219-thinking`)
+16. 🔄 Thinking-to-content functionality
+17. 🔄 Model rate limiting for users
+18. 💰 Cache billing support, which allows billing at a set ratio when cache is hit:
+ 1. Set the `Prompt Cache Ratio` option in `System Settings-Operation Settings`
+ 2. Set `Prompt Cache Ratio` in the channel, range 0-1, e.g., setting to 0.5 means billing at 50% when cache is hit
+ 3. Supported channels:
+ - [x] OpenAI
+ - [x] Azure
+ - [x] DeepSeek
+ - [x] Claude
+
+## Model Support
+
+This version supports multiple models, please refer to [API Documentation-Relay Interface](https://docs.newapi.pro/api) for details:
+
+1. Third-party models **gpts** (gpt-4-gizmo-*)
+2. Third-party channel [Midjourney-Proxy(Plus)](https://github.com/novicezk/midjourney-proxy) interface, [API Documentation](https://docs.newapi.pro/api/midjourney-proxy-image)
+3. Third-party channel [Suno API](https://github.com/Suno-API/Suno-API) interface, [API Documentation](https://docs.newapi.pro/api/suno-music)
+4. Custom channels, supporting full call address input
+5. Rerank models ([Cohere](https://cohere.ai/) and [Jina](https://jina.ai/)), [API Documentation](https://docs.newapi.pro/api/jinaai-rerank)
+6. Claude Messages format, [API Documentation](https://docs.newapi.pro/api/anthropic-chat)
+7. Dify, currently only supports chatflow
+
+## Environment Variable Configuration
+
+For detailed configuration instructions, please refer to [Installation Guide-Environment Variables Configuration](https://docs.newapi.pro/installation/environment-variables):
+
+- `GENERATE_DEFAULT_TOKEN`: Whether to generate initial tokens for newly registered users, default is `false`
+- `STREAMING_TIMEOUT`: Streaming response timeout, default is 120 seconds
+- `DIFY_DEBUG`: Whether to output workflow and node information for Dify channels, default is `true`
+- `FORCE_STREAM_OPTION`: Whether to override client stream_options parameter, default is `true`
+- `GET_MEDIA_TOKEN`: Whether to count image tokens, default is `true`
+- `GET_MEDIA_TOKEN_NOT_STREAM`: Whether to count image tokens in non-streaming cases, default is `true`
+- `UPDATE_TASK`: Whether to update asynchronous tasks (Midjourney, Suno), default is `true`
+- `COHERE_SAFETY_SETTING`: Cohere model safety settings, options are `NONE`, `CONTEXTUAL`, `STRICT`, default is `NONE`
+- `GEMINI_VISION_MAX_IMAGE_NUM`: Maximum number of images for Gemini models, default is `16`
+- `MAX_FILE_DOWNLOAD_MB`: Maximum file download size in MB, default is `20`
+- `CRYPTO_SECRET`: Encryption key used for encrypting database content
+- `AZURE_DEFAULT_API_VERSION`: Azure channel default API version, default is `2025-04-01-preview`
+- `NOTIFICATION_LIMIT_DURATION_MINUTE`: Notification limit duration, default is `10` minutes
+- `NOTIFY_LIMIT_COUNT`: Maximum number of user notifications within the specified duration, default is `2`
+- `ERROR_LOG_ENABLED=true`: Whether to record and display error logs, default is `false`
diff --git a/apps/new-api/README.md b/apps/new-api/README.md
new file mode 100644
index 0000000..840bcdc
--- /dev/null
+++ b/apps/new-api/README.md
@@ -0,0 +1,96 @@
+# New-API
+
+🍥新一代大模型网关与AI资产管理系统
+
+> AI模型接口管理与分发系统,支持将多种大模型转为统一格式调用,支持OpenAI、Claude等格式,可供个人或者企业内部管理与分发渠道使用,本项目基于One API二次开发
+
+
+
+
+
+
+
+## 📝 项目说明
+
+> [!NOTE]
+> 本项目为开源项目,在[One API](https://github.com/songquanpeng/one-api)的基础上进行二次开发
+
+> [!IMPORTANT]
+> - 本项目仅供个人学习使用,不保证稳定性,且不提供任何技术支持。
+> - 使用者必须在遵循 OpenAI 的[使用条款](https://openai.com/policies/terms-of-use)以及**法律法规**的情况下使用,不得用于非法用途。
+> - 根据[《生成式人工智能服务管理暂行办法》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)的要求,请勿对中国地区公众提供一切未经备案的生成式人工智能服务。
+
+## 📚 文档
+
+详细文档请访问我们的官方Wiki:[https://docs.newapi.pro/](https://docs.newapi.pro/)
+
+也可访问AI生成的DeepWiki:
+[](https://deepwiki.com/QuantumNous/new-api)
+
+## ✨ 主要特性
+
+New API提供了丰富的功能,详细特性请参考[特性说明](https://docs.newapi.pro/wiki/features-introduction):
+
+1. 🎨 全新的UI界面
+2. 🌍 多语言支持
+3. 💰 支持在线充值功能(易支付)
+4. 🔍 支持用key查询使用额度(配合[neko-api-key-tool](https://github.com/Calcium-Ion/neko-api-key-tool))
+5. 🔄 兼容原版One API的数据库
+6. 💵 支持模型按次数收费
+7. ⚖️ 支持渠道加权随机
+8. 📈 数据看板(控制台)
+9. 🔒 令牌分组、模型限制
+10. 🤖 支持更多授权登陆方式(LinuxDO,Telegram、OIDC)
+11. 🔄 支持Rerank模型(Cohere和Jina),[接口文档](https://docs.newapi.pro/api/jinaai-rerank)
+12. ⚡ 支持OpenAI Realtime API(包括Azure渠道),[接口文档](https://docs.newapi.pro/api/openai-realtime)
+13. ⚡ 支持Claude Messages 格式,[接口文档](https://docs.newapi.pro/api/anthropic-chat)
+14. 支持使用路由/chat2link进入聊天界面
+15. 🧠 支持通过模型名称后缀设置 reasoning effort:
+ 1. OpenAI o系列模型
+ - 添加后缀 `-high` 设置为 high reasoning effort (例如: `o3-mini-high`)
+ - 添加后缀 `-medium` 设置为 medium reasoning effort (例如: `o3-mini-medium`)
+ - 添加后缀 `-low` 设置为 low reasoning effort (例如: `o3-mini-low`)
+ 2. Claude 思考模型
+ - 添加后缀 `-thinking` 启用思考模式 (例如: `claude-3-7-sonnet-20250219-thinking`)
+16. 🔄 思考转内容功能
+17. 🔄 针对用户的模型限流功能
+18. 💰 缓存计费支持,开启后可以在缓存命中时按照设定的比例计费:
+ 1. 在 `系统设置-运营设置` 中设置 `提示缓存倍率` 选项
+ 2. 在渠道中设置 `提示缓存倍率`,范围 0-1,例如设置为 0.5 表示缓存命中时按照 50% 计费
+ 3. 支持的渠道:
+ - [x] OpenAI
+ - [x] Azure
+ - [x] DeepSeek
+ - [x] Claude
+
+## 模型支持
+
+此版本支持多种模型,详情请参考[接口文档-中继接口](https://docs.newapi.pro/api):
+
+1. 第三方模型 **gpts** (gpt-4-gizmo-*)
+2. 第三方渠道[Midjourney-Proxy(Plus)](https://github.com/novicezk/midjourney-proxy)接口,[接口文档](https://docs.newapi.pro/api/midjourney-proxy-image)
+3. 第三方渠道[Suno API](https://github.com/Suno-API/Suno-API)接口,[接口文档](https://docs.newapi.pro/api/suno-music)
+4. 自定义渠道,支持填入完整调用地址
+5. Rerank模型([Cohere](https://cohere.ai/)和[Jina](https://jina.ai/)),[接口文档](https://docs.newapi.pro/api/jinaai-rerank)
+6. Claude Messages 格式,[接口文档](https://docs.newapi.pro/api/anthropic-chat)
+7. Dify,当前仅支持chatflow
+
+## 环境变量配置
+
+详细配置说明请参考[安装指南-环境变量配置](https://docs.newapi.pro/installation/environment-variables):
+
+- `GENERATE_DEFAULT_TOKEN`:是否为新注册用户生成初始令牌,默认为 `false`
+- `STREAMING_TIMEOUT`:流式回复超时时间,默认120秒
+- `DIFY_DEBUG`:Dify渠道是否输出工作流和节点信息,默认 `true`
+- `FORCE_STREAM_OPTION`:是否覆盖客户端stream_options参数,默认 `true`
+- `GET_MEDIA_TOKEN`:是否统计图片token,默认 `true`
+- `GET_MEDIA_TOKEN_NOT_STREAM`:非流情况下是否统计图片token,默认 `true`
+- `UPDATE_TASK`:是否更新异步任务(Midjourney、Suno),默认 `true`
+- `COHERE_SAFETY_SETTING`:Cohere模型安全设置,可选值为 `NONE`, `CONTEXTUAL`, `STRICT`,默认 `NONE`
+- `GEMINI_VISION_MAX_IMAGE_NUM`:Gemini模型最大图片数量,默认 `16`
+- `MAX_FILE_DOWNLOAD_MB`: 最大文件下载大小,单位MB,默认 `20`
+- `CRYPTO_SECRET`:加密密钥,用于加密数据库内容
+- `AZURE_DEFAULT_API_VERSION`:Azure渠道默认API版本,默认 `2025-04-01-preview`
+- `NOTIFICATION_LIMIT_DURATION_MINUTE`:通知限制持续时间,默认 `10`分钟
+- `NOTIFY_LIMIT_COUNT`:用户通知在指定持续时间内的最大数量,默认 `2`
+- `ERROR_LOG_ENABLED=true`: 是否记录并显示错误日志,默认`false`
\ No newline at end of file
diff --git a/apps/new-api/data.yml b/apps/new-api/data.yml
new file mode 100644
index 0000000..e838aaa
--- /dev/null
+++ b/apps/new-api/data.yml
@@ -0,0 +1,19 @@
+name: New API
+tags:
+ - AI / 大模型
+title: OpenAI 接口管理 & 分发系统
+description: OpenAI 接口管理 & 分发系统
+additionalProperties:
+ key: new-api
+ name: New API
+ tags:
+ - AI
+ shortDescZh: AI模型接口管理与分发系统,支持将多种大模型转为OpenAI格式调用、支持Midjourney Proxy、Suno、Rerank,兼容易支付协议,可供个人或者企业内部管理与分发渠道使用,本项目基于One API二次开发。
+ shortDescEn: Access all LLM through the standard OpenAI API format, easy to deploy & use
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://nekoapi.com/
+ github: https://github.com/Calcium-Ion/new-api
+ document: https://github.com/Calcium-Ion/new-api/blob/main/README.md
diff --git a/apps/new-api/latest/data.yml b/apps/new-api/latest/data.yml
new file mode 100644
index 0000000..47b7d31
--- /dev/null
+++ b/apps/new-api/latest/data.yml
@@ -0,0 +1,17 @@
+additionalProperties:
+ formFields:
+ - default: 3000
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: Asia/Shanghai
+ edit: true
+ envKey: TZ
+ labelEn: Time Zone
+ labelZh: 时区
+ required: true
+ type: text
diff --git a/apps/new-api/latest/docker-compose.yml b/apps/new-api/latest/docker-compose.yml
new file mode 100644
index 0000000..c6fff4d
--- /dev/null
+++ b/apps/new-api/latest/docker-compose.yml
@@ -0,0 +1,25 @@
+services:
+ new-api:
+ image: calciumion/new-api:latest
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ ports:
+ - ${PANEL_APP_PORT_HTTP}:3000
+ networks:
+ - 1panel-network
+ command: --log-dir /app/logs
+ volumes:
+ - ./data:/data
+ - ./logs:/app/logs
+ environment:
+ - TZ=${TZ}
+# - SESSION_SECRET=${SESSION_SECRET}
+# - REDIS_CONN_STRING=redis://redis
+# - NODE_TYPE=slave # 多机部署时从节点取消注释该行
+# - SYNC_FREQUENCY=60 # 需要定期从数据库加载数据时取消注释该行
+# - FRONTEND_BASE_URL=https://openai.justsong.cn # 多机部署时从节点取消注释该行
+ labels:
+ createdBy: "Apps"
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/new-api/logo.png b/apps/new-api/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..851556f62db58d4267e096a39d2e9de88e6688c5
GIT binary patch
literal 9597
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
aG3a-DviBvqQ0G6M3ZNjPDqSUM7WzNIJEblF
literal 0
HcmV?d00001