refs #739: unify Smilegate game target planning

This commit is contained in:
devmrko
2026-07-28 10:09:12 +09:00
parent 57f6677afb
commit d13d6d48ca
9 changed files with 664 additions and 138 deletions

View File

@@ -98,7 +98,12 @@ class McpSseServiceTest {
var fewShot = tools.get(4);
assertThat(fewShot.path("name").asText())
.isEqualTo("oracle.select_ai.test_fewshot_nl2sql");
assertThat(fewShot.path("description").asText()).contains("Few-shot");
assertThat(fewShot.path("description").asText())
.contains("Few-shot")
.contains("NONE, SINGLE, MULTI, ALL");
assertThat(fewShot.path("inputSchema").path("properties")
.path("queryPlan").path("description").asText())
.contains("NONE, SINGLE, MULTI, ALL");
var gameScope = tools.get(5);
assertThat(gameScope.path("name").asText())
@@ -110,6 +115,10 @@ class McpSseServiceTest {
.isEqualTo("oracle.select_ai.game_catalog_resolve");
assertThat(tools.get(7).path("name").asText())
.isEqualTo("oracle.select_ai.game_query_plan");
assertThat(tools.get(7).path("description").asText())
.contains("항상 먼저 호출")
.contains("NONE, SINGLE, MULTI, ALL")
.contains("smilegate_fewshot_nl2sql");
}
@Test
@@ -161,10 +170,22 @@ class McpSseServiceTest {
ObjectNode request = request(7, "tools/call");
ObjectNode params = (ObjectNode) request.putObject("params");
params.put("name", "oracle.select_ai.test_fewshot_nl2sql");
params.putObject("arguments").put("prompt", "카제나 AU를 조회해 줘");
ObjectNode arguments = params.putObject("arguments");
arguments.put("prompt", "전체 매출을 조회해 줘");
ObjectNode plan = arguments.putObject("queryPlan");
plan.put("targetType", "NONE");
plan.put("status", "NO_TARGET");
plan.putArray("targets").addObject()
.put("status", "NONE")
.putNull("gameKey")
.putNull("gamePrefix")
.putNull("userMasterObjectName");
ObjectNode response = service.handle("default", request, "user-bearer");
CapturingSelectAiService agentService = (CapturingSelectAiService) selectAiService;
assertThat(agentService.prompt).isEqualTo("전체 매출을 조회해 줘");
assertThat(agentService.queryPlan.path("targetType").asText()).isEqualTo("NONE");
assertThat(response.path("result").path("isError").asBoolean()).isFalse();
String payload = response.path("result").path("content").get(0).path("text").asText();
assertThat(payload)
@@ -262,7 +283,9 @@ class McpSseServiceTest {
.contains("\"status\" : \"PARTIAL\"")
.contains("\"gameKey\" : \"SUPPORTED_GAME\"")
.contains("\"mention\" : \"Unknown game\"")
.contains("\"reasonCode\" : \"LLM_NO_CANDIDATE_MATCH\"");
.contains("\"reasonCode\" : \"LLM_NO_CANDIDATE_MATCH\"")
.contains("\"targetType\" : \"MULTI\"")
.contains("\"nextAction\" : \"CALL_FEWSHOT\"");
}
private ObjectNode request(int id, String method) {
@@ -277,6 +300,7 @@ class McpSseServiceTest {
private String bearerToken;
private String prompt;
private JsonNode queryPlan;
private boolean showpromptCalled;
private CapturingSelectAiService() {
@@ -302,6 +326,13 @@ class McpSseServiceTest {
return generateAndExecute(bearerToken, prompt);
}
@Override
public JsonNode generateAndExecute(
String bearerToken, String prompt, String scopeGameKey, JsonNode priorToolContext) {
this.queryPlan = priorToolContext;
return generateAndExecute(bearerToken, prompt);
}
@Override
public JsonNode generatePrompt(String bearerToken, String prompt) {
this.bearerToken = bearerToken;
@@ -372,8 +403,23 @@ class McpSseServiceTest {
@Override
public ObjectNode queryPlan(String token, String question, int topK) {
ObjectNode plan = new ObjectMapper().createObjectNode();
plan.put("scopeType", "MULTI_GAME");
plan.put("targetType", "MULTI");
plan.put("scopeType", "MULTI");
plan.put("status", "PARTIAL");
plan.putArray("targets")
.addObject()
.put("mention", "Supported game")
.put("status", "MATCHED")
.put("gameKey", "SUPPORTED_GAME")
.put("gamePrefix", "SUPPORTED")
.put("userMasterObjectName", "SUPPORTED_COMN_USER_MST");
plan.withArray("targets")
.addObject()
.put("mention", "Unknown game")
.put("status", "UNMATCHED")
.putNull("gameKey")
.putNull("gamePrefix")
.putNull("userMasterObjectName");
plan.putArray("matchedGames")
.addObject()
.put("gameKey", "SUPPORTED_GAME");
@@ -385,8 +431,8 @@ class McpSseServiceTest {
.addObject()
.put("mention", "Unknown game")
.put("reasonCode", "LLM_NO_CANDIDATE_MATCH");
plan.put("nextAction", "CALL_FEWSHOT_PER_GAME");
plan.put("executionMode", "FAN_OUT");
plan.put("nextAction", "CALL_FEWSHOT");
plan.put("executionMode", "COMBINED");
return plan;
}
}

View File

@@ -26,6 +26,7 @@ class SelectAiFewShotPromptTest {
.contains("SELECT COUNT(*) AS AU_COUNT FROM APP_USER")
.contains("Original user question:\ncurrent active users")
.contains("current approved object list and policy")
.contains("do not infer a default game");
.contains("do not infer a default game")
.contains("Continue a game-neutral question with approved common objects");
}
}