This is an automated email from the ASF dual-hosted git repository.
RaigorJiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new c9b29c87417 Add LLM usability scenario for natural encrypt rule
workflow (#38987)
c9b29c87417 is described below
commit c9b29c87417b4a3761682bb12836dc11de23b3c9
Author: zhaojinchao <[email protected]>
AuthorDate: Fri Jul 3 12:43:07 2026 +0800
Add LLM usability scenario for natural encrypt rule workflow (#38987)
* Add LLM usability scenario for natural encrypt rule workflow
* Fix ci
* Fix ci
---
.../usability/scenario/LLMUsabilityScenarioCatalog.java | 12 ++++++++++++
.../usability/scenario/LLMUsabilityScenarioCatalogTest.java | 11 ++++++++++-
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git
a/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalog.java
b/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalog.java
index d0dafb5adbb..5efc912680b 100644
---
a/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalog.java
+++
b/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalog.java
@@ -102,6 +102,18 @@ public final class LLMUsabilityScenarioCatalog {
"database_gateway_execute_query"),
List.of("database_gateway_plan_mask_rule",
"database_gateway_apply_workflow", "database_gateway_validate_workflow",
"database_gateway_execute_query")),
List.of(MCPInteractionActionNames.READ_RESOURCE,
"database_gateway_plan_mask_rule"), List.of(), false, false));
+ result.add(createScenario("natural-encrypt-rule-md5-" + runtimeKind,
LLMUsabilityDimension.TOOL, runtimeKind,
+ List.of(LLMUsabilityScenario.NATURAL_TASK_TAG, "natural",
"workflow", "encrypt"),
+ new LLME2EScenario("natural-encrypt-rule-md5-" + runtimeKind,
SYSTEM_PROMPT,
+ "A user asks you to identify and create an encrypt
rule now for logical database `" + databaseName + "`, schema `" + schemaName +
"`, table `" + tableName
+ + "`, and column `status` using the MD5
encrypt algorithm with cipher column `status_cipher`. The user wants
irreversible hashing, no equality, and no like. "
+ + "Use the planning response plan_id for
follow-up workflow calls, keep execution manual-only, validate the workflow
with the returned plan_id, "
+ + "and finish by verifying `" + query + "`.",
+ createAnswer(databaseName, schemaName, tableName,
query, totalOrders),
+ List.of(MCPInteractionActionNames.READ_RESOURCE,
"database_gateway_plan_encrypt_rule", "database_gateway_apply_workflow",
"database_gateway_validate_workflow",
+ "database_gateway_execute_query"),
+ List.of("database_gateway_plan_encrypt_rule",
"database_gateway_apply_workflow", "database_gateway_validate_workflow",
"database_gateway_execute_query")),
+ List.of(MCPInteractionActionNames.READ_RESOURCE,
"database_gateway_plan_encrypt_rule"), List.of(), false, false));
result.add(createScenario("natural-table-resource-" + runtimeKind,
LLMUsabilityDimension.RESOURCE, runtimeKind,
List.of(LLMUsabilityScenario.NATURAL_TASK_TAG, "natural",
"resource"),
new LLME2EScenario("natural-table-resource-" + runtimeKind,
SYSTEM_PROMPT,
diff --git
a/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalogTest.java
b/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalogTest.java
index 59a4b288401..2826c596c56 100644
---
a/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalogTest.java
+++
b/test/e2e/mcp/src/test/java/org/apache/shardingsphere/test/e2e/mcp/llm/suite/usability/scenario/LLMUsabilityScenarioCatalogTest.java
@@ -38,7 +38,7 @@ class LLMUsabilityScenarioCatalogTest {
"SELECT COUNT(*) AS total_orders FROM orders", 2);
Map<String, LLMUsabilityScenario> actualScenarios =
actual.stream().collect(Collectors.toMap(LLMUsabilityScenario::getScenarioId,
each -> each));
assertThat(actualScenarios.keySet(),
hasItems("natural-metadata-lookup-mysql", "natural-read-only-sql-mysql",
"natural-side-effect-preview-mysql",
- "natural-workflow-manual-export-mysql",
"natural-mask-rule-md5-mysql", "natural-table-resource-mysql"));
+ "natural-workflow-manual-export-mysql",
"natural-mask-rule-md5-mysql", "natural-encrypt-rule-md5-mysql",
"natural-table-resource-mysql"));
assertThat(actualScenarios.get("natural-side-effect-preview-mysql").getLlmScenario().getRequiredToolNames(),
is(List.of("database_gateway_execute_update",
"database_gateway_execute_query")));
assertThat(actualScenarios.get("natural-table-resource-mysql").getExpectedResourceUris(),
is(List.of("shardingsphere://databases/logic_db/schemas/logic_db/tables/orders")));
@@ -54,6 +54,15 @@ class LLMUsabilityScenarioCatalogTest {
assertThat(actualScenarios.get("natural-mask-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("MD5 mask algorithm"));
assertThat(actualScenarios.get("natural-mask-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("manual-only"));
assertThat(actualScenarios.get("natural-mask-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("validate the workflow"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getRequiredToolNames(),
+ is(List.of("database_gateway_plan_encrypt_rule",
"database_gateway_apply_workflow", "database_gateway_validate_workflow",
"database_gateway_execute_query")));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("identify and create an encrypt rule now"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("table `orders`"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("MD5 encrypt algorithm"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("cipher column `status_cipher`"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("irreversible hashing, no equality, and no like"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("manual-only"));
+
assertThat(actualScenarios.get("natural-encrypt-rule-md5-mysql").getLlmScenario().getUserPrompt(),
containsString("validate the workflow"));
assertTrue(actual.stream().allMatch(each ->
each.getTags().contains("natural")));
assertTrue(actual.stream().allMatch(LLMUsabilityScenario::isNaturalTask));
assertTrue(actual.stream().noneMatch(LLMUsabilityScenario::isProtocolContract));