SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

免费 GPT API 中转站的代价:你到底在用什么付钱

免费或低价的 GPT API 中转站,钱从哪里来?拆解中转站背后的 one-api 和 new-api、明文经手的提示词、模型掉包和余额消失的风险,教你自己动手检测,并给出官方人民币计费的替代方案。

免费 GPT API 中转站,到底拿什么付费

免费或明显低于官方价的 GPT API 中转站并不是没有成本,只是成本换了一种形式。你的提示词和代码要以明文经过一个陌生人的服务器。你点名要的模型,对方可以换成别的。你和其他用户共用同一份上游限速。你充进去的余额,网站一关就跟着消失。

对大陆开发者来说,更稳妥的低价路线是官方的、按人民币计价的 OpenAI 兼容 API,比如 DeepSeek、阿里云百炼上的千问、智谱 GLM 和 Kimi。在新加坡或马来西亚的读者,可以直接向 OpenAI 购买。如果你已经在用某个中转站,后面有一套可以自己运行的检测方法。

中转站底下通常是什么

中转站给用户看到的部分很简单。它给你一个 base URL(接口地址)和一个令牌。你把 OpenAI SDK(软件开发工具包)里的 base_url 换成它,代码不用改就能跑。

在服务器那一侧,典型的中转站是一套 API(应用程序接口)网关:前面接用户,后面接一池上游账号。one-api 和 new-api 就是这类网关的两个开源项目。

  • one-api(songquanpeng/one-api)用 MIT 协议开源。它的英文简介是 “LLM API management & key redistribution system”,意思是 LLM API 管理和 key 分发系统。它的 README 要求使用者“在遵循 OpenAI 的使用条款以及法律法规的情况下使用”。
  • new-api(QuantumNous/new-api)在 README 里说自己是 “a self-hosted AI gateway for applications, agents, and teams”,基于 One API 开发,用 AGPLv3 协议。

在这类网关里,运营者把上游的 API key 配成“渠道”,发给用户的是网关自己生成的“令牌”。用户的令牌按“额度”扣费,每次扣多少由运营者设置的“倍率”决定。所以你在中转站看到的价格,是运营者自己定的一个数字,不是 OpenAI 的价格。想看运营者那一侧的界面,可以读 One API 管理面板详解:渠道、令牌、分组与额度怎么算,以及 one-api 倍率与配额计算拆解。

new-api 的 README 在路由功能里列出了 “model mappings, channel priorities and weights, retries, channel affinity, and multiple upstream keys”。模型映射(model mapping)的意思是:用户请求的模型名,可以被网关改写成另一个上游模型名再发出去。这个功能有正当用途,比如统一一个团队内部的模型命名。但它也说明了一件事:在网关这一层,把你请求的模型换成另一个模型,只是一项配置。你在客户端看不到这项配置。

为什么会有中转站:OpenAI 的支持地区名单

中转站能做起来,是因为很多开发者买不到官方 API。OpenAI 的 API 支持国家和地区页面列出了它支持访问 API 的地方。截至 2026 年 10 月 20 日,这份名单里没有中国大陆,也没有香港。新加坡和马来西亚在名单里。

这个页面写明了在名单以外使用的后果:

Accessing or offering access to our services outside of the countries and territories listed below ... may result in your account being blocked or suspended.

意思是:在名单以外的国家和地区访问 OpenAI 的服务,或者向这些地方提供访问,账号可能被封禁或暂停。

2024 年 6 月,媒体报道 OpenAI 给一批开发者发了通知,说他们的组织有来自不支持地区的 API 流量,并且会从 2024 年 7 月 9 日起封锁这类访问。科技媒体 TechNode 当时引用了这份通知,原文是 “Our data shows that your organization has API traffic from a region that OpenAI does not currently support.”。我们没有在 OpenAI 自己的网站上找到这份通知,所以这里只按媒体报道转述。

