manifest
Version:
Self-hosted Manifest LLM router with embedded server, SQLite database, and dashboard
179 lines • 8 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TierService = void 0;
const common_1 = require("@nestjs/common");
const typeorm_1 = require("@nestjs/typeorm");
const typeorm_2 = require("typeorm");
const user_provider_entity_1 = require("../../entities/user-provider.entity");
const tier_assignment_entity_1 = require("../../entities/tier-assignment.entity");
const tier_auto_assign_service_1 = require("./tier-auto-assign.service");
const routing_cache_service_1 = require("./routing-cache.service");
const provider_service_1 = require("./provider.service");
const crypto_1 = require("crypto");
const types_1 = require("../../scoring/types");
const subscription_support_1 = require("../../common/utils/subscription-support");
let TierService = class TierService {
providerRepo;
tierRepo;
autoAssign;
routingCache;
providerService;
constructor(providerRepo, tierRepo, autoAssign, routingCache, providerService) {
this.providerRepo = providerRepo;
this.tierRepo = tierRepo;
this.autoAssign = autoAssign;
this.routingCache = routingCache;
this.providerService = providerService;
}
async getTiers(agentId, userId) {
const cached = this.routingCache.getTiers(agentId);
if (cached)
return cached;
await this.providerService.getProviders(agentId);
const rows = await this.tierRepo.find({ where: { agent_id: agentId } });
if (rows.length === 0) {
const created = types_1.TIERS.map((tier) => Object.assign(new tier_assignment_entity_1.TierAssignment(), {
id: (0, crypto_1.randomUUID)(),
user_id: userId ?? '',
agent_id: agentId,
tier,
override_model: null,
override_provider: null,
override_auth_type: null,
auto_assigned_model: null,
}));
try {
await this.tierRepo.insert(created);
}
catch {
const existing = await this.tierRepo.find({ where: { agent_id: agentId } });
if (existing.length > 0) {
this.routingCache.setTiers(agentId, existing);
return existing;
}
}
const providers = await this.providerRepo.find({
where: { agent_id: agentId, is_active: true },
});
const usableProviders = providers.filter(subscription_support_1.isManifestUsableProvider);
if (usableProviders.length > 0) {
await this.autoAssign.recalculate(agentId);
const result = await this.tierRepo.find({ where: { agent_id: agentId } });
this.routingCache.setTiers(agentId, result);
return result;
}
this.routingCache.setTiers(agentId, created);
return created;
}
this.routingCache.setTiers(agentId, rows);
return rows;
}
async setOverride(agentId, userId, tier, model, provider, authType) {
const existing = await this.tierRepo.findOne({
where: { agent_id: agentId, tier },
});
if (existing) {
existing.override_model = model;
existing.override_provider = provider ?? null;
existing.override_auth_type = authType ?? null;
if (existing.fallback_models?.includes(model)) {
const filtered = existing.fallback_models.filter((m) => m !== model);
existing.fallback_models = filtered.length > 0 ? filtered : null;
}
existing.updated_at = new Date().toISOString();
await this.tierRepo.save(existing);
this.routingCache.invalidateAgent(agentId);
return existing;
}
const record = Object.assign(new tier_assignment_entity_1.TierAssignment(), {
id: (0, crypto_1.randomUUID)(),
user_id: userId,
agent_id: agentId,
tier,
override_model: model,
override_provider: provider ?? null,
override_auth_type: authType ?? null,
auto_assigned_model: null,
});
try {
await this.tierRepo.insert(record);
}
catch {
const retry = await this.tierRepo.findOne({ where: { agent_id: agentId, tier } });
if (retry)
return this.setOverride(agentId, userId, tier, model, provider, authType);
}
this.routingCache.invalidateAgent(agentId);
return record;
}
async clearOverride(agentId, tier) {
const existing = await this.tierRepo.findOne({
where: { agent_id: agentId, tier },
});
if (!existing)
return;
existing.override_model = null;
existing.override_provider = null;
existing.override_auth_type = null;
existing.updated_at = new Date().toISOString();
await this.tierRepo.save(existing);
this.routingCache.invalidateAgent(agentId);
}
async resetAllOverrides(agentId) {
await this.tierRepo.update({ agent_id: agentId }, {
override_model: null,
override_provider: null,
override_auth_type: null,
fallback_models: null,
updated_at: new Date().toISOString(),
});
this.routingCache.invalidateAgent(agentId);
}
async getFallbacks(agentId, tier) {
const existing = await this.tierRepo.findOne({ where: { agent_id: agentId, tier } });
return existing?.fallback_models ?? [];
}
async setFallbacks(agentId, tier, models) {
const existing = await this.tierRepo.findOne({ where: { agent_id: agentId, tier } });
if (!existing)
return [];
existing.fallback_models = models.length > 0 ? models : null;
existing.updated_at = new Date().toISOString();
await this.tierRepo.save(existing);
this.routingCache.invalidateAgent(agentId);
return models;
}
async clearFallbacks(agentId, tier) {
const existing = await this.tierRepo.findOne({ where: { agent_id: agentId, tier } });
if (!existing)
return;
existing.fallback_models = null;
existing.updated_at = new Date().toISOString();
await this.tierRepo.save(existing);
this.routingCache.invalidateAgent(agentId);
}
};
exports.TierService = TierService;
exports.TierService = TierService = __decorate([
(0, common_1.Injectable)(),
__param(0, (0, typeorm_1.InjectRepository)(user_provider_entity_1.UserProvider)),
__param(1, (0, typeorm_1.InjectRepository)(tier_assignment_entity_1.TierAssignment)),
__metadata("design:paramtypes", [typeorm_2.Repository,
typeorm_2.Repository,
tier_auto_assign_service_1.TierAutoAssignService,
routing_cache_service_1.RoutingCacheService,
provider_service_1.ProviderService])
], TierService);
//# sourceMappingURL=tier.service.js.map