UNPKG

manifest

Version:

Self-hosted Manifest LLM router with embedded server, SQLite database, and dashboard

179 lines 8 kB
"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