Compare commits
No commits in common. "dc91830fae71f00713a6106aa326c8bba40c1a44" and "94992743e86dd8f4eabe22e77dca532f989d2dd6" have entirely different histories.
dc91830fae
...
94992743e8
1 changed files with 31 additions and 15 deletions
|
@ -12,19 +12,16 @@ import { Usage } from "@prisma/client";
|
||||||
export default class tokenCount implements IQuota {
|
export default class tokenCount implements IQuota {
|
||||||
defaultQuota: number;
|
defaultQuota: number;
|
||||||
lookback: number;
|
lookback: number;
|
||||||
requestTokenMultiplier: number;
|
considerInputTokensAsHalf: boolean;
|
||||||
responseTokenMultiplier: number;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
defaultQuota: number = 512 * 25,
|
defaultQuota: number = 512 * 25,
|
||||||
lookback: number = 1000 * 60 * 60 * 24,
|
lookback: number = 1000 * 60 * 60 * 24,
|
||||||
requestTokenMultiplier: number = 1,
|
considerInputTokensAsHalf: boolean = true,
|
||||||
responseTokenMultiplier: number = 1,
|
|
||||||
) {
|
) {
|
||||||
this.defaultQuota = defaultQuota;
|
this.defaultQuota = defaultQuota;
|
||||||
this.lookback = lookback;
|
this.lookback = lookback;
|
||||||
this.requestTokenMultiplier = requestTokenMultiplier;
|
this.considerInputTokensAsHalf = considerInputTokensAsHalf;
|
||||||
this.responseTokenMultiplier = responseTokenMultiplier;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private getUserQuota(id: string) {
|
private getUserQuota(id: string) {
|
||||||
|
@ -58,7 +55,9 @@ export default class tokenCount implements IQuota {
|
||||||
const usageResponse = usedTokens.usageResponse === null ? 0 : usedTokens.usageResponse;
|
const usageResponse = usedTokens.usageResponse === null ? 0 : usedTokens.usageResponse;
|
||||||
|
|
||||||
const usedUnits = (() => {
|
const usedUnits = (() => {
|
||||||
return usageRequest * this.requestTokenMultiplier + usageResponse * this.responseTokenMultiplier;
|
if (this.considerInputTokensAsHalf)
|
||||||
|
return usageResponse + usageRequest / 2;
|
||||||
|
return usageResponse + usageRequest;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
if (userQuota?.vip) return this.createUserQuotaData(Infinity, usedUnits);
|
if (userQuota?.vip) return this.createUserQuotaData(Infinity, usedUnits);
|
||||||
|
@ -75,13 +74,30 @@ export default class tokenCount implements IQuota {
|
||||||
* @returns promise of giving out the record
|
* @returns promise of giving out the record
|
||||||
*/
|
*/
|
||||||
findNthUsage(user: string, requestTimestamp: number, unitCount: number) {
|
findNthUsage(user: string, requestTimestamp: number, unitCount: number) {
|
||||||
return database.$queryRaw<Array<Usage & {usage: number | bigint}>>`
|
if (this.considerInputTokensAsHalf)
|
||||||
|
return database.$queryRaw<Array<Usage & {usage: number}>>`
|
||||||
|
SELECT t1.*, (
|
||||||
|
SELECT
|
||||||
|
SUM(usageResponse + usageRequest/2) AS usage
|
||||||
|
FROM \`usage\`
|
||||||
|
WHERE
|
||||||
|
user = ${user} AND
|
||||||
|
timestamp >= ${requestTimestamp - this.lookback} AND
|
||||||
|
timestamp <= t1.timestamp
|
||||||
|
) as usage
|
||||||
|
FROM
|
||||||
|
\`usage\` AS t1
|
||||||
|
WHERE
|
||||||
|
user = ${user} AND
|
||||||
|
timestamp >= ${requestTimestamp - this.lookback} AND
|
||||||
|
usage >= ${unitCount}
|
||||||
|
ORDER BY timestamp ASC
|
||||||
|
LIMIT 1
|
||||||
|
`;
|
||||||
|
return database.$queryRaw<Array<Usage & {usage: bigint}>>`
|
||||||
SELECT t1.*, (
|
SELECT t1.*, (
|
||||||
SELECT
|
SELECT
|
||||||
SUM(
|
SUM(usageResponse + usageRequest) AS usage
|
||||||
usageRequest * ${this.requestTokenMultiplier} +
|
|
||||||
usageResponse * ${this.responseTokenMultiplier}
|
|
||||||
) AS usage
|
|
||||||
FROM \`usage\`
|
FROM \`usage\`
|
||||||
WHERE
|
WHERE
|
||||||
user = ${user} AND
|
user = ${user} AND
|
||||||
|
@ -105,14 +121,14 @@ export default class tokenCount implements IQuota {
|
||||||
): Promise<userQuotaRecoveryData> {
|
): Promise<userQuotaRecoveryData> {
|
||||||
const userId = typeof user ==="string" ? user : user.id;
|
const userId = typeof user ==="string" ? user : user.id;
|
||||||
|
|
||||||
const [userQuota, overUnitCountRecord] = await Promise.all([
|
const [userQuota, renameMebecause] = await Promise.all([
|
||||||
this.checkUser(userId, request),
|
this.checkUser(userId, request),
|
||||||
this.findNthUsage(userId, request.createdTimestamp, unitCount)
|
this.findNthUsage(userId, request.createdTimestamp, unitCount)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...userQuota,
|
...userQuota,
|
||||||
recoveryTimestamp: (overUnitCountRecord.at(0)?.timestamp.valueOf() ?? Infinity) + this.lookback,
|
recoveryTimestamp: (renameMebecause.at(0)?.timestamp.valueOf() ?? Infinity) + this.lookback,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue