- Node.js 18+ (源码部署时需要)
 - Docker (可选)
 - Redis (可选,用于数据持久化)
 
创建 .env 文件并配置以下参数:
# 🌐 服务配置
LISTEN_ADDRESS=localhost       # 监听地址
SERVICE_PORT=3000             # 服务端口
# 🔐 安全配置
API_KEY=sk-123456,sk-456789   # API 密钥 (必填,支持多密钥)
ACCOUNTS=                     # 账户配置 (格式: user1:pass1,user2:pass2)
# 🚀 PM2 多进程配置
PM2_INSTANCES=1               # PM2进程数量 (1/数字/max)
PM2_MAX_MEMORY=1G             # PM2内存限制 (100M/1G/2G等)
                              # 注意: PM2集群模式下所有进程共用同一个端口
# 🔍 功能配置
SEARCH_INFO_MODE=table        # 搜索信息展示模式 (table/text)
OUTPUT_THINK=true             # 是否输出思考过程 (true/false)
SIMPLE_MODEL_MAP=false        # 简化模型映射 (true/false)
# 🗄️ 数据存储
DATA_SAVE_MODE=none           # 数据保存模式 (none/file/redis)
REDIS_URL=                    # Redis 连接地址 (可选)
# 📸 缓存配置
CACHE_MODE=default            # 图片缓存模式 (default/file)| 参数 | 说明 | 示例 | 
|---|---|---|
LISTEN_ADDRESS | 
服务监听地址 | localhost 或 0.0.0.0 | 
SERVICE_PORT | 
服务运行端口 | 3000 | 
API_KEY | 
API 访问密钥,支持多密钥配置。第一个为管理员密钥(可访问前端管理页面),其他为普通密钥(仅可调用API)。多个密钥用逗号分隔 | sk-admin123,sk-user456,sk-user789 | 
PM2_INSTANCES | 
PM2进程数量 | 1/4/max | 
PM2_MAX_MEMORY | 
PM2内存限制 | 100M/1G/2G | 
SEARCH_INFO_MODE | 
搜索结果展示格式 | table 或 text | 
OUTPUT_THINK | 
是否显示 AI 思考过程 | true 或 false | 
SIMPLE_MODEL_MAP | 
简化模型映射,只返回基础模型不包含变体 | true 或 false | 
DATA_SAVE_MODE | 
数据持久化方式 | none/file/redis | 
REDIS_URL | 
Redis 数据库连接 | redis://localhost:6379 | 
CACHE_MODE | 
图片缓存存储方式 | default/file | 
LOG_LEVEL | 
日志级别 | DEBUG/INFO/WARN/ERROR | 
ENABLE_FILE_LOG | 
是否启用文件日志 | true 或 false | 
LOG_DIR | 
日志文件目录 | ./logs | 
MAX_LOG_FILE_SIZE | 
最大日志文件大小(MB) | 10 | 
MAX_LOG_FILES | 
保留的日志文件数量 | 5 | 
API_KEY 环境变量支持配置多个API密钥,用于实现不同权限级别的访问控制:
配置格式:
# 单个密钥(管理员权限)
API_KEY=sk-admin123
# 多个密钥(第一个为管理员,其他为普通用户)
API_KEY=sk-admin123,sk-user456,sk-user789权限说明:
| 密钥类型 | 权限范围 | 功能描述 | 
|---|---|---|
| 管理员密钥 | 完整权限 | • 访问前端管理页面 • 修改系统设置 • 调用所有API接口 • 添加/删除普通密钥  | 
| 普通密钥 | API调用权限 | • 仅可调用API接口 • 无法访问前端管理页面 • 无法修改系统设置  | 
使用场景:
- 团队协作: 为不同团队成员分配不同权限的API密钥
 - 应用集成: 为第三方应用提供受限的API访问权限
 - 安全隔离: 将管理权限与普通使用权限分离
 
注意事项:
- 第一个API_KEY自动成为管理员密钥,拥有最高权限
 - 管理员可以通过前端页面动态添加或删除普通密钥
 - 所有密钥都可以正常调用API接口,权限差异仅体现在管理功能上
 
