@agentix-e/nl2spel 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +69 -39
  2. package/dist/SpelEvaluator.d.ts +124 -0
  3. package/dist/SpelEvaluator.d.ts.map +1 -0
  4. package/dist/SpelEvaluator.js +2 -0
  5. package/dist/SpelEvaluator.js.map +1 -0
  6. package/dist/__tests__/auto-fixer.test.d.ts +2 -0
  7. package/dist/__tests__/auto-fixer.test.d.ts.map +1 -0
  8. package/dist/__tests__/auto-fixer.test.js +285 -0
  9. package/dist/__tests__/auto-fixer.test.js.map +1 -0
  10. package/dist/__tests__/chinese-number-parser.test.d.ts +2 -0
  11. package/dist/__tests__/chinese-number-parser.test.d.ts.map +1 -0
  12. package/dist/__tests__/chinese-number-parser.test.js +106 -0
  13. package/dist/__tests__/chinese-number-parser.test.js.map +1 -0
  14. package/dist/__tests__/context-extractor.test.d.ts +2 -0
  15. package/dist/__tests__/context-extractor.test.d.ts.map +1 -0
  16. package/dist/__tests__/context-extractor.test.js +347 -0
  17. package/dist/__tests__/context-extractor.test.js.map +1 -0
  18. package/dist/__tests__/coverage-gaps.test.d.ts +2 -0
  19. package/dist/__tests__/coverage-gaps.test.d.ts.map +1 -0
  20. package/dist/__tests__/coverage-gaps.test.js +578 -0
  21. package/dist/__tests__/coverage-gaps.test.js.map +1 -0
  22. package/dist/__tests__/intent-classifier.test.d.ts +2 -0
  23. package/dist/__tests__/intent-classifier.test.d.ts.map +1 -0
  24. package/dist/__tests__/intent-classifier.test.js +384 -0
  25. package/dist/__tests__/intent-classifier.test.js.map +1 -0
  26. package/dist/__tests__/nl2spel-engine.test.d.ts +2 -0
  27. package/dist/__tests__/nl2spel-engine.test.d.ts.map +1 -0
  28. package/dist/__tests__/nl2spel-engine.test.js +344 -0
  29. package/dist/__tests__/nl2spel-engine.test.js.map +1 -0
  30. package/dist/__tests__/pattern-matcher.test.d.ts +2 -0
  31. package/dist/__tests__/pattern-matcher.test.d.ts.map +1 -0
  32. package/dist/__tests__/pattern-matcher.test.js +754 -0
  33. package/dist/__tests__/pattern-matcher.test.js.map +1 -0
  34. package/dist/__tests__/prompt-builder.test.d.ts +2 -0
  35. package/dist/__tests__/prompt-builder.test.d.ts.map +1 -0
  36. package/dist/__tests__/prompt-builder.test.js +99 -0
  37. package/dist/__tests__/prompt-builder.test.js.map +1 -0
  38. package/dist/__tests__/provider-registry.test.d.ts +2 -0
  39. package/dist/__tests__/provider-registry.test.d.ts.map +1 -0
  40. package/dist/__tests__/provider-registry.test.js +240 -0
  41. package/dist/__tests__/provider-registry.test.js.map +1 -0
  42. package/dist/__tests__/schema-formatter.test.d.ts +2 -0
  43. package/dist/__tests__/schema-formatter.test.d.ts.map +1 -0
  44. package/dist/__tests__/schema-formatter.test.js +298 -0
  45. package/dist/__tests__/schema-formatter.test.js.map +1 -0
  46. package/dist/__tests__/self-correction-loop.test.d.ts +2 -0
  47. package/dist/__tests__/self-correction-loop.test.d.ts.map +1 -0
  48. package/dist/__tests__/self-correction-loop.test.js +253 -0
  49. package/dist/__tests__/self-correction-loop.test.js.map +1 -0
  50. package/dist/__tests__/strategy-router.test.d.ts +2 -0
  51. package/dist/__tests__/strategy-router.test.d.ts.map +1 -0
  52. package/dist/__tests__/strategy-router.test.js +493 -0
  53. package/dist/__tests__/strategy-router.test.js.map +1 -0
  54. package/dist/__tests__/template-engine.test.d.ts +2 -0
  55. package/dist/__tests__/template-engine.test.d.ts.map +1 -0
  56. package/dist/__tests__/template-engine.test.js +367 -0
  57. package/dist/__tests__/template-engine.test.js.map +1 -0
  58. package/dist/__tests__/validation-pipeline.test.d.ts +2 -0
  59. package/dist/__tests__/validation-pipeline.test.d.ts.map +1 -0
  60. package/dist/__tests__/validation-pipeline.test.js +262 -0
  61. package/dist/__tests__/validation-pipeline.test.js.map +1 -0
  62. package/dist/context/context-extractor.d.ts +82 -0
  63. package/dist/context/context-extractor.d.ts.map +1 -0
  64. package/dist/context/context-extractor.js +166 -0
  65. package/dist/context/context-extractor.js.map +1 -0
  66. package/dist/context/schema-formatter.d.ts +20 -0
  67. package/dist/context/schema-formatter.d.ts.map +1 -0
  68. package/dist/context/schema-formatter.js +104 -0
  69. package/dist/context/schema-formatter.js.map +1 -0
  70. package/dist/engine/nl2spel-engine.d.ts +144 -0
  71. package/dist/engine/nl2spel-engine.d.ts.map +1 -0
  72. package/dist/engine/nl2spel-engine.js +125 -0
  73. package/dist/engine/nl2spel-engine.js.map +1 -0
  74. package/dist/index.d.ts +28 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +24 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/pattern/builtin-patterns.d.ts +12 -0
  79. package/dist/pattern/builtin-patterns.d.ts.map +1 -0
  80. package/dist/pattern/builtin-patterns.js +812 -0
  81. package/dist/pattern/builtin-patterns.js.map +1 -0
  82. package/dist/pattern/pattern-definition.d.ts +49 -0
  83. package/dist/pattern/pattern-definition.d.ts.map +1 -0
  84. package/dist/pattern/pattern-definition.js +2 -0
  85. package/dist/pattern/pattern-definition.js.map +1 -0
  86. package/dist/pattern/pattern-matcher.d.ts +55 -0
  87. package/dist/pattern/pattern-matcher.d.ts.map +1 -0
  88. package/dist/pattern/pattern-matcher.js +216 -0
  89. package/dist/pattern/pattern-matcher.js.map +1 -0
  90. package/dist/provider/llm-provider.d.ts +146 -0
  91. package/dist/provider/llm-provider.d.ts.map +1 -0
  92. package/dist/provider/llm-provider.js +2 -0
  93. package/dist/provider/llm-provider.js.map +1 -0
  94. package/dist/provider/provider-registry.d.ts +28 -0
  95. package/dist/provider/provider-registry.d.ts.map +1 -0
  96. package/dist/provider/provider-registry.js +65 -0
  97. package/dist/provider/provider-registry.js.map +1 -0
  98. package/dist/strategy/strategy-router.d.ts +79 -0
  99. package/dist/strategy/strategy-router.d.ts.map +1 -0
  100. package/dist/strategy/strategy-router.js +182 -0
  101. package/dist/strategy/strategy-router.js.map +1 -0
  102. package/dist/template/intent-classifier.d.ts +56 -0
  103. package/dist/template/intent-classifier.d.ts.map +1 -0
  104. package/dist/template/intent-classifier.js +251 -0
  105. package/dist/template/intent-classifier.js.map +1 -0
  106. package/dist/template/nl-intent.d.ts +38 -0
  107. package/dist/template/nl-intent.d.ts.map +1 -0
  108. package/dist/template/nl-intent.js +39 -0
  109. package/dist/template/nl-intent.js.map +1 -0
  110. package/dist/template/prompts/prompt-builder.d.ts +20 -0
  111. package/dist/template/prompts/prompt-builder.d.ts.map +1 -0
  112. package/dist/template/prompts/prompt-builder.js +243 -0
  113. package/dist/template/prompts/prompt-builder.js.map +1 -0
  114. package/dist/template/template-engine.d.ts +27 -0
  115. package/dist/template/template-engine.d.ts.map +1 -0
  116. package/dist/template/template-engine.js +378 -0
  117. package/dist/template/template-engine.js.map +1 -0
  118. package/dist/utils/chinese-number-parser.d.ts +30 -0
  119. package/dist/utils/chinese-number-parser.d.ts.map +1 -0
  120. package/dist/utils/chinese-number-parser.js +92 -0
  121. package/dist/utils/chinese-number-parser.js.map +1 -0
  122. package/dist/validation/auto-fixer.d.ts +14 -0
  123. package/dist/validation/auto-fixer.d.ts.map +1 -0
  124. package/dist/validation/auto-fixer.js +111 -0
  125. package/dist/validation/auto-fixer.js.map +1 -0
  126. package/dist/validation/self-correction-loop.d.ts +46 -0
  127. package/dist/validation/self-correction-loop.d.ts.map +1 -0
  128. package/dist/validation/self-correction-loop.js +141 -0
  129. package/dist/validation/self-correction-loop.js.map +1 -0
  130. package/dist/validation/validation-pipeline.d.ts +81 -0
  131. package/dist/validation/validation-pipeline.d.ts.map +1 -0
  132. package/dist/validation/validation-pipeline.js +306 -0
  133. package/dist/validation/validation-pipeline.js.map +1 -0
  134. package/package.json +36 -7
