Token EMC v1
根据导出的 Markdown 重建的帮助页
不用科学上网,是直连的;如果开了 VPN,速度会受到你本地线路影响。
所有模型都可以统一使用 OpenAI SDK,不需要为不同模型切换不同 SDK;当然使用原生 SDK 也支持。
https://tokenutopia.ai
https://tokenutopia.ai/v1
sk-xxxxxxxxxxxxxx
分组说明
| 名称 | 描述 |
|---|---|
| AWS | 直连官网 AWS Claude |
| Claude 官货 | Anthropic 官方直连 |
| CodexTeam | 100% GPT Team账号号池 |
| GPT稳定 | 兜底 GPT号池+OpenAI官方渠道兜底 |
| OpenAI GPT | 直连 OpenAI官方 |
| Banana 2 | Nano Banana 2 |
| Banana Pro | Nano Banana Pro |
| Gemini-AIStudio | Gemini文本 |
Codex(MAC环境)
安装 codex 客户端
npm install -g @openai/codex
设置配置文件
将 Key 和 URL 设置为我们提供的值。API Key 为你的专属 Key,Base URL 为 https://tokenutopia.ai/v1。
MAC 创建或编辑 ~/.codex/auth.json
{
"OPENAI_API_KEY": "给你的 key"
}
MAC 创建或编辑 ~/.codex/config.toml
model_provider = "myapi"
model = "gpt-5"
model_reasoning_effort = "high"
disable_response_storage = true
[model_providers.myapi]
name = "myapi"
base_url = "https://tokenutopia.ai/v1"
wire_api = "responses"
requires_openai_auth = true
[projects."/Users/james/.codex"]
trust_level = "trusted"
[notice.model_migrations]
gpt-5 = "gpt-5.3-codex"
测试连接
codex
VS Code 安装 Codex 插件后即可直接使用,插件会读取上述配置文件。
程序调用 codex 示例
先安装 SDK:
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "给你的 key",
baseURL: "https://tokenutopia.ai/v1",
});
async function main() {
console.log("🤖 正在调用 GPT 5.3 Codex...\n");
const response = await client.chat.completions.create({
model: "gpt-5.3-codex",
max_tokens: 1024,
messages: [
{
role: "system",
content: "你是一个简洁的助手,回答控制在 100 字以内。",
},
{
role: "user",
content: "美国、以色列和伊朗的战争会如何发展?",
},
],
});
const choice = response.choices[0];
if (choice.message.content) {
console.log("✅ 回复:", choice.message.content);
}
console.log("\n📊 Token 用量:");
console.log(" Input tokens: ", response.usage?.prompt_tokens);
console.log(" Output tokens:", response.usage?.completion_tokens);
console.log(" Total tokens: ", response.usage?.total_tokens);
}
main().catch(console.error);
Claude(MAC环境)
安装 Claude 客户端
npm install -g @anthropic-ai/claude-code
另外一种安装方式:
curl -fsSL https://claude.ai/install.sh | bash
设置配置文件
将收到的 Key 和 URL 写入 ~/.claude/settings.json。Base URL 使用 https://tokenutopia.ai。
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "替换为您的 API Key",
"ANTHROPIC_BASE_URL": "https://tokenutopia.ai",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1,
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": 1
},
"permissions": {
"allow": [],
"deny": []
}
}
测试连接
claude
VS Code 安装 Claude 插件即可,插件会直接读取配置文件内容,安装后可直接使用。
程序调用 Claude 示例
先安装 SDK:
npm i @anthropic-ai/sdk
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "给你的 KEY",
baseURL: "https://tokenutopia.ai",
});
async function main() {
console.log("🤖 正在调用 Claude...\n");
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
system: "你是一个简洁的助手,回答控制在 100 字以内。",
messages: [
{
role: "user",
content: "什么是 typescript?",
},
],
});
const text = response.content[0];
if (text.type === "text") {
console.log("✅ 回复:", text.text);
}
console.log("\n📊 Token 用量:");
console.log(" Input tokens: ", response.usage.input_tokens);
console.log(" Output tokens:", response.usage.output_tokens);
}
main().catch(console.error);
Claude(Win)
方法1:配置 settings.json
创建或编辑 C:\Users\<用户名>\.claude\settings.json。不要把真实 Key 写进共享文档或截图。
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "替换为您的 API Key",
"ANTHROPIC_BASE_URL": "https://tokenutopia.ai",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1,
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": 1
},
"permissions": {
"allow": [],
"deny": []
}
}
方法2:永久设置环境变量
- 在图形界面或系统设置里新增 ANTHROPIC_BASE_URL,值为 https://tokenutopia.ai。
- 新增 ANTHROPIC_AUTH_TOKEN,值为你的专属 Key。
- 重启终端后生效。
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL', 'https://tokenutopia.ai', 'User')
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN', '替换为您的 API Key', 'User')
Gemini(MAC 环境)
安装 Gemini 客户端
npm install -g @google/gemini-cli
设置配置文件
将收到的 Key 和 URL 写入 Gemini 配置目录。Base URL 使用 https://tokenutopia.ai。
MAC 配置文件 ~/.gemini/.env
GOOGLE_GEMINI_BASE_URL=https://tokenutopia.ai
GEMINI_API_KEY=给你的 key
MAC 配置文件 ~/.gemini/settings.json
{
"general": {
"sessionRetention": {
"enabled": true,
"maxAge": "30d",
"warningAcknowledged": true
}
},
"security": {
"auth": {
"selectedType": "gemini-api-key"
}
}
}
测试连接
gemini
banana2 的示例
生成“猫咪坐在月亮上的插画”,并将结果保存为本地图片文件。
/**
* Banana2 (Gemini 3.1 Flash) 图片生成测试脚本
* 使用 Gemini 原生 REST API,请求模型生成图片,
* 返回的 inlineData 会保存为本地文件。
*/
import { writeFileSync } from 'fs';
import { resolve } from 'path';
const BASE_URL = 'https://tokenutopia.ai';
const API_KEY = '给你的 KEY';
const MODEL = 'gemini-3.1-flash-image-preview';
interface GeminiPartText {
text: string;
}
interface GeminiPartInlineData {
inlineData: {
mimeType: string;
data: string;
};
}
type GeminiPart = GeminiPartText | GeminiPartInlineData;
interface GeminiImageResponse {
candidates: {
content: { parts: GeminiPart[]; role: string };
finishReason: string;
}[];
usageMetadata: {
promptTokenCount: number;
candidatesTokenCount: number;
totalTokenCount: number;
};
modelVersion: string;
}
async function generateImage(prompt: string): Promise<GeminiImageResponse> {
const url = `${BASE_URL}/v1beta/models/${MODEL}:generateContent`;
const body = {
contents: [{ role: 'user', parts: [{ text: prompt }] }],
generationConfig: {
responseModalities: ['TEXT', 'IMAGE'],
},
};
const res = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-goog-api-key': API_KEY,
},
body: JSON.stringify(body),
});
if (!res.ok) {
const errBody = await res.text();
throw new Error(`API 错误 [${res.status}]: ${errBody}`);
}
return (await res.json()) as GeminiImageResponse;
}
async function main() {
console.log('🍌 Banana2 图片生成测试\n');
const prompt = '请生成一张可爱的卡通猫咪坐在月亮上的插画,背景是星空。';
const response = await generateImage(prompt);
const parts = response.candidates[0]?.content.parts ?? [];
let imageCount = 0;
for (const part of parts) {
if ('text' in part) {
console.log('📝 文字回复:', part.text);
}
if ('inlineData' in part) {
imageCount++;
const { mimeType, data } = part.inlineData;
const ext = mimeType.split('/')[1] || 'png';
const filename = `banana2_output_${imageCount}.${ext}`;
writeFileSync(resolve(process.cwd(), filename), Buffer.from(data, 'base64'));
}
}
const usage = response.usageMetadata;
console.log(' Input tokens: ', usage.promptTokenCount);
console.log(' Output tokens:', usage.candidatesTokenCount);
console.log(' Total tokens: ', usage.totalTokenCount);
}
main().catch((err) => {
console.error('❌', err);
process.exit(1);
});
BananaPro 示例
BananaPro 是基于 Gemini 3 Pro 的 Image-to-Image 重绘模型。
模型名称:gemini-3-pro-image-preview
中转站:https://tokenutopia.ai
API 格式:Gemini 原生 REST API(v1beta)
建议始终使用流式请求 streamGenerateContent?alt=sse,避免 Nginx 60 秒超时。
文件说明
| 文件 | 说明 |
|---|---|
| bananaproTest.html | 浏览器页面版,可视化上传图片并查看重绘结果 |
| bananaproProxy.ts | 本地代理服务器,解决浏览器 CORS 限制并转发请求 |
方式一:浏览器页面版(推荐)
- 启动代理服务器:npx tsx bananaproProxy.ts
- 打开浏览器访问 http://localhost:3210/bananaproTest.html
- 上传本地图片,编辑提示词,点击“开始重绘”
- 等待模型处理,通常需要 1 到 3 分钟
- 页面会实时显示接收进度,并展示原图与结果图
代理服务器说明
代理服务器的作用是解决浏览器跨域限制,并把长任务超时提高到 10 分钟。
浏览器 → localhost:3210/proxy/v1beta/... → tokenutopia.ai/v1beta/...
import { createServer } from 'http';
const PORT = 3210;
const TARGET = 'https://tokenutopia.ai';
const server = createServer(async (req, res) => {
if (req.method === 'OPTIONS') {
res.writeHead(204, {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
'Access-Control-Allow-Headers': '*',
});
res.end();
return;
}
if (req.url?.startsWith('/proxy/')) {
const targetPath = req.url.replace(/^\/proxy/, '');
const upstream = await fetch(`${TARGET}${targetPath}`, {
method: req.method,
headers: {
'Content-Type': req.headers['content-type'] || 'application/json',
'x-goog-api-key': req.headers['x-goog-api-key'] || '',
},
});
res.writeHead(upstream.status, {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': '*',
'Content-Type': upstream.headers.get('content-type') || 'application/json',
});
const reader = upstream.body?.getReader();
if (!reader) {
res.end();
return;
}
while (true) {
const { done, value } = await reader.read();
if (done) {
res.end();
break;
}
res.write(value);
}
}
});
server.timeout = 10 * 60 * 1000;
server.listen(PORT);
支持的图片格式
| 格式 | MIME 类型 |
|---|---|
| PNG | image/png |
| JPEG | image/jpeg |
| WebP | image/webp |
| GIF | image/gif |
常见问题
Q: 504 Gateway Time-out
中转站 Nginx 有 60 秒超时限制。解决方案是使用浏览器页面版 + 本地代理,并改用 streamGenerateContent。
Q: Failed to fetch(浏览器)
这是浏览器 CORS 限制。必须先启动代理,再通过 http://localhost:3210 访问。
Q: 模型处理很慢?
Pro 模型进行图片重绘通常需要 1 到 3 分钟,属于正常情况,页面会持续显示接收进度。
Gemini 文本模型示例
这个示例使用 Gemini 原生 REST API,通过中转站调用 Gemini 3 Pro 文本模型。
/**
* Gemini 文本模型测试脚本
* 使用 Gemini 原生 REST API 格式,通过中转站调用 Gemini 3 Pro 文本模型。
*/
const BASE_URL = 'https://tokenutopia.ai';
const API_KEY = '给你的 KEY';
const MODEL = 'gemini-3-pro-preview';
interface GeminiRequest {
contents: { role: 'user' | 'model'; parts: { text: string }[] }[];
generationConfig?: {
temperature?: number;
maxOutputTokens?: number;
};
}
interface GeminiResponse {
candidates: {
content: { parts: { text: string }[]; role: string };
finishReason: string;
}[];
usageMetadata: {
promptTokenCount: number;
candidatesTokenCount: number;
totalTokenCount: number;
};
modelVersion: string;
}
async function callGemini(prompt: string): Promise<GeminiResponse> {
const url = `${BASE_URL}/v1beta/models/${MODEL}:generateContent`;
const body: GeminiRequest = {
contents: [{ role: 'user', parts: [{ text: prompt }] }],
generationConfig: {
temperature: 0.7,
maxOutputTokens: 1024,
},
};
const res = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-goog-api-key': API_KEY,
},
body: JSON.stringify(body),
});
if (!res.ok) {
const errBody = await res.text();
throw new Error(`API 错误 [${res.status}]: ${errBody}`);
}
return (await res.json()) as GeminiResponse;
}
async function main() {
const prompt = '你好,请简要介绍一下你自己,你是什么模型?回答控制在 100 字以内。';
const response = await callGemini(prompt);
const text = response.candidates[0]?.content.parts.map((p) => p.text).join('');
console.log('✅ 返回结果:');
console.log(text);
const usage = response.usageMetadata;
console.log(' Model: ', response.modelVersion);
console.log(' Input tokens: ', usage.promptTokenCount);
console.log(' Output tokens:', usage.candidatesTokenCount);
console.log(' Total tokens: ', usage.totalTokenCount);
}
main().catch((err) => {
console.error('❌', err);
process.exit(1);
});