@loonylabs/llm-middleware 2.2.0 โ†’ 2.4.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 (26) hide show
  1. package/README.md +89 -5
  2. package/dist/examples/custom-config/custom-config.messages.d.ts +16 -0
  3. package/dist/examples/custom-config/custom-config.messages.d.ts.map +1 -0
  4. package/dist/examples/custom-config/custom-config.messages.js +32 -0
  5. package/dist/examples/custom-config/custom-config.messages.js.map +1 -0
  6. package/dist/examples/custom-config/custom-config.usecase.d.ts +81 -0
  7. package/dist/examples/custom-config/custom-config.usecase.d.ts.map +1 -0
  8. package/dist/examples/custom-config/custom-config.usecase.js +137 -0
  9. package/dist/examples/custom-config/custom-config.usecase.js.map +1 -0
  10. package/dist/examples/simple-chat/anthropic-chat.usecase.d.ts +25 -0
  11. package/dist/examples/simple-chat/anthropic-chat.usecase.d.ts.map +1 -0
  12. package/dist/examples/simple-chat/anthropic-chat.usecase.js +31 -0
  13. package/dist/examples/simple-chat/anthropic-chat.usecase.js.map +1 -0
  14. package/dist/examples/simple-chat/index.d.ts +2 -0
  15. package/dist/examples/simple-chat/index.d.ts.map +1 -1
  16. package/dist/examples/simple-chat/index.js +6 -0
  17. package/dist/examples/simple-chat/index.js.map +1 -1
  18. package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.d.ts +3 -1
  19. package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.d.ts.map +1 -1
  20. package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.js +65 -14
  21. package/dist/middleware/services/json-cleaner/parsers/json-extractor.parser.js.map +1 -1
  22. package/dist/middleware/usecases/base/base-ai.usecase.d.ts +16 -0
  23. package/dist/middleware/usecases/base/base-ai.usecase.d.ts.map +1 -1
  24. package/dist/middleware/usecases/base/base-ai.usecase.js +19 -1
  25. package/dist/middleware/usecases/base/base-ai.usecase.js.map +1 -1
  26. package/package.json +1 -1
package/README.md CHANGED
@@ -44,6 +44,7 @@
44
44
  - ๐Ÿ”œ **OpenAI, Google**: Planned for future releases
45
45
  - ๐Ÿ”Œ **Pluggable**: Easy to add custom providers - see [LLM Providers Guide](docs/LLM_PROVIDERS.md)
46
46
  - ๐Ÿงน **JSON Cleaning**: Recipe-based JSON repair system with automatic strategy selection
47
+ - โœจ **v2.4.0**: Enhanced array extraction support - properly handles JSON arrays `[...]` in addition to objects `{...}`
47
48
  - ๐ŸŽจ **FlatFormatter System**: Advanced data formatting for LLM consumption
48
49
  - ๐Ÿ“Š **Comprehensive Logging**: Multi-level logging with metadata support
49
50
  - โš™๏ธ **Configuration Management**: Flexible model and application configuration
@@ -77,7 +78,7 @@ npm install github:loonylabs-dev/llm-middleware#v1.3.0
77
78
  ### Basic Usage
78
79
 
79
80
  ```typescript
80
- import { BaseAIUseCase, BaseAIRequest, BaseAIResult } from '@loonylabs/llm-middleware';
81
+ import { BaseAIUseCase, BaseAIRequest, BaseAIResult, LLMProvider } from '@loonylabs/llm-middleware';
81
82
 
82
83
  // Define your request/response interfaces
83
84
  interface MyRequest extends BaseAIRequest<string> {
@@ -88,19 +89,19 @@ interface MyResult extends BaseAIResult {
88
89
  response: string;
89
90
  }
90
91
 
91
- // Create your use case
92
+ // Create your use case (uses Ollama by default)
92
93
  class MyChatUseCase extends BaseAIUseCase<string, MyRequest, MyResult> {
93
94
  protected readonly systemMessage = "You are a helpful assistant.";
94
-
95
+
95
96
  // Required: return user message template function
96
97
  protected getUserTemplate(): (formattedPrompt: string) => string {
97
98
  return (message) => message;
98
99
  }
99
-
100
+
100
101
  protected formatUserMessage(prompt: any): string {
101
102
  return typeof prompt === 'string' ? prompt : prompt.message;
102
103
  }
103
-
104
+
104
105
  protected createResult(content: string, usedPrompt: string, thinking?: string): MyResult {
105
106
  return {
106
107
  generatedContent: content,
@@ -111,6 +112,13 @@ class MyChatUseCase extends BaseAIUseCase<string, MyRequest, MyResult> {
111
112
  };
112
113
  }
113
114
  }
115
+
116
+ // Switch to different provider (optional)
117
+ class MyAnthropicChatUseCase extends MyChatUseCase {
118
+ protected getProvider(): LLMProvider {
119
+ return LLMProvider.ANTHROPIC; // Use Claude instead of Ollama
120
+ }
121
+ }
114
122
  ```
115
123
 
116
124
  <details>
@@ -564,6 +572,82 @@ console.log(config.baseUrl); // Value from MODEL1_URL or default localhost
564
572
 
565
573
  </details>
