api2key-base-sdk
v0.1.10
Published
TypeScript SDK for consuming the Api2Key API stable APIs
Maintainers
Readme
api2key-base-sdk
api2key-base-sdk 是当前唯一保留的 SDK 入口,统一承载基础平台能力、项目运行时能力和后台管理客户端。
适合放进所有新项目作为默认基础依赖。
当前边界
当前统一暴露:
authcreditsapiKeyssettingsprojectsorderspaymentaispeechadmin
安装原则:
- 所有新项目默认只安装
api2key-base-sdk - 后台项目也只安装
api2key-base-sdk - 单项目私有逻辑优先留在本地 facade,而不是再拆新的 SDK 包
暴露的客户端
当前 api2key-base-sdk 暴露以下客户端:
authcreditsapiKeyssettingsprojectsorderspaymentaispeechadmin
1. auth
负责稳定的用户认证能力。
当前主要方法:
login(input)register(input)verifyEmail(input)resendVerification(input)forgotPassword(input)resetPassword(input)sendChangePasswordCode(accessToken?)changePassword(input, accessToken?)me(accessToken?)logout(accessToken?)
2. credits
负责稳定的积分账户读取与扣减能力。
推荐拆成两类理解:
- 用户态读取与扣减:默认跟随当前登录 token 或 API Key 的项目上下文
- 服务态写入:仍保留显式
projectId + X-Service-Secret的内部接口
当前主要方法包括:
getBalance(accessToken?)getLedger(input)deduct(input)spend(input)reserve(input)confirm(id)cancel(id)
3. apiKeys
负责用户 API Key 生命周期管理。
当前推荐约定:
- 用户登录后创建 API Key 时,不再要求前端额外显式传项目
- 默认使用当前 JWT 中的
projectId - 如仍传
projectId,它只能作为一致性校验,不能覆盖当前 token 项目
4. settings
负责用户级设置的读取与更新。
5. projects / orders / payment / ai / speech
负责项目商品、会员、订单、支付、AI 以及语音运行时能力。
其中 speech 对齐当前 api2key-base-api 的内置语音接口:
listVoices(...)synthesize(...)transcribe(...)transcribeSrt(...)getAsrTask(...)downloadAudio(...)
6. admin
负责项目管理、产品管理、用户管理、会员管理、模型管理、后台积分操作等控制面能力。
适合哪些项目
适合:
- 所有新项目
- 只需要登录、积分、用户设置、API Key 的项目
- 需要一个长期稳定基础依赖的项目
安装
npm install api2key-base-sdk使用示例
import { createBasePlatformClient } from 'api2key-base-sdk';
import {
createAdminPlatformClient,
createProjectPlatformClient,
} from 'api2key-base-sdk';
const baseClient = createBasePlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getAccessToken: () => process.env.ACCESS_TOKEN,
getServiceSecret: () => process.env.SERVICE_SECRET,
});
const me = await baseClient.auth.me();
const credits = await baseClient.credits.getBalance();
const apiKey = await baseClient.apiKeys.create({
name: 'workflow',
});
await baseClient.auth.verifyEmail({
email: '[email protected]',
code: '123456',
});
const projectClient = createProjectPlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getAccessToken: () => process.env.ACCESS_TOKEN,
getApiKey: () => process.env.API_KEY,
getProjectId: () => process.env.PROJECT_ID,
});
const adminClient = createAdminPlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getAccessToken: () => process.env.ADMIN_ACCESS_TOKEN,
});
const products = await projectClient.projects.getCatalogProducts(process.env.PROJECT_ID!);
const aiModels = await projectClient.ai.getModels({ projectId: process.env.PROJECT_ID! });
const aiBalance = await projectClient.ai.getBalance({ projectId: process.env.PROJECT_ID! });
for (const model of aiModels.models) {
console.log(model.key, model.inputPricing, model.outputPricing);
}
const directPayment = await projectClient.payment.createDirectUnified({
subject: 'Workflow credits top-up',
amount: 29.9,
});
const voices = await projectClient.speech.listVoices({
provider: 'azure',
locale: 'zh-CN',
});
const projects = await adminClient.admin.listProjects();推荐调用方式
用户态:
- 登录 / 注册阶段可以显式指定项目,也可以省略,让后端回落当前项目、绑定项目或默认项目
- 登录完成后,
auth.me()、credits.getBalance()、apiKeys.create()默认依赖当前 token 项目 - 前端不要在每个用户态接口上重复显式传
projectId auth.me()、credits.getBalance()不再接受显式projectId覆盖credits.deduct()支持accessToken或apiKey,不依赖service secret
服务态:
credits.spend()、credits.reserve()继续显式传projectId- 这类接口本质上是内部服务接口,走
X-Service-Secret
说明:
- SDK 仍然接收单一
baseUrl /api/v1/*接口继续基于baseUrl访问speech客户端会自动基于同一域名访问根路径下的/api/*语音接口,无需额外配置第二个 URL- 用户侧
auth.me、credits.getBalance()、apiKeys.create()默认优先使用当前登录 token 中的projectId,无需再显式传项目 - 内部服务侧积分扣减 / 预扣仍需显式传
projectId,因为它们走的是X-Service-Secret,不是用户 JWT payment.createDirectUnified()对齐后端直付充值接口,不依赖商品或订单,只需要subject + amount,projectId仅在你要锁定充值目标项目时才需要显式传入- AI 模型价格语义以
inputPricing/outputPricing为准;creditCostPerRequest仅保留为兼容旧服务端的可选字段
最小用户态示例
const authClient = createBasePlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getProjectId: () => process.env.PROJECT_ID,
});
const session = await authClient.auth.login({
email: '[email protected]',
password: 'password',
projectId: process.env.PROJECT_ID!,
});
const userClient = createBasePlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getAccessToken: () => session.accessToken,
});
const meAfterLogin = await userClient.auth.me();
const balanceAfterLogin = await userClient.credits.getBalance();
const newApiKey = await userClient.apiKeys.create({ name: 'default' });上面这组调用的重点是:
- 只在需要锁定项目时才在登录阶段显式指定项目
- 登录后用户态接口自动跟随 token 项目
- 不再把默认项目重复塞到每次请求里
/auth/me和/credits/balance已彻底收口,不再允许用户态通过 query 或 SDK 参数切项目
直接充值积分
直充积分走 payment.createDirectUnified(),不依赖产品,不需要先创建商品订单。
最小调用只需要:
- 登录态
accessToken subjectamount
const paymentClient = createProjectPlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getAccessToken: () => process.env.ACCESS_TOKEN,
});
const directPayment = await paymentClient.payment.createDirectUnified({
subject: 'Account credits top-up',
amount: 9.9,
});
console.log(directPayment.id);
console.log(directPayment.orderNo);
console.log(directPayment.data?.qrCode);如果你明确要把充值锁定到某个项目,再额外传 projectId:
await paymentClient.payment.createDirectUnified({
subject: 'Project credits top-up',
amount: 29.9,
projectId: process.env.PROJECT_ID,
});最小服务态示例
const serviceClient = createBasePlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getServiceSecret: () => process.env.SERVICE_SECRET,
});
await serviceClient.credits.spend({
userId: 'user-id',
projectId: process.env.PROJECT_ID!,
amount: 10,
service: 'ai_chat',
taskId: 'task-001',
});Speech 示例
推荐在项目级客户端上使用:
import { createProjectPlatformClient } from 'api2key-base-sdk';
const client = createProjectPlatformClient({
baseUrl: process.env.API2KEY_BASE_URL!,
getAccessToken: () => process.env.ACCESS_TOKEN,
getApiKey: () => process.env.API_KEY,
getProjectId: () => process.env.PROJECT_ID,
});1. 获取声音列表
const voices = await client.speech.listVoices({
provider: 'azure',
locale: 'zh-CN',
});
console.log(voices.provider);
console.log(voices.total);
console.log(voices.voices[0]?.shortName);2. 文本转音频
const synthesized = await client.speech.synthesize({
provider: 'azure',
text: '你好,欢迎使用 api2key speech client。',
locale: 'zh-CN',
voice: 'zh-CN-XiaoxiaoNeural',
format: 'audio-24khz-96kbitrate-mono-mp3',
rate: 1,
volume: 100,
pitch: 0,
});
console.log(synthesized.contentType);
console.log(synthesized.creditsCharged);
console.log(synthesized.storageKey);
console.log(synthesized.downloadUrl);
console.log(synthesized.audio.byteLength);如果你要把返回音频写入文件,在 Node.js 中可以这样处理:
import { writeFile } from 'node:fs/promises';
await writeFile('speech.mp3', Buffer.from(synthesized.audio));3. 简洁音频转文本
import { readFile } from 'node:fs/promises';
const audioBytes = await readFile('./sample.mp3');
const audioBlob = new Blob([audioBytes], { type: 'audio/mpeg' });
const transcript = await client.speech.transcribe({
provider: 'groq',
file: audioBlob,
fileName: 'sample.mp3',
});
console.log(transcript.language);
console.log(transcript.full_text);
console.log(transcript.segments.length);也可以直接传远程地址:
const transcript = await client.speech.transcribe({
provider: 'groq',
audioUrl: 'https://example.com/sample.mp3',
});4. 音频转 SRT
同步模式:
const srtResult = await client.speech.transcribeSrt({
provider: 'tencent',
file: audioBlob,
fileName: 'sample.mp3',
async: false,
});
if ('srt' in srtResult) {
console.log(srtResult.text);
console.log(srtResult.srt);
}异步模式:
const submitted = await client.speech.transcribeSrt({
provider: 'tencent',
file: audioBlob,
fileName: 'sample.mp3',
async: true,
});
if ('taskId' in submitted && !('srt' in submitted)) {
console.log(submitted.taskId);
console.log(submitted.statusStr);
}5. 查询异步字幕任务
const task = await client.speech.getAsrTask({
provider: 'tencent',
taskId: 123456,
});
console.log(task.status);
console.log(task.statusStr);
console.log(task.retryAfterSeconds);
console.log(task.srt);6. 通过存储 key 下载合成音频
const downloaded = await client.speech.downloadAudio({
key: synthesized.storageKey!,
});
console.log(downloaded.contentType);
console.log(downloaded.fileName);
console.log(downloaded.audio.byteLength);7. 鉴权建议
推荐方式:
- 服务端项目调用时,通过
getApiKey()提供sk-... - 用户登录态场景,通过
getAccessToken()提供 JWT - 大多数项目建议同时提供
getProjectId(),保持语音接口和项目上下文一致
8. 路径说明
你只需要传一个 baseUrl,例如:
baseUrl: 'https://open.api2key.com/api/v1'SDK 会自动处理:
- 普通平台接口继续访问
/api/v1/* - speech client 自动访问同域名下的
/api/*
设计原则
- 新项目默认只依赖这个包
- 共享客户端统一收敛在一个包里
api2key-base-api可以继续保持清晰的路由分层,而不需要在消费侧安装多个 SDK
Agent 约定
后续 agent 在处理需求时,默认把这个包视为“稳定基础层”。
规则:
- 如果需求属于共享客户端能力,优先在这里找
- 后端路由边界仍按 base/project/admin 区分,不要因为 SDK 合并而改乱 API 归属
- 如果新需求只服务单个项目,优先留在项目本地 facade
兼容说明
当前仍保留 createPlatformAClient 作为过渡别名,它返回基础能力客户端。
建议新代码统一使用:
createBasePlatformClientcreateProjectPlatformClientcreateAdminPlatformClient