名单里没有某个地区,只说明 OpenAI 不支持从那里访问。这不是对任何个人用法的法律定性,这里也不给法律结论。

另一条常被提到的路,是世纪互联运营的 Azure(Azure 中国)上的 Azure OpenAI。它现在是否还向大陆客户提供服务,我们在微软和 Azure 中国的公开页面上没能确认。微软的 Azure 中国服务可用性文档里,“AI + machine learning”表格只列了 Azure Machine Learning、AI Speech 和 Translator,没有 Azure OpenAI 这一行。但同一页面让读者去看 “Products available by China regions”,所以这不能当作结论。如果你在考虑这条路,请直接查 docs.azure.cn 和 azure.cn,或者问世纪互联。

免费或低价的中转站,钱从哪里来

一个中转站要付上游的钱,要付服务器的钱,运营者还想赚钱。如果它向你收的比上游向它收的还少,差价总要有人补。下面几种情况不是每个站都有,但每一种都会落到用户头上。

提示词和代码,明文经过陌生人的服务器

HTTPS 只保护你和中转站之间的那一段线路。请求到了中转站,网关要读出模型名、数 token、记账,所以它必须解密,看到完整的请求内容。这意味着你发出去的提示词、粘进去的代码、上传的文件,在中转站的服务器上都是明文。网关为了记账本来就要处理每一条请求。存不存全文、存多久、给谁看,只取决于运营者,你没有办法验证。

实际的做法是:不要通过任何第三方中转站发送你不愿意公开的东西。数据库密码、云平台密钥、.env 文件、客户数据,都不要进提示词。AI 编程工具会自动把文件内容发出去,所以风险更大。具体怎么防,见 如何不让密钥和机密进入 AI 编程代理的上下文。

模型可以被换掉:掉包、降智、掺水

中文社区把这类问题叫“掉包”“降智”或“掺水”。说的是同一件事:你付的是 A 模型的钱,拿到的却是更便宜的 B 模型,或者 A 和 B 混着来。

前面说过,模型映射在网关里只是一项配置。运营者有这样做的动机,因为便宜模型的上游成本低得多。你在客户端看到的 model 字段也是网关返回给你的,它可以写任何字符串。

还有一种不那么明显的情况。网关可以在你的请求前面加一段你看不见的系统提示词,可以截短你的上下文,也可以压低最大输出长度。这些都会让回答变差,而模型名一个字都没变。

限速是大家共用的

上游的限速属于上游那个账号。一个上游账号背后挂了多少中转用户,你不知道。高峰时段大家一起抢同一份限额,结果就是 HTTP 429(请求过多)错误、超时,或者网关为了不报错,把你的请求转给别的渠道。别的渠道背后是什么模型,你同样不知道。

Key 从哪里来,你看不到

中转站上游的 key 是怎么来的,用户没有办法查。可能是运营者自己合法付费的账号。也可能是从别人的组织借来或买来的 key,或者是逆向网页版会话得到的接口。后两种都很不稳定,因为原主人一停用、上游一封号,整个渠道就断了,你的请求也跟着失败。OpenAI 在条款里对 key 的买卖和转让有明确的写法,原文见下一节。

余额跟着网站一起消失

在中转站充值,等于把钱预付给一个你不认识的运营者。余额只是对方数据库里的一个数字。网站关了,或者域名换了,这个数字就没有了,通常也找不到可以追责的人。如果一定要用,只充你能接受全部损失的小额,并且单独开一个测试用的令牌。

OpenAI 的条款原文怎么说

下面是 OpenAI 自己的文字。这里只引用原文,不判断它对你的具体情况意味着什么。完整条款请读 OpenAI 官网的全文。

OpenAI 服务协议(OpenAI Services Agreement)适用于 OpenAI 的 API、ChatGPT Enterprise 和 ChatGPT Business,生效日期是 2026 年 1 月 1 日。它的第 3.3 条列出了客户不得做的事,其中 (g) 项是:

buy, sell, or transfer API keys from, to, or with a third party;

意思是:不得与第三方买卖或转让 API key。

同一协议第 3.1 条写道:

Customer will not share Account access credentials or individual login credentials between multiple users.

意思是:客户不得在多个用户之间共用账号访问凭据或个人登录凭据。同一节还写明 “Customer may not resell or lease access to its Account or any End User Account.”,也就是不得转售或出租对账号的访问。

OpenAI 帮助中心关于 API key 安全的文章说得更直接。原文有 “Your API key is intended to be used by you.” 和 “The sharing of API keys is against the Terms of Use.” 两句。这篇文章建议从 Members 页面邀请团队成员,让每个人用自己的 key。

关于在支持地区以外访问,服务协议第 16.12 条的原文是:

Customer and End Users may not access or offer access to the Services outside of the Supported Countries and Territories.

同一条接着写,违反这一条可能导致按第 8 条暂停服务。有人会想到在海外 VPS(虚拟专用服务器)上自己搭一个网关,给大陆用户使用。第 16.12 条写的正是“在支持地区以外访问或提供访问”,所以这里不把这种做法当成一种办法来介绍。

对外提供服务:《生成式人工智能服务管理暂行办法》原文

如果你考虑的不只是用中转站,而是自己开一个,还要看国内的规定。《生成式人工智能服务管理暂行办法》由国家网信办等七个部门于 2023 年 7 月 10 日发布,自 2023 年 8 月 15 日起施行。下面同样只引用原文,不做法律判断。

第二条规定了适用范围:

利用生成式人工智能技术向中华人民共和国境内公众提供生成文本、图片、音频、视频等内容的服务(以下称生成式人工智能服务),适用本办法。

同一条第三款写明了不适用的情况:

行业组织、企业、教育和科研机构、公共文化机构、有关专业机构等研发、应用生成式人工智能技术,未向境内公众提供生成式人工智能服务的,不适用本办法的规定。

第二十二条对“提供者”的定义里写明,“包括通过提供可编程接口等方式提供生成式人工智能服务”。第九条要求提供者“依法承担网络信息内容生产者责任,履行网络信息安全义务”,并与注册用户签订服务协议。第十七条针对的是一部分服务:

提供具有舆论属性或者社会动员能力的生成式人工智能服务的,应当按照国家有关规定开展安全评估,并按照《互联网信息服务算法推荐管理规定》履行算法备案和变更、注销备案手续。

注意,第十七条只针对“具有舆论属性或者社会动员能力”的服务。它没有说每一个服务都要备案。第二十条还涉及从境外向境内提供服务的情况。一个具体的中转站算不算“向境内公众提供”,这里不下结论。

两个开源网关的 README 也提到了这些规定。one-api 的 README 写着:“根据《生成式人工智能服务管理暂行办法》的要求,请勿对中国地区公众提供一切未经备案的生成式人工智能服务。”new-api 的中文 README 写着:“将本项目作为面向公众的生成式 AI 服务或 API 转售服务运营时,使用者应先完成备案、内容安全、实名、日志留存、税务、支付和上游授权等合规义务。”

怎么自己检测一个中转站有没有掉包

如果你已经在用某个中转站,可以自己跑几项检测。思路参考了开源检测工具 claude-detector(7836246/claude-detector,MIT 协议)。它对一个接口跑 19 项探测,最后给出六种结论:正品、正品(瑕疵)、第三方、存疑、假冒、无法判定。按它 README 里的规则,“第三方”是“大部分通过 + 倍率偏高”,也就是经过代理转发的真 Claude。“假冒”是模型和自我身份两项都失败。

要说清楚:claude-detector 检查的是 Claude(Anthropic)的接口,不是 GPT。比如它的 header_fingerprint 探测,找的是 Anthropic 特有的响应头。下面的方法借用的是它的思路,不是这个工具本身。