566
574
 
575
+ <details>
576
+ <summary><strong>๐Ÿ”ง Customizing Model Configuration (New in v2.3.0)</strong></summary>
577
+
578
+ Override the model configuration provider to use your own custom model configurations:
579
+
580
+ **Use Cases:**
581
+ - Multi-environment deployments (dev, staging, production)
582
+ - Dynamic model selection based on runtime conditions
583
+ - Loading model configs from external sources (database, API)
584
+ - Testing with different model configurations
585
+
586
+ **New Pattern (Recommended):**
587
+
588
+ ```typescript
589
+ import { BaseAIUseCase, ModelConfigKey, ValidatedLLMModelConfig } from '@loonylabs/llm-middleware';
590
+
591
+ // Define your custom model configurations
592
+ const MY_CUSTOM_MODELS: Record<string, ValidatedLLMModelConfig> = {
593
+ 'PRODUCTION_MODEL': {
594
+ name: 'llama3.2:latest',
595
+ baseUrl: 'http://production-server.com:11434',
596
+ temperature: 0.7
597
+ },
598
+ 'DEVELOPMENT_MODEL': {
599
+ name: 'llama3.2:latest',
600
+ baseUrl: 'http://localhost:11434',
601
+ temperature: 0.9
602
+ }
603
+ };
604
+
605
+ class MyCustomUseCase extends BaseAIUseCase<string, MyRequest, MyResult> {
606
+ // Override this method to provide custom model configurations
607
+ protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig {
608
+ const config = MY_CUSTOM_MODELS[key];
609
+ if (!config?.name) {
610
+ throw new Error(`Model ${key} not found`);
611
+ }
612
+ return config;
613
+ }
614
+
615
+ // ... rest of your use case implementation
616
+ }
617
+ ```
618
+
619
+ **Environment-Aware Example:**
620
+
621
+ ```typescript
622
+ class EnvironmentAwareUseCase extends BaseAIUseCase<string, MyRequest, MyResult> {
623
+ protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig {
624
+ const env = process.env.NODE_ENV || 'development';
625
+
626
+ // Automatically select model based on environment
627
+ const modelKey = env === 'production' ? 'PRODUCTION_MODEL' :
628
+ env === 'staging' ? 'STAGING_MODEL' :
629
+ 'DEVELOPMENT_MODEL';
630
+
631
+ return MY_CUSTOM_MODELS[modelKey];
632
+ }
633
+ }
634
+ ```
635
+
636
+ **Old Pattern (Still Supported):**
637
+
638
+ ```typescript
639
+ // Legacy approach - still works but not recommended
640
+ class LegacyUseCase extends BaseAIUseCase<string, MyRequest, MyResult> {
641
+ protected get modelConfig(): ValidatedLLMModelConfig {
642
+ return myCustomGetModelConfig(this.modelConfigKey);
643
+ }
644
+ }
645
+ ```
646
+
647
+ **See the [Custom Config Example](src/examples/custom-config/README.md) for a complete working implementation.**
648
+
649
+ </details>
650
+
567
651
  <details>
568
652
  <summary><strong>๐ŸŽ›๏ธ Parameter Configuration</strong></summary>
