U
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user