feat: log enhancement work

This commit is contained in:
Oleg Proskurin 2025-10-08 22:19:06 +07:00
parent 7c31644824
commit a97029a2b4
4 changed files with 184 additions and 0 deletions

View File

@ -50,12 +50,21 @@ export const autoEnhancePrompt = async (
promptEnhancementService = new PromptEnhancementService(apiKey); promptEnhancementService = new PromptEnhancementService(apiKey);
} }
// Extract orgId and projectId from validated API key
const orgId = req.apiKey?.organizationSlug || "unknown";
const projectId = req.apiKey?.projectSlug || "unknown";
const result = await promptEnhancementService.enhancePrompt( const result = await promptEnhancementService.enhancePrompt(
prompt, prompt,
{ {
...enhancementOptions, ...enhancementOptions,
...(req.body.meta?.tags && { tags: req.body.meta.tags }), ...(req.body.meta?.tags && { tags: req.body.meta.tags }),
}, },
{
orgId,
projectId,
...(req.body.meta && { meta: req.body.meta }),
},
); );
if (result.success && result.enhancedPrompt) { if (result.success && result.enhancedPrompt) {

View File

@ -133,9 +133,17 @@ enhanceRouter.post(
console.log(`[${timestamp}] [${requestId}] Starting prompt enhancement`); console.log(`[${timestamp}] [${requestId}] Starting prompt enhancement`);
try { try {
// Extract orgId and projectId from validated API key
const orgId = req.apiKey?.organizationSlug || "unknown";
const projectId = req.apiKey?.projectSlug || "unknown";
const result = await promptEnhancementService.enhancePrompt( const result = await promptEnhancementService.enhancePrompt(
prompt, prompt,
options || {}, options || {},
{
orgId,
projectId,
},
); );
console.log(`[${timestamp}] [${requestId}] Enhancement completed:`, { console.log(`[${timestamp}] [${requestId}] Enhancement completed:`, {

View File

@ -0,0 +1,136 @@
import { writeFileSync, readFileSync, existsSync, mkdirSync } from "fs";
import { dirname } from "path";
export interface EnhancementLogEntry {
timestamp: string;
orgId: string;
projectId: string;
originalPrompt: string;
enhancedPrompt: string;
meta?: {
tags?: string[];
};
template: string;
detectedLanguage?: string;
enhancements: string[];
model: string;
}
export class EnhancementLogger {
private static instance: EnhancementLogger | null = null;
private logFilePath: string | null = null;
private isEnabled: boolean = false;
private constructor() {
const enhLogPath = process.env["ENH_LOG"];
if (enhLogPath) {
this.logFilePath = enhLogPath;
this.isEnabled = true;
this.initializeLogFile();
}
}
static getInstance(): EnhancementLogger {
if (!EnhancementLogger.instance) {
EnhancementLogger.instance = new EnhancementLogger();
}
return EnhancementLogger.instance;
}
private initializeLogFile(): void {
if (!this.logFilePath) return;
try {
// Ensure directory exists
const dir = dirname(this.logFilePath);
if (!existsSync(dir)) {
mkdirSync(dir, { recursive: true });
}
// Reset/clear the log file on service start
writeFileSync(this.logFilePath, "# Prompt Enhancement Log\n\n", {
encoding: "utf-8",
});
console.log(
`[EnhancementLogger] Log file initialized: ${this.logFilePath}`,
);
} catch (error) {
console.error(
`[EnhancementLogger] Failed to initialize log file:`,
error,
);
this.isEnabled = false;
}
}
log(entry: EnhancementLogEntry): void {
if (!this.isEnabled || !this.logFilePath) {
return;
}
try {
const newLogEntry = this.formatLogEntry(entry);
// Read existing content
const existingContent = existsSync(this.logFilePath)
? readFileSync(this.logFilePath, "utf-8")
: "# Prompt Enhancement Log\n\n";
// Insert new entry AFTER header but BEFORE old entries
const headerEnd = existingContent.indexOf("\n\n") + 2;
const header = existingContent.slice(0, headerEnd);
const oldEntries = existingContent.slice(headerEnd);
writeFileSync(
this.logFilePath,
header + newLogEntry + oldEntries,
"utf-8",
);
} catch (error) {
console.error(`[EnhancementLogger] Failed to write log entry:`, error);
}
}
private formatLogEntry(entry: EnhancementLogEntry): string {
const {
timestamp,
orgId,
projectId,
originalPrompt,
enhancedPrompt,
meta,
template,
detectedLanguage,
enhancements,
model,
} = entry;
// Format date from ISO timestamp
const date = new Date(timestamp);
const formattedDate = date.toISOString().replace("T", " ").slice(0, 19);
let logText = `## ${formattedDate}\n`;
logText += `${orgId}/${projectId}\n\n`;
logText += `**Original Prompt:** ${originalPrompt}\n\n`;
logText += `**Enhanced Prompt:** ${enhancedPrompt}\n\n`;
// Add tags if present
if (meta?.tags && meta.tags.length > 0) {
logText += `**Tags:** ${meta.tags.join(", ")}\n\n`;
}
logText += `**Template:** ${template}\n`;
if (detectedLanguage) {
logText += `**Language:** ${detectedLanguage}\n`;
}
if (enhancements.length > 0) {
logText += `**Enhancements:** ${enhancements.join(", ")}\n`;
}
logText += `**Model:** ${model}\n\n`;
logText += `---\n\n`;
return logText;
}
}

View File

@ -1,4 +1,5 @@
import { GoogleGenAI } from "@google/genai"; import { GoogleGenAI } from "@google/genai";
import { EnhancementLogger, EnhancementLogEntry } from "./EnhancementLogger";
export interface PromptEnhancementOptions { export interface PromptEnhancementOptions {
template?: template?:
@ -12,6 +13,14 @@ export interface PromptEnhancementOptions {
tags?: string[]; // Optional tags - accepted but not used yet tags?: string[]; // Optional tags - accepted but not used yet
} }
export interface PromptEnhancementContext {
orgId: string;
projectId: string;
meta?: {
tags?: string[];
};
}
export interface PromptEnhancementResult { export interface PromptEnhancementResult {
success: boolean; success: boolean;
originalPrompt: string; originalPrompt: string;
@ -40,6 +49,7 @@ export class PromptEnhancementService {
async enhancePrompt( async enhancePrompt(
rawPrompt: string, rawPrompt: string,
options: PromptEnhancementOptions = {}, options: PromptEnhancementOptions = {},
context?: PromptEnhancementContext,
): Promise<PromptEnhancementResult> { ): Promise<PromptEnhancementResult> {
const timestamp = new Date().toISOString(); const timestamp = new Date().toISOString();
@ -105,6 +115,27 @@ export class PromptEnhancementService {
enhancements: result.enhancements, enhancements: result.enhancements,
}, },
}; };
// Log the enhancement if context is provided
if (context) {
const logEntry: EnhancementLogEntry = {
timestamp,
orgId: context.orgId,
projectId: context.projectId,
originalPrompt: rawPrompt,
enhancedPrompt: result.enhancedPrompt,
...(context.meta && { meta: context.meta }),
template: finalOptions.template,
...(result.detectedLanguage && {
detectedLanguage: result.detectedLanguage,
}),
enhancements: result.enhancements,
model: this.model,
};
EnhancementLogger.getInstance().log(logEntry);
}
return enhancementResult; return enhancementResult;
} }