这是一个名为 tokengift 的项目,可直接部署到 GitHub 仓库 mappedinfo/tokengift。项目提供 token 银行与 token 兑换能力,并支持通过访问链接附加字符串自动解析配置。
官方链接:
- GitHub: https://github.com/mappedinfo/tokengift
- PyPI: https://pypi.org/project/tokengift/
- npm: https://www.npmjs.com/package/tokengift
当前项目有三个版本,协同支持同一套配置解析与 RSA-OAEP(SHA-256) 加解密兼容规则:
npm包tokengift:命令行工具(node scripts/tokengift.js封装)。PyPI包tokengift:提供同样参数与加密规则的 Python CLI。- GitHub Pages:网页版“兑换中心 + 发起邀请 + 领取礼物”(本仓库页面,按网址链接直接使用)。
3 个版本共享同一套配置解析与 RSA-OAEP(SHA-256) 加解密规则,因此命令行与页面互相兼容。
- 不依赖服务端数据库
- 使用 React + TypeScript + Ant Design + AntV
- 自动解析 URL 配置,提取:
apiKey / baseUrl / 支持模型 / token 数量 - 默认以
gpt-5.5-medium作为结算基准 - 本地持久化记录每组配置下的余额与兑换记录(localStorage)
- 兑换后用图表和表格可视化余额变化
npm install
npm run devnpm run build
npm run preview# 使用你自己的仓库名,示例:mappedinfo/tokengift
npm run build前端工程已统一放在 web/ 目录下,默认构建产物为 web/dist,然后发布该目录到 GitHub Pages(可手动上传或使用 gh-pages/Workflow)。
本仓库已经新增了 GitHub Actions:
- 文件:
.github/workflows/deploy-gh-pages.yml - 触发:
main分支 push 或手动触发 - 流程:
npm ci -> npm run build -> 同步 web/dist 到 gh-pages - 默认会按仓库名
/tokengift/作为base,如果你仓库名不同可改:web/vite.config.ts的GH_PAGES_BASE_PATH/VITE_BASE_PATH- workflow 里的
env: GH_PAGES_BASE_PATH: /你的仓库名/
页面启动时会自动读取如下来源:
- 查询参数
?cfg=...或?config=... - 原始查询字符串(
https://.../?<payload>) - hash 字符串(
https://.../#<payload>)
支持两种 payload:
{
"profileName": "team-a",
"apiKey": "sk-xxxx",
"baseUrl": "https://api.openai.com/v1",
"models": [
{ "id": "gpt-5.5-medium", "rate": 1 },
{ "id": "gpt-4o", "rate": 1.15 }
],
"tokenQuota": 50000,
"initialBalances": {
"gpt-5.5-medium": 30000,
"gpt-4o": 10000
}
}例如拼接:
https://your-domain/#eyJwcm9maWxlTmFtZSI6InRlYW0tYSIsImFwaUtleSI6InNrLXh4Iiw...
<apiKey>|<baseUrl>|<model1:rate,model2:rate>|<totalToken>|<model1:balance,model2:balance>
示例:
aaa|https://api.openai.com/v1|gpt-5.5-medium:1,gpt-4o:1.15|50000|gpt-5.5-medium:20000
也可以粘贴到页面中的「手动解析」输入框。
- 本项目不持久传输 API Key,解析行为发生在前端;但请注意 URL 上明文包含 API Key 会有安全风险,请仅用于测试与演示。
如果希望把“指定额度后自动停止消耗”做成硬限制,不应把真实上游 API Key 直接交给 agent。推荐先在 New API / One API 中放入真实上游 Key,再由 tokengift 生成有限额、限模型、可过期的本地令牌并包装成礼物配置。
当前 issuer 第一版只在 npm CLI 中提供;Python CLI 继续保持 RSA 加解密兼容。完整实现说明见 Node Issuer 文档。
# CLI 会自动读取本地 .env,也支持显式 export
export NEWAPI_BASE_URL="https://newapi.example.com"
export NEWAPI_USER_TOKEN="your-user-token"
export NEWAPI_USER_ID="1"
npm run tokengift -- issue \
--provider newapi \
--name agent-a \
--quota 100000 \
--models gpt-4o-mini,gpt-4o \
--expires-at -1一展 API 这类 New API 二次开发平台也可使用兼容变量名:
NEW_API_URL=https://vip.yi-zhan.top
NEW_API_TOKEN=your-user-token
NEW_API_USER_ID=293默认输出可被页面解析的配置 JSON,包含有限额 apiKey、agent 使用的 baseUrl、允许模型、平台 token id 和额度信息。如果要直接加密给接收方,增加 --public keys/bob_public.pem;如果要生成领取链接,再增加 --link-base https://your-domain/。
export TOKENGIFT_API_KEY="sk-limited-xxx"
npm run tokengift -- usage --provider newapi
npm run tokengift -- revoke --provider newapi --token-id 123usage 会优先请求标准 New API 的 /api/usage/token;如果平台是类似一展 API 的二次开发并使用 /v1/dashboard/billing/usage,会自动 fallback。
export ONEAPI_BASE_URL="https://oneapi.example.com"
export ONEAPI_ACCESS_TOKEN="your-oneapi-access-token"
npm run tokengift -- issue \
--provider oneapi \
--name agent-a \
--quota 100000 \
--models gpt-4o-mini,gpt-4o \
--subnet "192.168.1.0/24"注意:这里的 quota 是 New API / One API 平台额度单位,通常会按平台的分组倍率、模型倍率、输入输出倍率折算,不等同于原始模型 token 数。额度耗尽后的硬停止由 New API / One API 执行,tokengift 只负责创建、包装、加密和分发有限额 key。
为了实现“赠予逻辑”中的密钥交换,项目增加了一个通用 CLI:tokengift(scripts/tokengift.js)。
用途:
- 用对方公钥加密配置(礼物发起方)
- 对方用自己的私钥解密配置(领取方)
- 生成 RSA 公/私钥对
npm install
npm run tokengift -- --help- 生成公私钥(发送方或接收方):
npm run tokengift -- keygen --public keys/receiver_public.pem --private keys/receiver_private.pem- 发送方用接收方公钥加密 JSON 配置:
npm run tokengift -- gift --public keys/receiver_public.pem --in token-config.json > encrypted.txt- 接收方用自己的私钥解密:
npm run tokengift -- open --private keys/receiver_private.pem --in encrypted.txt- 默认输出为
Base64URL(可直接贴到cfg=...参数中) - 为兼容更大体积内容,命令会按 RSA 分块加密,密文由多段
.分隔组合
说明:该 CLI 使用
RSA + OAEP(SHA-256),属于经典的“公钥加密、私钥解密”模型,适合用于配置/小对象共享场景。更大对象可先压缩或签名再加密。
在仓库根目录新增了 Python CLI,功能与 Node 版参数与行为对齐:
keygen:生成public/privateRSA PEM 密钥对(SPKI + PKCS8)gift(aliasencrypt):用公钥加密open(aliasdecrypt):用私钥解密- 输出/输入使用
Base64URL,多段密文用.分隔
# 推荐使用 uv 管理本地环境
uv venv
uv pip install -e .[dev]
uv run tokengift --help
uv run python -m build
uv pip install .UV_PYTHON=3.11 ./scripts/release_py.sh# 不使用脚本时,手动执行
UV_PYTHON=3.11 uv run --with build --with twine python -m build
UV_PYTHON=3.11 uv run --with build --with twine python -m twine upload dist/*如果你仍想直接使用发布脚本,当前脚本会自动完成版本 bump + build + twine upload:
./scripts/release_py.sh
./scripts/release_py.sh patch
./scripts/release_py.sh minor
./scripts/release_py.sh major说明:
- 默认执行
patch递增 - 支持参数
patch、minor、major - 自动读取
.env中的:TWINE_USERNAME=__token__TWINE_PASSWORD=<你的 PyPI token>
- 发布前会清理旧
dist/,再执行python -m build - 发布后会把新版本写入
pyproject.toml
tokengift keygen --public keys/bob_public.pem --private keys/bob_private.pem
tokengift gift --public keys/bob_public.pem --in token-config.json > encrypted.txt
tokengift open --private keys/bob_private.pem --in encrypted.txt小贴士:Node 版也使用同一套命令和分块 OAEP 规则,因此两端可互相加解密。