569
653
 
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Custom Config Example - Message Templates
3
+ *
4
+ * Simple message templates for demonstrating custom model configuration provider
5
+ */
6
+ /**
7
+ * System message for the custom config example
8
+ * Defines the AI's role and behavior
9
+ */
10
+ export declare const CUSTOM_CONFIG_SYSTEM_MESSAGE = "You are a helpful AI assistant that responds to user queries in a clear and concise manner.\n\nYour responses should be:\n- Direct and to the point\n- Accurate and factual\n- Well-formatted in JSON when appropriate\n\nReturn your response in the following JSON format:\n{\n \"response\": \"Your response text here\"\n}";
11
+ /**
12
+ * User message template
13
+ * Takes the formatted prompt and returns the user message
14
+ */
15
+ export declare const CUSTOM_CONFIG_USER_TEMPLATE: (formattedPrompt: string) => string;
16
+ //# sourceMappingURL=custom-config.messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-config.messages.d.ts","sourceRoot":"","sources":["../../../src/examples/custom-config/custom-config.messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,4BAA4B,oUAUvC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,2BAA2B,GAAI,iBAAiB,MAAM,KAAG,MAErE,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * Custom Config Example - Message Templates
4
+ *
5
+ * Simple message templates for demonstrating custom model configuration provider
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CUSTOM_CONFIG_USER_TEMPLATE = exports.CUSTOM_CONFIG_SYSTEM_MESSAGE = void 0;
9
+ /**
10
+ * System message for the custom config example
11
+ * Defines the AI's role and behavior
12
+ */
13
+ exports.CUSTOM_CONFIG_SYSTEM_MESSAGE = `You are a helpful AI assistant that responds to user queries in a clear and concise manner.
14
+
15
+ Your responses should be:
16
+ - Direct and to the point
17
+ - Accurate and factual
18
+ - Well-formatted in JSON when appropriate
19
+
20
+ Return your response in the following JSON format:
21
+ {
22
+ "response": "Your response text here"
23
+ }`;
24
+ /**
25
+ * User message template
26
+ * Takes the formatted prompt and returns the user message
27
+ */
28
+ const CUSTOM_CONFIG_USER_TEMPLATE = (formattedPrompt) => {
29
+ return formattedPrompt;
30
+ };
31
+ exports.CUSTOM_CONFIG_USER_TEMPLATE = CUSTOM_CONFIG_USER_TEMPLATE;
32
+ //# sourceMappingURL=custom-config.messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-config.messages.js","sourceRoot":"","sources":["../../../src/examples/custom-config/custom-config.messages.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH;;;GAGG;AACU,QAAA,4BAA4B,GAAG;;;;;;;;;;EAU1C,CAAC;AAEH;;;GAGG;AACI,MAAM,2BAA2B,GAAG,CAAC,eAAuB,EAAU,EAAE;IAC7E,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAFW,QAAA,2BAA2B,+BAEtC"}
@@ -0,0 +1,81 @@
1
+ import { BaseAIUseCase } from '../../middleware/usecases/base/base-ai.usecase';
2
+ import { BaseAIRequest, BaseAIResult } from '../../middleware/shared/types/base-request.types';
3
+ import { ModelConfigKey, ValidatedLLMModelConfig } from '../../middleware/shared/config/models.config';
4
+ /**
5
+ * Simple request interface for the custom config example
6
+ */
7
+ export interface CustomConfigRequest extends BaseAIRequest<string> {
8
+ }
9
+ /**
10
+ * Simple response structure
11
+ */
12
+ export interface CustomConfigResponse {
13
+ response: string;
14
+ }
15
+ /**
16
+ * Result interface for the custom config example
17
+ */
18
+ export interface CustomConfigResult extends BaseAIResult {
19
+ parsedResponse: CustomConfigResponse;
20
+ }
21
+ /**
22
+ * Custom Config Use Case Example
23
+ *
24
+ * This example demonstrates how to override the model configuration provider
25
+ * to use your own custom model configurations instead of the library's default MODELS config.
26
+ *
27
+ * Key Pattern: Override `getModelConfigProvider()` method
28
+ *
29
+ * Use Cases:
30
+ * - Multi-environment deployments (dev, staging, production)
31
+ * - Dynamic model selection based on runtime conditions
32
+ * - Using model configs from external sources (database, API, etc.)
33
+ * - Testing with different model configurations
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const useCase = new CustomConfigUseCase();
38
+ * const result = await useCase.execute({
39
+ * prompt: 'What is the capital of France?'
40
+ * });
41
+ * console.log(result.parsedResponse.response);
42
+ * ```
43
+ */
44
+ export declare class CustomConfigUseCase extends BaseAIUseCase<string, CustomConfigRequest, CustomConfigResult> {
45
+ protected readonly systemMessage = "You are a helpful AI assistant that responds to user queries in a clear and concise manner.\n\nYour responses should be:\n- Direct and to the point\n- Accurate and factual\n- Well-formatted in JSON when appropriate\n\nReturn your response in the following JSON format:\n{\n \"response\": \"Your response text here\"\n}";
46
+ /**
47
+ * Default model to use - references our custom config
48
+ */
49
+ protected static readonly DEFAULT_MODEL_CONFIG_KEY = "DEVELOPMENT_MODEL";
50
+ /**
51
+ * Override to use custom model configuration source
52
+ *
53
+ * This is the key method that allows you to provide your own model configurations.
54
+ * Instead of calling the library's getModelConfig(), we use our own MY_CUSTOM_MODELS.
55
+ *
56
+ * @param key - The model configuration key
57
+ * @returns Validated model configuration from our custom source
58
+ */
59
+ protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig;
60
+ /**
61
+ * Get user template for formatting the prompt
62
+ */
63
+ protected getUserTemplate(): (formattedPrompt: string) => string;
64
+ /**
65
+ * Create the result object from the AI response
66
+ */
67
+ protected createResult(content: string, usedPrompt: string, thinking?: string): CustomConfigResult;
68
+ }
69
+ /**
70
+ * Environment-Aware Use Case Example
71
+ *
72
+ * This example shows how to dynamically select model configurations
73
+ * based on the runtime environment (NODE_ENV).
74
+ */
75
+ export declare class EnvironmentAwareUseCase extends CustomConfigUseCase {
76
+ /**
77
+ * Override to select model based on environment
78
+ */
79
+ protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig;
80
+ }
81
+ //# sourceMappingURL=custom-config.usecase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-config.usecase.d.ts","sourceRoot":"","sources":["../../../src/examples/custom-config/custom-config.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kDAAkD,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AA4BvG;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,aAAa,CAAC,MAAM,CAAC;CAAG;AAErE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,cAAc,EAAE,oBAAoB,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAoB,SAAQ,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,kBAAkB,CAAC;IACrG,SAAS,CAAC,QAAQ,CAAC,aAAa,qUAAgC;IAEhE;;OAEG;IACH,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,uBAAuB;IAEzE;;;;;;;;OAQG;IACH,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,uBAAuB;IAY9E;;OAEG;IACH,SAAS,CAAC,eAAe,IAAI,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM;IAIhE;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,kBAAkB;CAoBnG;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,mBAAmB;IAC9D;;OAEG;IACH,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,uBAAuB;CAyB/E"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvironmentAwareUseCase = exports.CustomConfigUseCase = void 0;
4
+ const base_ai_usecase_1 = require("../../middleware/usecases/base/base-ai.usecase");
5
+ const custom_config_messages_1 = require("./custom-config.messages");
6
+ /**
7
+ * Custom model configurations (not from the library's MODELS config)
8
+ * This demonstrates how to use your own model configuration source
9
+ */
10
+ const MY_CUSTOM_MODELS = {
11
+ 'PRODUCTION_MODEL': {
12
+ name: 'llama3.2:latest',
13
+ baseUrl: 'http://production-server.com:11434',
14
+ temperature: 0.7
15
+ },
16
+ 'DEVELOPMENT_MODEL': {
17
+ name: 'llama3.2:latest',
18
+ baseUrl: 'http://localhost:11434',
19
+ temperature: 0.9
20
+ },
21
+ 'STAGING_MODEL': {
22
+ name: 'llama3.2:latest',
23
+ baseUrl: 'http://staging-server.com:11434',
24
+ temperature: 0.8
25
+ }
26
+ };
27
+ /**
28
+ * Custom Config Use Case Example
29
+ *
30
+ * This example demonstrates how to override the model configuration provider
31
+ * to use your own custom model configurations instead of the library's default MODELS config.
32
+ *
33
+ * Key Pattern: Override `getModelConfigProvider()` method
34
+ *
35
+ * Use Cases:
36
+ * - Multi-environment deployments (dev, staging, production)
37
+ * - Dynamic model selection based on runtime conditions
38
+ * - Using model configs from external sources (database, API, etc.)
39
+ * - Testing with different model configurations
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * const useCase = new CustomConfigUseCase();
44
+ * const result = await useCase.execute({
45
+ * prompt: 'What is the capital of France?'
46
+ * });
47
+ * console.log(result.parsedResponse.response);
48
+ * ```
49
+ */
50
+ class CustomConfigUseCase extends base_ai_usecase_1.BaseAIUseCase {
51
+ constructor() {
52
+ super(...arguments);
53
+ this.systemMessage = custom_config_messages_1.CUSTOM_CONFIG_SYSTEM_MESSAGE;
54
+ }
55
+ /**
56
+ * Override to use custom model configuration source
57
+ *
58
+ * This is the key method that allows you to provide your own model configurations.
59
+ * Instead of calling the library's getModelConfig(), we use our own MY_CUSTOM_MODELS.
60
+ *
61
+ * @param key - The model configuration key
62
+ * @returns Validated model configuration from our custom source
63
+ */
64
+ getModelConfigProvider(key) {
65
+ const config = MY_CUSTOM_MODELS[key];
66
+ if (!config?.name) {
67
+ throw new Error(`Custom model ${key} not found. Available models: ${Object.keys(MY_CUSTOM_MODELS).join(', ')}`);
68
+ }
69
+ return config;
70
+ }
71
+ /**
72
+ * Get user template for formatting the prompt
73
+ */
74
+ getUserTemplate() {
75
+ return custom_config_messages_1.CUSTOM_CONFIG_USER_TEMPLATE;
76
+ }
77
+ /**
78
+ * Create the result object from the AI response
79
+ */
80
+ createResult(content, usedPrompt, thinking) {
81
+ let parsedResponse;
82
+ try {
83
+ parsedResponse = JSON.parse(content);
84
+ }
85
+ catch (error) {
86
+ // Fallback if JSON parsing fails
87
+ parsedResponse = {
88
+ response: content
89
+ };
90
+ }
91
+ return {
92
+ generatedContent: content,
93
+ model: this.modelConfig.name,
94
+ usedPrompt,
95
+ thinking,
96
+ parsedResponse
97
+ };
98
+ }
99
+ }
100
+ exports.CustomConfigUseCase = CustomConfigUseCase;
101
+ /**
102
+ * Default model to use - references our custom config
103
+ */
104
+ CustomConfigUseCase.DEFAULT_MODEL_CONFIG_KEY = 'DEVELOPMENT_MODEL';
105
+ /**
106
+ * Environment-Aware Use Case Example
107
+ *
108
+ * This example shows how to dynamically select model configurations
109
+ * based on the runtime environment (NODE_ENV).
110
+ */
111
+ class EnvironmentAwareUseCase extends CustomConfigUseCase {
112
+ /**
113
+ * Override to select model based on environment
114
+ */
115
+ getModelConfigProvider(key) {
116
+ const env = process.env.NODE_ENV || 'development';
117
+ let selectedKey;
118
+ switch (env) {
119
+ case 'production':
120
+ selectedKey = 'PRODUCTION_MODEL';
121
+ break;
122
+ case 'staging':
123
+ selectedKey = 'STAGING_MODEL';
124
+ break;
125
+ default:
126
+ selectedKey = 'DEVELOPMENT_MODEL';
127
+ }
128
+ const config = MY_CUSTOM_MODELS[selectedKey];
129
+ if (!config?.name) {
130
+ throw new Error(`Model for environment ${env} (${selectedKey}) not found`);
131
+ }
132
+ console.log(`Using ${selectedKey} for environment: ${env}`);
133
+ return config;
134
+ }
135
+ }
136
+ exports.EnvironmentAwareUseCase = EnvironmentAwareUseCase;
137
+ //# sourceMappingURL=custom-config.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-config.usecase.js","sourceRoot":"","sources":["../../../src/examples/custom-config/custom-config.usecase.ts"],"names":[],"mappings":";;;AAAA,oFAA+E;AAG/E,qEAGkC;AAElC;;;GAGG;AACH,MAAM,gBAAgB,GAA4C;IAChE,kBAAkB,EAAE;QAClB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,oCAAoC;QAC7C,WAAW,EAAE,GAAG;KACjB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,wBAAwB;QACjC,WAAW,EAAE,GAAG;KACjB;IACD,eAAe,EAAE;QACf,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,iCAAiC;QAC1C,WAAW,EAAE,GAAG;KACjB;CACF,CAAC;AAqBF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,mBAAoB,SAAQ,+BAA8D;IAAvG;;QACqB,kBAAa,GAAG,qDAA4B,CAAC;IA0DlE,CAAC;IAnDC;;;;;;;;OAQG;IACO,sBAAsB,CAAC,GAAmB;QAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAErC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,gBAAgB,GAAG,iCAAiC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACO,eAAe;QACvB,OAAO,oDAA2B,CAAC;IACrC,CAAC;IAED;;OAEG;IACO,YAAY,CAAC,OAAe,EAAE,UAAkB,EAAE,QAAiB;QAC3E,IAAI,cAAoC,CAAC;QAEzC,IAAI,CAAC;YACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iCAAiC;YACjC,cAAc,GAAG;gBACf,QAAQ,EAAE,OAAO;aAClB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,gBAAgB,EAAE,OAAO;YACzB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YAC5B,UAAU;YACV,QAAQ;YACR,cAAc;SACf,CAAC;IACJ,CAAC;;AA1DH,kDA2DC;AAxDC;;GAEG;AACuB,4CAAwB,GAAG,mBAAmB,AAAtB,CAAuB;AAuD3E;;;;;GAKG;AACH,MAAa,uBAAwB,SAAQ,mBAAmB;IAC9D;;OAEG;IACO,sBAAsB,CAAC,GAAmB;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;QAElD,IAAI,WAAmB,CAAC;QAExB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,YAAY;gBACf,WAAW,GAAG,kBAAkB,CAAC;gBACjC,MAAM;YACR,KAAK,SAAS;gBACZ,WAAW,GAAG,eAAe,CAAC;gBAC9B,MAAM;YACR;gBACE,WAAW,GAAG,mBAAmB,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,KAAK,WAAW,aAAa,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,SAAS,WAAW,qBAAqB,GAAG,EAAE,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA7BD,0DA6BC"}
@@ -0,0 +1,25 @@
1
+ import { LLMProvider } from '../../middleware/services/llm';
2
+ import { SimpleChatUseCase } from './chat.usecase';
3
+ /**
4
+ * Example: Chat use case using Anthropic Claude instead of Ollama
5
+ *
6
+ * This demonstrates how to override the default provider (Ollama)
7
+ * to use a different LLM provider like Anthropic Claude.
8
+ *
9
+ * Usage:
10
+ * ```typescript
11
+ * const anthropicChat = new AnthropicChatUseCase();
12
+ * const result = await anthropicChat.execute({
13
+ * prompt: "Hello, Claude!",
14
+ * authToken: process.env.ANTHROPIC_API_KEY
15
+ * });
16
+ * ```
17
+ */
18
+ export declare class AnthropicChatUseCase extends SimpleChatUseCase {
19
+ /**
20
+ * Override to use Anthropic Claude provider
21
+ * @returns LLMProvider.ANTHROPIC
22
+ */
23
+ protected getProvider(): LLMProvider;
24
+ }
25
+ //# sourceMappingURL=anthropic-chat.usecase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-chat.usecase.d.ts","sourceRoot":"","sources":["../../../src/examples/simple-chat/anthropic-chat.usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,oBAAqB,SAAQ,iBAAiB;IACzD;;;OAGG;IACH,SAAS,CAAC,WAAW,IAAI,WAAW;CAGrC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnthropicChatUseCase = void 0;
4
+ const llm_1 = require("../../middleware/services/llm");
5
+ const chat_usecase_1 = require("./chat.usecase");
6
+ /**
7
+ * Example: Chat use case using Anthropic Claude instead of Ollama
8
+ *
9
+ * This demonstrates how to override the default provider (Ollama)
10
+ * to use a different LLM provider like Anthropic Claude.
11
+ *
12
+ * Usage:
13
+ * ```typescript
14
+ * const anthropicChat = new AnthropicChatUseCase();
15
+ * const result = await anthropicChat.execute({
16
+ * prompt: "Hello, Claude!",
17
+ * authToken: process.env.ANTHROPIC_API_KEY
18
+ * });
19
+ * ```
20
+ */
21
+ class AnthropicChatUseCase extends chat_usecase_1.SimpleChatUseCase {
22
+ /**
23
+ * Override to use Anthropic Claude provider
24
+ * @returns LLMProvider.ANTHROPIC
25
+ */
26
+ getProvider() {
27
+ return llm_1.LLMProvider.ANTHROPIC;
28
+ }
29
+ }
30
+ exports.AnthropicChatUseCase = AnthropicChatUseCase;
31
+ //# sourceMappingURL=anthropic-chat.usecase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-chat.usecase.js","sourceRoot":"","sources":["../../../src/examples/simple-chat/anthropic-chat.usecase.ts"],"names":[],"mappings":";;;AAAA,uDAA4D;AAC5D,iDAAmD;AAEnD;;;;;;;;;;;;;;GAcG;AACH,MAAa,oBAAqB,SAAQ,gCAAiB;IACzD;;;OAGG;IACO,WAAW;QACnB,OAAO,iBAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;CACF;AARD,oDAQC"}
@@ -1,3 +1,5 @@
1
+ export { SimpleChatUseCase } from './chat.usecase';
2
+ export { AnthropicChatUseCase } from './anthropic-chat.usecase';
1
3
  declare const app: import("express-serve-static-core").Express;
