docs: enterprise refactor plan with ralph specs
This commit is contained in:
71
dist/server/enrichment/AIEnrichmentService.js
vendored
Normal file
71
dist/server/enrichment/AIEnrichmentService.js
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
"use strict";
|
||||
/**
|
||||
* AIEnrichmentService — selects AI provider and runs enrichment asynchronously.
|
||||
* Triggered manually (POST /api/anomalies/:id/enrich) or automatically for high/critical.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.AIEnrichmentService = void 0;
|
||||
const ClaudeProvider_1 = require("./ClaudeProvider");
|
||||
const OpenAIProvider_1 = require("./OpenAIProvider");
|
||||
const OllamaProvider_1 = require("./OllamaProvider");
|
||||
const logger_1 = require("../logger");
|
||||
class AIEnrichmentService {
|
||||
constructor(emitter) {
|
||||
this.emitter = emitter;
|
||||
this.autoEnrich = process.env['ABE_AI_AUTO_ENRICH'] === 'true';
|
||||
const minSev = process.env['ABE_AI_MIN_SEVERITY'] ?? 'high';
|
||||
this.minSeverityRank = AIEnrichmentService.SEVERITY_RANK[minSev] ?? 2;
|
||||
this.provider = this.createProvider();
|
||||
}
|
||||
createProvider() {
|
||||
const providerName = process.env['ABE_AI_PROVIDER'] ?? 'none';
|
||||
const model = process.env['ABE_AI_MODEL'];
|
||||
if (providerName === 'claude') {
|
||||
const key = process.env['ABE_AI_API_KEY'];
|
||||
if (!key)
|
||||
return null;
|
||||
return new ClaudeProvider_1.ClaudeProvider(key, model);
|
||||
}
|
||||
if (providerName === 'openai') {
|
||||
const key = process.env['ABE_OPENAI_API_KEY'];
|
||||
if (!key)
|
||||
return null;
|
||||
return new OpenAIProvider_1.OpenAIProvider(key, model);
|
||||
}
|
||||
if (providerName === 'ollama') {
|
||||
const url = process.env['ABE_OLLAMA_URL'] ?? 'http://localhost:11434';
|
||||
return new OllamaProvider_1.OllamaProvider(url, model);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/** Check if auto-enrichment should run for this anomaly. */
|
||||
shouldAutoEnrich(anomaly) {
|
||||
if (!this.autoEnrich || !this.provider)
|
||||
return false;
|
||||
const rank = AIEnrichmentService.SEVERITY_RANK[anomaly.severity] ?? 0;
|
||||
return rank >= this.minSeverityRank;
|
||||
}
|
||||
/** Enrich an anomaly asynchronously and emit WebSocket event when done. */
|
||||
async enrich(anomaly, context) {
|
||||
if (!this.provider) {
|
||||
logger_1.log.warn({ anomalyId: anomaly.id }, 'No AI provider configured');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const enrichment = await this.provider.enrich(anomaly, context);
|
||||
anomaly.aiEnrichment = enrichment;
|
||||
this.emitter('anomaly:enriched', { anomalyId: anomaly.id, enrichment });
|
||||
logger_1.log.info({ anomalyId: anomaly.id, provider: this.provider.name }, 'Anomaly enriched');
|
||||
}
|
||||
catch (err) {
|
||||
logger_1.log.error({ anomalyId: anomaly.id, err: err instanceof Error ? err.message : String(err) }, 'AI enrichment failed');
|
||||
}
|
||||
}
|
||||
hasProvider() {
|
||||
return this.provider !== null;
|
||||
}
|
||||
}
|
||||
exports.AIEnrichmentService = AIEnrichmentService;
|
||||
AIEnrichmentService.SEVERITY_RANK = {
|
||||
low: 0, medium: 1, high: 2, critical: 3,
|
||||
};
|
||||
Reference in New Issue
Block a user