开始之前,先在中转站单独开一个测试令牌,只充很少的额度。测试用的提示词里不要放任何真实数据。

准备环境

找一台 Ubuntu 24.04 的机器,本地或 VPS 都可以。装好 Python 虚拟环境和 tiktoken。tiktoken 是 OpenAI 开源的 BPE(字节对编码)分词器,MIT 协议,它的 README 写的是 “tiktoken is a fast BPE tokeniser for use with OpenAI's models.”。

sudo apt update && sudo apt install -y python3-venv
python3 -m venv ~/relay-check
~/relay-check/bin/pip install tiktoken
~/relay-check/bin/python -c "import tiktoken; print(tiktoken.get_encoding('o200k_base').name)"

最后一行应该打印 o200k_base。如果 pip 报 externally-managed-environment,说明你调用的是系统的 pip,不是虚拟环境里的那个。检查命令的路径是不是 ~/relay-check/bin/pip。最后一行在第一次运行时可能需要联网。如果它报网络错误,先解决这台机器的网络问题。

然后设置三个环境变量:

read -rs RELAY_KEY && export RELAY_KEY
export RELAY_BASE_URL=https://relay.example.com/v1
export MODEL=gpt-4o-mini

第一行运行后,粘贴令牌再按回车。read -rs 不回显输入,令牌也不会进入 shell 历史。RELAY_BASE_URL 换成中转站给你的地址,也就是你在 OpenAI SDK 里填的那个 base_url。MODEL 换成你在中转站付费买的那个模型名。

检测脚本

把下面的脚本保存为 ~/relay-check/relay_check.py。它只用 Python 标准库和 tiktoken,有三个模式:usage、stream 和 tools。

import json
import os
import sys
import time
import urllib.error
import urllib.request

import tiktoken

BASE = os.environ['RELAY_BASE_URL'].rstrip('/')
KEY = os.environ['RELAY_KEY']
MODEL = os.environ.get('MODEL', 'gpt-4o-mini')

MESSAGES = [
    {'role': 'system', 'content': 'You are a terse assistant.'},
    {'role': 'user', 'content': 'List the first ten prime numbers, comma separated.'},
]

TOOLS = [{
    'type': 'function',
    'function': {
        'name': 'get_weather',
        'description': 'Get the current weather for a city',
        'parameters': {
            'type': 'object',
            'properties': {'city': {'type': 'string'}},
            'required': ['city'],
        },
    },
}]


def post(payload):
    req = urllib.request.Request(
        BASE + '/chat/completions',
        data=json.dumps(payload).encode(),
        headers={'Authorization': 'Bearer ' + KEY,
                 'Content-Type': 'application/json',
                 'User-Agent': 'relay-check/1.0'},
    )
    return urllib.request.urlopen(req, timeout=120)


def local_prompt_tokens(model, messages):
    # Same method as the OpenAI cookbook: an estimate, not an exact count.
    try:
        enc = tiktoken.encoding_for_model(model)
        name = enc.name
    except KeyError:
        enc = tiktoken.get_encoding('o200k_base')
        name = 'o200k_base (fallback: tiktoken does not know this model name)'
    n = 3
    for m in messages:
        n += 3
        for value in m.values():
            n += len(enc.encode(value))
    return n, name


def check_usage():
    with post({'model': MODEL, 'messages': MESSAGES}) as r:
        body = json.load(r)
    usage = body.get('usage') or {}
    est, enc_name = local_prompt_tokens(MODEL, MESSAGES)
    print('requested model :', MODEL)
    print('returned model  :', body.get('model'))
    print('usage           :', json.dumps(usage))
    print('local estimate  :', est, 'prompt tokens, encoding', enc_name)
    if 'prompt_tokens' in usage:
        print('difference      :', usage['prompt_tokens'] - est)