2
4
  export default app;
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/examples/simple-chat/index.ts"],"names":[],"mappings":"AAYA,QAAA,MAAM,GAAG,6CAAY,CAAC;AAkDtB,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/examples/simple-chat/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAKhE,QAAA,MAAM,GAAG,6CAAY,CAAC;AAkDtB,eAAe,GAAG,CAAC"}
@@ -3,12 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AnthropicChatUseCase = exports.SimpleChatUseCase = void 0;
6
7
  const express_1 = __importDefault(require("express"));
7
8
  const cors_1 = __importDefault(require("cors"));
8
9
  const dotenv_1 = __importDefault(require("dotenv"));
9
10
  const chat_controller_1 = require("./chat.controller");
10
11
  const app_config_1 = require("../../middleware/shared/config/app.config");
11
12
  const logging_utils_1 = require("../../middleware/shared/utils/logging.utils");
13
+ // Export use cases for library users
14
+ var chat_usecase_1 = require("./chat.usecase");
15
+ Object.defineProperty(exports, "SimpleChatUseCase", { enumerable: true, get: function () { return chat_usecase_1.SimpleChatUseCase; } });
16
+ var anthropic_chat_usecase_1 = require("./anthropic-chat.usecase");
17
+ Object.defineProperty(exports, "AnthropicChatUseCase", { enumerable: true, get: function () { return anthropic_chat_usecase_1.AnthropicChatUseCase; } });
12
18
  // Load environment variables
