Skip to main content

Rate Limits

abbr.stand formeaning
IPMImage Per Minute每分钟图像数
RPDRequests Per Day每天请求数
RPMRequests Per Minute每分钟请求数
TPDTokens Per Day每天令牌数
TPMTokens Per Minute每分钟令牌数
TTFTTokens To First Token第一个令牌的时间
TPOTTime Per Output Token每个输出的时间
E2ELEnd To End Latency端到端延迟
RPSRequests Per Second每秒请求数
TPSTokens Per Second每秒令牌数

令牌桶

class TokenBucket {
// 桶的容量,即桶中最多可以存放的令牌数
private readonly capacity: number;

// 令牌的补充速率 (每秒补充多少个令牌)
private readonly refillRatePerSecond: number;

// 当前桶中的令牌数量
private tokens: number;

// 上一次补充令牌的时间戳 (毫秒)
private lastRefillTimestamp: number;

constructor(capacity: number, refillRatePerSecond: number) {
this.capacity = capacity;
this.refillRatePerSecond = refillRatePerSecond;

// 初始时,桶是满的
this.tokens = capacity;
// 记录初始时间
this.lastRefillTimestamp = Date.now();
}

/**
* 尝试消耗指定数量的令牌。
* 这是外部调用的主要方法。
* @param count 需要消耗的令牌数量
* @returns 如果令牌足够则返回 true,否则返回 false
*/
public tryConsume(count: number): boolean {
// 1. 在消耗之前,先根据流逝的时间补充令牌
this.refill();

// 2. 检查当前令牌是否足够
if (this.tokens >= count) {
// 如果足够,则扣除相应数量的令牌
this.tokens -= count;
return true;
}

// 3. 如果令牌不足,则不允许消耗
return false;
}

/**
* 内部方法:补充令牌。
* 根据距离上次补充的时间,计算应增加多少新令牌。
*/
private refill(): void {
const now = Date.now();
const elapsedTime = now - this.lastRefillTimestamp;

if (elapsedTime > 0) {
// 计算在这段时间内应该补充多少令牌
// (速率 / 1000) 得到每毫秒的速率
const tokensToAdd = elapsedTime * (this.refillRatePerSecond / 1000);

// 增加令牌,但确保总数不超过桶的容量
this.tokens = Math.min(this.capacity, this.tokens + tokensToAdd);

this.lastRefillTimestamp = now;
}
}
}