@@ -0,0 +1,39 @@
1
+ /**
2
+ * NLIntent — Natural language intent classification system.
3
+ *
4
+ * 15 intent types covering all common SpEL usage scenarios.
5
+ */
6
+ export var NLIntent;
7
+ (function (NLIntent) {
8
+ /** Numeric comparison: "amount > 100", "年龄大于18" */
9
+ NLIntent["COMPARISON"] = "COMPARISON";
10
+ /** Permission check: "hasRole('admin')", "用户是VIP" */
11
+ NLIntent["PERMISSION_CHECK"] = "PERMISSION_CHECK";
12
+ /** Null check: "== null", "!= null", "不为空" */
13
+ NLIntent["NULL_CHECK"] = "NULL_CHECK";
14
+ /** Logical combination: "a and b", "金额大于100且已确认" */
15
+ NLIntent["LOGICAL"] = "LOGICAL";
16
+ /** String matching: "contains('keyword')", "以ORD开头" */
17
+ NLIntent["STRING_MATCH"] = "STRING_MATCH";
18
+ /** Collection operations: "list.contains('x')", "items.isEmpty()" */
19
+ NLIntent["COLLECTION"] = "COLLECTION";
20
+ /** Range check: "between {1, 10}", "年龄在18到60之间" */
21
+ NLIntent["RANGE"] = "RANGE";
22
+ /** Selection (filter): ".?[condition]", "all matching conditions" */
23
+ NLIntent["SELECTION"] = "SELECTION";
24
+ /** Projection: ".![field]", "each item's name" */
25
+ NLIntent["PROJECTION"] = "PROJECTION";
26
+ /** Type check: "instanceof", "是否是Admin类型" */
27
+ NLIntent["TYPE_CHECK"] = "TYPE_CHECK";
28
+ /** Boolean property: "isVIP", "是否已支付" */
29
+ NLIntent["BOOLEAN"] = "BOOLEAN";
30
+ /** Date comparison: "after/before", "after a certain date" */
31
+ NLIntent["DATE"] = "DATE";
32
+ /** Elvis default: "a ?: default", "or default value" */
33
+ NLIntent["ELVIS"] = "ELVIS";
34
+ /** Assignment: "a = value", "set field to" */
35
+ NLIntent["ASSIGNMENT"] = "ASSIGNMENT";
36
+ /** Arithmetic: "amount * price", "total = unit price × quantity" */
37
+ NLIntent["ARITHMETIC"] = "ARITHMETIC";
38
+ })(NLIntent || (NLIntent = {}));
39
+ //# sourceMappingURL=nl-intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nl-intent.js","sourceRoot":"","sources":["../../src/template/nl-intent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,QA6CX;AA7CD,WAAY,QAAQ;IAClB,mDAAmD;IACnD,qCAAyB,CAAA;IAEzB,qDAAqD;IACrD,iDAAqC,CAAA;IAErC,8CAA8C;IAC9C,qCAAyB,CAAA;IAEzB,oDAAoD;IACpD,+BAAmB,CAAA;IAEnB,uDAAuD;IACvD,yCAA6B,CAAA;IAE7B,qEAAqE;IACrE,qCAAyB,CAAA;IAEzB,mDAAmD;IACnD,2BAAe,CAAA;IAEf,qEAAqE;IACrE,mCAAuB,CAAA;IAEvB,kDAAkD;IAClD,qCAAyB,CAAA;IAEzB,6CAA6C;IAC7C,qCAAyB,CAAA;IAEzB,yCAAyC;IACzC,+BAAmB,CAAA;IAEnB,8DAA8D;IAC9D,yBAAa,CAAA;IAEb,wDAAwD;IACxD,2BAAe,CAAA;IAEf,8CAA8C;IAC9C,qCAAyB,CAAA;IAEzB,oEAAoE;IACpE,qCAAyB,CAAA;AAC3B,CAAC,EA7CW,QAAQ,KAAR,QAAQ,QA6CnB"}
@@ -0,0 +1,20 @@
1
+ import type { LLMPrompt } from '../../provider/llm-provider.js';
2
+ import type { ContextSchema } from '../../SpelEvaluator.js';
3
+ export interface PromptBuilderOptions {
4
+ /** Language (zh/en) */
5
+ language?: 'zh' | 'en';
6
+ /** Whether to include EBNF grammar block */
7
+ includeEBNF?: boolean;
8
+ }
9
+ export declare class PromptBuilder {
10
+ private readonly formatter;
11
+ /**
12
+ * Build a complete LLM Prompt
13
+ */
14
+ build(userInput: string, contextSchema?: ContextSchema, options?: PromptBuilderOptions): LLMPrompt;
15
+ /**
16
+ * Build Few-Shot example string
17
+ */
18
+ private buildExamples;
19
+ }
20
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../../src/template/prompts/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAuM5D,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD;;OAEG;IACI,KAAK,CACV,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,aAAa,EAC7B,OAAO,GAAE,oBAAyB,GACjC,SAAS;IAmCZ;;OAEG;IACH,OAAO,CAAC,aAAa;CA4BtB"}
@@ -0,0 +1,243 @@
1
+ import { SchemaFormatter } from '../../context/schema-formatter.js';
2
+ // ============================================================
3
+ // System Prompts
4
+ // ============================================================
5
+ const SYSTEM_PROMPT_ZH = `You are a Spring Expression Language (SpEL) expert. Your task is to convert natural language descriptions into precise SpEL expressions.
6
+
7
+ ## Rules
8
+ 1. SpEL uses #variable to reference variables, and #root.field to reference root object fields
9
+ 2. String literals use single quotes: 'value'
10
+ 3. Null comparison: == null or != null
11
+ 4. Logical operators: and, or, not (NOT &&, ||, !)
12
+ 5. Comparison operators: ==, !=, >, <, >=, <=
13
+ 6. Ternary operator uses Elvis syntax: value ?: default
14
+ 7. Method calls: list.contains('item'), list.size(), list.isEmpty()
15
+ 8. Collection projection: list.?[condition], list.^[condition], list.![projection]
16
+ 9. Range check: value between {min, max}
17
+ 10. Type check: variable instanceof T(ClassName)
18
+ 11. Permission check: hasRole('role'), hasPermission('permission')
19
+ 12. Date comparison: field.after(T(java.util.Date).valueOf('date')), field.before(...)
20
+
21
+ ## Output Format
22
+ Output ONLY the SpEL expression. Do not include any explanation or comments.`;
23
+ const SYSTEM_PROMPT_EN = `You are a Spring Expression Language (SpEL) expert. Convert natural language descriptions into precise SpEL expressions.
24
+
25
+ ## Rules
26
+ 1. SpEL uses #variable for variables, #root.field for root object fields
27
+ 2. String literals use single quotes: 'value'
28
+ 3. Null comparison: == null or != null
29
+ 4. Logical operators: and, or, not (NOT &&, ||, !)
30
+ 5. Comparison operators: ==, !=, >, <, >=, <=
31
+ 6. Elvis operator for defaults: value ?: default
32
+ 7. Method calls: list.contains('item'), list.size(), list.isEmpty()
33
+ 8. Collection projection: list.?[condition], list.^[condition], list.![projection]
34
+ 9. Range check: value between {min, max}
35
+ 10. Type check: variable instanceof T(ClassName)
36
+ 11. Permission check: hasRole('role'), hasPermission('permission')
37
+ 12. Date comparison: field.after(T(java.util.Date).valueOf('date')), field.before(...)
38
+
39
+ ## Output Format
40
+ Output ONLY the SpEL expression. No explanation, no markdown.`;
41
+ // ============================================================
42
+ // SpEL EBNF Grammar Block
43
+ // ============================================================
44
+ const SPEL_EBNF_GRAMMAR = `
45
+ ## SpEL EBNF (simplified)
46
+ expression := logicalOr
47
+ logicalOr := logicalAnd ('or' logicalAnd)*
48
+ logicalAnd := equality ('and' equality)*
49
+ equality := relational (('==' | '!=') relational)?
50
+ relational := additive (('>' | '<' | '>=' | '<=') additive)?
51
+ additive := multiplicative (('+' | '-') multiplicative)*
52
+ multiplicative := unary (('*' | '/' | '%') unary)*
53
+ unary := ('not' | '!')? primary
54
+ primary := literal | reference | method | '(' expression ')'
55
+ | projection | selection | elvis | typeExpr
56
+ literal := number | string | 'true' | 'false' | 'null'
57
+ string := "'" (char)* "'"
58
+ number := [0-9]+ ('.' [0-9]+)?
59
+ reference := '#' identifier ('.' identifier)*
60
+ method := reference '.'? identifier '(' args? ')'
61
+ projection := reference '.[' projectionExpr ']'
62
+ selection := reference '.?[' expr ']' | reference '.^[' expr ']'
63
+ elvis := expression '?:' expression
64
+ typeExpr := 'T(' qualifiedName ')'
65
+ identifier := [a-zA-Z_][a-zA-Z0-9_]*
66
+ `;
67
+ // ============================================================
68
+ // Few-Shot Examples (20 examples covering easy/medium/hard)
69
+ // ============================================================
70
+ const FEWSHOT_EXAMPLES = [
71
+ // Easy (9 examples)
72
+ {
73
+ nl: '订单金额大于1000',
74
+ spel: '#order.amount > 1000',
75
+ difficulty: 'easy',
76
+ category: 'comparison',
77
+ },
78
+ { nl: 'amount > 500', spel: '#order.amount > 500', difficulty: 'easy', category: 'comparison' },
79
+ {
80
+ nl: '订单状态是已发货',
81
+ spel: "#order.status == '已发货'",
82
+ difficulty: 'easy',
83
+ category: 'comparison',
84
+ },
85
+ {
86
+ nl: 'status equals completed',
87
+ spel: "#order.status == 'completed'",
88
+ difficulty: 'easy',
89
+ category: 'comparison',
90
+ },
91
+ { nl: '备注为空', spel: '#order.remark == null', difficulty: 'easy', category: 'null_check' },
92
+ {
93
+ nl: 'remark is null',
94
+ spel: '#order.remark == null',
95
+ difficulty: 'easy',
96
+ category: 'null_check',
97
+ },
98
+ {
99
+ nl: '用户拥有管理员角色',
100
+ spel: "hasRole('管理员')",
101
+ difficulty: 'easy',
102
+ category: 'permission',
103
+ },
104
+ {
105
+ nl: 'user has admin role',
106
+ spel: "hasRole('admin')",
107
+ difficulty: 'easy',
108
+ category: 'permission',
109
+ },
110
+ {
111
+ nl: '标签包含VIP',
112
+ spel: "#order.tags.contains('VIP')",
113
+ difficulty: 'easy',
114
+ category: 'collection',
115
+ },
116
+ // Medium (7 examples)
117
+ {
118
+ nl: '金额大于100且订单已确认',
119
+ spel: "#order.amount > 100 and #order.status == '已确认'",
120
+ difficulty: 'medium',
121
+ category: 'logical',
122
+ },
123
+ {
124
+ nl: 'amount > 100 and status == done',
125
+ spel: "#order.amount > 100 and #order.status == 'done'",
126
+ difficulty: 'medium',
127
+ category: 'logical',
128
+ },
129
+ {
130
+ nl: '金额大于500或已发货',
131
+ spel: "#order.amount > 500 or #order.status == '已发货'",
132
+ difficulty: 'medium',
133
+ category: 'logical',
134
+ },
135
+ {
136
+ nl: '年龄在18到60之间',
137
+ spel: '#user.age between {18, 60}',
138
+ difficulty: 'medium',
139
+ category: 'range',
140
+ },
141
+ {
142
+ nl: 'amount between 100 and 500',
143
+ spel: '#order.amount between {100, 500}',
144
+ difficulty: 'medium',
145
+ category: 'range',
146
+ },
147
+ {
148
+ nl: '订单备注包含加急',
149
+ spel: "#order.remark.contains('加急')",
150
+ difficulty: 'medium',
151
+ category: 'string',
152
+ },
153
+ {
154
+ nl: 'name contains test',
155
+ spel: "#order.name.contains('test')",
156
+ difficulty: 'medium',
157
+ category: 'string',
158
+ },
159
+ // Hard (4 examples)
160
+ {
161
+ nl: '金额大于1000且状态为已发货且用户是VIP',
162
+ spel: "#order.amount > 1000 and #order.status == '已发货' and #user.vip == true",
163
+ difficulty: 'hard',
164
+ category: 'complex_logical',
165
+ },
166
+ {
167
+ nl: '筛选出所有金额大于1000的订单',
168
+ spel: '#order.items.?[#this.amount > 1000]',
169
+ difficulty: 'hard',
170
+ category: 'selection',
171
+ },
172
+ {
173
+ nl: 'amount > 500 and (status == done or status == shipped)',
174
+ spel: "#order.amount > 500 and (#order.status == 'done' or #order.status == 'shipped')",
175
+ difficulty: 'hard',
176
+ category: 'complex_logical',
177
+ },
178
+ {
179
+ nl: '订单中第一个金额大于1000的商品',
180
+ spel: '#order.items.^[#this.amount > 1000]',
181
+ difficulty: 'hard',
182
+ category: 'selection',
183
+ },
184
+ ];
185
+ export class PromptBuilder {
186
+ formatter = new SchemaFormatter();
187
+ /**
188
+ * Build a complete LLM Prompt
189
+ */
190
+ build(userInput, contextSchema, options = {}) {
191
+ const lang = options.language ?? 'zh';
192
+ const includeEBNF = options.includeEBNF ?? true;
193
+ const systemPrompt = lang === 'zh' ? SYSTEM_PROMPT_ZH : SYSTEM_PROMPT_EN;
194
+ // Build user prompt
195
+ const parts = [this.buildExamples(lang)];
196
+ if (contextSchema && contextSchema.root) {
197
+ parts.push(this.formatter.formatForLLM(contextSchema));
198
+ }
199
+ if (includeEBNF) {
200
+ parts.push(SPEL_EBNF_GRAMMAR);
201
+ }
202
+ parts.push(`## User Input\n${userInput}\n\n## SpEL Expression\n`);
203
+ const user = parts.join('\n\n');
204
+ return {
205
+ system: systemPrompt,
206
+ user,
207
+ contextSchema: contextSchema ?? {
208
+ root: null,
209
+ variables: {},
210
+ beans: {},
211
+ types: {},
212
+ functions: {},
213
+ },
214
+ examples: FEWSHOT_EXAMPLES,
215
+ };
216
+ }
217
+ /**
218
+ * Build Few-Shot example string
219
+ */
220
+ buildExamples(lang) {
221
+ const lines = [];
222
+ const examples = lang === 'zh'
223
+ ? FEWSHOT_EXAMPLES
224
+ : FEWSHOT_EXAMPLES.filter(e =>
225
+ // Include all English-leaning examples
226
+ e.nl === e.nl.toLowerCase() ||
227
+ e.category === 'comparison' ||
228
+ e.category === 'logical');
229
+ if (lang === 'zh') {
230
+ lines.push('## Examples (Few-Shot)');
231
+ }
232
+ else {
233
+ lines.push('## Few-Shot Examples');
234
+ }
235
+ for (const example of examples) {
236
+ lines.push(`NL: ${example.nl}`);
237
+ lines.push(`SpEL: ${example.spel}`);
238
+ lines.push('');
239
+ }
240
+ return lines.join('\n');
241
+ }
242
+ }
243
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/template/prompts/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { NLIntent } from './nl-intent.js';
2
+ import type { IntentResult } from './intent-classifier.js';
3
+ import type { ContextSchema } from '../SpelEvaluator.js';
4
+ export interface TemplateResult {
5
+ /** Generated SpEL expression */
6
+ expression: string;
7
+ /** Intent used */
8
+ intent: NLIntent;
9
+ /** Template name used */
10
+ templateName: string;
11
+ /** Confidence */
12
+ confidence: number;
13
+ /** Unfilled slots needing further LLM processing */
14
+ unfilledSlots: string[];
15
+ }
16
+ export declare class TemplateEngine {
17
+ private contextSchema?;
18
+ constructor(contextSchema?: ContextSchema);
19
+ setContext(schema: ContextSchema): void;
20
+ /**
21
+ * Generate a SpEL expression based on intent classification results
22
+ */
23
+ generate(input: string, intentResult: IntentResult): TemplateResult | null;
24
+ private selectBestTemplate;
25
+ private fillTemplate;
26
+ }
27
+ //# sourceMappingURL=template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../../src/template/template-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IAEnB,kBAAkB;IAClB,MAAM,EAAE,QAAQ,CAAC;IAEjB,yBAAyB;IACzB,YAAY,EAAE,MAAM,CAAC;IAErB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IAEnB,oDAAoD;IACpD,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAuPD,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,aAAa,CAAC,EAAE,aAAa;IAIlC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAI9C;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI;IAsBjF,OAAO,CAAC,kBAAkB;IA4C1B,OAAO,CAAC,YAAY;CAmHrB"}