13
19
  dotenv_1.default.config();
14
20
  const app = (0, express_1.default)();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/examples/simple-chat/index.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAC9B,gDAAwB;AACxB,oDAA4B;AAC5B,uDAAmD;AACnD,0EAAsE;AACtE,+EAAqE;AAIrE,6BAA6B;AAC7B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AACtB,MAAM,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;AAE5C,aAAa;AACb,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;AAChB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACtD,GAAG,CAAC,UAAU,GAAG;QACf,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS;QAChD,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI,SAAS;QACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,EAAE,CAAC;AACT,CAAC,CAAC,CAAC;AAEH,SAAS;AACT,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9B,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAQ,EAAE,GAAa,EAAE,EAAE;IAChD,cAAc,CAAC,IAAI,CAAC,GAAsB,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,MAAM,IAAI,GAAG,sBAAS,CAAC,MAAM,CAAC,IAAI,CAAC;AAEnC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,sBAAM,CAAC,IAAI,CAAC,8CAA8C,IAAI,EAAE,EAAE;QAChE,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE;YACR,IAAI;YACJ,WAAW,EAAE,sBAAS,CAAC,MAAM,CAAC,WAAW;SAC1C;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,SAAS,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,WAAW,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,sBAAS,CAAC,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,kBAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/examples/simple-chat/index.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA8B;AAC9B,gDAAwB;AACxB,oDAA4B;AAC5B,uDAAmD;AACnD,0EAAsE;AACtE,+EAAqE;AAIrE,qCAAqC;AACrC,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAC1B,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA;AAE7B,6BAA6B;AAC7B,gBAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AACtB,MAAM,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;AAE5C,aAAa;AACb,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,GAAE,CAAC,CAAC;AAChB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACtD,GAAG,CAAC,UAAU,GAAG;QACf,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS;QAChD,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI,SAAS;QACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,IAAI,EAAE,CAAC;AACT,CAAC,CAAC,CAAC;AAEH,SAAS;AACT,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9B,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAQ,EAAE,GAAa,EAAE,EAAE;IAChD,cAAc,CAAC,IAAI,CAAC,GAAsB,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,MAAM,IAAI,GAAG,sBAAS,CAAC,MAAM,CAAC,IAAI,CAAC;AAEnC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,sBAAM,CAAC,IAAI,CAAC,8CAA8C,IAAI,EAAE,EAAE;QAChE,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE;YACR,IAAI;YACJ,WAAW,EAAE,sBAAS,CAAC,MAAM,CAAC,WAAW;SAC1C;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,SAAS,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,WAAW,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,sBAAsB,sBAAS,CAAC,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,kBAAe,GAAG,CAAC"}
@@ -17,11 +17,13 @@ export declare class JsonExtractor implements Parser {
17
17
  thinking: string;
18
18
  };
19
19
  /**
20
- * Extract JSON block by finding balanced braces
20
+ * Extract JSON block by finding balanced braces or brackets
21
+ * Supports both objects {...} and arrays [...]
21
22
  */
22
23
  private extractJsonBlock;
23
24
  /**
24
25
  * Extract JSON using common patterns
26
+ * Supports both objects {...} and arrays [...]
25
27
  */
26
28
  private extractByPattern;
27
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"json-extractor.parser.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IACnC,IAAI,SAAoB;IAE/B;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IA4B/D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuBrB"}
1
+ {"version":3,"file":"json-extractor.parser.d.ts","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IACnC,IAAI,SAAoB;IAE/B;;OAEG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAKvC;;OAEG;IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IA4B/D;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAoExB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAwDxB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuBrB"}
@@ -44,11 +44,14 @@ class JsonExtractor {
44
44
  return { json: result, thinking: '' };
45
45
  }
46
46
  /**
47
- * Extract JSON block by finding balanced braces
47
+ * Extract JSON block by finding balanced braces or brackets
48
+ * Supports both objects {...} and arrays [...]
48
49
  */
49
50
  extractJsonBlock(text) {
50
51
  let braceCount = 0;
52
+ let bracketCount = 0;
51
53
  let startIndex = -1;
54
+ let startChar = null;
52
55
  let inString = false;
53
56
  let escapeNext = false;
54
57
  for (let i = 0; i < text.length; i++) {
@@ -67,14 +70,35 @@ class JsonExtractor {
67
70
  }
68
71
  if (!inString) {
69
72
  if (char === '{') {
70
- if (braceCount === 0) {
73
+ if (braceCount === 0 && bracketCount === 0) {
71
74
  startIndex = i;
75
+ startChar = '{';
72
76
  }
73
77
  braceCount++;
74
78
  }
75
79
  else if (char === '}') {
76
80
  braceCount--;
77
- if (braceCount === 0 && startIndex >= 0) {
81
+ if (braceCount === 0 && bracketCount === 0 && startIndex >= 0 && startChar === '{') {
82
+ const jsonCandidate = text.substring(startIndex, i + 1);
83
+ try {
84
+ JSON.parse(jsonCandidate);
85
+ return jsonCandidate;
86
+ }
87
+ catch (e) {
88
+ // Continue searching
89
+ }
90
+ }
91
+ }
92
+ else if (char === '[') {
93
+ if (braceCount === 0 && bracketCount === 0) {
94
+ startIndex = i;
95
+ startChar = '[';
96
+ }
97
+ bracketCount++;
98
+ }
99
+ else if (char === ']') {
100
+ bracketCount--;
101
+ if (bracketCount === 0 && braceCount === 0 && startIndex >= 0 && startChar === '[') {
78
102
  const jsonCandidate = text.substring(startIndex, i + 1);
79
103
  try {
80
104
  JSON.parse(jsonCandidate);
@@ -91,25 +115,52 @@ class JsonExtractor {
91
115
  }
92
116
  /**
93
117
  * Extract JSON using common patterns
118
+ * Supports both objects {...} and arrays [...]
94
119
  */
95
120
  extractByPattern(text) {
96
- // Pattern 1: JSON after "response:" or similar
97
- const responsePattern = /(?:response|result|json|output):\s*(\{.*\})/is;
98
- const responseMatch = text.match(responsePattern);
99
- if (responseMatch) {
121
+ // Pattern 1: JSON object after "response:" or similar
122
+ const responseObjectPattern = /(?:response|result|json|output):\s*(\{.*\})/is;
123
+ const responseObjectMatch = text.match(responseObjectPattern);
124
+ if (responseObjectMatch) {
125
+ try {
126
+ JSON.parse(responseObjectMatch[1]);
127
+ return responseObjectMatch[1];
128
+ }
129
+ catch (e) {
130
+ // Continue with other patterns
131
+ }
132
+ }
133
+ // Pattern 2: JSON array after "response:" or similar
134
+ const responseArrayPattern = /(?:response|result|json|output):\s*(\[.*\])/is;
135
+ const responseArrayMatch = text.match(responseArrayPattern);
136
+ if (responseArrayMatch) {
100
137
  try {
101
- JSON.parse(responseMatch[1]);
102
- return responseMatch[1];
138
+ JSON.parse(responseArrayMatch[1]);
139
+ return responseArrayMatch[1];
103
140
  }
104
141
  catch (e) {
105
142
  // Continue with other patterns
106
143
  }
107
144
  }
108
- // Pattern 2: JSON in the middle of text
109
- const jsonPattern = /\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}/g;
110
- const matches = text.match(jsonPattern);
111
- if (matches) {
112
- for (const match of matches) {
145
+ // Pattern 3: JSON object in the middle of text
146
+ const jsonObjectPattern = /\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}/g;
147
+ const objectMatches = text.match(jsonObjectPattern);
148
+ if (objectMatches) {
149
+ for (const match of objectMatches) {
150
+ try {
151
+ JSON.parse(match);
152
+ return match;
153
+ }
154
+ catch (e) {
155
+ // Continue with next match
156
+ }
157
+ }
158
+ }
159
+ // Pattern 4: JSON array in the middle of text
160
+ const jsonArrayPattern = /\[[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]/g;
161
+ const arrayMatches = text.match(jsonArrayPattern);
162
+ if (arrayMatches) {
163
+ for (const match of arrayMatches) {
113
164
  try {
114
165
  JSON.parse(match);
115
166
  return match;
@@ -1 +1 @@
1
- {"version":3,"file":"json-extractor.parser.js","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":";;;AAAA,gEAA2D;AAG3D;;;GAGG;AACH,MAAa,aAAa;IAA1B;QACS,SAAI,GAAG,gBAAgB,CAAC;IAuJjC,CAAC;IArJC;;OAEG;IACI,QAAQ,CAAC,KAAa;QAC3B,mDAAmD;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAa;QACxB,MAAM,aAAa,GAAG,KAAK,CAAC;QAC5B,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE1B,2DAA2D;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,SAAS,EAAE,CAAC;YACd,uCAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YACjE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC3C,CAAC;QAED,2CAA2C;QAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,gBAAgB,EAAE,CAAC;YACrB,uCAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;YACxE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAClD,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,uCAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;YAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAY;QACnC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAErB,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,GAAG,KAAK,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC9B,UAAU,GAAG,IAAI,CAAC;gBAClB,SAAS;YACX,CAAC;YAED,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChC,QAAQ,GAAG,CAAC,QAAQ,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;wBACrB,UAAU,GAAG,CAAC,CAAC;oBACjB,CAAC;oBACD,UAAU,EAAE,CAAC;gBACf,CAAC;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACxB,UAAU,EAAE,CAAC;oBACb,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;wBACxC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;wBACxD,IAAI,CAAC;4BACH,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;4BAC1B,OAAO,aAAa,CAAC;wBACvB,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,qBAAqB;wBACvB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAY;QACnC,+CAA+C;QAC/C,MAAM,eAAe,GAAG,+CAA+C,CAAC;QACxE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,+BAA+B;YACjC,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,kCAAkC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAClB,OAAO,KAAK,CAAC;gBACf,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,2BAA2B;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,IAAY;QAC/B,IAAI,MAAM,GAAG,IAAI,CAAC;QAElB,yBAAyB;QACzB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;QAEzE,kCAAkC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,yBAAyB;QACzB,MAAM,GAAG,MAAM;YACb,yBAAyB;aACxB,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;YAC9B,oBAAoB;aACnB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YACnB,4BAA4B;aAC3B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEnC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CACF;AAxJD,sCAwJC"}
1
+ {"version":3,"file":"json-extractor.parser.js","sourceRoot":"","sources":["../../../../../src/middleware/services/json-cleaner/parsers/json-extractor.parser.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,22 @@ export declare abstract class BaseAIUseCase<TPrompt = string, TRequest extends B
25
25
  * If not overridden, uses the default model config key
26
26
  */
27
27
  protected get modelConfigKey(): ModelConfigKey;
28
+ /**
29
+ * Get the model configuration for a given key
30
+ * Override this method in subclasses to provide custom model configurations
31
+ *
32
+ * @param key - The model configuration key
33
+ * @returns Validated model configuration
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * // In your custom use case base class:
38
+ * protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig {
39
+ * return myCustomGetModelConfig(key);
40
+ * }
41
+ * ```
42
+ */
43
+ protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig;
28
44
  /**
29
45
  * Get the model configuration for this use case
30
46
  * Returns validated config with guaranteed model name
@@ -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;;;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+GzD;;;OAGG;cACa,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrG;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;CACjG"}
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+GzD;;;OAGG;cACa,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrG;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;CACjG"}
@@ -21,12 +21,30 @@ class BaseAIUseCase {
21
21
  get modelConfigKey() {
22
22
  return this.constructor.DEFAULT_MODEL_CONFIG_KEY;
23
23
  }
24
+ /**
25
+ * Get the model configuration for a given key
26
+ * Override this method in subclasses to provide custom model configurations
27
+ *
28
+ * @param key - The model configuration key
29
+ * @returns Validated model configuration
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * // In your custom use case base class:
34
+ * protected getModelConfigProvider(key: ModelConfigKey): ValidatedLLMModelConfig {
35
+ * return myCustomGetModelConfig(key);
36
+ * }
37
+ * ```
38
+ */
39
+ getModelConfigProvider(key) {
40
+ return (0, models_config_1.getModelConfig)(key);
41
+ }
24
42
  /**
25
43
  * Get the model configuration for this use case
26
44
  * Returns validated config with guaranteed model name
27
45
  */
28
46
  get modelConfig() {
29
- return (0, models_config_1.getModelConfig)(this.modelConfigKey);
47
+ return this.getModelConfigProvider(this.modelConfigKey);
30
48
  }
31
49
  /**
32
50
  * Creates a user message from the prompt
@@ -1 +1 @@
1
- {"version":3,"file":"base-ai.usecase.js","sourceRoot":"","sources":["../../../../src/middleware/usecases/base/base-ai.usecase.ts"],"names":[],"mappings":"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"}
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.2.0",
3
+ "version": "2.4.0",
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",