첫 '{'~마지막 '}' 구간만 추출해 파싱, 중괄호 없으면 조용히 규칙 폴백(WARN 대신 INFO)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -86,7 +86,13 @@ public class AiEntryParser {
|
|||||||
|
|
||||||
String out = stripFences(resp.path("content").path(0).path("text").asText("")).trim();
|
String out = stripFences(resp.path("content").path(0).path("text").asText("")).trim();
|
||||||
log.info("[ai-parse] 모델 원문='{}'", out);
|
log.info("[ai-parse] 모델 원문='{}'", out);
|
||||||
JsonNode j = om.readTree(out);
|
// 모델이 설명문을 섞어 보내도 첫 '{'~마지막 '}' 만 추출해 JSON 파싱(견고성).
|
||||||
|
String json = extractJson(out);
|
||||||
|
if (json == null) {
|
||||||
|
log.info("[ai-parse] JSON 없음 — 거래 아님으로 간주, 규칙기반 폴백");
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
JsonNode j = om.readTree(json);
|
||||||
|
|
||||||
String type = "INCOME".equalsIgnoreCase(j.path("type").asText("EXPENSE")) ? "INCOME" : "EXPENSE";
|
String type = "INCOME".equalsIgnoreCase(j.path("type").asText("EXPENSE")) ? "INCOME" : "EXPENSE";
|
||||||
LocalDate date;
|
LocalDate date;
|
||||||
@@ -111,6 +117,14 @@ public class AiEntryParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 설명문이 앞뒤로 붙어도 첫 '{'~마지막 '}' 구간만 잘라 JSON 만 추출. 중괄호 없으면 null. */
|
||||||
|
private String extractJson(String s) {
|
||||||
|
int a = s.indexOf('{');
|
||||||
|
int b = s.lastIndexOf('}');
|
||||||
|
if (a >= 0 && b > a) return s.substring(a, b + 1);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/** 모델이 ```json ... ``` 로 감쌌을 때 코드펜스 제거. */
|
/** 모델이 ```json ... ``` 로 감쌌을 때 코드펜스 제거. */
|
||||||
private String stripFences(String s) {
|
private String stripFences(String s) {
|
||||||
String t = s.trim();
|
String t = s.trim();
|
||||||
|
|||||||
Reference in New Issue
Block a user