@mcp-abap-adt/llm-agent-server 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/bin/llm-agent +2 -0
- package/bin/llm-agent-check +2 -0
- package/dist/agent.d.ts +49 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +97 -0
- package/dist/agent.js.map +1 -0
- package/dist/agents/anthropic-agent.d.ts +33 -0
- package/dist/agents/anthropic-agent.d.ts.map +1 -0
- package/dist/agents/anthropic-agent.js +138 -0
- package/dist/agents/anthropic-agent.js.map +1 -0
- package/dist/agents/base.d.ts +90 -0
- package/dist/agents/base.d.ts.map +1 -0
- package/dist/agents/base.js +107 -0
- package/dist/agents/base.js.map +1 -0
- package/dist/agents/deepseek-agent.d.ts +31 -0
- package/dist/agents/deepseek-agent.d.ts.map +1 -0
- package/dist/agents/deepseek-agent.js +121 -0
- package/dist/agents/deepseek-agent.js.map +1 -0
- package/dist/agents/index.d.ts +10 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +10 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/openai-agent.d.ts +32 -0
- package/dist/agents/openai-agent.d.ts.map +1 -0
- package/dist/agents/openai-agent.js +122 -0
- package/dist/agents/openai-agent.js.map +1 -0
- package/dist/agents/prompt-based-agent.d.ts +29 -0
- package/dist/agents/prompt-based-agent.d.ts.map +1 -0
- package/dist/agents/prompt-based-agent.js +67 -0
- package/dist/agents/prompt-based-agent.js.map +1 -0
- package/dist/agents/sap-core-ai-agent.d.ts +41 -0
- package/dist/agents/sap-core-ai-agent.d.ts.map +1 -0
- package/dist/agents/sap-core-ai-agent.js +151 -0
- package/dist/agents/sap-core-ai-agent.js.map +1 -0
- package/dist/cli.d.ts +53 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +338 -0
- package/dist/cli.js.map +1 -0
- package/dist/generated/version.d.ts +2 -0
- package/dist/generated/version.d.ts.map +1 -0
- package/dist/generated/version.js +3 -0
- package/dist/generated/version.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-providers/anthropic.d.ts +25 -0
- package/dist/llm-providers/anthropic.d.ts.map +1 -0
- package/dist/llm-providers/anthropic.js +202 -0
- package/dist/llm-providers/anthropic.js.map +1 -0
- package/dist/llm-providers/base.d.ts +33 -0
- package/dist/llm-providers/base.d.ts.map +1 -0
- package/dist/llm-providers/base.js +18 -0
- package/dist/llm-providers/base.js.map +1 -0
- package/dist/llm-providers/deepseek.d.ts +24 -0
- package/dist/llm-providers/deepseek.d.ts.map +1 -0
- package/dist/llm-providers/deepseek.js +60 -0
- package/dist/llm-providers/deepseek.js.map +1 -0
- package/dist/llm-providers/index.d.ts +13 -0
- package/dist/llm-providers/index.d.ts.map +1 -0
- package/dist/llm-providers/index.js +15 -0
- package/dist/llm-providers/index.js.map +1 -0
- package/dist/llm-providers/openai.d.ts +34 -0
- package/dist/llm-providers/openai.d.ts.map +1 -0
- package/dist/llm-providers/openai.js +193 -0
- package/dist/llm-providers/openai.js.map +1 -0
- package/dist/llm-providers/sap-core-ai.d.ts +90 -0
- package/dist/llm-providers/sap-core-ai.d.ts.map +1 -0
- package/dist/llm-providers/sap-core-ai.js +394 -0
- package/dist/llm-providers/sap-core-ai.js.map +1 -0
- package/dist/mcp/client.d.ts +133 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +314 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/smart-agent/adapters/cline-client-adapter.d.ts +18 -0
- package/dist/smart-agent/adapters/cline-client-adapter.d.ts.map +1 -0
- package/dist/smart-agent/adapters/cline-client-adapter.js +21 -0
- package/dist/smart-agent/adapters/cline-client-adapter.js.map +1 -0
- package/dist/smart-agent/adapters/index.d.ts +3 -0
- package/dist/smart-agent/adapters/index.d.ts.map +1 -0
- package/dist/smart-agent/adapters/index.js +3 -0
- package/dist/smart-agent/adapters/index.js.map +1 -0
- package/dist/smart-agent/adapters/llm-adapter.d.ts +24 -0
- package/dist/smart-agent/adapters/llm-adapter.d.ts.map +1 -0
- package/dist/smart-agent/adapters/llm-adapter.js +345 -0
- package/dist/smart-agent/adapters/llm-adapter.js.map +1 -0
- package/dist/smart-agent/adapters/mcp-client-adapter.d.ts +16 -0
- package/dist/smart-agent/adapters/mcp-client-adapter.d.ts.map +1 -0
- package/dist/smart-agent/adapters/mcp-client-adapter.js +95 -0
- package/dist/smart-agent/adapters/mcp-client-adapter.js.map +1 -0
- package/dist/smart-agent/adapters/non-streaming-llm.d.ts +18 -0
- package/dist/smart-agent/adapters/non-streaming-llm.d.ts.map +1 -0
- package/dist/smart-agent/adapters/non-streaming-llm.js +44 -0
- package/dist/smart-agent/adapters/non-streaming-llm.js.map +1 -0
- package/dist/smart-agent/agent.d.ts +229 -0
- package/dist/smart-agent/agent.d.ts.map +1 -0
- package/dist/smart-agent/agent.js +1538 -0
- package/dist/smart-agent/agent.js.map +1 -0
- package/dist/smart-agent/api-adapters/anthropic-adapter.d.ts +10 -0
- package/dist/smart-agent/api-adapters/anthropic-adapter.d.ts.map +1 -0
- package/dist/smart-agent/api-adapters/anthropic-adapter.js +356 -0
- package/dist/smart-agent/api-adapters/anthropic-adapter.js.map +1 -0
- package/dist/smart-agent/api-adapters/index.d.ts +3 -0
- package/dist/smart-agent/api-adapters/index.d.ts.map +1 -0
- package/dist/smart-agent/api-adapters/index.js +3 -0
- package/dist/smart-agent/api-adapters/index.js.map +1 -0
- package/dist/smart-agent/api-adapters/openai-adapter.d.ts +10 -0
- package/dist/smart-agent/api-adapters/openai-adapter.d.ts.map +1 -0
- package/dist/smart-agent/api-adapters/openai-adapter.js +277 -0
- package/dist/smart-agent/api-adapters/openai-adapter.js.map +1 -0
- package/dist/smart-agent/builder.d.ts +281 -0
- package/dist/smart-agent/builder.d.ts.map +1 -0
- package/dist/smart-agent/builder.js +942 -0
- package/dist/smart-agent/builder.js.map +1 -0
- package/dist/smart-agent/cache/index.d.ts +4 -0
- package/dist/smart-agent/cache/index.d.ts.map +1 -0
- package/dist/smart-agent/cache/index.js +3 -0
- package/dist/smart-agent/cache/index.js.map +1 -0
- package/dist/smart-agent/cache/noop-tool-cache.d.ts +7 -0
- package/dist/smart-agent/cache/noop-tool-cache.d.ts.map +1 -0
- package/dist/smart-agent/cache/noop-tool-cache.js +8 -0
- package/dist/smart-agent/cache/noop-tool-cache.js.map +1 -0
- package/dist/smart-agent/cache/tool-cache.d.ts +14 -0
- package/dist/smart-agent/cache/tool-cache.d.ts.map +1 -0
- package/dist/smart-agent/cache/tool-cache.js +32 -0
- package/dist/smart-agent/cache/tool-cache.js.map +1 -0
- package/dist/smart-agent/cache/types.d.ts +7 -0
- package/dist/smart-agent/cache/types.d.ts.map +1 -0
- package/dist/smart-agent/cache/types.js +2 -0
- package/dist/smart-agent/cache/types.js.map +1 -0
- package/dist/smart-agent/check-models-cli.d.ts +14 -0
- package/dist/smart-agent/check-models-cli.d.ts.map +1 -0
- package/dist/smart-agent/check-models-cli.js +237 -0
- package/dist/smart-agent/check-models-cli.js.map +1 -0
- package/dist/smart-agent/classifier/index.d.ts +3 -0
- package/dist/smart-agent/classifier/index.d.ts.map +1 -0
- package/dist/smart-agent/classifier/index.js +2 -0
- package/dist/smart-agent/classifier/index.js.map +1 -0
- package/dist/smart-agent/classifier/llm-classifier.d.ts +20 -0
- package/dist/smart-agent/classifier/llm-classifier.d.ts.map +1 -0
- package/dist/smart-agent/classifier/llm-classifier.js +128 -0
- package/dist/smart-agent/classifier/llm-classifier.js.map +1 -0
- package/dist/smart-agent/cli.d.ts +65 -0
- package/dist/smart-agent/cli.d.ts.map +1 -0
- package/dist/smart-agent/cli.js +199 -0
- package/dist/smart-agent/cli.js.map +1 -0
- package/dist/smart-agent/config/config-watcher.d.ts +54 -0
- package/dist/smart-agent/config/config-watcher.d.ts.map +1 -0
- package/dist/smart-agent/config/config-watcher.js +107 -0
- package/dist/smart-agent/config/config-watcher.js.map +1 -0
- package/dist/smart-agent/config/index.d.ts +2 -0
- package/dist/smart-agent/config/index.d.ts.map +1 -0
- package/dist/smart-agent/config/index.js +2 -0
- package/dist/smart-agent/config/index.js.map +1 -0
- package/dist/smart-agent/config.d.ts +35 -0
- package/dist/smart-agent/config.d.ts.map +1 -0
- package/dist/smart-agent/config.js +360 -0
- package/dist/smart-agent/config.js.map +1 -0
- package/dist/smart-agent/context/context-assembler.d.ts +49 -0
- package/dist/smart-agent/context/context-assembler.d.ts.map +1 -0
- package/dist/smart-agent/context/context-assembler.js +184 -0
- package/dist/smart-agent/context/context-assembler.js.map +1 -0
- package/dist/smart-agent/context/index.d.ts +3 -0
- package/dist/smart-agent/context/index.d.ts.map +1 -0
- package/dist/smart-agent/context/index.js +2 -0
- package/dist/smart-agent/context/index.js.map +1 -0
- package/dist/smart-agent/health/health-checker.d.ts +21 -0
- package/dist/smart-agent/health/health-checker.d.ts.map +1 -0
- package/dist/smart-agent/health/health-checker.js +52 -0
- package/dist/smart-agent/health/health-checker.js.map +1 -0
- package/dist/smart-agent/health/index.d.ts +3 -0
- package/dist/smart-agent/health/index.d.ts.map +1 -0
- package/dist/smart-agent/health/index.js +2 -0
- package/dist/smart-agent/health/index.js.map +1 -0
- package/dist/smart-agent/health/types.d.ts +25 -0
- package/dist/smart-agent/health/types.d.ts.map +1 -0
- package/dist/smart-agent/health/types.js +2 -0
- package/dist/smart-agent/health/types.js.map +1 -0
- package/dist/smart-agent/history/history-memory.d.ts +12 -0
- package/dist/smart-agent/history/history-memory.d.ts.map +1 -0
- package/dist/smart-agent/history/history-memory.js +26 -0
- package/dist/smart-agent/history/history-memory.js.map +1 -0
- package/dist/smart-agent/history/history-summarizer.d.ts +10 -0
- package/dist/smart-agent/history/history-summarizer.d.ts.map +1 -0
- package/dist/smart-agent/history/history-summarizer.js +27 -0
- package/dist/smart-agent/history/history-summarizer.js.map +1 -0
- package/dist/smart-agent/history/index.d.ts +3 -0
- package/dist/smart-agent/history/index.d.ts.map +1 -0
- package/dist/smart-agent/history/index.js +3 -0
- package/dist/smart-agent/history/index.js.map +1 -0
- package/dist/smart-agent/interfaces/api-adapter.d.ts +36 -0
- package/dist/smart-agent/interfaces/api-adapter.d.ts.map +1 -0
- package/dist/smart-agent/interfaces/api-adapter.js +9 -0
- package/dist/smart-agent/interfaces/api-adapter.js.map +1 -0
- package/dist/smart-agent/interfaces/client-adapter.d.ts +23 -0
- package/dist/smart-agent/interfaces/client-adapter.d.ts.map +1 -0
- package/dist/smart-agent/interfaces/client-adapter.js +10 -0
- package/dist/smart-agent/interfaces/client-adapter.js.map +1 -0
- package/dist/smart-agent/interfaces/mcp-connection-strategy.d.ts +27 -0
- package/dist/smart-agent/interfaces/mcp-connection-strategy.d.ts.map +1 -0
- package/dist/smart-agent/interfaces/mcp-connection-strategy.js +2 -0
- package/dist/smart-agent/interfaces/mcp-connection-strategy.js.map +1 -0
- package/dist/smart-agent/interfaces/model-resolver.d.ts +9 -0
- package/dist/smart-agent/interfaces/model-resolver.d.ts.map +1 -0
- package/dist/smart-agent/interfaces/model-resolver.js +2 -0
- package/dist/smart-agent/interfaces/model-resolver.js.map +1 -0
- package/dist/smart-agent/interfaces/pipeline.d.ts +125 -0
- package/dist/smart-agent/interfaces/pipeline.d.ts.map +1 -0
- package/dist/smart-agent/interfaces/pipeline.js +13 -0
- package/dist/smart-agent/interfaces/pipeline.js.map +1 -0
- package/dist/smart-agent/logger/console-logger.d.ts +7 -0
- package/dist/smart-agent/logger/console-logger.d.ts.map +1 -0
- package/dist/smart-agent/logger/console-logger.js +12 -0
- package/dist/smart-agent/logger/console-logger.js.map +1 -0
- package/dist/smart-agent/logger/default-request-logger.d.ts +17 -0
- package/dist/smart-agent/logger/default-request-logger.d.ts.map +1 -0
- package/dist/smart-agent/logger/default-request-logger.js +86 -0
- package/dist/smart-agent/logger/default-request-logger.js.map +1 -0
- package/dist/smart-agent/logger/index.d.ts +3 -0
- package/dist/smart-agent/logger/index.d.ts.map +1 -0
- package/dist/smart-agent/logger/index.js +2 -0
- package/dist/smart-agent/logger/index.js.map +1 -0
- package/dist/smart-agent/logger/noop-request-logger.d.ts +11 -0
- package/dist/smart-agent/logger/noop-request-logger.d.ts.map +1 -0
- package/dist/smart-agent/logger/noop-request-logger.js +20 -0
- package/dist/smart-agent/logger/noop-request-logger.js.map +1 -0
- package/dist/smart-agent/logger/session-logger.d.ts +10 -0
- package/dist/smart-agent/logger/session-logger.d.ts.map +1 -0
- package/dist/smart-agent/logger/session-logger.js +40 -0
- package/dist/smart-agent/logger/session-logger.js.map +1 -0
- package/dist/smart-agent/logger/types.d.ts +63 -0
- package/dist/smart-agent/logger/types.d.ts.map +1 -0
- package/dist/smart-agent/logger/types.js +2 -0
- package/dist/smart-agent/logger/types.js.map +1 -0
- package/dist/smart-agent/mcp-client-factory.d.ts +3 -0
- package/dist/smart-agent/mcp-client-factory.d.ts.map +1 -0
- package/dist/smart-agent/mcp-client-factory.js +21 -0
- package/dist/smart-agent/mcp-client-factory.js.map +1 -0
- package/dist/smart-agent/metrics/in-memory-metrics.d.ts +58 -0
- package/dist/smart-agent/metrics/in-memory-metrics.d.ts.map +1 -0
- package/dist/smart-agent/metrics/in-memory-metrics.js +78 -0
- package/dist/smart-agent/metrics/in-memory-metrics.js.map +1 -0
- package/dist/smart-agent/metrics/index.d.ts +4 -0
- package/dist/smart-agent/metrics/index.d.ts.map +1 -0
- package/dist/smart-agent/metrics/index.js +3 -0
- package/dist/smart-agent/metrics/index.js.map +1 -0
- package/dist/smart-agent/metrics/noop-metrics.d.ts +17 -0
- package/dist/smart-agent/metrics/noop-metrics.d.ts.map +1 -0
- package/dist/smart-agent/metrics/noop-metrics.js +22 -0
- package/dist/smart-agent/metrics/noop-metrics.js.map +1 -0
- package/dist/smart-agent/metrics/types.d.ts +36 -0
- package/dist/smart-agent/metrics/types.d.ts.map +1 -0
- package/dist/smart-agent/metrics/types.js +9 -0
- package/dist/smart-agent/metrics/types.js.map +1 -0
- package/dist/smart-agent/otel/index.d.ts +2 -0
- package/dist/smart-agent/otel/index.d.ts.map +1 -0
- package/dist/smart-agent/otel/index.js +2 -0
- package/dist/smart-agent/otel/index.js.map +1 -0
- package/dist/smart-agent/otel/otel-tracer-adapter.d.ts +15 -0
- package/dist/smart-agent/otel/otel-tracer-adapter.d.ts.map +1 -0
- package/dist/smart-agent/otel/otel-tracer-adapter.js +62 -0
- package/dist/smart-agent/otel/otel-tracer-adapter.js.map +1 -0
- package/dist/smart-agent/pipeline/condition-evaluator.d.ts +35 -0
- package/dist/smart-agent/pipeline/condition-evaluator.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/condition-evaluator.js +143 -0
- package/dist/smart-agent/pipeline/condition-evaluator.js.map +1 -0
- package/dist/smart-agent/pipeline/context.d.ts +121 -0
- package/dist/smart-agent/pipeline/context.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/context.js +19 -0
- package/dist/smart-agent/pipeline/context.js.map +1 -0
- package/dist/smart-agent/pipeline/default-pipeline.d.ts +69 -0
- package/dist/smart-agent/pipeline/default-pipeline.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/default-pipeline.js +278 -0
- package/dist/smart-agent/pipeline/default-pipeline.js.map +1 -0
- package/dist/smart-agent/pipeline/executor.d.ts +54 -0
- package/dist/smart-agent/pipeline/executor.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/executor.js +133 -0
- package/dist/smart-agent/pipeline/executor.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/assemble.d.ts +16 -0
- package/dist/smart-agent/pipeline/handlers/assemble.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/assemble.js +72 -0
- package/dist/smart-agent/pipeline/handlers/assemble.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/build-tool-query.d.ts +30 -0
- package/dist/smart-agent/pipeline/handlers/build-tool-query.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/build-tool-query.js +80 -0
- package/dist/smart-agent/pipeline/handlers/build-tool-query.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/classify.d.ts +21 -0
- package/dist/smart-agent/pipeline/handlers/classify.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/classify.js +60 -0
- package/dist/smart-agent/pipeline/handlers/classify.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/expand.d.ts +16 -0
- package/dist/smart-agent/pipeline/handlers/expand.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/expand.js +24 -0
- package/dist/smart-agent/pipeline/handlers/expand.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/history-upsert.d.ts +29 -0
- package/dist/smart-agent/pipeline/handlers/history-upsert.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/history-upsert.js +75 -0
- package/dist/smart-agent/pipeline/handlers/history-upsert.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/index.d.ts +31 -0
- package/dist/smart-agent/pipeline/handlers/index.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/index.js +44 -0
- package/dist/smart-agent/pipeline/handlers/index.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/rag-query.d.ts +27 -0
- package/dist/smart-agent/pipeline/handlers/rag-query.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/rag-query.js +117 -0
- package/dist/smart-agent/pipeline/handlers/rag-query.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/rerank.d.ts +16 -0
- package/dist/smart-agent/pipeline/handlers/rerank.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/rerank.js +27 -0
- package/dist/smart-agent/pipeline/handlers/rerank.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/skill-select.d.ts +18 -0
- package/dist/smart-agent/pipeline/handlers/skill-select.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/skill-select.js +88 -0
- package/dist/smart-agent/pipeline/handlers/skill-select.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/summarize.d.ts +17 -0
- package/dist/smart-agent/pipeline/handlers/summarize.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/summarize.js +56 -0
- package/dist/smart-agent/pipeline/handlers/summarize.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/tool-loop.d.ts +32 -0
- package/dist/smart-agent/pipeline/handlers/tool-loop.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/tool-loop.js +734 -0
- package/dist/smart-agent/pipeline/handlers/tool-loop.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/tool-select.d.ts +21 -0
- package/dist/smart-agent/pipeline/handlers/tool-select.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/tool-select.js +109 -0
- package/dist/smart-agent/pipeline/handlers/tool-select.js.map +1 -0
- package/dist/smart-agent/pipeline/handlers/translate.d.ts +17 -0
- package/dist/smart-agent/pipeline/handlers/translate.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/handlers/translate.js +42 -0
- package/dist/smart-agent/pipeline/handlers/translate.js.map +1 -0
- package/dist/smart-agent/pipeline/index.d.ts +14 -0
- package/dist/smart-agent/pipeline/index.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/index.js +16 -0
- package/dist/smart-agent/pipeline/index.js.map +1 -0
- package/dist/smart-agent/pipeline/stage-handler.d.ts +36 -0
- package/dist/smart-agent/pipeline/stage-handler.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/stage-handler.js +24 -0
- package/dist/smart-agent/pipeline/stage-handler.js.map +1 -0
- package/dist/smart-agent/pipeline/types.d.ts +116 -0
- package/dist/smart-agent/pipeline/types.d.ts.map +1 -0
- package/dist/smart-agent/pipeline/types.js +54 -0
- package/dist/smart-agent/pipeline/types.js.map +1 -0
- package/dist/smart-agent/pipeline.d.ts +82 -0
- package/dist/smart-agent/pipeline.d.ts.map +1 -0
- package/dist/smart-agent/pipeline.js +8 -0
- package/dist/smart-agent/pipeline.js.map +1 -0
- package/dist/smart-agent/plugins/index.d.ts +4 -0
- package/dist/smart-agent/plugins/index.d.ts.map +1 -0
- package/dist/smart-agent/plugins/index.js +3 -0
- package/dist/smart-agent/plugins/index.js.map +1 -0
- package/dist/smart-agent/plugins/loader.d.ts +67 -0
- package/dist/smart-agent/plugins/loader.d.ts.map +1 -0
- package/dist/smart-agent/plugins/loader.js +114 -0
- package/dist/smart-agent/plugins/loader.js.map +1 -0
- package/dist/smart-agent/plugins/types.d.ts +164 -0
- package/dist/smart-agent/plugins/types.d.ts.map +1 -0
- package/dist/smart-agent/plugins/types.js +136 -0
- package/dist/smart-agent/plugins/types.js.map +1 -0
- package/dist/smart-agent/policy/fallback-llm-call-strategy.d.ts +16 -0
- package/dist/smart-agent/policy/fallback-llm-call-strategy.d.ts.map +1 -0
- package/dist/smart-agent/policy/fallback-llm-call-strategy.js +66 -0
- package/dist/smart-agent/policy/fallback-llm-call-strategy.js.map +1 -0
- package/dist/smart-agent/policy/heuristic-injection-detector.d.ts +5 -0
- package/dist/smart-agent/policy/heuristic-injection-detector.d.ts.map +1 -0
- package/dist/smart-agent/policy/heuristic-injection-detector.js +36 -0
- package/dist/smart-agent/policy/heuristic-injection-detector.js.map +1 -0
- package/dist/smart-agent/policy/index.d.ts +6 -0
- package/dist/smart-agent/policy/index.d.ts.map +1 -0
- package/dist/smart-agent/policy/index.js +5 -0
- package/dist/smart-agent/policy/index.js.map +1 -0
- package/dist/smart-agent/policy/mixed-tool-call-handler.d.ts +16 -0
- package/dist/smart-agent/policy/mixed-tool-call-handler.d.ts.map +1 -0
- package/dist/smart-agent/policy/mixed-tool-call-handler.js +49 -0
- package/dist/smart-agent/policy/mixed-tool-call-handler.js.map +1 -0
- package/dist/smart-agent/policy/non-streaming-llm-call-strategy.d.ts +6 -0
- package/dist/smart-agent/policy/non-streaming-llm-call-strategy.d.ts.map +1 -0
- package/dist/smart-agent/policy/non-streaming-llm-call-strategy.js +21 -0
- package/dist/smart-agent/policy/non-streaming-llm-call-strategy.js.map +1 -0
- package/dist/smart-agent/policy/pending-tool-results-registry.d.ts +25 -0
- package/dist/smart-agent/policy/pending-tool-results-registry.d.ts.map +1 -0
- package/dist/smart-agent/policy/pending-tool-results-registry.js +50 -0
- package/dist/smart-agent/policy/pending-tool-results-registry.js.map +1 -0
- package/dist/smart-agent/policy/streaming-llm-call-strategy.d.ts +6 -0
- package/dist/smart-agent/policy/streaming-llm-call-strategy.d.ts.map +1 -0
- package/dist/smart-agent/policy/streaming-llm-call-strategy.js +7 -0
- package/dist/smart-agent/policy/streaming-llm-call-strategy.js.map +1 -0
- package/dist/smart-agent/policy/tool-availability-registry.d.ts +21 -0
- package/dist/smart-agent/policy/tool-availability-registry.d.ts.map +1 -0
- package/dist/smart-agent/policy/tool-availability-registry.js +77 -0
- package/dist/smart-agent/policy/tool-availability-registry.js.map +1 -0
- package/dist/smart-agent/policy/tool-policy-guard.d.ts +8 -0
- package/dist/smart-agent/policy/tool-policy-guard.d.ts.map +1 -0
- package/dist/smart-agent/policy/tool-policy-guard.js +40 -0
- package/dist/smart-agent/policy/tool-policy-guard.js.map +1 -0
- package/dist/smart-agent/policy/types.d.ts +51 -0
- package/dist/smart-agent/policy/types.d.ts.map +1 -0
- package/dist/smart-agent/policy/types.js +17 -0
- package/dist/smart-agent/policy/types.js.map +1 -0
- package/dist/smart-agent/providers.d.ts +98 -0
- package/dist/smart-agent/providers.d.ts.map +1 -0
- package/dist/smart-agent/providers.js +245 -0
- package/dist/smart-agent/providers.js.map +1 -0
- package/dist/smart-agent/reranker/index.d.ts +4 -0
- package/dist/smart-agent/reranker/index.d.ts.map +1 -0
- package/dist/smart-agent/reranker/index.js +3 -0
- package/dist/smart-agent/reranker/index.js.map +1 -0
- package/dist/smart-agent/reranker/llm-reranker.d.ts +10 -0
- package/dist/smart-agent/reranker/llm-reranker.d.ts.map +1 -0
- package/dist/smart-agent/reranker/llm-reranker.js +55 -0
- package/dist/smart-agent/reranker/llm-reranker.js.map +1 -0
- package/dist/smart-agent/reranker/noop-reranker.d.ts +6 -0
- package/dist/smart-agent/reranker/noop-reranker.d.ts.map +1 -0
- package/dist/smart-agent/reranker/noop-reranker.js +6 -0
- package/dist/smart-agent/reranker/noop-reranker.js.map +1 -0
- package/dist/smart-agent/reranker/types.d.ts +5 -0
- package/dist/smart-agent/reranker/types.d.ts.map +1 -0
- package/dist/smart-agent/reranker/types.js +2 -0
- package/dist/smart-agent/reranker/types.js.map +1 -0
- package/dist/smart-agent/resilience/circuit-breaker-embedder.d.ts +16 -0
- package/dist/smart-agent/resilience/circuit-breaker-embedder.d.ts.map +1 -0
- package/dist/smart-agent/resilience/circuit-breaker-embedder.js +47 -0
- package/dist/smart-agent/resilience/circuit-breaker-embedder.js.map +1 -0
- package/dist/smart-agent/resilience/circuit-breaker-llm.d.ts +19 -0
- package/dist/smart-agent/resilience/circuit-breaker-llm.d.ts.map +1 -0
- package/dist/smart-agent/resilience/circuit-breaker-llm.js +72 -0
- package/dist/smart-agent/resilience/circuit-breaker-llm.js.map +1 -0
- package/dist/smart-agent/resilience/circuit-breaker.d.ts +36 -0
- package/dist/smart-agent/resilience/circuit-breaker.d.ts.map +1 -0
- package/dist/smart-agent/resilience/circuit-breaker.js +60 -0
- package/dist/smart-agent/resilience/circuit-breaker.js.map +1 -0
- package/dist/smart-agent/resilience/fallback-rag.d.ts +21 -0
- package/dist/smart-agent/resilience/fallback-rag.d.ts.map +1 -0
- package/dist/smart-agent/resilience/fallback-rag.js +80 -0
- package/dist/smart-agent/resilience/fallback-rag.js.map +1 -0
- package/dist/smart-agent/resilience/index.d.ts +5 -0
- package/dist/smart-agent/resilience/index.d.ts.map +1 -0
- package/dist/smart-agent/resilience/index.js +5 -0
- package/dist/smart-agent/resilience/index.js.map +1 -0
- package/dist/smart-agent/resilience/rate-limiter-llm.d.ts +17 -0
- package/dist/smart-agent/resilience/rate-limiter-llm.d.ts.map +1 -0
- package/dist/smart-agent/resilience/rate-limiter-llm.js +30 -0
- package/dist/smart-agent/resilience/rate-limiter-llm.js.map +1 -0
- package/dist/smart-agent/resilience/retry-llm.d.ts +32 -0
- package/dist/smart-agent/resilience/retry-llm.d.ts.map +1 -0
- package/dist/smart-agent/resilience/retry-llm.js +103 -0
- package/dist/smart-agent/resilience/retry-llm.js.map +1 -0
- package/dist/smart-agent/resilience/token-bucket-rate-limiter.d.ts +21 -0
- package/dist/smart-agent/resilience/token-bucket-rate-limiter.d.ts.map +1 -0
- package/dist/smart-agent/resilience/token-bucket-rate-limiter.js +32 -0
- package/dist/smart-agent/resilience/token-bucket-rate-limiter.js.map +1 -0
- package/dist/smart-agent/server.d.ts +19 -0
- package/dist/smart-agent/server.d.ts.map +1 -0
- package/dist/smart-agent/server.js +349 -0
- package/dist/smart-agent/server.js.map +1 -0
- package/dist/smart-agent/session/index.d.ts +4 -0
- package/dist/smart-agent/session/index.d.ts.map +1 -0
- package/dist/smart-agent/session/index.js +3 -0
- package/dist/smart-agent/session/index.js.map +1 -0
- package/dist/smart-agent/session/noop-session-manager.d.ts +8 -0
- package/dist/smart-agent/session/noop-session-manager.d.ts.map +1 -0
- package/dist/smart-agent/session/noop-session-manager.js +11 -0
- package/dist/smart-agent/session/noop-session-manager.js.map +1 -0
- package/dist/smart-agent/session/session-manager.d.ts +13 -0
- package/dist/smart-agent/session/session-manager.d.ts.map +1 -0
- package/dist/smart-agent/session/session-manager.js +20 -0
- package/dist/smart-agent/session/session-manager.js.map +1 -0
- package/dist/smart-agent/session/types.d.ts +7 -0
- package/dist/smart-agent/session/types.d.ts.map +1 -0
- package/dist/smart-agent/session/types.js +2 -0
- package/dist/smart-agent/session/types.js.map +1 -0
- package/dist/smart-agent/skills/claude-skill-manager.d.ts +24 -0
- package/dist/smart-agent/skills/claude-skill-manager.d.ts.map +1 -0
- package/dist/smart-agent/skills/claude-skill-manager.js +81 -0
- package/dist/smart-agent/skills/claude-skill-manager.js.map +1 -0
- package/dist/smart-agent/skills/codex-skill-manager.d.ts +20 -0
- package/dist/smart-agent/skills/codex-skill-manager.d.ts.map +1 -0
- package/dist/smart-agent/skills/codex-skill-manager.js +75 -0
- package/dist/smart-agent/skills/codex-skill-manager.js.map +1 -0
- package/dist/smart-agent/skills/filesystem-skill-manager.d.ts +17 -0
- package/dist/smart-agent/skills/filesystem-skill-manager.d.ts.map +1 -0
- package/dist/smart-agent/skills/filesystem-skill-manager.js +48 -0
- package/dist/smart-agent/skills/filesystem-skill-manager.js.map +1 -0
- package/dist/smart-agent/skills/filesystem-skill.d.ts +25 -0
- package/dist/smart-agent/skills/filesystem-skill.d.ts.map +1 -0
- package/dist/smart-agent/skills/filesystem-skill.js +110 -0
- package/dist/smart-agent/skills/filesystem-skill.js.map +1 -0
- package/dist/smart-agent/skills/index.d.ts +9 -0
- package/dist/smart-agent/skills/index.d.ts.map +1 -0
- package/dist/smart-agent/skills/index.js +9 -0
- package/dist/smart-agent/skills/index.js.map +1 -0
- package/dist/smart-agent/skills/skill-utils.d.ts +15 -0
- package/dist/smart-agent/skills/skill-utils.d.ts.map +1 -0
- package/dist/smart-agent/skills/skill-utils.js +46 -0
- package/dist/smart-agent/skills/skill-utils.js.map +1 -0
- package/dist/smart-agent/smart-server.d.ts +150 -0
- package/dist/smart-agent/smart-server.d.ts.map +1 -0
- package/dist/smart-agent/smart-server.js +903 -0
- package/dist/smart-agent/smart-server.js.map +1 -0
- package/dist/smart-agent/strategies/index.d.ts +4 -0
- package/dist/smart-agent/strategies/index.d.ts.map +1 -0
- package/dist/smart-agent/strategies/index.js +4 -0
- package/dist/smart-agent/strategies/index.js.map +1 -0
- package/dist/smart-agent/strategies/lazy-connection-strategy.d.ts +15 -0
- package/dist/smart-agent/strategies/lazy-connection-strategy.d.ts.map +1 -0
- package/dist/smart-agent/strategies/lazy-connection-strategy.js +82 -0
- package/dist/smart-agent/strategies/lazy-connection-strategy.js.map +1 -0
- package/dist/smart-agent/strategies/noop-connection-strategy.d.ts +6 -0
- package/dist/smart-agent/strategies/noop-connection-strategy.d.ts.map +1 -0
- package/dist/smart-agent/strategies/noop-connection-strategy.js +6 -0
- package/dist/smart-agent/strategies/noop-connection-strategy.js.map +1 -0
- package/dist/smart-agent/strategies/periodic-connection-strategy.d.ts +13 -0
- package/dist/smart-agent/strategies/periodic-connection-strategy.d.ts.map +1 -0
- package/dist/smart-agent/strategies/periodic-connection-strategy.js +40 -0
- package/dist/smart-agent/strategies/periodic-connection-strategy.js.map +1 -0
- package/dist/smart-agent/testing/index.d.ts +121 -0
- package/dist/smart-agent/testing/index.d.ts.map +1 -0
- package/dist/smart-agent/testing/index.js +354 -0
- package/dist/smart-agent/testing/index.js.map +1 -0
- package/dist/smart-agent/tracer/index.d.ts +3 -0
- package/dist/smart-agent/tracer/index.d.ts.map +1 -0
- package/dist/smart-agent/tracer/index.js +2 -0
- package/dist/smart-agent/tracer/index.js.map +1 -0
- package/dist/smart-agent/tracer/noop-tracer.d.ts +5 -0
- package/dist/smart-agent/tracer/noop-tracer.d.ts.map +1 -0
- package/dist/smart-agent/tracer/noop-tracer.js +16 -0
- package/dist/smart-agent/tracer/noop-tracer.js.map +1 -0
- package/dist/smart-agent/tracer/types.d.ts +17 -0
- package/dist/smart-agent/tracer/types.d.ts.map +1 -0
- package/dist/smart-agent/tracer/types.js +2 -0
- package/dist/smart-agent/tracer/types.js.map +1 -0
- package/dist/smart-agent/utils/external-tools-normalizer.d.ts +15 -0
- package/dist/smart-agent/utils/external-tools-normalizer.d.ts.map +1 -0
- package/dist/smart-agent/utils/external-tools-normalizer.js +146 -0
- package/dist/smart-agent/utils/external-tools-normalizer.js.map +1 -0
- package/dist/smart-agent/utils/lazy.d.ts +51 -0
- package/dist/smart-agent/utils/lazy.d.ts.map +1 -0
- package/dist/smart-agent/utils/lazy.js +127 -0
- package/dist/smart-agent/utils/lazy.js.map +1 -0
- package/dist/smart-agent/utils/parse-frontmatter.d.ts +15 -0
- package/dist/smart-agent/utils/parse-frontmatter.d.ts.map +1 -0
- package/dist/smart-agent/utils/parse-frontmatter.js +22 -0
- package/dist/smart-agent/utils/parse-frontmatter.js.map +1 -0
- package/dist/smart-agent/utils/tool-call-deltas.d.ts +4 -0
- package/dist/smart-agent/utils/tool-call-deltas.d.ts.map +1 -0
- package/dist/smart-agent/utils/tool-call-deltas.js +25 -0
- package/dist/smart-agent/utils/tool-call-deltas.js.map +1 -0
- package/dist/smart-agent/validator/index.d.ts +3 -0
- package/dist/smart-agent/validator/index.d.ts.map +1 -0
- package/dist/smart-agent/validator/index.js +2 -0
- package/dist/smart-agent/validator/index.js.map +1 -0
- package/dist/smart-agent/validator/noop-validator.d.ts +6 -0
- package/dist/smart-agent/validator/noop-validator.d.ts.map +1 -0
- package/dist/smart-agent/validator/noop-validator.js +6 -0
- package/dist/smart-agent/validator/noop-validator.js.map +1 -0
- package/dist/smart-agent/validator/types.d.ts +17 -0
- package/dist/smart-agent/validator/types.d.ts.map +1 -0
- package/dist/smart-agent/validator/types.js +8 -0
- package/dist/smart-agent/validator/types.js.map +1 -0
- package/dist/smoke-adapters.d.ts +17 -0
- package/dist/smoke-adapters.d.ts.map +1 -0
- package/dist/smoke-adapters.js +178 -0
- package/dist/smoke-adapters.js.map +1 -0
- package/package.json +89 -0
- package/tools/claude-via-agent.ps1 +83 -0
- package/tools/claude-via-agent.sh +96 -0
|
@@ -0,0 +1,942 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartAgentBuilder — fluent builder for SmartAgent.
|
|
3
|
+
*
|
|
4
|
+
* Assembles a SmartAgent from interface-based components.
|
|
5
|
+
* The builder itself has NO knowledge of concrete providers —
|
|
6
|
+
* all dependencies must be injected via `withXxx()` methods or
|
|
7
|
+
* resolved externally by the composition root (SmartServer, CLI).
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const handle = await new SmartAgentBuilder()
|
|
11
|
+
* .withMainLlm(myLlm)
|
|
12
|
+
* .setToolsRag(myRag)
|
|
13
|
+
* .build();
|
|
14
|
+
*/
|
|
15
|
+
import { InMemoryRag, isBatchEmbedder, SimpleRagProviderRegistry, SimpleRagRegistry, } from '@mcp-abap-adt/llm-agent';
|
|
16
|
+
import { MCPClientWrapper } from '../mcp/client.js';
|
|
17
|
+
import { McpClientAdapter } from './adapters/mcp-client-adapter.js';
|
|
18
|
+
import { SmartAgent, } from './agent.js';
|
|
19
|
+
import { LlmClassifier, } from './classifier/llm-classifier.js';
|
|
20
|
+
import { ContextAssembler, } from './context/context-assembler.js';
|
|
21
|
+
import { HistoryMemory } from './history/history-memory.js';
|
|
22
|
+
import { HistorySummarizer } from './history/history-summarizer.js';
|
|
23
|
+
import { DefaultRequestLogger } from './logger/default-request-logger.js';
|
|
24
|
+
import { DefaultPipeline } from './pipeline/default-pipeline.js';
|
|
25
|
+
import { CircuitBreaker, } from './resilience/circuit-breaker.js';
|
|
26
|
+
import { CircuitBreakerLlm } from './resilience/circuit-breaker-llm.js';
|
|
27
|
+
import { FallbackRag } from './resilience/fallback-rag.js';
|
|
28
|
+
import { RateLimiterLlm } from './resilience/rate-limiter-llm.js';
|
|
29
|
+
import { RetryLlm } from './resilience/retry-llm.js';
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// SmartAgentBuilder
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
function isModelProvider(obj) {
|
|
34
|
+
return (obj !== null &&
|
|
35
|
+
typeof obj === 'object' &&
|
|
36
|
+
typeof obj.getModels === 'function' &&
|
|
37
|
+
typeof obj.getModel === 'function');
|
|
38
|
+
}
|
|
39
|
+
export class SmartAgentBuilder {
|
|
40
|
+
cfg;
|
|
41
|
+
// All components injected via fluent setters
|
|
42
|
+
_mainLlm;
|
|
43
|
+
_helperLlm;
|
|
44
|
+
_classifierLlm;
|
|
45
|
+
_onBeforeStream;
|
|
46
|
+
_toolsRag;
|
|
47
|
+
_historyRag;
|
|
48
|
+
_pipeline;
|
|
49
|
+
_mcpClients;
|
|
50
|
+
_classifier;
|
|
51
|
+
_assembler;
|
|
52
|
+
_logger;
|
|
53
|
+
_toolPolicy;
|
|
54
|
+
_injectionDetector;
|
|
55
|
+
_tracer;
|
|
56
|
+
_metrics;
|
|
57
|
+
_reranker;
|
|
58
|
+
_queryExpander;
|
|
59
|
+
_toolCache;
|
|
60
|
+
_outputValidator;
|
|
61
|
+
_sessionManager;
|
|
62
|
+
_circuitBreakerConfig;
|
|
63
|
+
_requestLogger;
|
|
64
|
+
_agentOverrides = {};
|
|
65
|
+
_pluginLoader;
|
|
66
|
+
_skillManager;
|
|
67
|
+
_clientAdapters = [];
|
|
68
|
+
_apiAdapters = new Map();
|
|
69
|
+
_modelProvider;
|
|
70
|
+
_embedder;
|
|
71
|
+
_connectionStrategy;
|
|
72
|
+
_historySummarizer;
|
|
73
|
+
_historyMemory;
|
|
74
|
+
_llmCallStrategy;
|
|
75
|
+
_rateLimiter;
|
|
76
|
+
_providers = [];
|
|
77
|
+
_staticCollections = [];
|
|
78
|
+
_pendingDynamicCollections = [];
|
|
79
|
+
_ragRegistry;
|
|
80
|
+
_ragProviderRegistry;
|
|
81
|
+
constructor(cfg = {}) {
|
|
82
|
+
this.cfg = cfg;
|
|
83
|
+
}
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
// Fluent setters
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
/** Set the main LLM used in the tool loop (required). */
|
|
88
|
+
withMainLlm(llm) {
|
|
89
|
+
this._mainLlm = llm;
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
/** Set a model provider for model discovery and metadata. */
|
|
93
|
+
withModelProvider(provider) {
|
|
94
|
+
this._modelProvider = provider;
|
|
95
|
+
return this;
|
|
96
|
+
}
|
|
97
|
+
/** Set the helper LLM used for summarization and translation. */
|
|
98
|
+
withHelperLlm(llm) {
|
|
99
|
+
this._helperLlm = llm;
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
/** Set the LLM used by the intent classifier. If not set, mainLlm is used. */
|
|
103
|
+
withClassifierLlm(llm) {
|
|
104
|
+
this._classifierLlm = llm;
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
/** Register a hook called before streaming the final response to the client. */
|
|
108
|
+
withOnBeforeStream(hook) {
|
|
109
|
+
this._onBeforeStream = hook;
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
/** Inject a custom RAG store for MCP tool selection. Overrides auto-created in-memory store. */
|
|
113
|
+
setToolsRag(rag) {
|
|
114
|
+
this._toolsRag = rag;
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
/** Inject a custom RAG store for conversation history. Overrides auto-created in-memory store. */
|
|
118
|
+
setHistoryRag(rag) {
|
|
119
|
+
this._historyRag = rag;
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
/** Register an IRagProvider for dynamic collection creation. */
|
|
123
|
+
addRagProvider(provider) {
|
|
124
|
+
this._providers.push(provider);
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
/** Register a static (pre-built) RAG collection by name. */
|
|
128
|
+
addRagCollection(params) {
|
|
129
|
+
this._staticCollections.push(params);
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
|
+
/** Queue a dynamic collection to be created via a provider during build(). */
|
|
133
|
+
createRagCollection(params) {
|
|
134
|
+
this._pendingDynamicCollections.push(params);
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
137
|
+
/** Provide a custom IRagRegistry. Defaults to SimpleRagRegistry if not set. */
|
|
138
|
+
setRagRegistry(registry) {
|
|
139
|
+
this._ragRegistry = registry;
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
/** Provide a custom IRagProviderRegistry. Defaults to SimpleRagProviderRegistry if not set. */
|
|
143
|
+
setRagProviderRegistry(registry) {
|
|
144
|
+
this._ragProviderRegistry = registry;
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
/** Inject a pipeline implementation. Defaults to DefaultPipeline if not set. */
|
|
148
|
+
setPipeline(pipeline) {
|
|
149
|
+
this._pipeline = pipeline;
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Override MCP clients. When set, auto-connect and tool vectorization
|
|
154
|
+
* are skipped — the caller is responsible for connecting clients.
|
|
155
|
+
*/
|
|
156
|
+
withMcpClients(clients) {
|
|
157
|
+
this._mcpClients = clients;
|
|
158
|
+
return this;
|
|
159
|
+
}
|
|
160
|
+
/** Override the intent classifier. */
|
|
161
|
+
withClassifier(classifier) {
|
|
162
|
+
this._classifier = classifier;
|
|
163
|
+
return this;
|
|
164
|
+
}
|
|
165
|
+
/** Override the context assembler. */
|
|
166
|
+
withAssembler(assembler) {
|
|
167
|
+
this._assembler = assembler;
|
|
168
|
+
return this;
|
|
169
|
+
}
|
|
170
|
+
/** Set a logger for internal pipeline events. */
|
|
171
|
+
withLogger(logger) {
|
|
172
|
+
this._logger = logger;
|
|
173
|
+
return this;
|
|
174
|
+
}
|
|
175
|
+
/** Set a tool execution policy (allow/deny list). */
|
|
176
|
+
withToolPolicy(policy) {
|
|
177
|
+
this._toolPolicy = policy;
|
|
178
|
+
return this;
|
|
179
|
+
}
|
|
180
|
+
/** Set a prompt-injection detector. */
|
|
181
|
+
withInjectionDetector(detector) {
|
|
182
|
+
this._injectionDetector = detector;
|
|
183
|
+
return this;
|
|
184
|
+
}
|
|
185
|
+
/** Set a tracer for pipeline span instrumentation. */
|
|
186
|
+
withTracer(tracer) {
|
|
187
|
+
this._tracer = tracer;
|
|
188
|
+
return this;
|
|
189
|
+
}
|
|
190
|
+
/** Set a metrics collector for pipeline instrumentation. */
|
|
191
|
+
withMetrics(metrics) {
|
|
192
|
+
this._metrics = metrics;
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
/** Set a reranker to re-score RAG results before context assembly. */
|
|
196
|
+
withReranker(reranker) {
|
|
197
|
+
this._reranker = reranker;
|
|
198
|
+
return this;
|
|
199
|
+
}
|
|
200
|
+
/** Set a query expander to broaden RAG queries with synonyms/related terms. */
|
|
201
|
+
withQueryExpander(expander) {
|
|
202
|
+
this._queryExpander = expander;
|
|
203
|
+
return this;
|
|
204
|
+
}
|
|
205
|
+
/** Set a tool result cache for MCP call deduplication. */
|
|
206
|
+
withToolCache(cache) {
|
|
207
|
+
this._toolCache = cache;
|
|
208
|
+
return this;
|
|
209
|
+
}
|
|
210
|
+
/** Set an output validator for post-LLM response validation. */
|
|
211
|
+
withOutputValidator(validator) {
|
|
212
|
+
this._outputValidator = validator;
|
|
213
|
+
return this;
|
|
214
|
+
}
|
|
215
|
+
/** Set a session manager for multi-turn token budget tracking. */
|
|
216
|
+
withSessionManager(manager) {
|
|
217
|
+
this._sessionManager = manager;
|
|
218
|
+
return this;
|
|
219
|
+
}
|
|
220
|
+
/** Set a skill manager for discovering and loading agent skills. */
|
|
221
|
+
withSkillManager(manager) {
|
|
222
|
+
this._skillManager = manager;
|
|
223
|
+
return this;
|
|
224
|
+
}
|
|
225
|
+
/** Register a client adapter for auto-detecting prompt-based clients. */
|
|
226
|
+
withClientAdapter(adapter) {
|
|
227
|
+
this._clientAdapters.push(adapter);
|
|
228
|
+
return this;
|
|
229
|
+
}
|
|
230
|
+
/** Register an API adapter. When called multiple times with the same name, the last one wins. */
|
|
231
|
+
withApiAdapter(adapter) {
|
|
232
|
+
this._apiAdapters.set(adapter.name, adapter);
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
/** Enable circuit breakers for LLM and embedder calls. */
|
|
236
|
+
withCircuitBreaker(config = {}) {
|
|
237
|
+
this._circuitBreakerConfig = config;
|
|
238
|
+
return this;
|
|
239
|
+
}
|
|
240
|
+
/** Set the shared embedder for RAG queries. When set, queries embed once and share the vector. */
|
|
241
|
+
withEmbedder(embedder) {
|
|
242
|
+
this._embedder = embedder;
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
/** Set a request logger for per-model usage tracking. */
|
|
246
|
+
withRequestLogger(logger) {
|
|
247
|
+
this._requestLogger = logger;
|
|
248
|
+
return this;
|
|
249
|
+
}
|
|
250
|
+
/** Set an MCP connection strategy for dynamic client management. */
|
|
251
|
+
withMcpConnectionStrategy(strategy) {
|
|
252
|
+
this._connectionStrategy = strategy;
|
|
253
|
+
return this;
|
|
254
|
+
}
|
|
255
|
+
/** Override the history summarizer used for semantic history compression. */
|
|
256
|
+
withHistorySummarizer(summarizer) {
|
|
257
|
+
this._historySummarizer = summarizer;
|
|
258
|
+
return this;
|
|
259
|
+
}
|
|
260
|
+
/** Set a rate limiter to throttle outbound LLM requests. */
|
|
261
|
+
withRateLimiter(limiter) {
|
|
262
|
+
this._rateLimiter = limiter;
|
|
263
|
+
return this;
|
|
264
|
+
}
|
|
265
|
+
/** Set the LLM call strategy for tool-loop (streaming, non-streaming, or fallback). */
|
|
266
|
+
withLlmCallStrategy(strategy) {
|
|
267
|
+
this._llmCallStrategy = strategy;
|
|
268
|
+
return this;
|
|
269
|
+
}
|
|
270
|
+
/** Override the history memory store used for semantic history retrieval. */
|
|
271
|
+
withHistoryMemory(memory) {
|
|
272
|
+
this._historyMemory = memory;
|
|
273
|
+
return this;
|
|
274
|
+
}
|
|
275
|
+
// -------------------------------------------------------------------------
|
|
276
|
+
// Pipeline configuration (SmartAgentConfig parameters)
|
|
277
|
+
// -------------------------------------------------------------------------
|
|
278
|
+
/** Set the execution mode: 'smart' (full pipeline), 'hard' (MCP-only), 'pass' (direct LLM). */
|
|
279
|
+
withMode(mode) {
|
|
280
|
+
this._agentOverrides.mode = mode;
|
|
281
|
+
return this;
|
|
282
|
+
}
|
|
283
|
+
/** Set the maximum number of tool-loop iterations. */
|
|
284
|
+
withMaxIterations(n) {
|
|
285
|
+
this._agentOverrides.maxIterations = n;
|
|
286
|
+
return this;
|
|
287
|
+
}
|
|
288
|
+
/** Set the maximum number of tool calls per request. */
|
|
289
|
+
withMaxToolCalls(n) {
|
|
290
|
+
this._agentOverrides.maxToolCalls = n;
|
|
291
|
+
return this;
|
|
292
|
+
}
|
|
293
|
+
/** Set the request timeout in milliseconds. */
|
|
294
|
+
withTimeout(ms) {
|
|
295
|
+
this._agentOverrides.timeoutMs = ms;
|
|
296
|
+
return this;
|
|
297
|
+
}
|
|
298
|
+
/** Set the number of RAG results to retrieve per store. */
|
|
299
|
+
withRagQueryK(k) {
|
|
300
|
+
this._agentOverrides.ragQueryK = k;
|
|
301
|
+
return this;
|
|
302
|
+
}
|
|
303
|
+
/** Enable or disable query expansion for RAG queries. */
|
|
304
|
+
withQueryExpansion(enabled) {
|
|
305
|
+
this._agentOverrides.queryExpansionEnabled = enabled;
|
|
306
|
+
return this;
|
|
307
|
+
}
|
|
308
|
+
/** Enable or disable reasoning/strategy blocks in the response. */
|
|
309
|
+
withShowReasoning(enabled) {
|
|
310
|
+
this._agentOverrides.showReasoning = enabled;
|
|
311
|
+
return this;
|
|
312
|
+
}
|
|
313
|
+
/** Set the SSE heartbeat interval in milliseconds during tool execution. */
|
|
314
|
+
withHeartbeatInterval(ms) {
|
|
315
|
+
this._agentOverrides.heartbeatIntervalMs = ms;
|
|
316
|
+
return this;
|
|
317
|
+
}
|
|
318
|
+
/** Set the health check probe timeout in milliseconds. Default: 5000. */
|
|
319
|
+
withHealthTimeout(ms) {
|
|
320
|
+
this._agentOverrides.healthTimeoutMs = ms;
|
|
321
|
+
return this;
|
|
322
|
+
}
|
|
323
|
+
/** Enable or disable the classification pipeline stage. When disabled, input is treated as a single action. */
|
|
324
|
+
withClassification(enabled) {
|
|
325
|
+
this._agentOverrides.classificationEnabled = enabled;
|
|
326
|
+
return this;
|
|
327
|
+
}
|
|
328
|
+
/** Enable per-iteration RAG-based tool re-selection in the tool loop. */
|
|
329
|
+
withToolReselection(enabled) {
|
|
330
|
+
this._agentOverrides.toolReselectPerIteration = enabled;
|
|
331
|
+
return this;
|
|
332
|
+
}
|
|
333
|
+
/** Set the history message count threshold for auto-summarization. */
|
|
334
|
+
withHistorySummarization(limit) {
|
|
335
|
+
this._agentOverrides.historyAutoSummarizeLimit = limit;
|
|
336
|
+
return this;
|
|
337
|
+
}
|
|
338
|
+
/** Set the session token budget for multi-turn conversations. */
|
|
339
|
+
withSessionTokenBudget(budget) {
|
|
340
|
+
this._agentOverrides.sessionTokenBudget = budget;
|
|
341
|
+
return this;
|
|
342
|
+
}
|
|
343
|
+
// -------------------------------------------------------------------------
|
|
344
|
+
// Plugin loader
|
|
345
|
+
// -------------------------------------------------------------------------
|
|
346
|
+
/**
|
|
347
|
+
* Set a plugin loader for automatic plugin discovery.
|
|
348
|
+
*
|
|
349
|
+
* During `build()`, the loader's `load()` method is called and all
|
|
350
|
+
* discovered registrations are applied to the builder (stage handlers,
|
|
351
|
+
* embedder factories, reranker, query expander, output validator).
|
|
352
|
+
*
|
|
353
|
+
* The library ships {@link FileSystemPluginLoader} as the default.
|
|
354
|
+
* Consumers can provide their own `IPluginLoader` implementation to
|
|
355
|
+
* load plugins from npm packages, remote registries, or any other source.
|
|
356
|
+
*
|
|
357
|
+
* Explicit `withReranker()`, etc. calls take
|
|
358
|
+
* precedence over plugin-loaded registrations.
|
|
359
|
+
*
|
|
360
|
+
* @example Filesystem (default)
|
|
361
|
+
* ```ts
|
|
362
|
+
* import { FileSystemPluginLoader, getDefaultPluginDirs } from '@mcp-abap-adt/llm-agent';
|
|
363
|
+
* builder.withPluginLoader(new FileSystemPluginLoader({
|
|
364
|
+
* dirs: getDefaultPluginDirs(),
|
|
365
|
+
* }));
|
|
366
|
+
* ```
|
|
367
|
+
*
|
|
368
|
+
* @example Custom npm loader
|
|
369
|
+
* ```ts
|
|
370
|
+
* builder.withPluginLoader(new NpmPluginLoader(['my-plugin-a']));
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
withPluginLoader(loader) {
|
|
374
|
+
this._pluginLoader = loader;
|
|
375
|
+
return this;
|
|
376
|
+
}
|
|
377
|
+
// -------------------------------------------------------------------------
|
|
378
|
+
// build()
|
|
379
|
+
// -------------------------------------------------------------------------
|
|
380
|
+
async build() {
|
|
381
|
+
const log = this._logger;
|
|
382
|
+
// ---- Validate required dependencies -----------------------------------
|
|
383
|
+
const mainLlm = this._mainLlm;
|
|
384
|
+
if (!mainLlm) {
|
|
385
|
+
throw new Error('Main LLM is required. Call .withMainLlm(llm) before .build().');
|
|
386
|
+
}
|
|
387
|
+
let wrappedMainLlm = mainLlm;
|
|
388
|
+
// Classifier defaults to main LLM if not provided
|
|
389
|
+
const classifierLlm = this._classifierLlm ?? mainLlm;
|
|
390
|
+
const helperLlm = this._helperLlm;
|
|
391
|
+
// ---- Startup model validation ------------------------------------------
|
|
392
|
+
// Verify that configured models respond before starting the server.
|
|
393
|
+
// Only checks unique models from the pipeline config (main, classifier, helper).
|
|
394
|
+
if (!this.cfg.skipModelValidation) {
|
|
395
|
+
const modelsToCheck = new Map();
|
|
396
|
+
modelsToCheck.set(mainLlm.model ?? 'main', mainLlm);
|
|
397
|
+
if (classifierLlm !== mainLlm) {
|
|
398
|
+
modelsToCheck.set(classifierLlm.model ?? 'classifier', classifierLlm);
|
|
399
|
+
}
|
|
400
|
+
if (helperLlm && helperLlm !== mainLlm) {
|
|
401
|
+
modelsToCheck.set(helperLlm.model ?? 'helper', helperLlm);
|
|
402
|
+
}
|
|
403
|
+
for (const [modelName, llm] of modelsToCheck) {
|
|
404
|
+
const result = await llm.chat([{ role: 'user', content: 'Reply with OK' }], undefined, { maxTokens: 10 });
|
|
405
|
+
if (!result.ok) {
|
|
406
|
+
const detail = result.error.message;
|
|
407
|
+
log?.log({
|
|
408
|
+
type: 'pipeline_error',
|
|
409
|
+
traceId: 'builder',
|
|
410
|
+
code: 'MODEL_UNAVAILABLE',
|
|
411
|
+
message: `Model "${modelName}" is not available: ${detail}`,
|
|
412
|
+
durationMs: 0,
|
|
413
|
+
});
|
|
414
|
+
throw new Error(`Startup aborted: model "${modelName}" is not available.\n${detail}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
} // end skipModelValidation guard
|
|
418
|
+
// Auto-create tools RAG if MCP clients will be configured and embedder available
|
|
419
|
+
const toolsRag = this._toolsRag ??
|
|
420
|
+
((this.cfg.mcp || this._mcpClients) && this._embedder
|
|
421
|
+
? new InMemoryRag()
|
|
422
|
+
: undefined);
|
|
423
|
+
// Auto-create history RAG if history summarization is enabled
|
|
424
|
+
const historyRag = this._historyRag ??
|
|
425
|
+
(this._agentOverrides.historyAutoSummarizeLimit ||
|
|
426
|
+
this.cfg.agent?.historyAutoSummarizeLimit
|
|
427
|
+
? new InMemoryRag()
|
|
428
|
+
: undefined);
|
|
429
|
+
// Build provider registry and collection registry (v9.1 wiring).
|
|
430
|
+
const ragProviderRegistry = this._ragProviderRegistry ?? new SimpleRagProviderRegistry();
|
|
431
|
+
for (const p of this._providers)
|
|
432
|
+
ragProviderRegistry.registerProvider(p);
|
|
433
|
+
const ragRegistry = this._ragRegistry ?? new SimpleRagRegistry();
|
|
434
|
+
// Wire providers into registry when the registry supports it (SimpleRagRegistry does).
|
|
435
|
+
if (ragRegistry instanceof SimpleRagRegistry ||
|
|
436
|
+
typeof ragRegistry
|
|
437
|
+
.setProviderRegistry === 'function') {
|
|
438
|
+
ragRegistry.setProviderRegistry(ragProviderRegistry);
|
|
439
|
+
}
|
|
440
|
+
// Register user-supplied static collections (from addRagCollection fluent calls).
|
|
441
|
+
for (const c of this._staticCollections) {
|
|
442
|
+
ragRegistry.register(c.name, c.rag, c.editor, c.meta);
|
|
443
|
+
}
|
|
444
|
+
// Mirror the built-in toolsRag / historyRag into the registry so the projection preserves
|
|
445
|
+
// ragStores.tools / ragStores.history behavior that existing handlers rely on.
|
|
446
|
+
if (toolsRag && !ragRegistry.get('tools')) {
|
|
447
|
+
ragRegistry.register('tools', toolsRag, undefined, {
|
|
448
|
+
displayName: 'tools',
|
|
449
|
+
scope: 'global',
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
if (historyRag && !ragRegistry.get('history')) {
|
|
453
|
+
ragRegistry.register('history', historyRag, undefined, {
|
|
454
|
+
displayName: 'history',
|
|
455
|
+
scope: 'global',
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
// Create any queued dynamic collections at startup.
|
|
459
|
+
for (const c of this._pendingDynamicCollections) {
|
|
460
|
+
const res = await ragRegistry.createCollection(c);
|
|
461
|
+
if (!res.ok) {
|
|
462
|
+
throw new Error(`Failed to create collection '${c.collectionName}': ${res.error.message}`);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// Derive ragStores as a live projection of the registry; keep it in sync via the
|
|
466
|
+
// registry's mutation listener so existing code paths (assembler, handlers,
|
|
467
|
+
// addRagStore/removeRagStore) see the same shape.
|
|
468
|
+
const ragStores = {};
|
|
469
|
+
const rebuildProjection = () => {
|
|
470
|
+
for (const k of Object.keys(ragStores))
|
|
471
|
+
delete ragStores[k];
|
|
472
|
+
for (const m of ragRegistry.list()) {
|
|
473
|
+
const r = ragRegistry.get(m.name);
|
|
474
|
+
if (r)
|
|
475
|
+
ragStores[m.name] = r;
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
rebuildProjection();
|
|
479
|
+
if (ragRegistry instanceof SimpleRagRegistry ||
|
|
480
|
+
typeof ragRegistry
|
|
481
|
+
.setMutationListener === 'function') {
|
|
482
|
+
ragRegistry.setMutationListener(rebuildProjection);
|
|
483
|
+
}
|
|
484
|
+
const translateQueryStores = new Set();
|
|
485
|
+
if (toolsRag)
|
|
486
|
+
translateQueryStores.add('tools');
|
|
487
|
+
// ---- Circuit breaker wrapping ----------------------------------------
|
|
488
|
+
const circuitBreakers = [];
|
|
489
|
+
if (this._circuitBreakerConfig) {
|
|
490
|
+
const cbCfg = this._circuitBreakerConfig;
|
|
491
|
+
const metricsRef = this._metrics;
|
|
492
|
+
const makeOnStateChange = (target) => (from, to) => {
|
|
493
|
+
metricsRef?.circuitBreakerTransition.add(1, { from, to, target });
|
|
494
|
+
};
|
|
495
|
+
// Wrap mainLlm
|
|
496
|
+
const llmBreaker = new CircuitBreaker({
|
|
497
|
+
...cbCfg,
|
|
498
|
+
onStateChange: cbCfg.onStateChange ?? makeOnStateChange('llm'),
|
|
499
|
+
});
|
|
500
|
+
wrappedMainLlm = new CircuitBreakerLlm(wrappedMainLlm, llmBreaker);
|
|
501
|
+
circuitBreakers.push(llmBreaker);
|
|
502
|
+
// Wrap RAG stores with FallbackRag using InMemoryRag fallback
|
|
503
|
+
const embedderBreaker = new CircuitBreaker({
|
|
504
|
+
...cbCfg,
|
|
505
|
+
onStateChange: cbCfg.onStateChange ?? makeOnStateChange('embedder'),
|
|
506
|
+
});
|
|
507
|
+
circuitBreakers.push(embedderBreaker);
|
|
508
|
+
for (const [key, store] of Object.entries(ragStores)) {
|
|
509
|
+
const wrapped = new FallbackRag(store, new InMemoryRag(), embedderBreaker);
|
|
510
|
+
// Update both registry and projection so later lookups (and the mutation-listener
|
|
511
|
+
// rebuild) see the wrapped store.
|
|
512
|
+
const existingMeta = ragRegistry.list().find((m) => m.name === key);
|
|
513
|
+
ragRegistry.unregister(key);
|
|
514
|
+
ragRegistry.register(key, wrapped, undefined, {
|
|
515
|
+
displayName: existingMeta?.displayName ?? key,
|
|
516
|
+
scope: existingMeta?.scope ?? 'global',
|
|
517
|
+
});
|
|
518
|
+
// Projection gets rebuilt by the mutation listener; no direct write to ragStores needed.
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
// ---- Request logger ---------------------------------------------------
|
|
522
|
+
const requestLogger = this._requestLogger ?? new DefaultRequestLogger();
|
|
523
|
+
// ---- MCP clients + tool vectorization --------------------------------
|
|
524
|
+
let mcpClients;
|
|
525
|
+
const closeFns = [];
|
|
526
|
+
const connectionStrategy = this._connectionStrategy;
|
|
527
|
+
if (this._mcpClients) {
|
|
528
|
+
// Caller-provided clients: skip auto-connect and vectorization
|
|
529
|
+
mcpClients = this._mcpClients;
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
const mcpList = this.cfg.mcp
|
|
533
|
+
? Array.isArray(this.cfg.mcp)
|
|
534
|
+
? this.cfg.mcp
|
|
535
|
+
: [this.cfg.mcp]
|
|
536
|
+
: [];
|
|
537
|
+
const connected = [];
|
|
538
|
+
for (const mcpCfg of mcpList) {
|
|
539
|
+
try {
|
|
540
|
+
let wrapper;
|
|
541
|
+
if (mcpCfg.type === 'stdio') {
|
|
542
|
+
wrapper = new MCPClientWrapper({
|
|
543
|
+
transport: 'stdio',
|
|
544
|
+
command: mcpCfg.command,
|
|
545
|
+
args: mcpCfg.args ?? [],
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
wrapper = new MCPClientWrapper({
|
|
550
|
+
transport: 'auto',
|
|
551
|
+
url: mcpCfg.url,
|
|
552
|
+
headers: mcpCfg.headers,
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
await wrapper.connect();
|
|
556
|
+
const adapter = new McpClientAdapter(wrapper);
|
|
557
|
+
log?.log({
|
|
558
|
+
type: 'pipeline_done',
|
|
559
|
+
traceId: 'builder',
|
|
560
|
+
stopReason: 'stop',
|
|
561
|
+
iterations: 0,
|
|
562
|
+
toolCallCount: 0,
|
|
563
|
+
durationMs: 0,
|
|
564
|
+
});
|
|
565
|
+
// Vectorize tools into the tools RAG store
|
|
566
|
+
if (toolsRag) {
|
|
567
|
+
const toolsResult = await adapter.listTools();
|
|
568
|
+
if (toolsResult.ok) {
|
|
569
|
+
const tools = toolsResult.value;
|
|
570
|
+
// Try to access the embedder from the store for batch embedding.
|
|
571
|
+
// VectorRag and QdrantRag store their embedder as a private field.
|
|
572
|
+
// biome-ignore lint/suspicious/noExplicitAny: accessing private embedder for batch optimization
|
|
573
|
+
const storeEmbedder = toolsRag.embedder;
|
|
574
|
+
if (storeEmbedder &&
|
|
575
|
+
isBatchEmbedder(storeEmbedder) &&
|
|
576
|
+
toolsRag.writer?.()?.upsertPrecomputedRaw !== undefined) {
|
|
577
|
+
// Batch path: single HTTP call for all tools
|
|
578
|
+
const texts = tools.map((t) => `Tool: ${t.name} — ${t.description}`);
|
|
579
|
+
const batchStart = Date.now();
|
|
580
|
+
try {
|
|
581
|
+
const embedResults = await storeEmbedder.embedBatch(texts);
|
|
582
|
+
const batchDuration = Date.now() - batchStart;
|
|
583
|
+
for (let i = 0; i < tools.length; i++) {
|
|
584
|
+
const toolWriter = toolsRag.writer?.();
|
|
585
|
+
const result = toolWriter?.upsertPrecomputedRaw
|
|
586
|
+
? await toolWriter.upsertPrecomputedRaw(`tool:${tools[i].name}`, texts[i], embedResults[i].vector, {})
|
|
587
|
+
: toolWriter
|
|
588
|
+
? await toolWriter.upsertRaw(`tool:${tools[i].name}`, texts[i], {})
|
|
589
|
+
: { ok: true, value: undefined };
|
|
590
|
+
if (!result.ok) {
|
|
591
|
+
log?.log({
|
|
592
|
+
type: 'warning',
|
|
593
|
+
traceId: 'builder',
|
|
594
|
+
message: `Tool vectorization failed for "${tools[i].name}": ${result.error.message}`,
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
const realUsage = embedResults.reduce((acc, r) => {
|
|
599
|
+
if (!r.usage)
|
|
600
|
+
return acc;
|
|
601
|
+
return {
|
|
602
|
+
promptTokens: (acc?.promptTokens ?? 0) + r.usage.promptTokens,
|
|
603
|
+
totalTokens: (acc?.totalTokens ?? 0) + r.usage.totalTokens,
|
|
604
|
+
};
|
|
605
|
+
}, null);
|
|
606
|
+
const totalEstTokens = texts.reduce((sum, t) => sum + Math.ceil(t.length / 4), 0);
|
|
607
|
+
requestLogger.logLlmCall({
|
|
608
|
+
component: 'embedding',
|
|
609
|
+
model: 'embedder',
|
|
610
|
+
promptTokens: realUsage?.promptTokens ?? totalEstTokens,
|
|
611
|
+
completionTokens: 0,
|
|
612
|
+
totalTokens: realUsage?.totalTokens ?? totalEstTokens,
|
|
613
|
+
durationMs: batchDuration,
|
|
614
|
+
estimated: realUsage === null,
|
|
615
|
+
scope: 'initialization',
|
|
616
|
+
detail: 'tools',
|
|
617
|
+
});
|
|
618
|
+
}
|
|
619
|
+
catch (err) {
|
|
620
|
+
log?.log({
|
|
621
|
+
type: 'warning',
|
|
622
|
+
traceId: 'builder',
|
|
623
|
+
message: `Batch embedding failed, falling back to sequential: ${String(err)}`,
|
|
624
|
+
});
|
|
625
|
+
// Fallback to sequential
|
|
626
|
+
const batchSize = 5;
|
|
627
|
+
const batchDelayMs = 500;
|
|
628
|
+
for (let i = 0; i < tools.length; i++) {
|
|
629
|
+
const t = tools[i];
|
|
630
|
+
const text = `Tool: ${t.name} — ${t.description}`;
|
|
631
|
+
const embedStart = Date.now();
|
|
632
|
+
const result = await toolsRag
|
|
633
|
+
.writer?.()
|
|
634
|
+
?.upsertRaw(`tool:${t.name}`, text, {});
|
|
635
|
+
if (result && !result.ok) {
|
|
636
|
+
log?.log({
|
|
637
|
+
type: 'warning',
|
|
638
|
+
traceId: 'builder',
|
|
639
|
+
message: `Tool vectorization failed for "${t.name}": ${result.error.message}`,
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
requestLogger.logLlmCall({
|
|
644
|
+
component: 'embedding',
|
|
645
|
+
model: 'embedder',
|
|
646
|
+
promptTokens: Math.ceil(text.length / 4),
|
|
647
|
+
completionTokens: 0,
|
|
648
|
+
totalTokens: Math.ceil(text.length / 4),
|
|
649
|
+
durationMs: Date.now() - embedStart,
|
|
650
|
+
estimated: true,
|
|
651
|
+
scope: 'initialization',
|
|
652
|
+
detail: 'tools',
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
if ((i + 1) % batchSize === 0 && i < tools.length - 1) {
|
|
656
|
+
await new Promise((r) => setTimeout(r, batchDelayMs));
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
// Sequential path (no batch support)
|
|
663
|
+
const batchSize = 5;
|
|
664
|
+
const batchDelayMs = 500;
|
|
665
|
+
for (let i = 0; i < tools.length; i++) {
|
|
666
|
+
const t = tools[i];
|
|
667
|
+
const text = `Tool: ${t.name} — ${t.description}`;
|
|
668
|
+
const embedStart = Date.now();
|
|
669
|
+
const result = await toolsRag
|
|
670
|
+
.writer?.()
|
|
671
|
+
?.upsertRaw(`tool:${t.name}`, text, {});
|
|
672
|
+
if (result && !result.ok) {
|
|
673
|
+
log?.log({
|
|
674
|
+
type: 'warning',
|
|
675
|
+
traceId: 'builder',
|
|
676
|
+
message: `Tool vectorization failed for "${t.name}": ${result.error.message}`,
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
requestLogger.logLlmCall({
|
|
681
|
+
component: 'embedding',
|
|
682
|
+
model: 'embedder',
|
|
683
|
+
promptTokens: Math.ceil(text.length / 4),
|
|
684
|
+
completionTokens: 0,
|
|
685
|
+
totalTokens: Math.ceil(text.length / 4),
|
|
686
|
+
durationMs: Date.now() - embedStart,
|
|
687
|
+
estimated: true,
|
|
688
|
+
scope: 'initialization',
|
|
689
|
+
detail: 'tools',
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
if ((i + 1) % batchSize === 0 && i < tools.length - 1) {
|
|
693
|
+
await new Promise((r) => setTimeout(r, batchDelayMs));
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
connected.push(adapter);
|
|
700
|
+
closeFns.push(() => wrapper.disconnect?.() ?? Promise.resolve());
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
// Skip failed MCP connections — agent continues without that server
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
mcpClients = connected;
|
|
707
|
+
}
|
|
708
|
+
// ---- SmartAgent Config ------------------------------------------------
|
|
709
|
+
const agentCfg = {
|
|
710
|
+
maxIterations: 10,
|
|
711
|
+
maxToolCalls: 30,
|
|
712
|
+
ragQueryK: 10,
|
|
713
|
+
ragTranslatePrompt: this.cfg.prompts?.ragTranslate,
|
|
714
|
+
historySummaryPrompt: this.cfg.prompts?.historySummary,
|
|
715
|
+
historyAutoSummarizeLimit: this.cfg.agent?.historyAutoSummarizeLimit,
|
|
716
|
+
...this.cfg.agent,
|
|
717
|
+
...(this.cfg.sessionPolicy
|
|
718
|
+
? { sessionPolicy: this.cfg.sessionPolicy }
|
|
719
|
+
: {}),
|
|
720
|
+
// Fluent overrides take precedence over cfg.agent
|
|
721
|
+
...this._agentOverrides,
|
|
722
|
+
onBeforeStream: this._onBeforeStream,
|
|
723
|
+
};
|
|
724
|
+
// ---- Retry wrapping (outside circuit breaker) ----------------------------
|
|
725
|
+
// Enable retry by default with sensible defaults; explicit config overrides.
|
|
726
|
+
const retryOpts = agentCfg.retry ?? {
|
|
727
|
+
maxAttempts: 3,
|
|
728
|
+
backoffMs: 2000,
|
|
729
|
+
retryOn: [429, 500, 502, 503],
|
|
730
|
+
retryOnMidStream: [],
|
|
731
|
+
};
|
|
732
|
+
wrappedMainLlm = new RetryLlm(wrappedMainLlm, retryOpts);
|
|
733
|
+
// ---- Rate limiter wrapping (outermost — retry attempts also throttled) ----
|
|
734
|
+
if (this._rateLimiter) {
|
|
735
|
+
wrappedMainLlm = new RateLimiterLlm(wrappedMainLlm, this._rateLimiter);
|
|
736
|
+
}
|
|
737
|
+
// ---- Classifier -------------------------------------------------------
|
|
738
|
+
const classifierCfg = {};
|
|
739
|
+
if (this.cfg.prompts?.classifier)
|
|
740
|
+
classifierCfg.systemPrompt = this.cfg.prompts.classifier;
|
|
741
|
+
const classifier = this._classifier ??
|
|
742
|
+
new LlmClassifier(classifierLlm, classifierCfg, requestLogger);
|
|
743
|
+
// ---- Assembler --------------------------------------------------------
|
|
744
|
+
const assemblerCfg = {
|
|
745
|
+
maxTokens: agentCfg.contextBudgetTokens,
|
|
746
|
+
showReasoning: agentCfg.showReasoning,
|
|
747
|
+
reasoningInstruction: this.cfg.prompts?.reasoning,
|
|
748
|
+
historyRecencyWindow: agentCfg.historyRecencyWindow,
|
|
749
|
+
};
|
|
750
|
+
if (this.cfg.prompts?.system)
|
|
751
|
+
assemblerCfg.systemPromptPreamble = this.cfg.prompts.system;
|
|
752
|
+
const assembler = this._assembler ?? new ContextAssembler(assemblerCfg);
|
|
753
|
+
// ---- History memory & summarizer ----------------------------------------
|
|
754
|
+
let historyMemory;
|
|
755
|
+
let historySummarizer;
|
|
756
|
+
if (agentCfg.semanticHistoryEnabled) {
|
|
757
|
+
historyMemory =
|
|
758
|
+
this._historyMemory ??
|
|
759
|
+
new HistoryMemory({
|
|
760
|
+
maxSize: agentCfg.historyRecencyWindow ?? 3,
|
|
761
|
+
});
|
|
762
|
+
const summarizerLlm = this._helperLlm ?? mainLlm;
|
|
763
|
+
historySummarizer =
|
|
764
|
+
this._historySummarizer ??
|
|
765
|
+
new HistorySummarizer(summarizerLlm, agentCfg.historyTurnSummaryPrompt
|
|
766
|
+
? { prompt: agentCfg.historyTurnSummaryPrompt }
|
|
767
|
+
: undefined);
|
|
768
|
+
if (historyRag && !ragRegistry.get('history')) {
|
|
769
|
+
ragRegistry.register('history', historyRag, undefined, {
|
|
770
|
+
displayName: 'history',
|
|
771
|
+
scope: 'global',
|
|
772
|
+
});
|
|
773
|
+
// ragStores projection updates via mutation listener.
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
// ---- Plugin loader (optional) -------------------------------------------
|
|
777
|
+
let loadedPlugins;
|
|
778
|
+
if (this._pluginLoader) {
|
|
779
|
+
const plugins = await this._pluginLoader.load();
|
|
780
|
+
loadedPlugins = plugins;
|
|
781
|
+
if (plugins.reranker && !this._reranker) {
|
|
782
|
+
this._reranker = plugins.reranker;
|
|
783
|
+
}
|
|
784
|
+
if (plugins.queryExpander && !this._queryExpander) {
|
|
785
|
+
this._queryExpander = plugins.queryExpander;
|
|
786
|
+
}
|
|
787
|
+
if (plugins.outputValidator && !this._outputValidator) {
|
|
788
|
+
this._outputValidator = plugins.outputValidator;
|
|
789
|
+
}
|
|
790
|
+
if (plugins.skillManager && !this._skillManager) {
|
|
791
|
+
this._skillManager = plugins.skillManager;
|
|
792
|
+
}
|
|
793
|
+
if (plugins.clientAdapters.length > 0) {
|
|
794
|
+
this._clientAdapters.push(...plugins.clientAdapters);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
// ---- Skill vectorization (optional) ------------------------------------
|
|
798
|
+
if (this._skillManager && toolsRag) {
|
|
799
|
+
const skillsResult = await this._skillManager.listSkills();
|
|
800
|
+
if (skillsResult.ok) {
|
|
801
|
+
for (const s of skillsResult.value) {
|
|
802
|
+
const text = `Skill: ${s.name}\n${s.description}`;
|
|
803
|
+
const embedStart = Date.now();
|
|
804
|
+
const result = await toolsRag
|
|
805
|
+
.writer?.()
|
|
806
|
+
?.upsertRaw(`skill:${s.name}`, text, {});
|
|
807
|
+
if (result && !result.ok) {
|
|
808
|
+
log?.log({
|
|
809
|
+
type: 'warning',
|
|
810
|
+
traceId: 'builder',
|
|
811
|
+
message: `Skill vectorization failed for "${s.name}": ${result.error.message}`,
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
else {
|
|
815
|
+
requestLogger.logLlmCall({
|
|
816
|
+
component: 'embedding',
|
|
817
|
+
model: 'embedder',
|
|
818
|
+
promptTokens: Math.ceil(text.length / 4),
|
|
819
|
+
completionTokens: 0,
|
|
820
|
+
totalTokens: Math.ceil(text.length / 4),
|
|
821
|
+
durationMs: Date.now() - embedStart,
|
|
822
|
+
estimated: true,
|
|
823
|
+
scope: 'initialization',
|
|
824
|
+
detail: 'skills',
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
// ---- Pipeline initialization -------------------------------------------
|
|
831
|
+
const pipeline = this._pipeline ?? new DefaultPipeline();
|
|
832
|
+
pipeline.initialize({
|
|
833
|
+
mainLlm: wrappedMainLlm,
|
|
834
|
+
helperLlm,
|
|
835
|
+
classifierLlm,
|
|
836
|
+
classifier,
|
|
837
|
+
assembler,
|
|
838
|
+
mcpClients,
|
|
839
|
+
toolsRag,
|
|
840
|
+
historyRag,
|
|
841
|
+
ragStores,
|
|
842
|
+
ragRegistry,
|
|
843
|
+
ragProviderRegistry,
|
|
844
|
+
embedder: this._embedder,
|
|
845
|
+
reranker: this._reranker,
|
|
846
|
+
queryExpander: this._queryExpander,
|
|
847
|
+
toolPolicy: this._toolPolicy,
|
|
848
|
+
injectionDetector: this._injectionDetector,
|
|
849
|
+
toolCache: this._toolCache,
|
|
850
|
+
outputValidator: this._outputValidator,
|
|
851
|
+
sessionManager: this._sessionManager,
|
|
852
|
+
skillManager: this._skillManager,
|
|
853
|
+
logger: log,
|
|
854
|
+
requestLogger,
|
|
855
|
+
tracer: this._tracer,
|
|
856
|
+
metrics: this._metrics,
|
|
857
|
+
historyMemory,
|
|
858
|
+
historySummarizer,
|
|
859
|
+
llmCallStrategy: this._llmCallStrategy,
|
|
860
|
+
agentConfig: agentCfg,
|
|
861
|
+
});
|
|
862
|
+
const agent = new SmartAgent({
|
|
863
|
+
mainLlm: wrappedMainLlm,
|
|
864
|
+
helperLlm: this._helperLlm,
|
|
865
|
+
mcpClients,
|
|
866
|
+
ragStores,
|
|
867
|
+
ragRegistry,
|
|
868
|
+
ragProviderRegistry,
|
|
869
|
+
classifier,
|
|
870
|
+
classifierLlm,
|
|
871
|
+
classifierConfig: classifierCfg,
|
|
872
|
+
assembler,
|
|
873
|
+
pipeline,
|
|
874
|
+
...(log ? { logger: log } : {}),
|
|
875
|
+
...(this._toolPolicy ? { toolPolicy: this._toolPolicy } : {}),
|
|
876
|
+
...(this._injectionDetector
|
|
877
|
+
? { injectionDetector: this._injectionDetector }
|
|
878
|
+
: {}),
|
|
879
|
+
...(this._reranker ? { reranker: this._reranker } : {}),
|
|
880
|
+
...(this._queryExpander ? { queryExpander: this._queryExpander } : {}),
|
|
881
|
+
...(this._tracer ? { tracer: this._tracer } : {}),
|
|
882
|
+
...(this._metrics ? { metrics: this._metrics } : {}),
|
|
883
|
+
...(this._toolCache ? { toolCache: this._toolCache } : {}),
|
|
884
|
+
...(this._outputValidator
|
|
885
|
+
? { outputValidator: this._outputValidator }
|
|
886
|
+
: {}),
|
|
887
|
+
...(this._sessionManager
|
|
888
|
+
? { sessionManager: this._sessionManager }
|
|
889
|
+
: {}),
|
|
890
|
+
...(this._skillManager ? { skillManager: this._skillManager } : {}),
|
|
891
|
+
...(this._clientAdapters.length > 0
|
|
892
|
+
? { clientAdapters: this._clientAdapters }
|
|
893
|
+
: {}),
|
|
894
|
+
...(this._embedder ? { embedder: this._embedder } : {}),
|
|
895
|
+
...(connectionStrategy ? { connectionStrategy } : {}),
|
|
896
|
+
...(historyMemory ? { historyMemory } : {}),
|
|
897
|
+
...(historySummarizer ? { historySummarizer } : {}),
|
|
898
|
+
...(this._llmCallStrategy
|
|
899
|
+
? { llmCallStrategy: this._llmCallStrategy }
|
|
900
|
+
: {}),
|
|
901
|
+
...(translateQueryStores.size > 0 ? { translateQueryStores } : {}),
|
|
902
|
+
requestLogger,
|
|
903
|
+
}, agentCfg);
|
|
904
|
+
// ---- Model provider auto-detection ------------------------------------
|
|
905
|
+
let modelProvider = this._modelProvider;
|
|
906
|
+
if (!modelProvider) {
|
|
907
|
+
const candidate = mainLlm;
|
|
908
|
+
if (isModelProvider(candidate)) {
|
|
909
|
+
modelProvider = candidate;
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
// ---- API adapters: merge plugin adapters → builder adapters (builder wins) ---
|
|
913
|
+
// plugins.apiAdapters does not exist yet (added in Task 4); safe future-compat check.
|
|
914
|
+
const apiAdapters = new Map();
|
|
915
|
+
const pluginApiAdapters = loadedPlugins?.apiAdapters;
|
|
916
|
+
if (pluginApiAdapters) {
|
|
917
|
+
for (const [name, adapter] of pluginApiAdapters) {
|
|
918
|
+
apiAdapters.set(name, adapter);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
for (const [name, adapter] of this._apiAdapters) {
|
|
922
|
+
apiAdapters.set(name, adapter);
|
|
923
|
+
}
|
|
924
|
+
return {
|
|
925
|
+
agent,
|
|
926
|
+
chat: (messages, tools, options) => agent.currentMainLlm.chat(messages, tools, options),
|
|
927
|
+
streamChat: (messages, tools, options) => agent.currentMainLlm.streamChat(messages, tools, options),
|
|
928
|
+
requestLogger,
|
|
929
|
+
close: async () => {
|
|
930
|
+
await connectionStrategy?.dispose?.();
|
|
931
|
+
for (const fn of closeFns)
|
|
932
|
+
await fn();
|
|
933
|
+
},
|
|
934
|
+
circuitBreakers,
|
|
935
|
+
ragStores,
|
|
936
|
+
modelProvider,
|
|
937
|
+
getApiAdapter: (name) => apiAdapters.get(name),
|
|
938
|
+
listApiAdapters: () => [...apiAdapters.keys()],
|
|
939
|
+
};
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
//# sourceMappingURL=builder.js.map
|