@mcp-abap-adt/llm-agent-libs 12.0.2 → 12.0.4
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/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/llm-adapter.d.ts +24 -0
- package/dist/adapters/llm-adapter.d.ts.map +1 -0
- package/dist/adapters/llm-adapter.js +345 -0
- package/dist/adapters/llm-adapter.js.map +1 -0
- package/dist/adapters/llm-provider-bridge.d.ts +30 -0
- package/dist/adapters/llm-provider-bridge.d.ts.map +1 -0
- package/dist/adapters/llm-provider-bridge.js +122 -0
- package/dist/adapters/llm-provider-bridge.js.map +1 -0
- package/dist/adapters/non-streaming-llm.d.ts +18 -0
- package/dist/adapters/non-streaming-llm.d.ts.map +1 -0
- package/dist/adapters/non-streaming-llm.js +44 -0
- package/dist/adapters/non-streaming-llm.js.map +1 -0
- package/dist/agent.d.ts +227 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +1534 -0
- package/dist/agent.js.map +1 -0
- package/dist/builder.d.ts +260 -0
- package/dist/builder.d.ts.map +1 -0
- package/dist/builder.js +949 -0
- package/dist/builder.js.map +1 -0
- package/dist/classifier/index.d.ts +3 -0
- package/dist/classifier/index.d.ts.map +1 -0
- package/dist/classifier/index.js +2 -0
- package/dist/classifier/index.js.map +1 -0
- package/dist/classifier/llm-classifier.d.ts +20 -0
- package/dist/classifier/llm-classifier.d.ts.map +1 -0
- package/dist/classifier/llm-classifier.js +128 -0
- package/dist/classifier/llm-classifier.js.map +1 -0
- package/dist/config/config-watcher.d.ts +54 -0
- package/dist/config/config-watcher.d.ts.map +1 -0
- package/dist/config/config-watcher.js +107 -0
- package/dist/config/config-watcher.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/context/context-assembler.d.ts +49 -0
- package/dist/context/context-assembler.d.ts.map +1 -0
- package/dist/context/context-assembler.js +184 -0
- package/dist/context/context-assembler.js.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +2 -0
- package/dist/context/index.js.map +1 -0
- package/dist/health/health-checker.d.ts +21 -0
- package/dist/health/health-checker.d.ts.map +1 -0
- package/dist/health/health-checker.js +52 -0
- package/dist/health/health-checker.js.map +1 -0
- package/dist/health/index.d.ts +3 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +2 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/types.d.ts +2 -0
- package/dist/health/types.d.ts.map +1 -0
- package/dist/health/types.js +2 -0
- package/dist/health/types.js.map +1 -0
- package/dist/history/history-memory.d.ts +12 -0
- package/dist/history/history-memory.d.ts.map +1 -0
- package/dist/history/history-memory.js +26 -0
- package/dist/history/history-memory.js.map +1 -0
- package/dist/history/history-summarizer.d.ts +10 -0
- package/dist/history/history-summarizer.d.ts.map +1 -0
- package/dist/history/history-summarizer.js +27 -0
- package/dist/history/history-summarizer.js.map +1 -0
- package/dist/history/index.d.ts +3 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +3 -0
- package/dist/history/index.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/mcp-connection-strategy.d.ts +2 -0
- package/dist/interfaces/mcp-connection-strategy.d.ts.map +1 -0
- package/dist/interfaces/mcp-connection-strategy.js +2 -0
- package/dist/interfaces/mcp-connection-strategy.js.map +1 -0
- package/dist/interfaces/model-resolver.d.ts +2 -0
- package/dist/interfaces/model-resolver.d.ts.map +1 -0
- package/dist/interfaces/model-resolver.js +2 -0
- package/dist/interfaces/model-resolver.js.map +1 -0
- package/dist/interfaces/pipeline.d.ts +123 -0
- package/dist/interfaces/pipeline.d.ts.map +1 -0
- package/dist/interfaces/pipeline.js +13 -0
- package/dist/interfaces/pipeline.js.map +1 -0
- package/dist/logger/console-logger.d.ts +7 -0
- package/dist/logger/console-logger.d.ts.map +1 -0
- package/dist/logger/console-logger.js +12 -0
- package/dist/logger/console-logger.js.map +1 -0
- package/dist/logger/default-request-logger.d.ts +17 -0
- package/dist/logger/default-request-logger.d.ts.map +1 -0
- package/dist/logger/default-request-logger.js +86 -0
- package/dist/logger/default-request-logger.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +2 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/noop-request-logger.d.ts +11 -0
- package/dist/logger/noop-request-logger.d.ts.map +1 -0
- package/dist/logger/noop-request-logger.js +20 -0
- package/dist/logger/noop-request-logger.js.map +1 -0
- package/dist/logger/session-logger.d.ts +10 -0
- package/dist/logger/session-logger.d.ts.map +1 -0
- package/dist/logger/session-logger.js +40 -0
- package/dist/logger/session-logger.js.map +1 -0
- package/dist/metrics/in-memory-metrics.d.ts +36 -0
- package/dist/metrics/in-memory-metrics.d.ts.map +1 -0
- package/dist/metrics/in-memory-metrics.js +87 -0
- package/dist/metrics/in-memory-metrics.js.map +1 -0
- package/dist/metrics/index.d.ts +4 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/noop-metrics.d.ts +17 -0
- package/dist/metrics/noop-metrics.d.ts.map +1 -0
- package/dist/metrics/noop-metrics.js +22 -0
- package/dist/metrics/noop-metrics.js.map +1 -0
- package/dist/metrics/types.d.ts +2 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +2 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/otel/index.d.ts +2 -0
- package/dist/otel/index.d.ts.map +1 -0
- package/dist/otel/index.js +2 -0
- package/dist/otel/index.js.map +1 -0
- package/dist/otel/otel-tracer-adapter.d.ts +15 -0
- package/dist/otel/otel-tracer-adapter.d.ts.map +1 -0
- package/dist/otel/otel-tracer-adapter.js +62 -0
- package/dist/otel/otel-tracer-adapter.js.map +1 -0
- package/dist/pipeline/condition-evaluator.d.ts +35 -0
- package/dist/pipeline/condition-evaluator.d.ts.map +1 -0
- package/dist/pipeline/condition-evaluator.js +143 -0
- package/dist/pipeline/condition-evaluator.js.map +1 -0
- package/dist/pipeline/context.d.ts +119 -0
- package/dist/pipeline/context.d.ts.map +1 -0
- package/dist/pipeline/context.js +19 -0
- package/dist/pipeline/context.js.map +1 -0
- package/dist/pipeline/default-pipeline.d.ts +69 -0
- package/dist/pipeline/default-pipeline.d.ts.map +1 -0
- package/dist/pipeline/default-pipeline.js +276 -0
- package/dist/pipeline/default-pipeline.js.map +1 -0
- package/dist/pipeline/executor.d.ts +54 -0
- package/dist/pipeline/executor.d.ts.map +1 -0
- package/dist/pipeline/executor.js +133 -0
- package/dist/pipeline/executor.js.map +1 -0
- package/dist/pipeline/handlers/assemble.d.ts +16 -0
- package/dist/pipeline/handlers/assemble.d.ts.map +1 -0
- package/dist/pipeline/handlers/assemble.js +72 -0
- package/dist/pipeline/handlers/assemble.js.map +1 -0
- package/dist/pipeline/handlers/build-tool-query.d.ts +30 -0
- package/dist/pipeline/handlers/build-tool-query.d.ts.map +1 -0
- package/dist/pipeline/handlers/build-tool-query.js +80 -0
- package/dist/pipeline/handlers/build-tool-query.js.map +1 -0
- package/dist/pipeline/handlers/classify.d.ts +21 -0
- package/dist/pipeline/handlers/classify.d.ts.map +1 -0
- package/dist/pipeline/handlers/classify.js +60 -0
- package/dist/pipeline/handlers/classify.js.map +1 -0
- package/dist/pipeline/handlers/expand.d.ts +16 -0
- package/dist/pipeline/handlers/expand.d.ts.map +1 -0
- package/dist/pipeline/handlers/expand.js +24 -0
- package/dist/pipeline/handlers/expand.js.map +1 -0
- package/dist/pipeline/handlers/history-upsert.d.ts +29 -0
- package/dist/pipeline/handlers/history-upsert.d.ts.map +1 -0
- package/dist/pipeline/handlers/history-upsert.js +75 -0
- package/dist/pipeline/handlers/history-upsert.js.map +1 -0
- package/dist/pipeline/handlers/index.d.ts +31 -0
- package/dist/pipeline/handlers/index.d.ts.map +1 -0
- package/dist/pipeline/handlers/index.js +44 -0
- package/dist/pipeline/handlers/index.js.map +1 -0
- package/dist/pipeline/handlers/rag-query.d.ts +27 -0
- package/dist/pipeline/handlers/rag-query.d.ts.map +1 -0
- package/dist/pipeline/handlers/rag-query.js +117 -0
- package/dist/pipeline/handlers/rag-query.js.map +1 -0
- package/dist/pipeline/handlers/rerank.d.ts +16 -0
- package/dist/pipeline/handlers/rerank.d.ts.map +1 -0
- package/dist/pipeline/handlers/rerank.js +27 -0
- package/dist/pipeline/handlers/rerank.js.map +1 -0
- package/dist/pipeline/handlers/skill-select.d.ts +18 -0
- package/dist/pipeline/handlers/skill-select.d.ts.map +1 -0
- package/dist/pipeline/handlers/skill-select.js +88 -0
- package/dist/pipeline/handlers/skill-select.js.map +1 -0
- package/dist/pipeline/handlers/summarize.d.ts +17 -0
- package/dist/pipeline/handlers/summarize.d.ts.map +1 -0
- package/dist/pipeline/handlers/summarize.js +56 -0
- package/dist/pipeline/handlers/summarize.js.map +1 -0
- package/dist/pipeline/handlers/tool-loop.d.ts +32 -0
- package/dist/pipeline/handlers/tool-loop.d.ts.map +1 -0
- package/dist/pipeline/handlers/tool-loop.js +734 -0
- package/dist/pipeline/handlers/tool-loop.js.map +1 -0
- package/dist/pipeline/handlers/tool-select.d.ts +21 -0
- package/dist/pipeline/handlers/tool-select.d.ts.map +1 -0
- package/dist/pipeline/handlers/tool-select.js +109 -0
- package/dist/pipeline/handlers/tool-select.js.map +1 -0
- package/dist/pipeline/handlers/translate.d.ts +17 -0
- package/dist/pipeline/handlers/translate.d.ts.map +1 -0
- package/dist/pipeline/handlers/translate.js +42 -0
- package/dist/pipeline/handlers/translate.js.map +1 -0
- package/dist/pipeline/index.d.ts +14 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +16 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/stage-handler.d.ts +27 -0
- package/dist/pipeline/stage-handler.d.ts.map +1 -0
- package/dist/pipeline/stage-handler.js +25 -0
- package/dist/pipeline/stage-handler.js.map +1 -0
- package/dist/pipeline/types.d.ts +5 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +2 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/loader.d.ts +67 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +114 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/types.d.ts +24 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +86 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/policy/heuristic-injection-detector.d.ts +5 -0
- package/dist/policy/heuristic-injection-detector.d.ts.map +1 -0
- package/dist/policy/heuristic-injection-detector.js +36 -0
- package/dist/policy/heuristic-injection-detector.js.map +1 -0
- package/dist/policy/index.d.ts +6 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +5 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/mixed-tool-call-handler.d.ts +15 -0
- package/dist/policy/mixed-tool-call-handler.d.ts.map +1 -0
- package/dist/policy/mixed-tool-call-handler.js +49 -0
- package/dist/policy/mixed-tool-call-handler.js.map +1 -0
- package/dist/policy/pending-tool-results-registry.d.ts +25 -0
- package/dist/policy/pending-tool-results-registry.d.ts.map +1 -0
- package/dist/policy/pending-tool-results-registry.js +50 -0
- package/dist/policy/pending-tool-results-registry.js.map +1 -0
- package/dist/policy/tool-availability-registry.d.ts +21 -0
- package/dist/policy/tool-availability-registry.d.ts.map +1 -0
- package/dist/policy/tool-availability-registry.js +77 -0
- package/dist/policy/tool-availability-registry.js.map +1 -0
- package/dist/policy/tool-policy-guard.d.ts +8 -0
- package/dist/policy/tool-policy-guard.d.ts.map +1 -0
- package/dist/policy/tool-policy-guard.js +40 -0
- package/dist/policy/tool-policy-guard.js.map +1 -0
- package/dist/policy/types.d.ts +51 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +17 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/providers.d.ts +48 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +192 -0
- package/dist/providers.js.map +1 -0
- package/dist/reranker/index.d.ts +4 -0
- package/dist/reranker/index.d.ts.map +1 -0
- package/dist/reranker/index.js +3 -0
- package/dist/reranker/index.js.map +1 -0
- package/dist/reranker/llm-reranker.d.ts +10 -0
- package/dist/reranker/llm-reranker.d.ts.map +1 -0
- package/dist/reranker/llm-reranker.js +55 -0
- package/dist/reranker/llm-reranker.js.map +1 -0
- package/dist/reranker/noop-reranker.d.ts +6 -0
- package/dist/reranker/noop-reranker.d.ts.map +1 -0
- package/dist/reranker/noop-reranker.js +6 -0
- package/dist/reranker/noop-reranker.js.map +1 -0
- package/dist/reranker/types.d.ts +2 -0
- package/dist/reranker/types.d.ts.map +1 -0
- package/dist/reranker/types.js +2 -0
- package/dist/reranker/types.js.map +1 -0
- package/dist/resilience/rate-limiter-llm.d.ts +17 -0
- package/dist/resilience/rate-limiter-llm.d.ts.map +1 -0
- package/dist/resilience/rate-limiter-llm.js +30 -0
- package/dist/resilience/rate-limiter-llm.js.map +1 -0
- package/dist/resilience/retry-llm.d.ts +32 -0
- package/dist/resilience/retry-llm.d.ts.map +1 -0
- package/dist/resilience/retry-llm.js +103 -0
- package/dist/resilience/retry-llm.js.map +1 -0
- package/dist/resilience/token-bucket-rate-limiter.d.ts +21 -0
- package/dist/resilience/token-bucket-rate-limiter.d.ts.map +1 -0
- package/dist/resilience/token-bucket-rate-limiter.js +32 -0
- package/dist/resilience/token-bucket-rate-limiter.js.map +1 -0
- package/dist/session/index.d.ts +4 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +3 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/noop-session-manager.d.ts +8 -0
- package/dist/session/noop-session-manager.d.ts.map +1 -0
- package/dist/session/noop-session-manager.js +11 -0
- package/dist/session/noop-session-manager.js.map +1 -0
- package/dist/session/session-manager.d.ts +13 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +20 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/types.d.ts +2 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/skills/claude-skill-manager.d.ts +24 -0
- package/dist/skills/claude-skill-manager.d.ts.map +1 -0
- package/dist/skills/claude-skill-manager.js +81 -0
- package/dist/skills/claude-skill-manager.js.map +1 -0
- package/dist/skills/codex-skill-manager.d.ts +20 -0
- package/dist/skills/codex-skill-manager.d.ts.map +1 -0
- package/dist/skills/codex-skill-manager.js +75 -0
- package/dist/skills/codex-skill-manager.js.map +1 -0
- package/dist/skills/filesystem-skill-manager.d.ts +17 -0
- package/dist/skills/filesystem-skill-manager.d.ts.map +1 -0
- package/dist/skills/filesystem-skill-manager.js +48 -0
- package/dist/skills/filesystem-skill-manager.js.map +1 -0
- package/dist/skills/filesystem-skill.d.ts +25 -0
- package/dist/skills/filesystem-skill.d.ts.map +1 -0
- package/dist/skills/filesystem-skill.js +110 -0
- package/dist/skills/filesystem-skill.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +9 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-utils.d.ts +15 -0
- package/dist/skills/skill-utils.d.ts.map +1 -0
- package/dist/skills/skill-utils.js +46 -0
- package/dist/skills/skill-utils.js.map +1 -0
- package/dist/testing/index.d.ts +118 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +351 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tracer/index.d.ts +3 -0
- package/dist/tracer/index.d.ts.map +1 -0
- package/dist/tracer/index.js +2 -0
- package/dist/tracer/index.js.map +1 -0
- package/dist/tracer/noop-tracer.d.ts +5 -0
- package/dist/tracer/noop-tracer.d.ts.map +1 -0
- package/dist/tracer/noop-tracer.js +16 -0
- package/dist/tracer/noop-tracer.js.map +1 -0
- package/dist/tracer/types.d.ts +2 -0
- package/dist/tracer/types.d.ts.map +1 -0
- package/dist/tracer/types.js +2 -0
- package/dist/tracer/types.js.map +1 -0
- package/dist/utils/lazy.d.ts +51 -0
- package/dist/utils/lazy.d.ts.map +1 -0
- package/dist/utils/lazy.js +127 -0
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/parse-frontmatter.d.ts +15 -0
- package/dist/utils/parse-frontmatter.d.ts.map +1 -0
- package/dist/utils/parse-frontmatter.js +22 -0
- package/dist/utils/parse-frontmatter.js.map +1 -0
- package/dist/validator/index.d.ts +3 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +2 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/noop-validator.d.ts +6 -0
- package/dist/validator/noop-validator.d.ts.map +1 -0
- package/dist/validator/noop-validator.js +6 -0
- package/dist/validator/noop-validator.js.map +1 -0
- package/dist/validator/types.d.ts +3 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +2 -0
- package/dist/validator/types.js.map +1 -0
- package/package.json +14 -11
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider resolution — the composition root for concrete LLM implementations.
|
|
3
|
+
*
|
|
4
|
+
* This module is the ONLY place that knows about concrete LLM providers.
|
|
5
|
+
* Embedder and RAG factories live in @mcp-abap-adt/llm-agent-rag.
|
|
6
|
+
*
|
|
7
|
+
* LLM provider packages are optional peers loaded via dynamic import().
|
|
8
|
+
* MissingProviderError is thrown when a required peer is not installed.
|
|
9
|
+
*/
|
|
10
|
+
import type { ILlm, IModelResolver } from '@mcp-abap-adt/llm-agent';
|
|
11
|
+
import type { SapAICoreCredentials } from '@mcp-abap-adt/sap-aicore-llm';
|
|
12
|
+
export interface MakeLlmConfig {
|
|
13
|
+
provider: 'deepseek' | 'openai' | 'anthropic' | 'sap-ai-sdk';
|
|
14
|
+
apiKey?: string;
|
|
15
|
+
/** Custom base URL for OpenAI-compatible endpoints (Azure OpenAI, Ollama, vLLM, etc.). */
|
|
16
|
+
baseURL?: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
temperature?: number;
|
|
19
|
+
maxTokens?: number;
|
|
20
|
+
resourceGroup?: string;
|
|
21
|
+
credentials?: SapAICoreCredentials;
|
|
22
|
+
/** When false, streamChat() is replaced with chat() yielding a single chunk. Default: true. */
|
|
23
|
+
streaming?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create an ILlm from a declarative provider config.
|
|
27
|
+
* This is the only function that knows about concrete LLM implementations.
|
|
28
|
+
* Provider packages are loaded via dynamic import (optional peers).
|
|
29
|
+
*/
|
|
30
|
+
export declare function makeLlm(cfg: MakeLlmConfig, temperature: number): Promise<ILlm>;
|
|
31
|
+
/**
|
|
32
|
+
* Create a default DeepSeek-based ILlm from simple config (apiKey + model).
|
|
33
|
+
* Used by the flat YAML / CLI path.
|
|
34
|
+
*/
|
|
35
|
+
export declare function makeDefaultLlm(apiKey: string, model: string, temperature: number): Promise<ILlm>;
|
|
36
|
+
/**
|
|
37
|
+
* Default IModelResolver — delegates to makeLlm() with the given provider settings.
|
|
38
|
+
* Returns fully constructed ILlm instances ready for use with SmartAgent.reconfigure().
|
|
39
|
+
*/
|
|
40
|
+
export declare class DefaultModelResolver implements IModelResolver {
|
|
41
|
+
private readonly providerConfig;
|
|
42
|
+
private readonly defaults;
|
|
43
|
+
constructor(providerConfig: Omit<MakeLlmConfig, 'model'>, defaults?: {
|
|
44
|
+
temperature?: number;
|
|
45
|
+
});
|
|
46
|
+
resolve(modelName: string, role: 'main' | 'classifier' | 'helper'): Promise<ILlm>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AASzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,+FAA+F;IAC/F,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAmHD;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,aAAa,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAkGf;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAEvD,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,cAAc,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,EAC5C,QAAQ,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpD,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GACrC,OAAO,CAAC,IAAI,CAAC;CAKjB"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider resolution — the composition root for concrete LLM implementations.
|
|
3
|
+
*
|
|
4
|
+
* This module is the ONLY place that knows about concrete LLM providers.
|
|
5
|
+
* Embedder and RAG factories live in @mcp-abap-adt/llm-agent-rag.
|
|
6
|
+
*
|
|
7
|
+
* LLM provider packages are optional peers loaded via dynamic import().
|
|
8
|
+
* MissingProviderError is thrown when a required peer is not installed.
|
|
9
|
+
*/
|
|
10
|
+
import { MissingProviderError } from '@mcp-abap-adt/llm-agent';
|
|
11
|
+
import { LlmAdapter } from './adapters/llm-adapter.js';
|
|
12
|
+
import { LlmProviderBridge } from './adapters/llm-provider-bridge.js';
|
|
13
|
+
import { NonStreamingLlm } from './adapters/non-streaming-llm.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Per-provider dynamic loaders
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function isMissingOptionalPeer(err, pkg) {
|
|
18
|
+
if (!(err instanceof Error))
|
|
19
|
+
return false;
|
|
20
|
+
const code = err.code;
|
|
21
|
+
if (code === 'ERR_MODULE_NOT_FOUND')
|
|
22
|
+
return true;
|
|
23
|
+
if (err.message.includes(pkg) &&
|
|
24
|
+
err.message.toLowerCase().includes('cannot find'))
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
async function loadOpenAI() {
|
|
29
|
+
const pkg = '@mcp-abap-adt/openai-llm';
|
|
30
|
+
try {
|
|
31
|
+
const mod = await import(pkg);
|
|
32
|
+
return mod.OpenAIProvider;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if (isMissingOptionalPeer(err, pkg))
|
|
36
|
+
throw new MissingProviderError(pkg, 'openai');
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function loadDeepSeek() {
|
|
41
|
+
const pkg = '@mcp-abap-adt/deepseek-llm';
|
|
42
|
+
try {
|
|
43
|
+
const mod = await import(pkg);
|
|
44
|
+
return mod.DeepSeekProvider;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (isMissingOptionalPeer(err, pkg))
|
|
48
|
+
throw new MissingProviderError(pkg, 'deepseek');
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function loadAnthropic() {
|
|
53
|
+
const pkg = '@mcp-abap-adt/anthropic-llm';
|
|
54
|
+
try {
|
|
55
|
+
const mod = await import(pkg);
|
|
56
|
+
return mod.AnthropicProvider;
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (isMissingOptionalPeer(err, pkg))
|
|
60
|
+
throw new MissingProviderError(pkg, 'anthropic');
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function loadSapAiCore() {
|
|
65
|
+
const pkg = '@mcp-abap-adt/sap-aicore-llm';
|
|
66
|
+
try {
|
|
67
|
+
const mod = await import(pkg);
|
|
68
|
+
return mod.SapCoreAIProvider;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
if (isMissingOptionalPeer(err, pkg))
|
|
72
|
+
throw new MissingProviderError(pkg, 'sap-ai-sdk');
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// makeLlm — async, dynamic-import based
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
/**
|
|
80
|
+
* Create an ILlm from a declarative provider config.
|
|
81
|
+
* This is the only function that knows about concrete LLM implementations.
|
|
82
|
+
* Provider packages are loaded via dynamic import (optional peers).
|
|
83
|
+
*/
|
|
84
|
+
export async function makeLlm(cfg, temperature) {
|
|
85
|
+
// Coerce numeric fields that may arrive as strings from ${ENV_VAR} substitution
|
|
86
|
+
const maxTokens = cfg.maxTokens != null ? Number(cfg.maxTokens) : undefined;
|
|
87
|
+
let llm;
|
|
88
|
+
switch (cfg.provider) {
|
|
89
|
+
case 'deepseek': {
|
|
90
|
+
const DeepSeekProvider = await loadDeepSeek();
|
|
91
|
+
const provider = new DeepSeekProvider({
|
|
92
|
+
apiKey: cfg.apiKey,
|
|
93
|
+
baseURL: cfg.baseURL,
|
|
94
|
+
model: cfg.model,
|
|
95
|
+
temperature,
|
|
96
|
+
maxTokens,
|
|
97
|
+
});
|
|
98
|
+
llm = new LlmAdapter(new LlmProviderBridge(provider), {
|
|
99
|
+
model: provider.model,
|
|
100
|
+
getModels: () => provider.getModels?.() ?? Promise.resolve([]),
|
|
101
|
+
getEmbeddingModels: () => provider.getEmbeddingModels?.() ?? Promise.resolve([]),
|
|
102
|
+
});
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case 'openai': {
|
|
106
|
+
const OpenAIProvider = await loadOpenAI();
|
|
107
|
+
const provider = new OpenAIProvider({
|
|
108
|
+
apiKey: cfg.apiKey,
|
|
109
|
+
baseURL: cfg.baseURL,
|
|
110
|
+
model: cfg.model,
|
|
111
|
+
temperature,
|
|
112
|
+
maxTokens,
|
|
113
|
+
});
|
|
114
|
+
llm = new LlmAdapter(new LlmProviderBridge(provider), {
|
|
115
|
+
model: provider.model,
|
|
116
|
+
getModels: () => provider.getModels?.() ?? Promise.resolve([]),
|
|
117
|
+
getEmbeddingModels: () => provider.getEmbeddingModels?.() ?? Promise.resolve([]),
|
|
118
|
+
});
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case 'anthropic': {
|
|
122
|
+
const AnthropicProvider = await loadAnthropic();
|
|
123
|
+
const provider = new AnthropicProvider({
|
|
124
|
+
apiKey: cfg.apiKey,
|
|
125
|
+
baseURL: cfg.baseURL,
|
|
126
|
+
model: cfg.model,
|
|
127
|
+
temperature,
|
|
128
|
+
maxTokens,
|
|
129
|
+
});
|
|
130
|
+
llm = new LlmAdapter(new LlmProviderBridge(provider), {
|
|
131
|
+
model: provider.model,
|
|
132
|
+
getModels: () => provider.getModels?.() ?? Promise.resolve([]),
|
|
133
|
+
getEmbeddingModels: () => provider.getEmbeddingModels?.() ?? Promise.resolve([]),
|
|
134
|
+
});
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
case 'sap-ai-sdk': {
|
|
138
|
+
const SapCoreAIProvider = await loadSapAiCore();
|
|
139
|
+
const provider = new SapCoreAIProvider({
|
|
140
|
+
apiKey: cfg.apiKey,
|
|
141
|
+
model: cfg.model,
|
|
142
|
+
temperature,
|
|
143
|
+
maxTokens,
|
|
144
|
+
resourceGroup: cfg.resourceGroup,
|
|
145
|
+
credentials: cfg.credentials,
|
|
146
|
+
log: {
|
|
147
|
+
debug: (msg, meta) => process.stderr.write(`[sap-ai-sdk:debug] ${msg} ${meta ? JSON.stringify(meta) : ''}\n`),
|
|
148
|
+
error: (msg, meta) => process.stderr.write(`[sap-ai-sdk:error] ${msg} ${meta ? JSON.stringify(meta) : ''}\n`),
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
llm = new LlmAdapter(new LlmProviderBridge(provider), {
|
|
152
|
+
model: provider.model,
|
|
153
|
+
getModels: () => provider.getModels?.() ?? Promise.resolve([]),
|
|
154
|
+
getEmbeddingModels: () => provider.getEmbeddingModels?.() ?? Promise.resolve([]),
|
|
155
|
+
});
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
default: {
|
|
159
|
+
const _exhaustive = cfg.provider;
|
|
160
|
+
throw new Error(`Unknown LLM provider: ${_exhaustive}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Wrap with non-streaming adapter when streaming is disabled for this provider
|
|
164
|
+
if (cfg.streaming === false) {
|
|
165
|
+
llm = new NonStreamingLlm(llm);
|
|
166
|
+
}
|
|
167
|
+
return llm;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Create a default DeepSeek-based ILlm from simple config (apiKey + model).
|
|
171
|
+
* Used by the flat YAML / CLI path.
|
|
172
|
+
*/
|
|
173
|
+
export async function makeDefaultLlm(apiKey, model, temperature) {
|
|
174
|
+
return makeLlm({ provider: 'deepseek', apiKey, model }, temperature);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Default IModelResolver — delegates to makeLlm() with the given provider settings.
|
|
178
|
+
* Returns fully constructed ILlm instances ready for use with SmartAgent.reconfigure().
|
|
179
|
+
*/
|
|
180
|
+
export class DefaultModelResolver {
|
|
181
|
+
providerConfig;
|
|
182
|
+
defaults;
|
|
183
|
+
constructor(providerConfig, defaults = {}) {
|
|
184
|
+
this.providerConfig = providerConfig;
|
|
185
|
+
this.defaults = defaults;
|
|
186
|
+
}
|
|
187
|
+
async resolve(modelName, role) {
|
|
188
|
+
const temperature = this.defaults.temperature ?? (role === 'main' ? 0.7 : 0.1);
|
|
189
|
+
return makeLlm({ ...this.providerConfig, model: modelName }, temperature);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reranker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reranker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ILlm } from '@mcp-abap-adt/llm-agent';
|
|
2
|
+
import { type CallOptions, RagError, type RagResult, type Result } from '@mcp-abap-adt/llm-agent';
|
|
3
|
+
import type { IReranker } from './types.js';
|
|
4
|
+
export declare class LlmReranker implements IReranker {
|
|
5
|
+
private readonly llm;
|
|
6
|
+
constructor(llm: ILlm);
|
|
7
|
+
rerank(query: string, results: RagResult[], options?: CallOptions): Promise<Result<RagResult[], RagError>>;
|
|
8
|
+
private _parseScores;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=llm-reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-reranker.d.ts","sourceRoot":"","sources":["../../src/reranker/llm-reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EACL,KAAK,WAAW,EAChB,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C,qBAAa,WAAY,YAAW,SAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,IAAI;IAEhC,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,EAAE,EACpB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;IAyCzC,OAAO,CAAC,YAAY;CAWrB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { RagError, } from '@mcp-abap-adt/llm-agent';
|
|
2
|
+
const RERANK_SYSTEM_PROMPT = `You are a relevance scoring engine. Given a query and a list of text passages, rate the relevance of each passage to the query on a scale of 0 to 10.
|
|
3
|
+
|
|
4
|
+
Respond with ONLY a JSON array of numbers representing the scores, one per passage, in the same order.
|
|
5
|
+
Example: [8, 3, 10, 1]
|
|
6
|
+
|
|
7
|
+
Do not include any other text.`;
|
|
8
|
+
export class LlmReranker {
|
|
9
|
+
llm;
|
|
10
|
+
constructor(llm) {
|
|
11
|
+
this.llm = llm;
|
|
12
|
+
}
|
|
13
|
+
async rerank(query, results, options) {
|
|
14
|
+
if (results.length === 0) {
|
|
15
|
+
return { ok: true, value: results };
|
|
16
|
+
}
|
|
17
|
+
const passages = results.map((r, i) => `[${i}] ${r.text}`).join('\n\n');
|
|
18
|
+
const userPrompt = `Query: ${query}\n\nPassages:\n${passages}`;
|
|
19
|
+
try {
|
|
20
|
+
const res = await this.llm.chat([
|
|
21
|
+
{ role: 'system', content: RERANK_SYSTEM_PROMPT },
|
|
22
|
+
{ role: 'user', content: userPrompt },
|
|
23
|
+
], [], options);
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
return {
|
|
26
|
+
ok: false,
|
|
27
|
+
error: new RagError(res.error.message, 'RERANK_ERROR'),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const scores = this._parseScores(res.value.content, results.length);
|
|
31
|
+
const reranked = results
|
|
32
|
+
.map((r, i) => ({ ...r, score: scores[i] / 10 }))
|
|
33
|
+
.sort((a, b) => b.score - a.score);
|
|
34
|
+
return { ok: true, value: reranked };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
error: new RagError(`Reranking failed: ${String(err)}`, 'RERANK_ERROR'),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
_parseScores(content, expectedCount) {
|
|
44
|
+
const match = content.match(/\[[\d\s,.-]+\]/);
|
|
45
|
+
if (match) {
|
|
46
|
+
const parsed = JSON.parse(match[0]);
|
|
47
|
+
if (parsed.length === expectedCount) {
|
|
48
|
+
return parsed.map((s) => Math.max(0, Math.min(10, Number(s) || 0)));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Fallback: preserve original ordering
|
|
52
|
+
return Array.from({ length: expectedCount }, (_, i) => expectedCount - i);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=llm-reranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-reranker.js","sourceRoot":"","sources":["../../src/reranker/llm-reranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CallOptions, RagError, RagResult, Result } from '@mcp-abap-adt/llm-agent';
|
|
2
|
+
import type { IReranker } from './types.js';
|
|
3
|
+
export declare class NoopReranker implements IReranker {
|
|
4
|
+
rerank(_query: string, results: RagResult[], _options?: CallOptions): Promise<Result<RagResult[], RagError>>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=noop-reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-reranker.d.ts","sourceRoot":"","sources":["../../src/reranker/noop-reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,MAAM,EACP,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,qBAAa,YAAa,YAAW,SAAS;IACtC,MAAM,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;CAG1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noop-reranker.js","sourceRoot":"","sources":["../../src/reranker/noop-reranker.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,MAAM,CACV,MAAc,EACd,OAAoB,EACpB,QAAsB;QAEtB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reranker/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reranker/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RateLimiterLlm — ILlm decorator that throttles outbound requests.
|
|
3
|
+
*
|
|
4
|
+
* Composition order: RateLimiterLlm → RetryLlm → CircuitBreakerLlm → LlmAdapter
|
|
5
|
+
* Rate limiter sits outermost so that retry attempts also respect the limit.
|
|
6
|
+
*/
|
|
7
|
+
import type { CallOptions, ILlm, ILlmRateLimiter, LlmError, LlmResponse, LlmStreamChunk, LlmTool, Message, Result } from '@mcp-abap-adt/llm-agent';
|
|
8
|
+
export declare class RateLimiterLlm implements ILlm {
|
|
9
|
+
private readonly inner;
|
|
10
|
+
private readonly limiter;
|
|
11
|
+
healthCheck?: ILlm['healthCheck'];
|
|
12
|
+
constructor(inner: ILlm, limiter: ILlmRateLimiter);
|
|
13
|
+
get model(): string | undefined;
|
|
14
|
+
chat(messages: Message[], tools?: LlmTool[], options?: CallOptions): Promise<Result<LlmResponse, LlmError>>;
|
|
15
|
+
streamChat(messages: Message[], tools?: LlmTool[], options?: CallOptions): AsyncIterable<Result<LlmStreamChunk, LlmError>>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=rate-limiter-llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter-llm.d.ts","sourceRoot":"","sources":["../../src/resilience/rate-limiter-llm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,IAAI,EACJ,eAAe,EACf,QAAQ,EACR,WAAW,EACX,cAAc,EACd,OAAO,EACP,OAAO,EACP,MAAM,EACP,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,cAAe,YAAW,IAAI;IAIvC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAGf,KAAK,EAAE,IAAI,EACX,OAAO,EAAE,eAAe;IAO3C,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAEK,IAAI,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAKlC,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;CAInD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RateLimiterLlm — ILlm decorator that throttles outbound requests.
|
|
3
|
+
*
|
|
4
|
+
* Composition order: RateLimiterLlm → RetryLlm → CircuitBreakerLlm → LlmAdapter
|
|
5
|
+
* Rate limiter sits outermost so that retry attempts also respect the limit.
|
|
6
|
+
*/
|
|
7
|
+
export class RateLimiterLlm {
|
|
8
|
+
inner;
|
|
9
|
+
limiter;
|
|
10
|
+
healthCheck;
|
|
11
|
+
constructor(inner, limiter) {
|
|
12
|
+
this.inner = inner;
|
|
13
|
+
this.limiter = limiter;
|
|
14
|
+
if (inner.healthCheck) {
|
|
15
|
+
this.healthCheck = inner.healthCheck.bind(inner);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get model() {
|
|
19
|
+
return this.inner.model;
|
|
20
|
+
}
|
|
21
|
+
async chat(messages, tools, options) {
|
|
22
|
+
await this.limiter.acquire();
|
|
23
|
+
return this.inner.chat(messages, tools, options);
|
|
24
|
+
}
|
|
25
|
+
async *streamChat(messages, tools, options) {
|
|
26
|
+
await this.limiter.acquire();
|
|
27
|
+
yield* this.inner.streamChat(messages, tools, options);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=rate-limiter-llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter-llm.js","sourceRoot":"","sources":["../../src/resilience/rate-limiter-llm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,MAAM,OAAO,cAAc;IAIN;IACA;IAJnB,WAAW,CAAuB;IAElC,YACmB,KAAW,EACX,OAAwB;QADxB,UAAK,GAAL,KAAK,CAAM;QACX,YAAO,GAAP,OAAO,CAAiB;QAEzC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAAmB,EACnB,KAAiB,EACjB,OAAqB;QAErB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CACf,QAAmB,EACnB,KAAiB,EACjB,OAAqB;QAErB,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RetryLlm — ILlm decorator that retries transient failures with exponential backoff.
|
|
3
|
+
*
|
|
4
|
+
* Composition order: RetryLlm → CircuitBreakerLlm → LlmAdapter
|
|
5
|
+
* Retry sits outside the circuit breaker so that retry attempts are not
|
|
6
|
+
* counted as separate failures.
|
|
7
|
+
*/
|
|
8
|
+
import type { ILlm, Message } from '@mcp-abap-adt/llm-agent';
|
|
9
|
+
import { type CallOptions, LlmError, type LlmResponse, type LlmStreamChunk, type LlmTool, type Result } from '@mcp-abap-adt/llm-agent';
|
|
10
|
+
export interface RetryOptions {
|
|
11
|
+
/** Maximum number of retry attempts (total calls = maxAttempts + 1). Default: 3. */
|
|
12
|
+
maxAttempts: number;
|
|
13
|
+
/** Initial backoff delay in ms. Doubles each attempt. Default: 2000. */
|
|
14
|
+
backoffMs: number;
|
|
15
|
+
/** HTTP status codes that trigger retry. Default: [429, 500, 502, 503]. */
|
|
16
|
+
retryOn: number[];
|
|
17
|
+
/** Substrings in error message that trigger mid-stream retry (replays entire stream). Default: []. */
|
|
18
|
+
retryOnMidStream: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare class RetryLlm implements ILlm {
|
|
21
|
+
private readonly inner;
|
|
22
|
+
private readonly opts;
|
|
23
|
+
healthCheck?: ILlm['healthCheck'];
|
|
24
|
+
constructor(inner: ILlm, options?: Partial<RetryOptions>);
|
|
25
|
+
get model(): string | undefined;
|
|
26
|
+
chat(messages: Message[], tools?: LlmTool[], options?: CallOptions): Promise<Result<LlmResponse, LlmError>>;
|
|
27
|
+
streamChat(messages: Message[], tools?: LlmTool[], options?: CallOptions): AsyncIterable<Result<LlmStreamChunk, LlmError>>;
|
|
28
|
+
private isRetryable;
|
|
29
|
+
private isMidStreamRetryable;
|
|
30
|
+
private backoff;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=retry-llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-llm.d.ts","sourceRoot":"","sources":["../../src/resilience/retry-llm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,KAAK,WAAW,EAChB,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sGAAsG;IACtG,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AASD,qBAAa,QAAS,YAAW,IAAI;IAKjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAGf,KAAK,EAAE,IAAI,EAC5B,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAQjC,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAEK,IAAI,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAoBlC,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAqDlD,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,OAAO;CAchB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RetryLlm — ILlm decorator that retries transient failures with exponential backoff.
|
|
3
|
+
*
|
|
4
|
+
* Composition order: RetryLlm → CircuitBreakerLlm → LlmAdapter
|
|
5
|
+
* Retry sits outside the circuit breaker so that retry attempts are not
|
|
6
|
+
* counted as separate failures.
|
|
7
|
+
*/
|
|
8
|
+
import { LlmError, } from '@mcp-abap-adt/llm-agent';
|
|
9
|
+
const DEFAULT_OPTIONS = {
|
|
10
|
+
maxAttempts: 3,
|
|
11
|
+
backoffMs: 2000,
|
|
12
|
+
retryOn: [429, 500, 502, 503],
|
|
13
|
+
retryOnMidStream: [],
|
|
14
|
+
};
|
|
15
|
+
export class RetryLlm {
|
|
16
|
+
inner;
|
|
17
|
+
opts;
|
|
18
|
+
healthCheck;
|
|
19
|
+
constructor(inner, options) {
|
|
20
|
+
this.inner = inner;
|
|
21
|
+
this.opts = { ...DEFAULT_OPTIONS, ...options };
|
|
22
|
+
if (inner.healthCheck) {
|
|
23
|
+
this.healthCheck = inner.healthCheck.bind(inner);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
get model() {
|
|
27
|
+
return this.inner.model;
|
|
28
|
+
}
|
|
29
|
+
async chat(messages, tools, options) {
|
|
30
|
+
for (let attempt = 0;; attempt++) {
|
|
31
|
+
if (options?.signal?.aborted) {
|
|
32
|
+
return { ok: false, error: new LlmError('Aborted', 'ABORTED') };
|
|
33
|
+
}
|
|
34
|
+
const result = await this.inner.chat(messages, tools, options);
|
|
35
|
+
if (result.ok ||
|
|
36
|
+
attempt >= this.opts.maxAttempts ||
|
|
37
|
+
!this.isRetryable(result.error)) {
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
await this.backoff(attempt, options?.signal);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async *streamChat(messages, tools, options) {
|
|
44
|
+
for (let attempt = 0;; attempt++) {
|
|
45
|
+
if (options?.signal?.aborted) {
|
|
46
|
+
yield { ok: false, error: new LlmError('Aborted', 'ABORTED') };
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
let chunksYielded = 0;
|
|
50
|
+
let shouldRetry = false;
|
|
51
|
+
for await (const chunk of this.inner.streamChat(messages, tools, options)) {
|
|
52
|
+
if (chunk.ok) {
|
|
53
|
+
chunksYielded++;
|
|
54
|
+
yield chunk;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const canRetry = attempt < this.opts.maxAttempts;
|
|
58
|
+
// Pre-stream failure: retry on HTTP status codes (existing behavior)
|
|
59
|
+
if (chunksYielded === 0 &&
|
|
60
|
+
canRetry &&
|
|
61
|
+
this.isRetryable(chunk.error)) {
|
|
62
|
+
shouldRetry = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
// Mid-stream failure: retry on configured substrings
|
|
66
|
+
if (chunksYielded > 0 &&
|
|
67
|
+
canRetry &&
|
|
68
|
+
this.isMidStreamRetryable(chunk.error)) {
|
|
69
|
+
yield { ok: true, value: { content: '', reset: true } };
|
|
70
|
+
shouldRetry = true;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
yield chunk;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!shouldRetry)
|
|
78
|
+
return;
|
|
79
|
+
await this.backoff(attempt, options?.signal);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
isRetryable(error) {
|
|
83
|
+
const msg = error.message;
|
|
84
|
+
return this.opts.retryOn.some((code) => msg.includes(String(code)));
|
|
85
|
+
}
|
|
86
|
+
isMidStreamRetryable(error) {
|
|
87
|
+
if (this.opts.retryOnMidStream.length === 0)
|
|
88
|
+
return false;
|
|
89
|
+
const msg = error.message;
|
|
90
|
+
return this.opts.retryOnMidStream.some((sub) => msg.includes(sub));
|
|
91
|
+
}
|
|
92
|
+
backoff(attempt, signal) {
|
|
93
|
+
const delay = this.opts.backoffMs * 2 ** attempt;
|
|
94
|
+
return new Promise((resolve) => {
|
|
95
|
+
const timer = setTimeout(resolve, delay);
|
|
96
|
+
signal?.addEventListener('abort', () => {
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
resolve();
|
|
99
|
+
}, { once: true });
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=retry-llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-llm.js","sourceRoot":"","sources":["../../src/resilience/retry-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ILlmRateLimiter } from '@mcp-abap-adt/llm-agent';
|
|
2
|
+
export interface TokenBucketConfig {
|
|
3
|
+
/** Maximum requests allowed per window. */
|
|
4
|
+
maxRequests: number;
|
|
5
|
+
/** Window duration in milliseconds. Default: 60_000 (1 minute). */
|
|
6
|
+
windowMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Token-bucket rate limiter.
|
|
10
|
+
*
|
|
11
|
+
* Allows up to `maxRequests` in a rolling `windowMs` window.
|
|
12
|
+
* When the bucket is empty, `acquire()` blocks until a slot frees up.
|
|
13
|
+
*/
|
|
14
|
+
export declare class TokenBucketRateLimiter implements ILlmRateLimiter {
|
|
15
|
+
private readonly maxRequests;
|
|
16
|
+
private readonly windowMs;
|
|
17
|
+
private timestamps;
|
|
18
|
+
constructor(config: TokenBucketConfig);
|
|
19
|
+
acquire(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=token-bucket-rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-bucket-rate-limiter.d.ts","sourceRoot":"","sources":["../../src/resilience/token-bucket-rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAgB;gBAEtB,MAAM,EAAE,iBAAiB;IAK/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB/B"}
|