def check_stream():
    start = time.monotonic()
    first = None
    stream_usage = None
    payload = {'model': MODEL, 'messages': MESSAGES, 'stream': True,
               'stream_options': {'include_usage': True}}
    with post(payload) as r:
        for raw in r:
            line = raw.decode('utf-8', 'replace').strip()
            if not line.startswith('data:'):
                continue
            data = line[5:].strip()
            if data == '[DONE]':
                break
            chunk = json.loads(data)
            for choice in chunk.get('choices') or []:
                delta = choice.get('delta') or {}
                if first is None and delta.get('content'):
                    first = time.monotonic() - start
            if chunk.get('usage'):
                stream_usage = chunk['usage']
    total = time.monotonic() - start
    if first is None:
        print('time to first token: no content chunk seen')
    else:
        print('time to first token: %.2fs' % first)
    print('total stream time  : %.2fs' % total)
    print('stream usage       :', json.dumps(stream_usage))


def check_tools():
    payload = {'model': MODEL, 'tools': TOOLS, 'messages': [
        {'role': 'user', 'content': 'What is the weather in Hangzhou? Use the tool.'}]}
    with post(payload) as r:
        body = json.load(r)
    message = body['choices'][0]['message']
    print('tool_calls:', json.dumps(message.get('tool_calls'), ensure_ascii=False))
    print('content   :', message.get('content'))


if __name__ == '__main__':
    mode = sys.argv[1] if len(sys.argv) > 1 else 'usage'
    try:
        {'usage': check_usage, 'stream': check_stream, 'tools': check_tools}[mode]()
    except urllib.error.HTTPError as e:
        print('HTTP', e.code, e.read().decode('utf-8', 'replace'))

如果输出是 HTTP 401 加一段错误信息,说明鉴权没有通过。最常见的原因是令牌或地址填错了,先核对这两项。但 401 不一定出在你这边。中转站可能把上游的错误原样转给你,而 OpenAI 的错误码文档(2026 年 10 月 20 日查阅)里,401 还包括两种和你的令牌无关的情况:账号不属于任何组织(“Your account is not part of an organization.”),以及请求 IP 不在项目或组织配置的 IP 白名单里(“Your request IP does not match the configured IP allowlist for your project or organization.”)。如果令牌和地址都确认无误,错误信息里又出现这类文字,问题在中转站的上游账号,你自己修不了。同一份文档里,403 表示从不支持的国家或地区访问;429 除了请求太快,也可能是组织的预付额度用完(credit_balance_exhausted)或达到了花费上限。先排除这些错误,再往下测。

第一项:返回的 model 字段

~/relay-check/bin/python ~/relay-check/relay_check.py usage

输出的前两行,是你请求的模型名和接口返回的 model 字段。OpenAI 的 Chat Completions 接口文档对这个字段的说明是 “The model used for the chat completion.”,也就是本次补全使用的模型。文档没有写明它应该和你请求的名字完全一样,还是会返回带日期的版本名。所以先记下你看到的值,作为以后对照的基准。

这一项的价值是单向的。网关可以在这个字段里写任何字符串,所以字段一致什么也证明不了。但如果它返回的名字明显是另一个模型,那就是很强的信号。

第二项:usage 和本地 tiktoken 计数

同一次输出里还有 usage,以及脚本用 tiktoken 在本地算出的输入 token 估算值和两者的差。估算方法照搬 OpenAI cookbook:每条消息加 3,最后再加 3。cookbook 自己也提醒 “the exact way that tokens are counted from messages may change from model to model”,意思是不同模型对消息的计数方式可能不同。所以本地数字是估算,不是标准答案。

如果 tiktoken 不认识你填的模型名,encoding_for_model() 会抛出 KeyError。这时脚本退回到 o200k_base,并在输出里写明这是退回的编码。cookbook 的对照表只覆盖较早的模型名,例如 gpt-4o 和 gpt-4o-mini 对应 o200k_base,gpt-4 和 gpt-3.5-turbo 对应 cl100k_base。较新的模型,以 tiktoken 自己的判断为准。