CACHE_MODE 环境变量控制图片缓存的存储方式,用于优化图片上传和处理性能:
| 模式 | 说明 | 适用场景 | 
|---|---|---|
default | 
内存缓存模式 (默认) | 单进程部署,重启后缓存丢失 | 
file | 
文件缓存模式 | 多进程部署,缓存持久化到 ./caches/ 目录 | 
推荐配置:
- 单进程部署: 使用 
CACHE_MODE=default,性能最佳 - 多进程/集群部署: 使用 
CACHE_MODE=file,确保进程间缓存共享 - Docker 部署: 建议使用 
CACHE_MODE=file并挂载./caches目录 
文件缓存目录结构:
caches/
├── [signature1].txt    # 缓存文件,包含图片URL
├── [signature2].txt
└── ...
💡 提示: 可以在 Upstash 免费创建 Redis 实例,使用 TLS 协议时地址格式为
rediss://...
docker run -d \
  -p 3000:3000 \
  -e API_KEY=sk-admin123,sk-user456,sk-user789 \
  -e DATA_SAVE_MODE=none \
  -e CACHE_MODE=file \
  -e ACCOUNTS= \
  -v ./caches:/app/caches \
  --name qwen2api \
  rfym21/qwen2api:latest# 下载配置文件
curl -o docker-compose.yml https://raw.githubusercontent.com/Rfym21/Qwen2API/refs/heads/main/docker-compose.yml
# 启动服务
docker compose pull && docker compose up -d# 克隆项目
git clone https://github.com/Rfym21/Qwen2API.git
cd Qwen2API
# 安装依赖
npm install
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件
# 智能启动 (推荐 - 自动判断单进程/多进程)
npm start
# 开发模式
npm run dev使用 PM2 进行生产环境多进程部署,提供更好的性能和稳定性。
重要说明: PM2 集群模式下,所有进程共用同一个端口,PM2 会自动进行负载均衡。
使用 npm start 可以自动判断启动方式:
- 当 
PM2_INSTANCES=1时,使用单进程模式 - 当 
PM2_INSTANCES>1时,使用 Node.js 集群模式 - 自动限制进程数不超过 CPU 核心数
 
快速部署到 Hugging Face Spaces:
Qwen2API/
├── Dockerfile
├── README.md
├── docker-compose.yml
├── docker-compose-redis.yml
├── ecosystem.config.js              # PM2配置文件
├── package.json
│
├── caches/                          # 缓存文件目录
├── data/                            # 数据文件目录
│   ├── data.json
│   └── data_template.json
│
├── src/                             # 后端源代码目录
│   ├── server.js                    # 主服务器文件
│   ├── start.js                     # 智能启动脚本 (自动判断单进程/多进程)
│   ├── config/
│   │   └── index.js                 # 配置文件
│   ├── controllers/                 # 控制器目录
│   │   ├── chat.js
│   │   ├── cli.chat.js              # CLI聊天控制器
│   │   └── models.js
│   ├── middlewares/                 # 中间件目录
│   │   ├── authorization.js
│   │   └── chat-middleware.js
│   ├── models/                      # 模型目录
│   │   └── models-map.js
│   ├── routes/                      # 路由目录
│   │   ├── accounts.js
│   │   ├── chat.js
│   │   ├── cli.chat.js              # CLI聊天路由
│   │   ├── models.js
│   │   ├── settings.js
│   │   └── verify.js
│   └── utils/                       # 工具函数目录
│       ├── account-rotator.js
│       ├── account.js
│       ├── chat-helpers.js
│       ├── cli.manager.js           # CLI管理器
│       ├── data-persistence.js
│       ├── img-caches.js
│       ├── logger.js                # 日志工具
│       ├── model-utils.js
│       ├── precise-tokenizer.js     # 精确分词器
│       ├── redis.js
│       ├── request.js
│       ├── setting.js
│       ├── token-manager.js
│       ├── tools.js
│       └── upload.js
│
└── public/                          # 前端项目目录
    ├── dist/                        # 编译后的前端文件
    │   ├── assets/                  # 静态资源
    │   ├── favicon.png
    │   └── index.html
    ├── src/                         # 前端源代码
    │   ├── App.vue                  # 主应用组件
    │   ├── main.js                  # 入口文件
    │   ├── style.css                # 全局样式
    │   ├── assets/                  # 静态资源
    │   │   └── background.mp4
    │   ├── routes/                  # 路由配置
    │   │   └── index.js
    │   └── views/                   # 页面组件
    │       ├── auth.vue             # 认证页面
    │       ├── dashboard.vue        # 仪表板页面
    │       └── settings.vue         # 设置页面
    ├── package.json                 # 前端依赖配置
    ├── package-lock.json
    ├── index.html                   # 前端入口HTML
    ├── postcss.config.js            # PostCSS配置
    ├── tailwind.config.js           # TailwindCSS配置
    ├── vite.config.js               # Vite构建配置
    └── public/                      # 公共静态资源
        └── favicon.png
本API支持多密钥认证机制,所有API请求都需要在请求头中包含有效的API密钥:
Authorization: Bearer sk-your-api-key支持的密钥类型:
- 管理员密钥: 第一个配置的API_KEY,拥有完整权限
 - 普通密钥: 其他配置的API_KEY,仅可调用API接口
 
