From ec5d731bf510f84bddd8cd5903094e50122a66b0 Mon Sep 17 00:00:00 2001 From: devmrko Date: Mon, 27 Jul 2026 14:47:37 +0900 Subject: [PATCH] pass previous tool context into few-shot query --- .../vpdbackoffice/service/McpSseService.java | 9 +++++++-- .../vpdbackoffice/service/SelectAiService.java | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/service/McpSseService.java b/src/main/java/com/cloudhandson/vpdbackoffice/service/McpSseService.java index 13a0417..b32576d 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/service/McpSseService.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/service/McpSseService.java @@ -144,6 +144,10 @@ public class McpSseService { if (fewShotNl2SqlToolName().equals(toolView.name())) { addStringProperty(properties, "scopeGameKey", "선택 사항입니다. game_scope_resolve가 반환한 SUPPORTED gameKey만 전달하세요.", 128); + ObjectNode plan = properties.putObject("queryPlan"); + plan.put("type", "object"); + plan.put("description", "앞 단계 game_query_plan의 구조화된 결과입니다."); + plan.putObject("additionalProperties").put("type", "object"); } required.add("prompt"); } @@ -207,8 +211,9 @@ public class McpSseService { response = queryTool ? selectAiService.generateAndExecute(token, prompt) : fewShotNl2SqlTool - ? selectAiService.generateAndExecute(token, prompt, - arguments.path("scopeGameKey").asText("")) + ? selectAiService.generateAndExecute(token, prompt, + arguments.path("scopeGameKey").asText(""), + arguments.path("queryPlan")) : selectAiService.generatePrompt(token, prompt); } } catch (VpdTokenAccessDeniedException ignored) { diff --git a/src/main/java/com/cloudhandson/vpdbackoffice/service/SelectAiService.java b/src/main/java/com/cloudhandson/vpdbackoffice/service/SelectAiService.java index 5d55c44..659fac8 100644 --- a/src/main/java/com/cloudhandson/vpdbackoffice/service/SelectAiService.java +++ b/src/main/java/com/cloudhandson/vpdbackoffice/service/SelectAiService.java @@ -115,6 +115,13 @@ public class SelectAiService { return response; } + public JsonNode generateAndExecute( + String bearerToken, String prompt, String scopeGameKey, JsonNode priorToolContext) { + String context = priorToolContext == null || priorToolContext.isMissingNode() + || priorToolContext.isNull() ? "" : "\n[PREVIOUS TOOL RESULT]\n" + priorToolContext; + return generateAndExecute(bearerToken, prompt + context, scopeGameKey); + } + private GameContext resolveGameContext(String bearerToken, String question) { try { List candidates =