把同一个请求连续跑五次:

for i in 1 2 3 4 5; do ~/relay-check/bin/python ~/relay-check/relay_check.py usage; done

怎么读结果:

  • 看 prompt_tokens 是否每次都一样。同一段输入、同一个模型,分词结果是确定的,所以这个数字应该不变。如果它来回跳,说明请求在不同的上游之间切换,或者网关每次往你的请求里加的东西不一样。
  • 看差值是不是稳定。一个固定的小差值,可能只是计数方法不同。如果 prompt_tokens 远大于本地估算,一种可能是网关在前面加了你看不见的系统提示词,另一种可能是这个数字是网关自己编的。
  • 把 usage 里的数字和中转站后台扣掉的额度对一对。后台扣得比 usage 和标价算出来的多,多出来的部分就在倍率里。

第三项:测一个便宜替代品做不好的功能

先去 OpenAI 的模型文档里查清楚:你付费买的那个模型,官方写明支持哪些功能。然后挑一个便宜替代模型常常做不好的功能来测,比如工具调用(function calling)或者图片输入。claude-detector 也是这样做的,它有 tool_use 和 multimodal 两项探测。

脚本的 tools 模式会发一个带 get_weather 工具定义的请求:

~/relay-check/bin/python ~/relay-check/relay_check.py tools

看它有没有返回 tool_calls,函数名是不是 get_weather,arguments 是不是一段能解析的 JSON,里面有没有 city。如果你买的模型官方支持工具调用,这里却只返回一段普通文字,或者参数格式是乱的,就值得怀疑。多换几个问题再测,一次失败说明不了什么。

第四项:首字延迟

首字延迟(TTFT,time to first token)是从发出请求到收到第一段内容的时间。

for i in 1 2 3 4 5; do ~/relay-check/bin/python ~/relay-check/relay_check.py stream; done

脚本发的是流式请求,并且打开了 stream_options.include_usage。OpenAI 文档说明,打开这个选项后,会在 data: [DONE] 之前多发一个数据块,所以流式模式下也能拿到 usage。如果 stream usage 这一行一直是 null,可能是网关没有把这个块转发过来。

首字延迟没有一个标准值。它受模型大小、你到中转站的网络、中转站到上游的网络、上游当时的负载影响。这一项的用法是建立你自己的基线:在不同时间段多跑几次,记下正常范围。之后如果某一天延迟突然大幅变化,回答的风格也变了,背后的东西就可能换了。

没有哪一项能单独证明真假

上面每一项都可以被绕过,也都可能误报。一个用心作假的网关可以伪造 model 字段,也可以按本地分词器重新算一遍 usage。一个真实的上游,也可能因为网络慢或负载高而延迟异常。所以结论要看几项一起的结果,并且要在不同时间重复测。即使全部通过,也只说明这几次没有发现问题,不说明你的数据是安全的。明文经手的风险,任何检测都消除不了。

排行榜和检测站也是利益相关方

搜“中转站”时,你会看到各种排行榜和测评站。读它们之前,先看它们靠什么赚钱,以及有没有写明。

以 apiranking.com 为例。它自称“AI API 中转站 实测排行榜”,并说“本站就是专门做中转站真假检测的”。它写明自己“不卖中转站、不接付费排名、不做掺水排名”,位次“纯由实测决定”。同时,它的排序说明里有一句“站越受欢迎,排得越靠前”。页面上的“官网 →”外链带着来源追踪参数,有标注“本站用户专属”的优惠码,还有一个“合作”页面。我们在这个页面上没有找到关于返利、推广佣金或广告的披露。这些安排是否涉及佣金,页面没有说明。

这不是在说某一个站作假。重点是:一个站如果从它推荐的对象那里拿钱,又没有披露,它的排名就不是独立的。检测工具也一样。最可靠的是你能自己读代码、自己运行的那种。这里不推荐、不排名任何中转站,也不提供免费名单。