认证示例:
# 使用管理员密钥
curl -H "Authorization: Bearer sk-admin123" http://localhost:3000/v1/models
# 使用普通密钥
curl -H "Authorization: Bearer sk-user456" http://localhost:3000/v1/chat/completions获取所有可用的 AI 模型列表。
GET /v1/models
Authorization: Bearer sk-your-api-keyGET /models (免认证)响应示例:
{
  "object": "list",
  "data": [
    {
      "id": "qwen-max-latest",
      "object": "model",
      "created": 1677610602,
      "owned_by": "qwen"
    }
  ]
}发送聊天消息并获取 AI 回复。
POST /v1/chat/completions
Content-Type: application/json
Authorization: Bearer sk-your-api-key请求体:
{
  "model": "qwen-max-latest",
  "messages": [
    {
      "role": "system",
      "content": "你是一个有用的助手。"
    },
    {
      "role": "user",
      "content": "你好,请介绍一下自己。"
    }
  ],
  "stream": false,
  "temperature": 0.7,
  "max_tokens": 2000
}响应示例:
{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "model": "qwen-max-latest",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "你好!我是一个AI助手..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 20,
    "completion_tokens": 50,
    "total_tokens": 70
  }
}使用 -image 模型启用文本到图像生成功能。
使用 -image-edit 模型启用图像修改功能。
当使用``-image时你可以通过在请求体中添加size` 参数或在消息内容中包含特定关键词 `1:1`, `4:3`, `3:4`, `16:9`, `9:16` 来控制图片尺寸。
POST /v1/chat/completions
Content-Type: application/json
Authorization: Bearer sk-your-api-key请求体:
{
  "model": "qwen-max-latest-image",
  "messages": [
    {
      "role": "user",
      "content": "画一只在花园里玩耍的小猫咪,卡通风格"
    }
  ],
  "size": "1:1",
  "stream": false
}支持的参数:
size: 图片尺寸,支持"1:1"、"4:3"、"3:4"、"16:9"、"9:16"stream: 支持流式和非流式响应
响应示例:
{
  "created": 1677652288,
  "model": "qwen-max-latest",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": ""
      },
      "finish_reason": "stop"
    }
  ]
}在模型名称后添加 -search 后缀启用搜索功能:
{
  "model": "qwen-max-latest-search",
  "messages": [...]
}在模型名称后添加 -thinking 后缀启用思考过程输出:
{
  "model": "qwen-max-latest-thinking",
  "messages": [...]
}同时启用搜索和推理功能:
{
  "model": "qwen-max-latest-thinking-search",
  "messages": [...]
}通过设置 chat_type 参数为 t2i 启用文本到图像生成功能:
{
  "model": "qwen-max-latest",
  "chat_type": "t2i",
  "messages": [
    {
      "role": "user",
      "content": "画一只可爱的小猫咪"
    }
  ],
  "size": "1:1"
}支持的图片尺寸: 1:1、4:3、3:4、16:9、9:16
智能尺寸识别: 系统会自动从提示词中识别尺寸关键词并设置对应尺寸
API 自动处理图像上传,支持在对话中发送图片:
{
  "model": "qwen-max-latest",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "这张图片里有什么?"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": "data:image/jpeg;base64,..."
          }
        }
      ]
    }
  ]
}使用CLI端点仅支持 qwen3-coder-plus 和 qwen3-coder-flash,支持256K上下文和工具调用(Function Calling)
通过 CLI 端点发送聊天请求,支持流式和非流式响应。
POST /cli/v1/chat/completions
Content-Type: application/json
Authorization: Bearer API_KEY请求体:
{
  "model": "qwen3-coder-plus",
  "messages": [
    {
      "role": "user",
      "content": "你好,请介绍一下自己。"
    }
  ],
  "stream": false,
  "temperature": 0.7,
  "max_tokens": 2000
}流式请求:
{
  "model": "qwen3-coder-flash",
  "messages": [
    {
      "role": "user",
      "content": "写一首关于春天的诗。"
    }
  ],
  "stream": true
}响应格式:
非流式响应与标准 OpenAI API 格式相同:
{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "model": "qwen3-coder-plus",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "你好!我是一个AI助手..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 20,
    "completion_tokens": 50,
    "total_tokens": 70
  }
}流式响应使用 Server-Sent Events (SSE) 格式:
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"qwen3-coder-flash","choices":[{"index":0,"delta":{"content":"你好"},"finish_reason":null}]}
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1677652288,"model":"qwen3-coder-flash","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}]}
data: [DONE]