tryaii-mcp-server
Version:
TryAII MCP Server - 15+ AI models with comparison, cost tracking, and collective intelligence
111 lines • 3.76 kB
JavaScript
import { Schema } from 'mongoose';
// Reference to existing UserApiKey schema (from your main DB)
export const UserApiKeySchema = new Schema({
userId: { type: String, required: true, index: true },
keyId: { type: String, required: true, unique: true, index: true },
keyHash: { type: String, required: true, unique: true },
keyPrefix: { type: String, required: true },
name: { type: String, required: true, trim: true, maxlength: 100 },
permissions: {
type: [String],
required: true,
default: ['chat'],
validate: {
validator: function (permissions) {
const validPermissions = ['chat', 'compare', 'models', 'usage'];
return permissions.every(p => validPermissions.includes(p));
},
message: 'Invalid permission specified'
}
},
isActive: { type: Boolean, default: true, index: true },
lastUsed: Date,
usageStats: {
totalRequests: { type: Number, default: 0, min: 0 },
totalCost: {
type: Number,
default: 0,
min: 0,
get: (v) => parseFloat(v.toFixed(6))
},
lastResetDate: { type: Date, default: Date.now }
},
expiresAt: Date
}, {
timestamps: true,
versionKey: false
});
// Reference to existing User schema (from your main DB)
export const UserSchema = new Schema({
_id: { type: String, required: true },
email: { type: String, required: true, unique: true, trim: true, lowercase: true },
name: { type: String, required: true, trim: true },
image: String,
provider: { type: String, required: true },
providerId: { type: String, required: true },
lastLogin: { type: Date, default: Date.now },
isActive: { type: Boolean, default: true },
role: { type: String, enum: ['user', 'admin'], default: 'user' },
balance: {
currentAmount: {
type: Number,
get: (v) => parseFloat(v.toFixed(6)),
default: 0.25
},
currency: { type: String, default: 'USD' },
lastUpdated: { type: Date, default: Date.now }
},
apiKeyQuota: {
maxKeys: { type: Number, default: 3, min: 0, max: 10 },
currentCount: { type: Number, default: 0, min: 0 }
}
}, {
timestamps: true,
versionKey: false,
_id: false
});
// Reference to existing Transaction schema (from your main DB)
export const TransactionSchema = new Schema({
userId: { type: String, required: true, index: true },
amount: {
type: Number,
required: true,
get: (v) => parseFloat(v.toFixed(6))
},
balanceAfter: {
type: Number,
required: true,
get: (v) => parseFloat(v.toFixed(6))
},
description: { type: String, required: true },
type: {
type: String,
enum: ['initial', 'deposit', 'usage', 'refund', 'adjustment'],
required: true
},
paymentReference: String,
status: {
type: String,
enum: ['pending', 'completed', 'failed', 'refunded'],
default: 'completed'
},
metadata: {
ipAddress: { type: String, default: '' },
userAgent: { type: String, default: '' },
adminId: { type: String, default: '' }
},
// 🆕 Enhanced token and cost tracking
tokenUsage: {
totalTokens: { type: Number, default: 0 },
thinkingTokens: { type: Number, default: 0 },
reasoningModelsUsed: { type: Number, default: 0 }
},
costBreakdown: {
inputCost: { type: Number, default: 0 },
outputCost: { type: Number, default: 0 },
thinkingCost: { type: Number, default: 0 }
}
}, {
timestamps: true
});
//# sourceMappingURL=ExistingModels.js.map