@loonylabs/llm-middleware 2.7.0 → 2.8.1
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.
- package/README.md +98 -0
- package/dist/middleware/services/index.d.ts +1 -0
- package/dist/middleware/services/index.d.ts.map +1 -1
- package/dist/middleware/services/index.js +1 -0
- package/dist/middleware/services/index.js.map +1 -1
- package/dist/middleware/services/response-processor/types.d.ts +106 -0
- package/dist/middleware/services/response-processor/types.d.ts.map +1 -0
- package/dist/middleware/services/response-processor/types.js +15 -0
- package/dist/middleware/services/response-processor/types.js.map +1 -0
- package/dist/middleware/services/response-processor.service.d.ts +37 -3
- package/dist/middleware/services/response-processor.service.d.ts.map +1 -1
- package/dist/middleware/services/response-processor.service.js +76 -5
- package/dist/middleware/services/response-processor.service.js.map +1 -1
- package/dist/middleware/usecases/base/base-ai.usecase.d.ts +32 -0
- package/dist/middleware/usecases/base/base-ai.usecase.d.ts.map +1 -1
- package/dist/middleware/usecases/base/base-ai.usecase.js +38 -3
- package/dist/middleware/usecases/base/base-ai.usecase.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -714,6 +714,104 @@ For detailed documentation about all parameters, value ranges, and preset config
|
|
|
714
714
|
|
|
715
715
|
</details>
|
|
716
716
|
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
### 🔧 Response Processing Options (v2.8.0)
|
|
720
|
+
|
|
721
|
+
<details>
|
|
722
|
+
<summary><strong>📦 Configurable Response Processing</strong></summary>
|
|
723
|
+
|
|
724
|
+
Starting in v2.8.0, you can customize how responses are processed with `ResponseProcessingOptions`:
|
|
725
|
+
|
|
726
|
+
#### Available Options
|
|
727
|
+
|
|
728
|
+
```typescript
|
|
729
|
+
interface ResponseProcessingOptions {
|
|
730
|
+
extractThinkTags?: boolean; // default: true
|
|
731
|
+
extractMarkdown?: boolean; // default: true
|
|
732
|
+
validateJson?: boolean; // default: true
|
|
733
|
+
cleanJson?: boolean; // default: true
|
|
734
|
+
recipeMode?: 'conservative' | 'aggressive' | 'adaptive';
|
|
735
|
+
}
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
#### Usage in Use Cases
|
|
739
|
+
|
|
740
|
+
Override `getResponseProcessingOptions()` to customize processing:
|
|
741
|
+
|
|
742
|
+
```typescript
|
|
743
|
+
// Plain text response (compression, summarization)
|
|
744
|
+
class CompressEntityUseCase extends BaseAIUseCase {
|
|
745
|
+
protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
746
|
+
return {
|
|
747
|
+
extractThinkTags: true, // YES: Extract <think> tags
|
|
748
|
+
extractMarkdown: true, // YES: Extract markdown blocks
|
|
749
|
+
validateJson: false, // NO: Skip JSON validation
|
|
750
|
+
cleanJson: false // NO: Skip JSON cleaning
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// Keep think tags in content
|
|
756
|
+
class DebugUseCase extends BaseAIUseCase {
|
|
757
|
+
protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
758
|
+
return {
|
|
759
|
+
extractThinkTags: false // Keep <think> tags visible
|
|
760
|
+
};
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// Conservative JSON cleaning
|
|
765
|
+
class StrictJsonUseCase extends BaseAIUseCase {
|
|
766
|
+
protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
767
|
+
return {
|
|
768
|
+
recipeMode: 'conservative' // Minimal JSON fixes
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
#### Direct Service Usage
|
|
775
|
+
|
|
776
|
+
You can also use `ResponseProcessorService` directly:
|
|
777
|
+
|
|
778
|
+
```typescript
|
|
779
|
+
import { ResponseProcessorService, ResponseProcessingOptions } from '@loonylabs/llm-middleware';
|
|
780
|
+
|
|
781
|
+
// Plain text (no JSON processing)
|
|
782
|
+
const result = await ResponseProcessorService.processResponseAsync(response, {
|
|
783
|
+
validateJson: false,
|
|
784
|
+
cleanJson: false
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
// Extract markdown but skip JSON
|
|
788
|
+
const result2 = await ResponseProcessorService.processResponseAsync(response, {
|
|
789
|
+
extractMarkdown: true,
|
|
790
|
+
validateJson: false
|
|
791
|
+
});
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
#### Use Cases
|
|
795
|
+
|
|
796
|
+
- ✅ **Plain text responses**: Compression, summarization, text generation
|
|
797
|
+
- ✅ **Pre-validated JSON**: Skip redundant validation
|
|
798
|
+
- ✅ **Debug/analysis**: Keep think tags in content
|
|
799
|
+
- ✅ **Performance**: Skip unnecessary processing steps
|
|
800
|
+
- ✅ **Custom workflows**: Mix and match extraction features
|
|
801
|
+
|
|
802
|
+
#### Backward Compatibility
|
|
803
|
+
|
|
804
|
+
All options are **optional** with sensible defaults. Existing code works without changes:
|
|
805
|
+
|
|
806
|
+
```typescript
|
|
807
|
+
// Still works exactly as before
|
|
808
|
+
const result = await ResponseProcessorService.processResponseAsync(response);
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
</details>
|
|
812
|
+
|
|
813
|
+
---
|
|
814
|
+
|
|
717
815
|
## 🤝 Contributing
|
|
718
816
|
|
|
719
817
|
We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
|
|
@@ -2,6 +2,7 @@ export * from './llm';
|
|
|
2
2
|
export * from './json-cleaner';
|
|
3
3
|
export * from './request-formatter';
|
|
4
4
|
export * from './response-processor.service';
|
|
5
|
+
export * from './response-processor/types';
|
|
5
6
|
export * from './model-parameter-manager';
|
|
6
7
|
export * from './token-estimator';
|
|
7
8
|
export * from './flat-formatter';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/services/index.ts"],"names":[],"mappings":"AACA,cAAc,OAAO,CAAC;AACtB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/middleware/services/index.ts"],"names":[],"mappings":"AACA,cAAc,OAAO,CAAC;AACtB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC"}
|
|
@@ -19,6 +19,7 @@ __exportStar(require("./llm"), exports);
|
|
|
19
19
|
__exportStar(require("./json-cleaner"), exports);
|
|
20
20
|
__exportStar(require("./request-formatter"), exports);
|
|
21
21
|
__exportStar(require("./response-processor.service"), exports);
|
|
22
|
+
__exportStar(require("./response-processor/types"), exports);
|
|
22
23
|
__exportStar(require("./model-parameter-manager"), exports);
|
|
23
24
|
__exportStar(require("./token-estimator"), exports);
|
|
24
25
|
__exportStar(require("./flat-formatter"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gBAAgB;AAChB,wCAAsB;AACtB,iDAA+B;AAC/B,sDAAoC;AACpC,+DAA6C;AAC7C,4DAA0C;AAC1C,oDAAkC;AAClC,mDAAiC;AAEjC,mBAAmB;AACnB,qDAAmC;AACnC,4DAA0C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gBAAgB;AAChB,wCAAsB;AACtB,iDAA+B;AAC/B,sDAAoC;AACpC,+DAA6C;AAC7C,6DAA2C;AAC3C,4DAA0C;AAC1C,oDAAkC;AAClC,mDAAiC;AAEjC,mBAAmB;AACnB,qDAAmC;AACnC,4DAA0C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for configuring response processing behavior
|
|
3
|
+
*
|
|
4
|
+
* @since 2.8.0
|
|
5
|
+
*/
|
|
6
|
+
export interface ResponseProcessingOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Whether to extract and remove <think> tags from the response
|
|
9
|
+
*
|
|
10
|
+
* @default true
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Extract thinking content
|
|
14
|
+
* const result = await processResponseAsync(response, { extractThinkTags: true });
|
|
15
|
+
* console.log(result.thinking); // Content from <think> tags
|
|
16
|
+
*
|
|
17
|
+
* // Keep thinking in main content
|
|
18
|
+
* const result = await processResponseAsync(response, { extractThinkTags: false });
|
|
19
|
+
* console.log(result.thinking); // Empty string
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
extractThinkTags?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether to extract content from markdown code blocks (```json, ```text, etc.)
|
|
25
|
+
*
|
|
26
|
+
* @default true
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Extract from markdown blocks
|
|
30
|
+
* const result = await processResponseAsync('```json\n{"key": "value"}\n```', {
|
|
31
|
+
* extractMarkdown: true
|
|
32
|
+
* });
|
|
33
|
+
* console.log(result.cleanedJson); // '{"key": "value"}'
|
|
34
|
+
*
|
|
35
|
+
* // Keep markdown syntax
|
|
36
|
+
* const result = await processResponseAsync('```json\n{"key": "value"}\n```', {
|
|
37
|
+
* extractMarkdown: false
|
|
38
|
+
* });
|
|
39
|
+
* console.log(result.cleanedJson); // '```json\n{"key": "value"}\n```'
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
extractMarkdown?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Whether to validate that the response is valid JSON
|
|
45
|
+
*
|
|
46
|
+
* Set to `false` for use cases that expect plain text responses
|
|
47
|
+
* (e.g., compression, summarization, plain text generation)
|
|
48
|
+
*
|
|
49
|
+
* @default true
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // For plain text responses (no JSON validation)
|
|
53
|
+
* const result = await processResponseAsync('This is plain text', {
|
|
54
|
+
* validateJson: false
|
|
55
|
+
* });
|
|
56
|
+
* // No JSON validation errors
|
|
57
|
+
*
|
|
58
|
+
* // For JSON responses (with validation)
|
|
59
|
+
* const result = await processResponseAsync('{"key": "value"}', {
|
|
60
|
+
* validateJson: true
|
|
61
|
+
* });
|
|
62
|
+
* // Validates JSON structure
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
validateJson?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Whether to apply JSON cleaning strategies to fix common issues
|
|
68
|
+
*
|
|
69
|
+
* Set to `false` for use cases that expect plain text or pre-validated JSON
|
|
70
|
+
* Has no effect if `validateJson` is `false`
|
|
71
|
+
*
|
|
72
|
+
* @default true
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // For responses that might have JSON issues
|
|
76
|
+
* const result = await processResponseAsync('{"key": "value",}', {
|
|
77
|
+
* cleanJson: true
|
|
78
|
+
* });
|
|
79
|
+
* // Fixes trailing comma
|
|
80
|
+
*
|
|
81
|
+
* // For pre-validated or plain text responses
|
|
82
|
+
* const result = await processResponseAsync('Plain text response', {
|
|
83
|
+
* cleanJson: false,
|
|
84
|
+
* validateJson: false
|
|
85
|
+
* });
|
|
86
|
+
* // No cleaning applied
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
cleanJson?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Recipe system mode for JSON cleaning (only used if cleanJson is true)
|
|
92
|
+
*
|
|
93
|
+
* - 'conservative': Minimal fixes, preserves original structure
|
|
94
|
+
* - 'aggressive': More fixes, may modify structure for valid JSON
|
|
95
|
+
* - 'adaptive': Automatically chooses strategy based on response
|
|
96
|
+
*
|
|
97
|
+
* @default 'adaptive'
|
|
98
|
+
*/
|
|
99
|
+
recipeMode?: 'conservative' | 'aggressive' | 'adaptive';
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Default options for response processing
|
|
103
|
+
* Ensures backward compatibility with existing behavior
|
|
104
|
+
*/
|
|
105
|
+
export declare const DEFAULT_RESPONSE_PROCESSING_OPTIONS: Required<ResponseProcessingOptions>;
|
|
106
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/middleware/services/response-processor/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,UAAU,CAAC;CACzD;AAED;;;GAGG;AACH,eAAO,MAAM,mCAAmC,EAAE,QAAQ,CAAC,yBAAyB,CAMnF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RESPONSE_PROCESSING_OPTIONS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Default options for response processing
|
|
6
|
+
* Ensures backward compatibility with existing behavior
|
|
7
|
+
*/
|
|
8
|
+
exports.DEFAULT_RESPONSE_PROCESSING_OPTIONS = {
|
|
9
|
+
extractThinkTags: true,
|
|
10
|
+
extractMarkdown: true,
|
|
11
|
+
validateJson: true,
|
|
12
|
+
cleanJson: true,
|
|
13
|
+
recipeMode: 'adaptive'
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/middleware/services/response-processor/types.ts"],"names":[],"mappings":";;;AAyGA;;;GAGG;AACU,QAAA,mCAAmC,GAAwC;IACtF,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,UAAU;CACvB,CAAC"}
|
|
@@ -1,16 +1,50 @@
|
|
|
1
1
|
import { CleanedJsonResult } from './json-cleaner';
|
|
2
|
+
import { ResponseProcessingOptions } from './response-processor/types';
|
|
2
3
|
/**
|
|
3
4
|
* Service for processing AI model responses
|
|
4
5
|
* Handles JSON cleaning, content extraction, and response validation
|
|
5
6
|
*/
|
|
6
7
|
export declare class ResponseProcessorService {
|
|
7
8
|
/**
|
|
8
|
-
* Process the raw AI response
|
|
9
|
-
*
|
|
9
|
+
* Process the raw AI response with configurable options
|
|
10
|
+
*
|
|
10
11
|
* @param response The raw response from the AI model
|
|
12
|
+
* @param options Processing options to control extraction and validation behavior
|
|
11
13
|
* @returns Processed content with thinking extracted
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Default behavior (backward compatible)
|
|
18
|
+
* const result = await processResponseAsync(response);
|
|
19
|
+
*
|
|
20
|
+
* // Plain text response (skip JSON cleaning)
|
|
21
|
+
* const result = await processResponseAsync(response, {
|
|
22
|
+
* extractThinkTags: true,
|
|
23
|
+
* extractMarkdown: true,
|
|
24
|
+
* validateJson: false,
|
|
25
|
+
* cleanJson: false
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Custom processing
|
|
29
|
+
* const result = await processResponseAsync(response, {
|
|
30
|
+
* extractThinkTags: false, // Keep <think> in content
|
|
31
|
+
* cleanJson: true, // Clean JSON
|
|
32
|
+
* recipeMode: 'conservative'
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @since 2.8.0
|
|
12
37
|
*/
|
|
13
|
-
static processResponseAsync(response: string): Promise<CleanedJsonResult>;
|
|
38
|
+
static processResponseAsync(response: string, options?: ResponseProcessingOptions): Promise<CleanedJsonResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Extract content from markdown code blocks
|
|
41
|
+
* Handles ```json, ```text, ``` blocks
|
|
42
|
+
*
|
|
43
|
+
* @param response The response potentially containing markdown
|
|
44
|
+
* @returns Content without markdown wrappers
|
|
45
|
+
* @private
|
|
46
|
+
*/
|
|
47
|
+
private static extractMarkdownContent;
|
|
14
48
|
/**
|
|
15
49
|
* Extract only the thinking content from a response
|
|
16
50
|
* @param response The raw response from the AI model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-processor.service.d.ts","sourceRoot":"","sources":["../../../src/middleware/services/response-processor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"response-processor.service.d.ts","sourceRoot":"","sources":["../../../src/middleware/services/response-processor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAuC,MAAM,4BAA4B,CAAC;AAE5G;;;GAGG;AACH,qBAAa,wBAAwB;IAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;WACiB,oBAAoB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,iBAAiB,CAAC;IAwC7B;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IASrC;;;;OAIG;WACW,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAKvD;;;;OAIG;WACW,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAItD;;;;OAIG;WACW,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG;QACvD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB;IASD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B;;;;OAIG;WACW,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUrD;;;;OAIG;WACiB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAevE;;;;OAIG;WACiB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACrE,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,iBAAiB,CAAC;QAC3B,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,OAAO,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,EAAE;YACL,cAAc,EAAE,MAAM,CAAC;YACvB,aAAa,EAAE,MAAM,CAAC;YACtB,cAAc,EAAE,MAAM,CAAC;YACvB,aAAa,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;IAuBF;;;;OAIG;WACW,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAyBtD;;;;OAIG;WACW,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;QAC/C,eAAe,EAAE,OAAO,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QACvC,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;KACnC;IAsCD;;;;OAIG;WACW,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAChD,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACnC,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;CAiDF"}
|
|
@@ -2,20 +2,91 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ResponseProcessorService = void 0;
|
|
4
4
|
const json_cleaner_1 = require("./json-cleaner");
|
|
5
|
+
const types_1 = require("./response-processor/types");
|
|
5
6
|
/**
|
|
6
7
|
* Service for processing AI model responses
|
|
7
8
|
* Handles JSON cleaning, content extraction, and response validation
|
|
8
9
|
*/
|
|
9
10
|
class ResponseProcessorService {
|
|
10
11
|
/**
|
|
11
|
-
* Process the raw AI response
|
|
12
|
-
*
|
|
12
|
+
* Process the raw AI response with configurable options
|
|
13
|
+
*
|
|
13
14
|
* @param response The raw response from the AI model
|
|
15
|
+
* @param options Processing options to control extraction and validation behavior
|
|
14
16
|
* @returns Processed content with thinking extracted
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // Default behavior (backward compatible)
|
|
21
|
+
* const result = await processResponseAsync(response);
|
|
22
|
+
*
|
|
23
|
+
* // Plain text response (skip JSON cleaning)
|
|
24
|
+
* const result = await processResponseAsync(response, {
|
|
25
|
+
* extractThinkTags: true,
|
|
26
|
+
* extractMarkdown: true,
|
|
27
|
+
* validateJson: false,
|
|
28
|
+
* cleanJson: false
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Custom processing
|
|
32
|
+
* const result = await processResponseAsync(response, {
|
|
33
|
+
* extractThinkTags: false, // Keep <think> in content
|
|
34
|
+
* cleanJson: true, // Clean JSON
|
|
35
|
+
* recipeMode: 'conservative'
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @since 2.8.0
|
|
15
40
|
*/
|
|
16
|
-
static async processResponseAsync(response) {
|
|
17
|
-
//
|
|
18
|
-
|
|
41
|
+
static async processResponseAsync(response, options = {}) {
|
|
42
|
+
// Merge with defaults for backward compatibility
|
|
43
|
+
const opts = {
|
|
44
|
+
...types_1.DEFAULT_RESPONSE_PROCESSING_OPTIONS,
|
|
45
|
+
...options
|
|
46
|
+
};
|
|
47
|
+
let thinking = '';
|
|
48
|
+
let content = response;
|
|
49
|
+
// Step 1: Extract thinking tags if enabled
|
|
50
|
+
if (opts.extractThinkTags) {
|
|
51
|
+
thinking = this.extractThinking(content);
|
|
52
|
+
content = this.extractContent(content);
|
|
53
|
+
}
|
|
54
|
+
// Step 2: Extract markdown if enabled
|
|
55
|
+
if (opts.extractMarkdown) {
|
|
56
|
+
content = this.extractMarkdownContent(content);
|
|
57
|
+
}
|
|
58
|
+
// Step 3: Clean/validate JSON if enabled
|
|
59
|
+
if (opts.validateJson || opts.cleanJson) {
|
|
60
|
+
// Only call JsonCleaner if content is not empty
|
|
61
|
+
if (content && content.trim().length > 0) {
|
|
62
|
+
const cleaned = await json_cleaner_1.JsonCleanerService.processResponseAsync(content);
|
|
63
|
+
content = cleaned.cleanedJson;
|
|
64
|
+
// Preserve thinking from JsonCleaner if we didn't extract it ourselves
|
|
65
|
+
if (!opts.extractThinkTags && cleaned.thinking) {
|
|
66
|
+
thinking = cleaned.thinking;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
cleanedJson: content,
|
|
72
|
+
thinking
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract content from markdown code blocks
|
|
77
|
+
* Handles ```json, ```text, ``` blocks
|
|
78
|
+
*
|
|
79
|
+
* @param response The response potentially containing markdown
|
|
80
|
+
* @returns Content without markdown wrappers
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
83
|
+
static extractMarkdownContent(response) {
|
|
84
|
+
// Check for markdown code blocks
|
|
85
|
+
const markdownMatch = response.match(/```(?:json|text|)?\s*([\s\S]*?)\s*```/);
|
|
86
|
+
if (markdownMatch && markdownMatch[1]) {
|
|
87
|
+
return markdownMatch[1].trim();
|
|
88
|
+
}
|
|
89
|
+
return response;
|
|
19
90
|
}
|
|
20
91
|
/**
|
|
21
92
|
* Extract only the thinking content from a response
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-processor.service.js","sourceRoot":"","sources":["../../../src/middleware/services/response-processor.service.ts"],"names":[],"mappings":";;;AAAA,iDAAuE;
|
|
1
|
+
{"version":3,"file":"response-processor.service.js","sourceRoot":"","sources":["../../../src/middleware/services/response-processor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { LLMProvider } from '../../services/llm';
|
|
2
2
|
import { ModelConfigKey, ValidatedLLMModelConfig } from '../../shared/config/models.config';
|
|
3
|
+
import { ResponseProcessingOptions } from '../../services/response-processor/types';
|
|
3
4
|
import { BaseAIRequest, BaseAIResult } from '../../shared/types/base-request.types';
|
|
4
5
|
import { ModelParameterOverrides } from '../../services/model-parameter-manager/model-parameter-manager.service';
|
|
5
6
|
/**
|
|
@@ -75,9 +76,40 @@ export declare abstract class BaseAIUseCase<TPrompt = string, TRequest extends B
|
|
|
75
76
|
* @returns The result of the AI processing
|
|
76
77
|
*/
|
|
77
78
|
execute(request: TRequest): Promise<TResult>;
|
|
79
|
+
/**
|
|
80
|
+
* Get response processing options for this use case
|
|
81
|
+
* Override in specific use cases to customize processing behavior
|
|
82
|
+
*
|
|
83
|
+
* @returns Options for response processing
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // For plain text responses (compression, summarization)
|
|
88
|
+
* protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
89
|
+
* return {
|
|
90
|
+
* extractThinkTags: true, // YES: Extract <think> tags
|
|
91
|
+
* extractMarkdown: true, // YES: Extract markdown blocks
|
|
92
|
+
* validateJson: false, // NO: Skip JSON validation
|
|
93
|
+
* cleanJson: false // NO: Skip JSON cleaning
|
|
94
|
+
* };
|
|
95
|
+
* }
|
|
96
|
+
*
|
|
97
|
+
* // For conservative JSON cleaning
|
|
98
|
+
* protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
99
|
+
* return {
|
|
100
|
+
* recipeMode: 'conservative'
|
|
101
|
+
* };
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @since 2.8.0
|
|
106
|
+
*/
|
|
107
|
+
protected getResponseProcessingOptions(): ResponseProcessingOptions;
|
|
78
108
|
/**
|
|
79
109
|
* Process the raw AI response using the modern Recipe System
|
|
80
110
|
* Can be overridden by specific use cases if special processing is needed
|
|
111
|
+
*
|
|
112
|
+
* @since 2.8.0 - Now uses getResponseProcessingOptions() for configurable processing
|
|
81
113
|
*/
|
|
82
114
|
protected processResponse(response: string): Promise<{
|
|
83
115
|
cleanedJson: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-ai.usecase.d.ts","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAkB,cAAc,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5G,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,EAAgC,uBAAuB,EAAE,MAAM,wEAAwE,CAAC;AAG/I;;;;;;GAMG;AACH,8BAAsB,aAAa,CACjC,OAAO,GAAG,MAAM,EAChB,QAAQ,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAChE,OAAO,SAAS,YAAY,GAAG,YAAY;IAE3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAElD;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,cAAc,CAAY;IAE9E;;;OAGG;IACH,SAAS,KAAK,cAAc,IAAI,cAAc,CAE7C;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,uBAAuB;IAI9E;;;OAGG;IACH,SAAS,KAAK,WAAW,IAAI,uBAAuB,CAEnD;IAED;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAShD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM;IAEzE;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,IAAI,uBAAuB;IAI1D;;;;OAIG;IACH,SAAS,CAAC,WAAW,IAAI,WAAW;IAIpC;;;;OAIG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA+HzD
|
|
1
|
+
{"version":3,"file":"base-ai.usecase.d.ts","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAkB,cAAc,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAE5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,EAAgC,uBAAuB,EAAE,MAAM,wEAAwE,CAAC;AAG/I;;;;;;GAMG;AACH,8BAAsB,aAAa,CACjC,OAAO,GAAG,MAAM,EAChB,QAAQ,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAChE,OAAO,SAAS,YAAY,GAAG,YAAY;IAE3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAElD;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,EAAE,cAAc,CAAY;IAE9E;;;OAGG;IACH,SAAS,KAAK,cAAc,IAAI,cAAc,CAE7C;IAED;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,uBAAuB;IAI9E;;;OAGG;IACH,SAAS,KAAK,WAAW,IAAI,uBAAuB,CAEnD;IAED;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAShD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM;IAEzE;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,IAAI,uBAAuB;IAI1D;;;;OAIG;IACH,SAAS,CAAC,WAAW,IAAI,WAAW;IAIpC;;;;OAIG;IACU,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA+HzD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,CAAC,4BAA4B,IAAI,yBAAyB;IAKnE;;;;;OAKG;cACa,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAKrG;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;CACjG"}
|
|
@@ -122,8 +122,8 @@ class BaseAIUseCase {
|
|
|
122
122
|
if (!result || !result.message) {
|
|
123
123
|
throw new Error('No response received from the LLM provider');
|
|
124
124
|
}
|
|
125
|
-
// Process the response using
|
|
126
|
-
const { cleanedJson: processedContent, thinking: extractedThinking } = await
|
|
125
|
+
// Process the response using processResponse() method (uses getResponseProcessingOptions())
|
|
126
|
+
const { cleanedJson: processedContent, thinking: extractedThinking } = await this.processResponse(result.message.content);
|
|
127
127
|
thinking = extractedThinking;
|
|
128
128
|
success = true;
|
|
129
129
|
// Extract actual token counts from provider response if available
|
|
@@ -152,12 +152,47 @@ class BaseAIUseCase {
|
|
|
152
152
|
throw error;
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Get response processing options for this use case
|
|
157
|
+
* Override in specific use cases to customize processing behavior
|
|
158
|
+
*
|
|
159
|
+
* @returns Options for response processing
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* // For plain text responses (compression, summarization)
|
|
164
|
+
* protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
165
|
+
* return {
|
|
166
|
+
* extractThinkTags: true, // YES: Extract <think> tags
|
|
167
|
+
* extractMarkdown: true, // YES: Extract markdown blocks
|
|
168
|
+
* validateJson: false, // NO: Skip JSON validation
|
|
169
|
+
* cleanJson: false // NO: Skip JSON cleaning
|
|
170
|
+
* };
|
|
171
|
+
* }
|
|
172
|
+
*
|
|
173
|
+
* // For conservative JSON cleaning
|
|
174
|
+
* protected getResponseProcessingOptions(): ResponseProcessingOptions {
|
|
175
|
+
* return {
|
|
176
|
+
* recipeMode: 'conservative'
|
|
177
|
+
* };
|
|
178
|
+
* }
|
|
179
|
+
* ```
|
|
180
|
+
*
|
|
181
|
+
* @since 2.8.0
|
|
182
|
+
*/
|
|
183
|
+
getResponseProcessingOptions() {
|
|
184
|
+
// Default: Use all features (backward compatible)
|
|
185
|
+
return {};
|
|
186
|
+
}
|
|
155
187
|
/**
|
|
156
188
|
* Process the raw AI response using the modern Recipe System
|
|
157
189
|
* Can be overridden by specific use cases if special processing is needed
|
|
190
|
+
*
|
|
191
|
+
* @since 2.8.0 - Now uses getResponseProcessingOptions() for configurable processing
|
|
158
192
|
*/
|
|
159
193
|
async processResponse(response) {
|
|
160
|
-
|
|
194
|
+
const options = this.getResponseProcessingOptions();
|
|
195
|
+
return response_processor_service_1.ResponseProcessorService.processResponseAsync(response, options);
|
|
161
196
|
}
|
|
162
197
|
}
|
|
163
198
|
exports.BaseAIUseCase = BaseAIUseCase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-ai.usecase.js","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":";;;AAAA,4CAA6D;AAC7D,qEAA4G;AAC5G,0FAAqF;
|
|
1
|
+
{"version":3,"file":"base-ai.usecase.js","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loonylabs/llm-middleware",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.1",
|
|
4
4
|
"description": "Complete middleware infrastructure for LLM-based backends with multi-provider support (Ollama, Anthropic, OpenAI, Google)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|