@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,493 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { StrategyRouter } from '../strategy/strategy-router.js';
3
+ import { ProviderRegistry } from '../provider/provider-registry.js';
4
+ function createMockLLMProvider(name, responseText = '#order.amount > 1000', available = true) {
5
+ return {
6
+ name,
7
+ capabilities: {
8
+ maxContextTokens: 128000,
9
+ supportsGrammarConstraint: false,
10
+ supportsStreaming: true,
11
+ supportsStructuredOutput: true,
12
+ offlineAvailable: false,
13
+ estimatedCostPerRequest: 0.001,
14
+ estimatedLatencyMs: 2000,
15
+ },
16
+ generate: vi.fn().mockResolvedValue({
17
+ text: responseText,
18
+ model: 'mock-model',
19
+ usage: { promptTokens: 100, completionTokens: 50, totalTokens: 150 },
20
+ latencyMs: 100,
21
+ finishReason: 'stop',
22
+ providerName: name,
23
+ }),
24
+ isAvailable: vi.fn().mockResolvedValue(available),
25
+ };
26
+ }
27
+ describe('StrategyRouter', () => {
28
+ // ===== Easy: Pattern matching =====
29
+ describe('Layer 0: Pattern', () => {
30
+ it('should match simple Chinese comparison via pattern', async () => {
31
+ const registry = new ProviderRegistry();
32
+ const router = new StrategyRouter(registry, { patternMinConfidence: 0.7 });
33
+ const result = await router.generate('订单金额大于1000');
34
+ expect(result.strategy).toBe('pattern');
35
+ expect(result.expression).toContain('>');
36
+ expect(result.confidence).toBeGreaterThanOrEqual(0.9);
37
+ });
38
+ it('should match simple English comparison via pattern', async () => {
39
+ const registry = new ProviderRegistry();
40
+ const router = new StrategyRouter(registry);
41
+ const result = await router.generate('amount > 500');
42
+ expect(result.strategy).toBe('pattern');
43
+ expect(result.expression).toContain('>');
44
+ });
45
+ it('should match null check via pattern', async () => {
46
+ const registry = new ProviderRegistry();
47
+ const router = new StrategyRouter(registry);
48
+ const result = await router.generate('备注为空');
49
+ expect(result.strategy).toBe('pattern');
50
+ expect(result.expression).toContain('null');
51
+ });
52
+ it('should match hasrole via pattern', async () => {
53
+ const registry = new ProviderRegistry();
54
+ const router = new StrategyRouter(registry);
55
+ const result = await router.generate('用户是管理员');
56
+ expect(result.strategy).toBe('pattern');
57
+ expect(result.expression).toContain('hasRole');
58
+ });
59
+ });
60
+ // ===== Medium: Template layer =====
61
+ describe('Layer 1: Template', () => {
62
+ it('should use template or LLM when pattern confidence is low', async () => {
63
+ const registry = new ProviderRegistry();
64
+ registry.register(createMockLLMProvider('openai', "#order.amount > 100 and #order.status == '已确认'"));
65
+ const router = new StrategyRouter(registry, { patternMinConfidence: 1.0 });
66
+ // Setting very high pattern threshold forces non-pattern routes
67
+ const result = await router.generate('金额大于100且已确认');
68
+ // May use template or LLM — just verify expression exists
69
+ expect(result.expression.length).toBeGreaterThan(0);
70
+ });
71
+ });
72
+ // ===== LLM fallback =====
73
+ describe('Layer 2: LLM', () => {
74
+ it('should fallback to LLM for unmatched input', async () => {
75
+ const registry = new ProviderRegistry();
76
+ registry.register(createMockLLMProvider('openai', '#order.amount > 1000'));
77
+ const router = new StrategyRouter(registry);
78
+ const result = await router.generate('一个非常复杂的需要LLM处理的查询');
79
+ expect(result.strategy).toBe('llm-api');
80
+ expect(result.expression).toContain('#order');
81
+ });
82
+ it('should throw when no LLM providers available', async () => {
83
+ const registry = new ProviderRegistry();
84
+ const router = new StrategyRouter(registry);
85
+ await expect(router.generate('一个非常复杂的需要LLM处理的查询')).rejects.toThrow('No LLM providers');
86
+ });
87
+ it('should try next provider on failure', async () => {
88
+ const registry = new ProviderRegistry();
89
+ const failingProvider = createMockLLMProvider('failing');
90
+ failingProvider.generate = vi
91
+ .fn()
92
+ .mockRejectedValue(new Error('Service unavailable'));
93
+ const workingProvider = createMockLLMProvider('openai', '#order.amount > 1000');
94
+ registry.register(failingProvider);
95
+ registry.register(workingProvider);
96
+ const router = new StrategyRouter(registry);
97
+ // Make pattern not match by using low confidence threshold? No, use high threshold
98
+ // Actually, let's test via a non-matching input
99
+ });
100
+ });
101
+ // ===== Metadata =====
102
+ describe('Metadata', () => {
103
+ it('should include pattern ID for pattern matches', async () => {
104
+ const registry = new ProviderRegistry();
105
+ const router = new StrategyRouter(registry);
106
+ const result = await router.generate('订单金额大于1000');
107
+ expect(result.metadata.patternId).toBeDefined();
108
+ });
109
+ it('should include provider name for LLM matches', async () => {
110
+ const registry = new ProviderRegistry();
111
+ registry.register(createMockLLMProvider('openai', '#order.amount > 1000'));
112
+ const router = new StrategyRouter(registry);
113
+ // Use input that won't match any pattern
114
+ const result = await router.generate('复杂的多层嵌套查询需要deep analysis');
115
+ if (result.strategy === 'llm-api') {
116
+ expect(result.metadata.providerName).toBeDefined();
117
+ }
118
+ });
119
+ });
120
+ // ===== Latency tracking =====
121
+ describe('Latency', () => {
122
+ it('should track latency', async () => {
123
+ const registry = new ProviderRegistry();
124
+ const router = new StrategyRouter(registry);
125
+ const result = await router.generate('订单金额大于1000');
126
+ expect(result.latencyMs).toBeGreaterThanOrEqual(0);
127
+ });
128
+ });
129
+ // ============================================================
130
+ // ADDITIONAL COVERAGE TESTS
131
+ // ============================================================
132
+ // ===== LLM Provider Fallback Chain =====
133
+ describe('LLM Provider Fallback Chain', () => {
134
+ it('should fallback to second provider when first provider fails', async () => {
135
+ const registry = new ProviderRegistry();
136
+ const failingProvider = createMockLLMProvider('failing');
137
+ vi.mocked(failingProvider.generate).mockRejectedValue(new Error('Service unavailable'));
138
+ const workingProvider = createMockLLMProvider('openai', '#order.amount > 1000');
139
+ registry.register(failingProvider);
140
+ registry.register(workingProvider);
141
+ // High thresholds skip pattern and template, force LLM path
142
+ const router = new StrategyRouter(registry, {
143
+ patternMinConfidence: 1.0,
144
+ templateMinConfidence: 1.0,
145
+ });
146
+ const result = await router.generate('复杂的LLM查询无法匹配模式或模板');
147
+ expect(result.strategy).toBe('llm-api');
148
+ expect(result.metadata.providerName).toBe('openai');
149
+ expect(failingProvider.generate).toHaveBeenCalled();
150
+ expect(workingProvider.generate).toHaveBeenCalled();
151
+ });
152
+ it('should throw when all LLM providers are exhausted', async () => {
153
+ const registry = new ProviderRegistry();
154
+ const failing1 = createMockLLMProvider('fail1');
155
+ vi.mocked(failing1.generate).mockRejectedValue(new Error('Provider 1 failed'));
156
+ const failing2 = createMockLLMProvider('fail2');
157
+ vi.mocked(failing2.generate).mockRejectedValue(new Error('Provider 2 failed'));
158
+ registry.register(failing1);
159
+ registry.register(failing2);
160
+ const router = new StrategyRouter(registry, {
161
+ patternMinConfidence: 1.0,
162
+ templateMinConfidence: 1.0,
163
+ });
164
+ await expect(router.generate('复杂查询')).rejects.toThrow('All LLM providers failed');
165
+ });
166
+ });
167
+ // ===== Self-Correction =====
168
+ describe('Self-Correction', () => {
169
+ const contextSchema = {
170
+ root: {
171
+ name: 'order',
172
+ type: 'Order',
173
+ fields: {
174
+ amount: { type: 'number', description: 'Order amount' },
175
+ status: { type: 'string', description: 'Order status' },
176
+ },
177
+ methods: {},
178
+ },
179
+ variables: {},
180
+ beans: {},
181
+ types: {},
182
+ functions: {},
183
+ };
184
+ it('should skip self-correction when disabled', async () => {
185
+ const registry = new ProviderRegistry();
186
+ registry.register(createMockLLMProvider('openai', '#order.amount > 1000'));
187
+ const router = new StrategyRouter(registry, {
188
+ enableSelfCorrection: false,
189
+ patternMinConfidence: 1.0,
190
+ templateMinConfidence: 1.0,
191
+ });
192
+ const result = await router.generate('LLM查询', contextSchema);
193
+ expect(result.strategy).toBe('llm-api');
194
+ // Corrections stays 0 because self-correction is disabled
195
+ expect(result.metadata.corrections).toBe(0);
196
+ });
197
+ it('should run self-correction when enabled with contextSchema', async () => {
198
+ const registry = new ProviderRegistry();
199
+ registry.register(createMockLLMProvider('openai', '#order.amount > 1000'));
200
+ const router = new StrategyRouter(registry, {
201
+ enableSelfCorrection: true,
202
+ patternMinConfidence: 1.0,
203
+ templateMinConfidence: 1.0,
204
+ });
205
+ const result = await router.generate('LLM查询', contextSchema);
206
+ expect(result.strategy).toBe('llm-api');
207
+ // Self-correction was executed, corrections field populated
208
+ expect(result.metadata.corrections).toBeDefined();
209
+ });
210
+ });
211
+ // ===== forceLLMProvider =====
212
+ describe('forceLLMProvider', () => {
213
+ it('should prioritize the forced LLM provider when it exists', async () => {
214
+ const registry = new ProviderRegistry();
215
+ const primaryProvider = createMockLLMProvider('primary');
216
+ const forcedProvider = createMockLLMProvider('forced', '#forced.result > 100');
217
+ registry.register(primaryProvider);
218
+ registry.register(forcedProvider);
219
+ const router = new StrategyRouter(registry, {
220
+ patternMinConfidence: 1.0,
221
+ templateMinConfidence: 1.0,
222
+ });
223
+ const result = await router.generate('复杂查询', undefined, 'forced');
224
+ expect(result.strategy).toBe('llm-api');
225
+ expect(result.metadata.providerName).toBe('forced');
226
+ expect(result.expression).toContain('forced');
227
+ });
228
+ it('should fallback to default priority when forced provider does not exist', async () => {
229
+ const registry = new ProviderRegistry();
230
+ const provider = createMockLLMProvider('openai', '#order.amount > 1000');
231
+ registry.register(provider);
232
+ const router = new StrategyRouter(registry, {
233
+ patternMinConfidence: 1.0,
234
+ templateMinConfidence: 1.0,
235
+ });
236
+ const result = await router.generate('查询', undefined, 'nonexistent');
237
+ expect(result.strategy).toBe('llm-api');
238
+ expect(result.metadata.providerName).toBe('openai');
239
+ });
240
+ });
241
+ // ===== ContextSchema on Template Engine =====
242
+ describe('ContextSchema on Template Engine', () => {
243
+ it('should call setContext on template engine when contextSchema is provided', async () => {
244
+ const registry = new ProviderRegistry();
245
+ const router = new StrategyRouter(registry);
246
+ const contextSchema = {
247
+ root: {
248
+ name: 'order',
249
+ type: 'Order',
250
+ fields: {
251
+ amount: { type: 'number' },
252
+ },
253
+ methods: {},
254
+ },
255
+ variables: {},
256
+ beans: {},
257
+ types: {},
258
+ functions: {},
259
+ };
260
+ // This exercises the contextSchema branch in generate()
261
+ const result = await router.generate('订单金额大于1000', contextSchema);
262
+ expect(result).toBeDefined();
263
+ expect(result.strategy).toBe('pattern');
264
+ });
265
+ });
266
+ // ===== Template to LLM Fallback =====
267
+ describe('Template to LLM Fallback', () => {
268
+ it('should route to template when confidence meets threshold and no unfilled slots', async () => {
269
+ const registry = new ProviderRegistry();
270
+ const router = new StrategyRouter(registry, {
271
+ patternMinConfidence: 1.0, // skip all patterns
272
+ templateMinConfidence: 0.0, // accept any template confidence
273
+ });
274
+ // "价格大于5000" → COMPARISON intent → COMPARISON-SIMPLE template
275
+ // Template has all slots fillable → no unfilled slots
276
+ const result = await router.generate('价格大于5000');
277
+ expect(result.strategy).toBe('template');
278
+ expect(result.metadata.intent).toBeDefined();
279
+ expect(result.metadata.templateName).toBeDefined();
280
+ expect(result.expression).toContain('5000');
281
+ });
282
+ it('should skip to LLM when template result has unfilled slots', async () => {
283
+ const registry = new ProviderRegistry();
284
+ registry.register(createMockLLMProvider('openai', '#order.amount > 1000'));
285
+ const router = new StrategyRouter(registry, {
286
+ patternMinConfidence: 1.0, // skip pattern entirely
287
+ templateMinConfidence: 0.0, // accept any confidence
288
+ });
289
+ // Input triggers LOGICAL intent → LOGICAL-AND template has {left}/{right} unfilled
290
+ const result = await router.generate('金额大于100且状态为已确认');
291
+ // Should fall through to LLM because template has unfilled slots
292
+ expect(result.strategy).toBe('llm-api');
293
+ });
294
+ it('should skip to LLM when template confidence is below threshold', async () => {
295
+ const registry = new ProviderRegistry();
296
+ registry.register(createMockLLMProvider('openai', '#order.amount > 1000'));
297
+ const router = new StrategyRouter(registry, {
298
+ patternMinConfidence: 1.0, // skip pattern
299
+ templateMinConfidence: 0.99, // very high threshold
300
+ });
301
+ // Template confidence (0.9 * intentConfidence) will be < 0.99
302
+ const result = await router.generate('金额大于100');
303
+ expect(result.strategy).toBe('llm-api');
304
+ });
305
+ });
306
+ // ===== PromptBuilder Integration =====
307
+ describe('PromptBuilder Integration', () => {
308
+ it('should pass prompt from PromptBuilder to LLM provider', async () => {
309
+ const registry = new ProviderRegistry();
310
+ const provider = createMockLLMProvider('openai', '#order.amount > 1000');
311
+ registry.register(provider);
312
+ const router = new StrategyRouter(registry, {
313
+ enableSelfCorrection: false, // keep generate() call count predictable
314
+ patternMinConfidence: 1.0,
315
+ templateMinConfidence: 1.0,
316
+ });
317
+ await router.generate('复杂查询');
318
+ // Verify PromptBuilder.build result was passed to LLM provider
319
+ expect(provider.generate).toHaveBeenCalledWith(expect.objectContaining({
320
+ system: expect.stringContaining('SpEL'),
321
+ user: expect.stringContaining('复杂查询'),
322
+ }), expect.objectContaining({ timeout: 30000 }));
323
+ });
324
+ it('should include context schema in LLM prompt when provided', async () => {
325
+ const registry = new ProviderRegistry();
326
+ const provider = createMockLLMProvider('openai', '#order.amount > 1000');
327
+ registry.register(provider);
328
+ const contextSchema = {
329
+ root: {
330
+ name: 'order',
331
+ type: 'Order',
332
+ fields: {
333
+ amount: { type: 'number', description: 'Order amount' },
334
+ },
335
+ methods: {},
336
+ },
337
+ variables: {},
338
+ beans: {},
339
+ types: {},
340
+ functions: {},
341
+ };
342
+ const router = new StrategyRouter(registry, {
343
+ enableSelfCorrection: false,
344
+ patternMinConfidence: 1.0,
345
+ templateMinConfidence: 1.0,
346
+ });
347
+ await router.generate('复杂查询', contextSchema);
348
+ // Verify contextSchema was included in the prompt
349
+ expect(provider.generate).toHaveBeenCalledWith(expect.objectContaining({
350
+ contextSchema: expect.objectContaining({
351
+ root: expect.objectContaining({ name: 'order' }),
352
+ }),
353
+ }), expect.any(Object));
354
+ });
355
+ it('should return rawOutput from LLM response in metadata', async () => {
356
+ const registry = new ProviderRegistry();
357
+ const llmOutput = '#order.amount > 1000';
358
+ registry.register(createMockLLMProvider('openai', llmOutput));
359
+ const router = new StrategyRouter(registry, {
360
+ enableSelfCorrection: false,
361
+ patternMinConfidence: 1.0,
362
+ templateMinConfidence: 1.0,
363
+ });
364
+ const result = await router.generate('查询');
365
+ expect(result.strategy).toBe('llm-api');
366
+ expect(result.metadata.rawOutput).toBe(llmOutput);
367
+ });
368
+ });
369
+ // ===== Provider Availability =====
370
+ describe('Provider Availability', () => {
371
+ it('should filter out unavailable providers from prioritized list', async () => {
372
+ const registry = new ProviderRegistry();
373
+ // Provider with isAvailable() returning false
374
+ const unavailable = createMockLLMProvider('unavailable', '', false);
375
+ const available = createMockLLMProvider('available', '#order.amount > 1000', true);
376
+ registry.register(unavailable);
377
+ registry.register(available);
378
+ const router = new StrategyRouter(registry, {
379
+ patternMinConfidence: 1.0,
380
+ templateMinConfidence: 1.0,
381
+ });
382
+ const result = await router.generate('查询');
383
+ // Only the available provider should be used
384
+ expect(result.strategy).toBe('llm-api');
385
+ expect(result.metadata.providerName).toBe('available');
386
+ });
387
+ });
388
+ // ===== getPromptBuilder =====
389
+ describe('getPromptBuilder', () => {
390
+ it('should return the internal PromptBuilder instance', () => {
391
+ const registry = new ProviderRegistry();
392
+ const router = new StrategyRouter(registry);
393
+ const promptBuilder = router.getPromptBuilder();
394
+ expect(promptBuilder).toBeDefined();
395
+ expect(typeof promptBuilder.build).toBe('function');
396
+ });
397
+ });
398
+ // ===== getPatternMatcher =====
399
+ describe('getPatternMatcher', () => {
400
+ it('should return the internal PatternMatcher instance', () => {
401
+ const registry = new ProviderRegistry();
402
+ const router = new StrategyRouter(registry);
403
+ const matcher = router.getPatternMatcher();
404
+ expect(matcher).toBeDefined();
405
+ expect(typeof matcher.match).toBe('function');
406
+ expect(typeof matcher.register).toBe('function');
407
+ });
408
+ });
409
+ // ===== getTemplateEngine =====
410
+ describe('getTemplateEngine', () => {
411
+ it('should return the internal TemplateEngine instance', () => {
412
+ const registry = new ProviderRegistry();
413
+ const router = new StrategyRouter(registry);
414
+ const engine = router.getTemplateEngine();
415
+ expect(engine).toBeDefined();
416
+ expect(typeof engine.generate).toBe('function');
417
+ expect(typeof engine.setContext).toBe('function');
418
+ });
419
+ });
420
+ // ===== Pattern AutoFix Path =====
421
+ describe('Pattern AutoFix Path', () => {
422
+ it('should apply AutoFix when pattern produces expression with &&', async () => {
423
+ const registry = new ProviderRegistry();
424
+ const router = new StrategyRouter(registry);
425
+ // Inject a custom pattern whose spelTemplate contains JS operator &&
426
+ // This forces validation to fail and triggers the AutoFix path
427
+ router.getPatternMatcher().register({
428
+ id: 'TEST-JS-AND-OP',
429
+ match: /^autofixtest double ampersand$/,
430
+ spelTemplate: "#order.amount > 1000 && #order.status == 'confirmed'",
431
+ slots: {},
432
+ priority: 100,
433
+ tags: ['test'],
434
+ examples: [],
435
+ difficulty: 'easy',
436
+ confidence: 0.99,
437
+ });
438
+ const result = await router.generate('autofixtest double ampersand');
439
+ expect(result.strategy).toBe('pattern');
440
+ expect(result.metadata.patternId).toBe('TEST-JS-AND-OP');
441
+ // AutoFix should have replaced && with and
442
+ expect(result.expression).not.toContain('&&');
443
+ expect(result.expression).toContain('and');
444
+ // Confidence reduced by AutoFix multiplier (0.95)
445
+ expect(result.confidence).toBeLessThan(0.99);
446
+ });
447
+ it('should apply AutoFix when pattern produces expression with ||', async () => {
448
+ const registry = new ProviderRegistry();
449
+ const router = new StrategyRouter(registry);
450
+ // Inject a custom pattern whose spelTemplate contains JS operator ||
451
+ router.getPatternMatcher().register({
452
+ id: 'TEST-JS-OR-OP',
453
+ match: /^autofixtest double pipe$/,
454
+ spelTemplate: "#order.status == 'expired' || #order.amount > 10000",
455
+ slots: {},
456
+ priority: 100,
457
+ tags: ['test'],
458
+ examples: [],
459
+ difficulty: 'easy',
460
+ confidence: 0.99,
461
+ });
462
+ const result = await router.generate('autofixtest double pipe');
463
+ expect(result.strategy).toBe('pattern');
464
+ expect(result.metadata.patternId).toBe('TEST-JS-OR-OP');
465
+ // AutoFix should have replaced || with or
466
+ expect(result.expression).not.toContain('||');
467
+ expect(result.expression).toContain('or');
468
+ });
469
+ it('should apply AutoFix when pattern produces expression with ===', async () => {
470
+ const registry = new ProviderRegistry();
471
+ const router = new StrategyRouter(registry);
472
+ // Inject a custom pattern whose spelTemplate contains JS operator ===
473
+ router.getPatternMatcher().register({
474
+ id: 'TEST-JS-EQ-OP',
475
+ match: /^autofixtest triple equals$/,
476
+ spelTemplate: "#order.status === 'confirmed'",
477
+ slots: {},
478
+ priority: 100,
479
+ tags: ['test'],
480
+ examples: [],
481
+ difficulty: 'easy',
482
+ confidence: 0.99,
483
+ });
484
+ const result = await router.generate('autofixtest triple equals');
485
+ expect(result.strategy).toBe('pattern');
486
+ expect(result.metadata.patternId).toBe('TEST-JS-EQ-OP');
487
+ // AutoFix should have replaced === with ==
488
+ expect(result.expression).not.toContain('===');
489
+ expect(result.expression).toContain('==');
490
+ });
491
+ });
492
+ });
493
+ //# sourceMappingURL=strategy-router.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy-router.test.js","sourceRoot":"","sources":["../../src/__tests__/strategy-router.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=template-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/template-engine.test.ts"],"names":[],"mappings":""}