大陆开发者的正规低价路线:官方人民币计费 API

如果你在大陆,想用便宜的、OpenAI 兼容格式的大模型 API,下面几家都是官方直接提供、按人民币计价的。兼容的意思是:同一套 OpenAI SDK 代码,换掉 base URL、API key 和模型名就能用。

  • DeepSeek:文档写明 “The DeepSeek API uses an API format compatible with OpenAI/Anthropic.”,base URL 是 https://api.deepseek.com。中文价格页按元标价,英文价格页按美元标价。
  • 阿里云百炼(千问):文档写明千问模型“支持 OpenAI 兼容接口”。北京地域的 base URL 是 https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,其中 {WorkspaceId} 换成你自己的工作空间 ID。API key 和地域绑定,用错地域会得到 HTTP 401 invalid_api_key。
  • 智谱 BigModel(GLM):文档写明“智谱提供与 OpenAI API 兼容的接口”,地址是 https://open.bigmodel.cn/api/paas/v4/。
  • Kimi(月之暗面):文档写明“Kimi API 兼容 OpenAI API 格式”,base URL 是 https://api.moonshot.cn/v1。价格页说明它是“按量计费”模式,“不提供订阅制方案”。

下面是 2026 年 10 月 19 日查阅的官方标价,单位是每百万 tokens。DeepSeek 和 Kimi 的输入价取的是缓存未命中的价格。Kimi 的价格页用的是 ¥ 符号。

图表官方标价:元或 ¥ 每百万 tokens(2026-10-19 查阅)
此图表背后的数据
[
  {
    "label": "DeepSeek deepseek-flash \u975e\u9ad8\u5cf0",
    "input_per_million": 1,
    "output_per_million": 4
  },
  {
    "label": "DeepSeek deepseek-flash \u9ad8\u5cf0",
    "input_per_million": 2,
    "output_per_million": 8
  },
  {
    "label": "\u667a\u8c31 GLM-5.3-Flash",
    "input_per_million": 0.8,
    "output_per_million": 2.8
  },
  {
    "label": "\u667a\u8c31 GLM-5.3",
    "input_per_million": 8,
    "output_per_million": 28
  },
  {
    "label": "DeepSeek deepseek-v4-pro \u975e\u9ad8\u5cf0",
    "input_per_million": 4.5,
    "output_per_million": 13.5
  },
  {
    "label": "DeepSeek deepseek-v4-pro \u9ad8\u5cf0",
    "input_per_million": 9,
    "output_per_million": 27
  },
  {
    "label": "\u963f\u91cc\u4e91\u767e\u70bc qwen3.8-max \u5317\u4eac",
    "input_per_million": 12,
    "output_per_million": 36
  },
  {
    "label": "Kimi kimi-k3",
    "input_per_million": 20,
    "output_per_million": 100
  }
]

几点要看清楚:

  • DeepSeek 分高峰和非高峰,价格页写着“空闲时段价格为高峰时段的一半”。deepseek-flash 非高峰的输入价是 1 元,高峰是 2 元。英文价格页给出的高峰时段是 UTC 周一到周五的 01:00 到 04:00 和 06:00 到 10:00,中国法定节假日除外。换算成北京时间,就是 09:00 到 12:00 和 14:00 到 18:00。
  • 图里付费模型中标价最低的是智谱 GLM-5.3-Flash,输入 0.8 元,输出 2.8 元。最贵的输出价是 Kimi kimi-k3 的 100 ¥。
  • 阿里云百炼的价格取的是北京地域、价格页上 0<Token≤1M 这一档。价格页还写了 100 万 tokens 的免费额度,有效期是“自开通百炼/模型发布/申请通过之日起90天内(以较晚者为准)”。
  • 智谱的价格页把 GLM-4.7-Flash、GLM-4-Flash-250414 等几个 Flash 模型标为“免费”。这些是智谱自己的模型,不是 GPT。
  • 价格变化很快。DeepSeek 的价格页自己写明保留调整价格的权利。下单前,以各家的价格页为准。

