This commit is contained in:
NAME
2026-05-15 11:18:03 +00:00
parent 7730c76e08
commit 6b4f09640f
36 changed files with 631 additions and 78 deletions
@@ -69,6 +69,8 @@ export class ContentSafetyService {
// Hard block check
for (const pattern of this.HARD_BLOCK_PATTERNS) {
if (pattern.test(content)) {
this.logger.error(`checkOutput ->FALSE -> Output contains prohibited language`);
this.logger.error({content});
return {
safe: false,
blockReason: 'Output contains prohibited language',
@@ -4,6 +4,7 @@ import {ContentStyle} from '../enum/style.enum';
import {ProviderName} from '../providers/ai-provider.factory';
import {Language} from "../../../common/interfaces/language.prompt.interface";
import {ContentTone, isEdgyTone} from "../enum/tone.enum";
import {AngleEnum} from "../enum/angle.enum";
interface ProviderPair {
writer: ProviderName;
@@ -54,6 +55,15 @@ export class ProviderRouterService {
}): RoutingDecision {
const { language, contentType, style, tone } = params;
if (tone === ContentTone.EMPATHETIC) {
return {
writer: 'openai', // warmest voice, less "AI-ish"
reviewer: 'openai',
useXEnrichment: false,
reason: 'Empathy context: GPT for warmer human-like tone',
};
}
// 🔥 EDGY TONES: route mạnh sang Grok (EN) hoặc DeepSeek (others)
// GPT thường refuse hoặc water down → tránh
if (tone && isEdgyTone(tone)) {
@@ -1,5 +1,5 @@
// services/quote-writer.service.ts
import {Injectable, Logger} from '@nestjs/common';
import {Injectable, Logger, UnprocessableEntityException} from '@nestjs/common';
import {ConfigService} from '@nestjs/config';
import {AIProviderFactory} from '../providers/ai-provider.factory';
import {ProviderRouterService} from './provider-router.service';
@@ -28,8 +28,16 @@ export class QuoteWriterService {
private safety: ContentSafetyService
) {}
async generateQuote(dto: GenerateQuoteDto) {
this.logger.debug(`==> QuoteWriterService_generateQuote`);
async generateQuote(dto: GenerateQuoteDto, _retryCount = 0) {
const MAX_RETRIES = 2;
if (_retryCount >= MAX_RETRIES) {
throw new UnprocessableEntityException(
`Cannot generate safe content after ${MAX_RETRIES + 1} attempts`,
);
}
this.logger.debug(`==> QuoteWriterService_generateQuote lần:${_retryCount}`);
// 1. Auto-detect quote type nếu không có
const quoteType = dto.quoteType ?? suggestQuoteType(dto.originalPost, dto.yourAngle);
this.logger.log(`Quote type: ${quoteType}`);
@@ -132,7 +140,9 @@ export class QuoteWriterService {
return this.generateQuote({
...dto,
tone: this.downgradeTone(dto.tone!),
});
},
_retryCount + 1,
);
}
return {