标签 newapi 下的文章

各中转站对 RPM 有限制,同时禁止分发,本教程只给出自用模式

看到群里不少佬友想在 newapi 中对接中转站,恰好我在用 RightCode,所以以 rightcode 为例,写(水)一篇教程吧。

前者要求

  • git (用于克隆仓库)
  • windows docker desktop 或者 linux docker (建议有足够的内存 + 硬盘存储)
  • 配置好 docker compose

windows docker desktop 建议选择 wsl2 作为 backend

安装部署

克隆仓库 & 启动

先克隆仓库

git clone https://github.com/QuantumNous/new-api.git

修改 docker-compose.yml

本教程采用 postgresql

```diff
version: '3.4' # For compatibility with older Docker versions

services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: always
    command: --log-dir /app/logs
    ports:
-     - "3000:3000" +     - "3003:3000"
    volumes:
      - ./data:/data
      - ./logs:/app/logs
    environment:
-     - SQL_DSN=postgresql://root:123456@postgres:5432/new-api # ⚠️ IMPORTANT: Change the password in production! +     - SQL_DSN=postgresql://root:idkpassword@postgres:5432/new-api # ⚠️ IMPORTANT: Change the password in production!
#       - SQL_DSN=root:123456@tcp(mysql:3306)/new-api  # Point to the mysql service, uncomment if using MySQL
      - REDIS_CONN_STRING=redis://redis
      - TZ=Asia/Shanghai
      - ERROR_LOG_ENABLED=true # 是否启用错误日志记录 (Whether to enable error log recording)
      - BATCH_UPDATE_ENABLED=true  # 是否启用批量更新 (Whether to enable batch update)

    depends_on:
      - redis
      - postgres
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis:
    image: redis:latest
    container_name: redis
    restart: always

  postgres:
    image: postgres:15
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: root
-     POSTGRES_PASSWORD: 123456  # ⚠️ IMPORTANT: Change this password in production! +     POSTGRES_PASSWORD: idkpassword  # ⚠️ IMPORTANT: Change this password in production!
      POSTGRES_DB: new-api
    volumes:
      - pg_data:/var/lib/postgresql/data

volumes:
  pg_data:
#  mysql_data:

编辑完保存,继续执行命令

docker compose up -d

等待 n 秒(取决于你的网速~)

出现以下字样,拉去镜像和启动成功

[+] Running 5/5
 ✔ Network new-api_default   Created                                                                                                                   0.1s
 ✔ Volume "new-api_pg_data"  Created                                                                                                                   0.0s
 ✔ Container redis           Started                                                                                                                   0.7s
 ✔ Container postgres        Started                                                                                                                   0.7s
 ✔ Container new-api         Started                                                                                                                   1.0s

NewAPI 配置

打开浏览器,输入 http://localhost:3003/ 后,会出现配置页

如果你的数据库检查没有错误,继续下一步,填写管理员账号和密码

下一步,选择使用模式

最后 初始化系统 即可

配置渠道

打开 控制台

依次点击 渠道管理 添加渠道,并填入 类型 / 名称 / 密钥

填入 API 地址为 https://www.right.codes/codex

因为 rightcode 支持了模型列表接口,点获取模型列表即可获取可用的模型

随后确定,并提交即可

模型管理

按照图中的内容,切换刀模型管理,依次点击 同步 → 下一步 → 确定

配合 CC Switch 使用

现在 控制台 -> 令牌管理 生成令牌,并填入刀 cc switch 中

最终的 config.toml

model_provider = "custom" model = "gpt-5.2" model_reasoning_effort = "xhigh" disable_response_storage = true [model_providers.custom] name = "custom" wire_api = "responses" requires_openai_auth = false base_url = "http://localhost:3003/v1" 

保存好以后,切换供应商,可以开始 coding 了


📌 转载信息
原作者:
unsafe
转载时间:
2026/1/15 18:30:28

众所周知,OpenAI、Anthropic 和 Google 三家的模型格式各不相同。目前主流是使用 基于 NewAPI 的中转站,在 OpenCode 的配置文件中通过自定义类型进行接入。

常见的配置如下:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "new-api": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "NewAPI",
      "options": {
        "baseURL": "https://xxx/v1"
      },
      "models": {
        "gemini-2.0-flash": { "name": "gemini-2.0-flash" }
      }
    }
  }
}

这里存在一个潜在问题: 在这种配置下,程序实际上是在调用 /v1/chat/completions 接口。对于 Gemini 渠道的模型,请求会经过 NewAPI 的一层或多层格式转换逻辑。这不仅增加了延迟,还可能导致参数缺失或兼容性报错。

更优的解决方案: 既然部分中转站支持 Gemini 原生格式,且 OpenCode 底层基于 Vercel AI SDK,我们完全可以绕过 OpenAI 兼容层。

通过查阅 AI SDK Provider 列表,我们可以直接将 npm 包替换为原生的 @ai-sdk/google

优化后的配置:

  • 修改 npm 字段:@ai-sdk/openai-compatible 改为 @ai-sdk/google
  • 保持 baseURL 依然指向你的中转地址。
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "google-native": {
      "npm": "@ai-sdk/google",
      "name": "Google Native",
      "options": {
        "baseURL": "https://your-proxy.com/v1"
      },
      "models": {
        "gemini-2.5-flash": { "name": "gemini-2.5-flash" }
    },
    "anthropic-native": {
      "npm": "@ai-sdk/anthropic",
      "name": "Anthropic Native",
      "options": {
        "baseURL": "https://your-proxy.com/v1"
      },
      "models": {
        "claude-3-5-sonnet-20241022": { "name": "claude-3-5-sonnet-20241022" }
      }
    }
  }
}

这样,调用将直接走 Google 原生协议,省去了中间的转换逻辑,响应更迅速且功能支持更完整。针对 Claude 渠道,替换为 @ai-sdk/anthropic 也是同理。


📌 转载信息
转载时间:
2026/1/15 18:21:51

排名不分先后,都是我用过的, 本文不做任何推荐

CC Switch 好像有个 bug, 余额查询的配置好像是不隔离的。

NewAPI 系列

以下几家中转站都是基于 NewAPI 搭建,所以查询余额较为简单

  • IKunCode
  • privnode
  • Duckcoding

配置步骤:

以 ikuncode 站为例,privnode/Duckcoding 步骤都一样

  1. 登录对应的网站,打开控制台 / 个人设置

  2. 点击安全设置,生成系统访问令牌

  3. 回到 CC-Switch, 配置用量查询,预设模板选择 NewAPI, 填入访问令牌和用户 ID

RightCode (订阅余额)

配置步骤:

  1. 预设模板选择 通用模板,填入请求地址 https://right.codes/subscriptions/list

  2. 登录网站 F12 控制台获取 bearer token(任意一个请求), 填入提取器代码(整个替换)

({
request: {
url: "https://right.codes/subscriptions/list",
method: "GET",
headers: {
Authorization: `f12控制台获取 bearer token`,
},
},
extractor: function (response) {
const now = new Date(); // 获取当前时间,用于比较 const results = response.subscriptions.reduce(
(acc, subscription, index) => {
// 解析过期时间 const expiredAt = new Date(subscription.expired_at);

// 判断是否过期:当前时间 > 过期时间,则跳过 if (now > expiredAt) {
return acc; // 跳过该项,直接返回已累积的数组
}

// 根据 reset_today 判断重置状态 const resetStatus = subscription.reset_today ? "已重置" : "未重置";
const extraInfo = `今天${resetStatus}`;

// 将符合条件的项添加到累积数组
acc.push({
id: subscription.id || `subscription_${index + 1}`,
remaining: subscription.remaining_quota,
planName: subscription.name,
unit: "USD",
// 新增的 extra 字段 extra: extraInfo,
});

return acc; // 返回更新后的累积数组
},
[],
); // 初始值为空数组 return results;
},
});

群里有个人开发了 vscode 插件可以更好的显示

cubence (余额)

配置步骤:

  1. 预设模板选择 通用模板,填入请求地址 https://cubence.com/api/v1/auth/me,并从网页端 F12 获取 cookie, 提取器代码填入以下代码:
({
  request: {
    url: "https://cubence.com/api/v1/auth/me",
    method: "GET",
    headers: {
      "Cookie": "token=<yourtoken>",
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0"
    }
  },
  extractor: function(response) {
    return {
      remaining: response.user.normal_balance / 1000000,
      unit: "USD"
    };
  }
})

Yescode

步骤:

  1. 预设模板选择 通用模板,填入请求地址 https://co.yes.vg/api/v1/user/balance,并从网页端 F12 获取 cookie, 提取器代码填入以下代码:
({
  request: {
    url: "https://co.yes.vg/api/v1/user/balance",
    method: "GET",
    headers: {
      Cookie:
        "your_cookie",
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:146.0) Gecko/20100101 Firefox/146.0",
    },
  },
  extractor: function (response) {
    return {
      remaining: response.balance,
      unit: "USD",
    };
  },
});

📌 转载信息
原作者:
unsafe
转载时间:
2026/1/12 10:35:17

效果图

先上个效果图

NewAPI 搭建的中转站

大部分的中转站都是基于 NewAPI 部署,一般可以在中转站底部 footer 看到是不是,那么可以使用接下来的两种用量查询方式

使用访问令牌

1. 获取用户 ID + 访问令牌:在 NewAPI 系统中转站 ,登录后找到 个人设置 -> 安全设置 -> 系统访问令牌,生成令牌。头像的旁边可以看到你的 ID

2. 填写配置:在 cc-switch 中进入用量查询配置页面,选择 NewAPI 模板,将请求地址、访问令牌、用户 ID 都填写上,注意这 3 个都是必填项。勾选启用用量查询 保存即可查询。


使用 APIKey

这个方式不用生成访问令牌,使用你填写的供应商 key 完成查询。使用 通用模板,在提取器代码输入框中输入以下脚本。

({
  request: {
    url: "{{baseUrl}}/api/usage/token",
    method: "GET",
    headers: {
      Authorization: "Bearer {{apiKey}}",
    },
  },
  extractor: function (response) {
    if (response.code) {
      if (response.data.unlimited_quota) {
        return {
          planName: response.data.name,
          total: -1,
          used: response.data.total_used / 500000,
          unit: "USD",
        };
      }
      return {
        isValid: true,
        planName: response.data.name,
        total: response.data.total_granted / 500000,
        used: response.data.total_used / 500000,
        remaining: response.data.total_available / 500000,
        unit: "USD",
      };
    }
    if (response.error) {
      return {
        isValid: false,
        invalidMessage: response.error.message,
      };
    }
  },
})

这个方式是查询你这个供应商 key 的用量情况,并非是你账号的,如果你的 key 生成时选择的无限额度,那么在 cc-switch 中只会显示这个 key 已经使用的用量,并不会显示剩余的。

其它

还有很多中转站是自研的系统,无法使用上述的方式进行查询,那么就要自己去写对应的查询脚本完成查询,这里我贴一个 88code 的,其它支持查询用量的站点,可以私聊我进行补充。

88code

和方式 2 一样,使用 通用模板 ,在提取器代码输入框中粘贴以下脚本。

({
  request: {
    url: "{{baseUrl}}/subscription",
    method: "POST",
    headers: {
      Authorization: "Bearer {{apiKey}}",
      "User-Agent": "cc-switch/1.0",
      Accept: "*/*",
    },
  },
  extractor: function (response) {
    if (response.error && response.msg == "No active subscription found") {
      throw new Error("该套餐暂无额度可使用");
    }
    if (response.error && response.msg == "API key not found") {
      throw new Error("该KEY无效");
    }
    const res = response.data // 成功处理:检查响应是否为非空数组 if (Array.isArray(res) && res.length > 0) {
      return res.filter(i => i.subscriptionStatus === "活跃中").map((i) => {
        let extraInfo = ""; // 初始化 extra 字段变量 // 判断是否有上次重置时间,以此来计算下次刷新时间 // lastCreditReset 字段存在且不为 null if (i.lastCreditReset) {
          // 1. 将上次重置时间的字符串转换为 Date 对象 const lastResetDate = new Date(i.lastCreditReset);
          // 2. 根据套餐描述,假设是每日重置,计算下次重置时间(加上24小时) // 86400000 毫秒 = 24 * 60 * 60 * 1000 const nextResetDate = new Date(lastResetDate.getTime() + 5*60*60*1000);
          // 3. 格式化日期为 "MM-DD HH:MM" const pad = (num) => String(num).padStart(2, "0");
          const month = pad(nextResetDate.getMonth() + 1); // 月份是从0开始的,所以+1 const day = pad(nextResetDate.getDate());
          const hours = pad(nextResetDate.getHours());
          const minutes = pad(nextResetDate.getMinutes());
          const formattedNextReset = `${month}-${day} ${hours}:${minutes}`;
          // 4. 拼接成最终的字符串
          extraInfo = `下次可刷新时间:${formattedNextReset}(${i.resetTimes})`;
        }
        // 对于按量付费(PAY_PER_USE)类型的套餐,提供特定信息 else if (i.subscriptionPlan.planType === "PAY_PER_USE") {
          extraInfo = "按量付费套餐,无固定刷新周期";
        }
        // 返回包含新字段的完整对象 return {
          isValid: true,
          planName: i.subscriptionPlan.subscriptionName,
          total: i.subscriptionPlan.creditLimit,
          remaining: i.currentCredits,
          unit: "USD",
          extra: extraInfo, // 将生成的 extra 信息添加到返回对象中
        };
      });
    }
  },
});

📌 转载信息
转载时间:
2026/1/12 10:34:08

NewAPI SYNC TOOL

GITHUB: 点此进入
前端演示网址NewAPI 同步工具 v4.0
注意!仅供前端演示,请不要输入真实地址与配置!!有自动保存功能!

该项目旨在优化改进 Newapi 中模型名称重定向功能,可以实现一键添加后缀,一键统一模型名称,一键更新旧模型旧映射,适合拥有多公益站或者自建的佬友(屯屯鼠)。

更新内容

  • 新增 Zeabur 一键部署

  • 完全重构前端

  • 一键更新功能(自动找出旧模型,自动匹配上游公益站模型名变化)

  • 回退保护机制

  • 黑夜模式

  • 重构缓存库

页面功能展示

主页面


一键更新


映射同步

一键部署(跳转至 GITHUB 查看说明)

Deploy on Zeabur

部署后请务必确认:

  1. PORT=8083

  2. CONFIG_DIR=/data

  3. 挂载 /data 持久化卷

  4. 设置强 SECRET_KEY(用于加密配置文件)

功能特性

  • 轻量:Node.js + Express,启动快,资源占用低。

  • 易部署:支持 Dockerfile、Docker Compose、常规 Node 部署。

  • 安全:配置文件加密存储,SECRET_KEY 可自定义。

  • 可持久化:配置可写入磁盘,适合长期运行的服务。

环境变量说明

| 变量名 | 说明 | 默认值 | 建议 |

| PORT | 服务端口 | 8083 | 保持默认即可 |

| SECRET_KEY | 加密密钥 | newapi-sync-tool-2024 | 请设置为强密码 |

| CONFIG_DIR | 配置文件目录 | 项目根目录 | 生产建议 /data |

Docker 部署(未尝试)


docker build -t newapi-elegant .

docker run -d --name newapi-elegant \

-p 8083:8083 \

-e PORT=8083 \

-e SECRET_KEY=change-me \

-e CONFIG_DIR=/data \

-v ./data:/data \

newapi-elegant

Docker Compose


docker compose up -d

本地运行


npm install

npm start

访问:http://localhost:8083

反馈与建议

目前项目还处在不断改进阶段,很多功能并不完善,
欢迎讨论改进。不喜勿喷。

感谢支持


📌 转载信息
原作者:
ZICHUANLAN
转载时间:
2026/1/10 19:06:05

Lonely 自己私下里有一个公益站(怕扛不住所以没公开),但是呢… 对于用户(在 qq 群内)留存率有点苦恼,所以想出来了通过 Nonebot2 QQ Adapter 在 QQ 群内认证并遵循 OAuth2.0 标准

先掏源码:
archive.zip

NewAPI 中的配置:

配置

Well-Known URL
<不用填这个 这个目前不支持>
Client ID:
<QQ群ID,Bot只会受理指定群的消息>
Client Secret:
<你oauth_secrets.json中的密钥>
Authorization Endpoint:
https://<domain>/oauth/authorize
Token Endpoint:
https://<domain>/oauth/token
User Info Endpoint:
https://<domain>/oauth/userinfo

使用教程:

  1. 解压
  2. 使用 uv sync 命令同步环境,没有 uv 的请看 uv 官方文档 安装
  3. 配置.env.prod,记得随机生成一个 JWT_SECRET,这个绝对不能给别人!!给了别人就能解码 JWT 了,注意在文件中添加一行 ONEBOT_ACCESS_TOKEN=你的访问令牌,生产环境需要添加
  4. 打开 data 目录,复制文件 oauth_secrets.json.example 为 oauth_secrets.json,并编辑键值对,键是群号,值(列表)是(多个)OAuth 密钥,可以只配置一个
  5. 接下来回到项目根目录,通过 uv run bot.py 运行项目,记得反代为 HTTPS 协议,不然凭据容易被(中间人)盗取
如何接入 QQ 机器人

在服务器安装 Napcat
使用 docker logs <容器名字,默认napcat> 查看容器日志,打开服务器地址:6099/webui,从日志中找到 token 并登录 Napcat 以及登录 Napcat 上的 QQ
接下来添加连接配置,选择客户端 Websocket,地址填写 ws://<服务器地址>:5800/onebot/v11/ws(因为 NGINX 反代不好用,所以连接),密钥填写你在第三步 配置的连接 Token,不是 secret
接下来确保 Napcat 和 Nonebot 启动后,打开你要应用的 QQ 群,发送登录 123456 测试机器人是否有反应,有反应则代表成功


📌 转载信息
转载时间:
2026/1/5 13:00:59

newapi 刚刚更新了参数覆盖功能,支持了更多语义操作,要实现批量移除、增加、替换参数更加方便了。

举个例子,某渠道支持多个 DeepSeek 模型,但是默认不开启思考,需要配置 thinking 参数

想要通过识别 -think 模型后缀自动添加上思考参数,我们可以这么写:

{
  "operations": [
    {
      "path": "thinking.type",
      "mode": "set",
      "value": "enabled",
      "conditions": [
        { "path": "model", "mode": "prefix", "value": "DeepSeek-" },
        { "path": "model", "mode": "suffix", "value": "-think" }
      ],
      "logic": "AND"
    },
    {
      "path": "model",
      "mode": "trim_suffix",
      "value": "-think",
      "conditions": [
        { "path": "model", "mode": "prefix", "value": "DeepSeek-" },
        { "path": "model", "mode": "suffix", "value": "-think" }
      ],
      "logic": "AND"
    }
  ]
}

这样通过 DeepSeek-V3.1-think / DeepSeek-V3.1-Terminus-think / DeepSeek-V3.2-think / DeepSeek-V3.2-Exp-think 调用的时候就能自动转义了。
批量增加 / 移除模型名称前缀之类的操作也很简单,就不再赘述了,放个官方例子参考:

{"operations":[{"path":"model","mode":"trim_prefix","value":"openai/"}]}

📌 转载信息
原作者:
zhong_little
转载时间:
2026/1/3 15:37:25