前面的检测脚本也可以指向这些官方接口,用来对照首字延迟和工具调用的表现。但 tiktoken 是 OpenAI 模型的分词器,它对这些模型算出的 token 数没有参考意义。对这几家,第二项只看 prompt_tokens 是否稳定即可。如果你同时在比较 Claude 的费用,Claude API 按量付费和订阅哪个更省钱 把两种计费方式放在一起算过。

如果你在新加坡或马来西亚,这两个地方都在 OpenAI 的支持名单里。直接在 OpenAI 平台注册购买就行,没有必要经过中转。

什么时候该自己部署 new-api

自己部署 new-api 或 one-api,适合的场景是:一个组织在内部统一管理它合法持有的上游 key。new-api 的中文 README 把它的用途限定为“合法授权的 AI API 网关、组织内部鉴权、多模型管理、用量统计、成本核算和私有化部署场景”,并且要求“使用者必须合法取得上游 API Key、账号、模型服务或接口权限,并遵守上游服务条款及适用法律法规”。

一个合理的例子:团队同时用 DeepSeek、千问和 GLM 的官方 API,想要一个统一的入口,按人发令牌,按项目看用量和成本。网关前面接团队成员,后面接团队自己付费的官方 key。

有两件事要先查清楚。第一,上游条款是否允许一个 key 给多人用。OpenAI 的帮助中心就建议每个团队成员用自己的 key,原文见前面的条款一节。其他厂商的规定,请读各自的服务协议。第二,网关只对内部开放。一旦对外开放并收费,就进入了暂行办法和 new-api README 里讲的那些义务。

自建网关同样会看到所有明文请求。区别是这台服务器在你自己手里,日志存不存、存多久,由你决定。如果你打算把它放在一台 VPS 上,费用可以参考 一台 VPS 每月大概要花多少钱。

FAQ

免费的 GPT API 中转站安全吗?

你发出去的提示词、代码和文件,会在中转站的服务器上被解密成明文,因为网关要读出模型名并计费。运营者是否保存、保存多久,你无法验证。所以不要通过第三方中转站发送密码、密钥、客户数据或不能公开的代码。充值的余额只存在于对方的数据库里,网站关门就会消失,所以只充能接受全部损失的小额。

怎么判断中转站有没有偷偷换模型?

没有一项检测能单独证明。要几项一起看:返回的 model 字段是不是明显是别的模型;同一请求连续多次的 prompt_tokens 是否稳定,和本地 tiktoken 估算差多少;你买的模型官方支持的功能(比如工具调用)能不能正常工作;首字延迟和你记录的基线相比有没有突变。字段一致不能证明是真的,因为网关可以写任何字符串,但明显不一致是很强的信号。

大陆开发者有没有官方的便宜 OpenAI 兼容接口?

有。DeepSeek、阿里云百炼的千问、智谱 GLM 和 Kimi 都提供官方的 OpenAI 兼容接口,并按人民币计价。换掉 base URL、API key 和模型名,就能沿用 OpenAI SDK 的代码。价格和免费额度经常变,下单前以各家官方价格页为准。在新加坡或马来西亚,可以直接向 OpenAI 购买 API。

自己部署 one-api 或 new-api 给团队用,要注意什么?

只用它管理团队自己合法付费的上游 key,并且只对内部开放。先读上游厂商的条款:OpenAI 的帮助中心写着 “The sharing of API keys is against the Terms of Use.”,并建议从 Members 页面邀请成员,让每个人用自己的 key。如果网关要对外收费或面向公众,new-api 的 README 要求先完成备案、内容安全、实名等合规义务,《生成式人工智能服务管理暂行办法》也有相应条款。

#openai-api#api-relay#new-api#llm-gateway#china#pricing