mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.8 KiB
75 lines
1.8 KiB
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
|
|
|
|
import { Injectable } from '@nestjs/common';
|
|
import { randomUUID } from 'node:crypto';
|
|
|
|
import { AiAgentFeedbackResponse } from './ai-agent.interfaces';
|
|
import { AiObservabilityService } from './ai-observability.service';
|
|
|
|
const AI_AGENT_FEEDBACK_TTL_IN_MS = 30 * 24 * 60 * 60 * 1000;
|
|
|
|
@Injectable()
|
|
export class AiFeedbackService {
|
|
public constructor(
|
|
private readonly redisCacheService: RedisCacheService,
|
|
private readonly aiObservabilityService: AiObservabilityService
|
|
) {}
|
|
|
|
public async submitFeedback({
|
|
comment,
|
|
rating,
|
|
sessionId,
|
|
userId
|
|
}: {
|
|
comment?: string;
|
|
rating: 'down' | 'up';
|
|
sessionId: string;
|
|
userId: string;
|
|
}): Promise<AiAgentFeedbackResponse> {
|
|
const feedbackId = randomUUID();
|
|
const normalizedComment = comment?.trim();
|
|
const normalizedSessionId = sessionId.trim();
|
|
|
|
await this.redisCacheService.set(
|
|
this.getFeedbackKey({
|
|
feedbackId,
|
|
sessionId: normalizedSessionId,
|
|
userId
|
|
}),
|
|
JSON.stringify({
|
|
comment: normalizedComment,
|
|
createdAt: new Date().toISOString(),
|
|
feedbackId,
|
|
rating,
|
|
sessionId: normalizedSessionId,
|
|
userId
|
|
}),
|
|
AI_AGENT_FEEDBACK_TTL_IN_MS
|
|
);
|
|
|
|
await this.aiObservabilityService.recordFeedback({
|
|
comment: normalizedComment,
|
|
feedbackId,
|
|
rating,
|
|
sessionId: normalizedSessionId,
|
|
userId
|
|
});
|
|
|
|
return {
|
|
accepted: true,
|
|
feedbackId
|
|
};
|
|
}
|
|
|
|
private getFeedbackKey({
|
|
feedbackId,
|
|
sessionId,
|
|
userId
|
|
}: {
|
|
feedbackId: string;
|
|
sessionId: string;
|
|
userId: string;
|
|
}) {
|
|
return `ai-agent-feedback-${userId}-${sessionId}-${feedbackId}`;
|
|
}
|
|
}
|
|
|