Token EMC v1

根据导出的 Markdown 重建的帮助页

免费试用

不用科学上网,是直连的;如果开了 VPN,速度会受到你本地线路影响。

所有模型都可以统一使用 OpenAI SDK,不需要为不同模型切换不同 SDK;当然使用原生 SDK 也支持。

Base URL
https://tokenutopia.ai
OpenAI 兼容入口
https://tokenutopia.ai/v1
API Key
sk-xxxxxxxxxxxxxx

分组说明

名称 描述
AWS直连官网 AWS Claude
Claude 官货Anthropic 官方直连
CodexTeam100% GPT Team账号号池
GPT稳定兜底 GPT号池+OpenAI官方渠道兜底
OpenAI GPT直连 OpenAI官方
Banana 2Nano Banana 2
Banana ProNano Banana Pro
Gemini-AIStudioGemini文本

Codex(MAC环境)

安装 codex 客户端

Terminal
npm install -g @openai/codex

设置配置文件

将 Key 和 URL 设置为我们提供的值。API Key 为你的专属 Key,Base URL 为 https://tokenutopia.ai/v1

MAC 创建或编辑 ~/.codex/auth.json

auth.json
{
  "OPENAI_API_KEY": "给你的 key"
}

MAC 创建或编辑 ~/.codex/config.toml

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"

测试连接

Terminal
codex

VS Code 安装 Codex 插件后即可直接使用,插件会读取上述配置文件。

程序调用 codex 示例

先安装 SDK:

Terminal
npm install openai
codex.ts
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 客户端

Terminal
npm install -g @anthropic-ai/claude-code

另外一种安装方式:

Terminal
curl -fsSL https://claude.ai/install.sh | bash

设置配置文件

将收到的 Key 和 URL 写入 ~/.claude/settings.json。Base URL 使用 https://tokenutopia.ai

settings.json
{
  "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": []
  }
}

测试连接

Terminal
claude

VS Code 安装 Claude 插件即可,插件会直接读取配置文件内容,安装后可直接使用。

程序调用 Claude 示例

先安装 SDK:

Terminal
npm i @anthropic-ai/sdk
claude.ts
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 写进共享文档或截图。

settings.json
{
  "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:永久设置环境变量

  1. 在图形界面或系统设置里新增 ANTHROPIC_BASE_URL,值为 https://tokenutopia.ai
  2. 新增 ANTHROPIC_AUTH_TOKEN,值为你的专属 Key。
  3. 重启终端后生效。
PowerShell
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_BASE_URL', 'https://tokenutopia.ai', 'User')
[System.Environment]::SetEnvironmentVariable('ANTHROPIC_AUTH_TOKEN', '替换为您的 API Key', 'User')

Gemini(MAC 环境)

安装 Gemini 客户端

Terminal
npm install -g @google/gemini-cli

设置配置文件

将收到的 Key 和 URL 写入 Gemini 配置目录。Base URL 使用 https://tokenutopia.ai

MAC 配置文件 ~/.gemini/.env

.env
GOOGLE_GEMINI_BASE_URL=https://tokenutopia.ai
GEMINI_API_KEY=给你的 key

MAC 配置文件 ~/.gemini/settings.json

settings.json
{
  "general": {
    "sessionRetention": {
      "enabled": true,
      "maxAge": "30d",
      "warningAcknowledged": true
    }
  },
  "security": {
    "auth": {
      "selectedType": "gemini-api-key"
    }
  }
}

测试连接

Terminal
gemini

banana2 的示例

生成“猫咪坐在月亮上的插画”,并将结果保存为本地图片文件。

banana2.ts
/**
 * 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 限制并转发请求

方式一:浏览器页面版(推荐)

  1. 启动代理服务器:npx tsx bananaproProxy.ts
  2. 打开浏览器访问 http://localhost:3210/bananaproTest.html
  3. 上传本地图片,编辑提示词,点击“开始重绘”
  4. 等待模型处理,通常需要 1 到 3 分钟
  5. 页面会实时显示接收进度,并展示原图与结果图

代理服务器说明

代理服务器的作用是解决浏览器跨域限制,并把长任务超时提高到 10 分钟。

请求流程
浏览器 → localhost:3210/proxy/v1beta/... → tokenutopia.ai/v1beta/...
bananaproProxy.ts
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 类型
PNGimage/png
JPEGimage/jpeg
WebPimage/webp
GIFimage/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_text.ts
/**
 * 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);
});