This commit is contained in:
root
2025-12-20 23:19:44 +05:00
parent 00b291d47e
commit c4484cfafd
2 changed files with 27 additions and 5 deletions
@@ -3813,8 +3813,10 @@ public class MarketingAnalysisService {
.replace("[[CHART_CHANNEL_MATRIX]]", "")
.replace("[[CHART_FUNNEL]]", "")
.replace("[[CHART_SWOT]]", "");
// Safety net: remove any unknown/variant placeholders too
cleaned = cleaned.replaceAll("(?i)\\[\\[\\s*(CHART|TABLE)_[A-Za-z0-9_]+\\s*\\]\\]", "");
// Safety net: remove any unknown/variant placeholders too.
// IMPORTANT: model sometimes outputs generic placeholders like [[CHART_...]].
// We tolerate dots/hyphens/underscores to ensure they get removed.
cleaned = cleaned.replaceAll("(?i)\\[\\[\\s*(CHART|TABLE)_[A-Za-z0-9_.-]+\\s*\\]\\]", "");
cleaned = cleaned.replaceAll("(\\r?\\n){3,}", "\n\n");
return cleaned;
}
@@ -3854,7 +3856,7 @@ public class MarketingAnalysisService {
// spaces). Use a fast contains() check first, but fall back to regex to
// tolerate extra spaces like: [[ CHART_SEASONALITY ]].
java.util.regex.Pattern presentPattern = java.util.regex.Pattern
.compile("\\[\\[\\s*(CHART|TABLE)_[A-Za-z0-9_]+\\s*\\]\\]");
.compile("\\[\\[\\s*(CHART|TABLE)_[A-Za-z0-9_.-]+\\s*\\]\\]");
Set<String> presentPlaceholders = new LinkedHashSet<>();
if (containsChartOrTablePlaceholder(result)) {
java.util.regex.Matcher presentMatcher = presentPattern.matcher(result);
@@ -3935,8 +3937,9 @@ public class MarketingAnalysisService {
result = removePlaceholderWithSurroundingNewlines(result, placeholderVariant);
}
// Final safety net: remove any leftover placeholders (known or unknown)
result = result.replaceAll("(?i)\\[\\[\\s*(CHART|TABLE)_[A-Za-z0-9_]+\\s*\\]\\]", "");
// Final safety net: remove any leftover placeholders (known or unknown),
// including generic tokens like [[CHART_...]].
result = result.replaceAll("(?i)\\[\\[\\s*(CHART|TABLE)_[A-Za-z0-9_.-]+\\s*\\]\\]", "");
result = result.replaceAll("(\\r?\\n){3,}", "\n\n");
logger.info(
@@ -171,4 +171,23 @@ class MarketingAnalysisServiceChartPlacementTest {
assertTrue(Pattern.compile("(?m)^```json:segmentsChannelMatrix$").matcher(out).find(),
"Opening fence line must be exactly ```json:<key> with no leading spaces");
}
@Test
void replaceChartPlaceholders_shouldRemoveGenericChartDotsPlaceholder() throws Exception {
Method m = MarketingAnalysisService.class.getDeclaredMethod("replaceChartPlaceholders", String.class,
Map.class);
m.setAccessible(true);
String report = ""
+ "## I. Краткое резюме\n"
+ "Текст перед.\n"
+ "[[CHART_...]]\n"
+ "Текст после.\n";
// Even if chartsData is empty, generic placeholders must be removed.
String out = (String) m.invoke(marketingAnalysisService, report, new HashMap<String, Object>());
assertFalse(out.contains("[[CHART_...]]"),
"Generic placeholder [[CHART_...]] must be removed from fullAnalysis");
}
}