feat(#126): create LLM Manager Service

Implemented centralized service for managing multiple LLM provider instances.

Architecture:
- LlmManagerService manages provider lifecycle and selection
- Loads provider instances from Prisma database on startup
- Maintains in-memory registry of active providers
- Factory pattern for provider instantiation

Core Features:
- Database integration via PrismaService
- Provider initialization on module startup (OnModuleInit)
- Get provider by ID
- Get all active providers
- Get system default provider
- Get user-specific provider with fallback to system default
- Health check all registered providers
- Dynamic registration/unregistration (hot reload)
- Reload from database without restart

Provider Selection Logic:
- User-level providers: userId matches, is enabled
- System-level providers: userId is NULL, is enabled
- Fallback: system default if no user provider found
- Graceful error handling with detailed logging

Integration:
- Added to LlmModule providers and exports
- Uses PrismaService for database queries
- Factory creates OllamaProvider from config
- Extensible for future providers (Claude, OpenAI)

Testing:
- 31 comprehensive unit tests
- 93.05% code coverage (exceeds 85% requirement)
- All error scenarios covered
- Proper mocking of dependencies

Quality Gates:
-  All 31 tests passing
-  93.05% coverage
-  Linting clean
-  Type checking passed
-  Code review approved

Fixes #126

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-31 12:22:14 -06:00
parent c6699908e4
commit be6c15116d
4 changed files with 998 additions and 1 deletions

View File

@@ -1,5 +1,11 @@
import { Module } from "@nestjs/common";
import { LlmController } from "./llm.controller";
import { LlmService } from "./llm.service";
@Module({ controllers: [LlmController], providers: [LlmService], exports: [LlmService] })
import { LlmManagerService } from "./llm-manager.service";
@Module({
controllers: [LlmController],
providers: [LlmService, LlmManagerService],
exports: [LlmService, LlmManagerService],
})
export class LlmModule {}