82 lines
2.7 KiB
JavaScript
82 lines
2.7 KiB
JavaScript
"use strict";
|
|
/**
|
|
* OpenAIProvider — AI enrichment using OpenAI API.
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.OpenAIProvider = void 0;
|
|
const DEFAULT_MODEL = 'gpt-4o-mini';
|
|
function buildPrompt(anomaly, context) {
|
|
return `You are a senior software engineer analyzing a bug report.
|
|
|
|
Bug:
|
|
- Type: ${anomaly.type}
|
|
- Severity: ${anomaly.severity}
|
|
- Description: ${anomaly.description}
|
|
- URL: ${context.url}
|
|
- Actions: ${JSON.stringify(anomaly.actionTrace.slice(-5))}
|
|
${context.httpLog.length > 0 ? `- HTTP: ${JSON.stringify(context.httpLog.slice(-3))}` : ''}
|
|
${context.consoleErrors.length > 0 ? `- Errors: ${context.consoleErrors.slice(-3).join('; ')}` : ''}
|
|
|
|
Respond ONLY with JSON:
|
|
{"rootCause":"...","userImpact":"...","suggestedFix":"...","confidence":"low|medium|high"}`;
|
|
}
|
|
function parseResponse(text, model) {
|
|
try {
|
|
const match = text.match(/\{[\s\S]*\}/);
|
|
if (match) {
|
|
const p = JSON.parse(match[0]);
|
|
return {
|
|
rootCause: p['rootCause'] ?? 'Unknown',
|
|
userImpact: p['userImpact'] ?? 'Unknown',
|
|
suggestedFix: p['suggestedFix'] ?? 'None',
|
|
debugPrompt: text,
|
|
confidence: p['confidence'] ?? 'medium',
|
|
generatedAt: Date.now(),
|
|
provider: 'openai',
|
|
model,
|
|
};
|
|
}
|
|
}
|
|
catch { /* fallback */ }
|
|
return {
|
|
rootCause: text.slice(0, 200),
|
|
userImpact: 'See response',
|
|
suggestedFix: 'See response',
|
|
debugPrompt: text,
|
|
confidence: 'low',
|
|
generatedAt: Date.now(),
|
|
provider: 'openai',
|
|
model,
|
|
};
|
|
}
|
|
class OpenAIProvider {
|
|
constructor(apiKey, model = DEFAULT_MODEL) {
|
|
this.name = 'openai';
|
|
this.apiKey = apiKey;
|
|
this.model = model;
|
|
}
|
|
async enrich(anomaly, context) {
|
|
const prompt = buildPrompt(anomaly, context);
|
|
const res = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': `Bearer ${this.apiKey}`,
|
|
},
|
|
body: JSON.stringify({
|
|
model: this.model,
|
|
messages: [{ role: 'user', content: prompt }],
|
|
max_tokens: 512,
|
|
response_format: { type: 'json_object' },
|
|
}),
|
|
});
|
|
if (!res.ok) {
|
|
throw new Error(`OpenAI API error: ${res.status} ${await res.text()}`);
|
|
}
|
|
const data = await res.json();
|
|
const text = data.choices[0]?.message?.content ?? '';
|
|
return parseResponse(text, this.model);
|
|
}
|
|
}
|
|
exports.OpenAIProvider = OpenAIProvider;
|