@superblocksteam/vite-plugin-file-sync 2.0.59-next.0 → 2.0.59-next.10
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/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +25 -9
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/subagents/apis/examples.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/apis/examples.js +137 -10
- package/dist/ai-service/agent/subagents/apis/examples.js.map +1 -1
- package/dist/ai-service/agent/subagents/apis/static-analysis.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/apis/static-analysis.js +14 -7
- package/dist/ai-service/agent/subagents/apis/static-analysis.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +6 -2
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/analysis.d.ts +9 -0
- package/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/analysis.js +358 -0
- package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -0
- package/dist/ai-service/agent/{subagents → tools}/apis/api-executor.d.ts +35 -10
- package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -0
- package/dist/ai-service/agent/{subagents → tools}/apis/api-executor.js +179 -94
- package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-source.d.ts +19 -0
- package/dist/ai-service/agent/tools/apis/api-source.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-source.js +73 -0
- package/dist/ai-service/agent/tools/apis/api-source.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts +51 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +510 -0
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts +32 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +313 -0
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/build-api.d.ts +1 -10
- package/dist/ai-service/agent/tools/apis/build-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api.js +26 -238
- package/dist/ai-service/agent/tools/apis/build-api.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts +11 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.js +1841 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/integration-types.d.ts +37 -0
- package/dist/ai-service/agent/tools/apis/integration-types.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/integration-types.js +689 -0
- package/dist/ai-service/agent/tools/apis/integration-types.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +25 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/test-api.js +194 -0
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/write-api.d.ts +11 -0
- package/dist/ai-service/agent/tools/apis/write-api.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/write-api.js +41 -0
- package/dist/ai-service/agent/tools/apis/write-api.js.map +1 -0
- package/dist/ai-service/agent/tools/build-read-files.js +2 -2
- package/dist/ai-service/agent/tools/build-read-files.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts +2 -5
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +51 -22
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts +1 -0
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +15 -13
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts +2 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +4 -3
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +73 -127
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep-metadata.js +25 -4
- package/dist/ai-service/agent/tools2/tools/grep-metadata.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/tools2/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/utils.js +4 -1
- package/dist/ai-service/agent/tools2/utils.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts +1 -3
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +55 -13
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts +5 -0
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +17 -2
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +7 -0
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +26 -0
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/const.d.ts +3 -1
- package/dist/ai-service/const.d.ts.map +1 -1
- package/dist/ai-service/const.js +3 -0
- package/dist/ai-service/const.js.map +1 -1
- package/dist/ai-service/index.d.ts +5 -1
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +55 -7
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/index.d.ts +10 -0
- package/dist/ai-service/integrations/metadata-storage/index.d.ts.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.d.ts +4 -2
- package/dist/ai-service/integrations/metadata-storage/local.d.ts.map +1 -1
- package/dist/ai-service/integrations/metadata-storage/local.js +35 -9
- package/dist/ai-service/integrations/metadata-storage/local.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +27 -2
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +129 -62
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +123 -0
- package/dist/ai-service/llm/client.d.ts.map +1 -0
- package/dist/ai-service/llm/client.js +168 -0
- package/dist/ai-service/llm/client.js.map +1 -0
- package/dist/ai-service/llm/context/context-handle.d.ts +4 -4
- package/dist/ai-service/llm/context/context-handle.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context-handle.js +7 -3
- package/dist/ai-service/llm/context/context-handle.js.map +1 -1
- package/dist/ai-service/llm/context/context.d.ts +28 -0
- package/dist/ai-service/llm/context/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context.js +119 -0
- package/dist/ai-service/llm/context/context.js.map +1 -1
- package/dist/ai-service/llm/context/manager.d.ts +22 -2
- package/dist/ai-service/llm/context/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context/manager.js +86 -13
- package/dist/ai-service/llm/context/manager.js.map +1 -1
- package/dist/ai-service/llm/context/storage/index.d.ts +1 -0
- package/dist/ai-service/llm/context/storage/index.d.ts.map +1 -1
- package/dist/ai-service/llm/context/storage/local.d.ts +1 -0
- package/dist/ai-service/llm/context/storage/local.d.ts.map +1 -1
- package/dist/ai-service/llm/context/storage/local.js +13 -1
- package/dist/ai-service/llm/context/storage/local.js.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.js +6 -2
- package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +14 -4
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +49 -4
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts +67 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.js +111 -0
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -0
- package/dist/ai-service/llm/interaction/compose.d.ts +71 -0
- package/dist/ai-service/llm/interaction/compose.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/compose.js +88 -0
- package/dist/ai-service/llm/interaction/compose.js.map +1 -0
- package/dist/ai-service/llm/interaction/index.d.ts +68 -0
- package/dist/ai-service/llm/interaction/index.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/index.js +70 -0
- package/dist/ai-service/llm/interaction/index.js.map +1 -0
- package/dist/ai-service/llm/interaction/middleware.d.ts +52 -0
- package/dist/ai-service/llm/interaction/middleware.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middleware.js +17 -0
- package/dist/ai-service/llm/interaction/middleware.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts +45 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js +85 -0
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts +88 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.js +238 -0
- package/dist/ai-service/llm/interaction/middlewares/logging.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts +47 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.js +183 -0
- package/dist/ai-service/llm/interaction/middlewares/profiler.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts +121 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js +291 -0
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js.map +1 -0
- package/dist/ai-service/llm/interaction/provider.d.ts +173 -0
- package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/provider.js +15 -0
- package/dist/ai-service/llm/interaction/provider.js.map +1 -0
- package/dist/ai-service/llm/interaction/result-utils.d.ts +43 -0
- package/dist/ai-service/llm/interaction/result-utils.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/result-utils.js +49 -0
- package/dist/ai-service/llm/interaction/result-utils.js.map +1 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts +48 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.js +129 -0
- package/dist/ai-service/llm/interaction/stream-lifecycle.js.map +1 -0
- package/dist/ai-service/llm/provider.d.ts +1 -2
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +3 -6
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llmobs/helpers.d.ts +7 -8
- package/dist/ai-service/llmobs/helpers.d.ts.map +1 -1
- package/dist/ai-service/llmobs/helpers.js +8 -48
- package/dist/ai-service/llmobs/helpers.js.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts +19 -21
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js +98 -106
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +1 -1
- package/dist/ai-service/llmobs/types.d.ts +14 -1
- package/dist/ai-service/llmobs/types.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +75 -5
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +100 -0
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +4 -0
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +91 -456
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +1 -1
- package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/peer.js +15 -0
- package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
- package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
- package/dist/ai-service/state-machine/mocks.js +1 -0
- package/dist/ai-service/state-machine/mocks.js.map +1 -1
- package/dist/ai-service/template-renderer.js +1 -1
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/types.d.ts +30 -0
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/binding-extraction/extract-identifiers.d.ts +14 -0
- package/dist/binding-extraction/extract-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/extract-identifiers.js +46 -1
- package/dist/binding-extraction/extract-identifiers.js.map +1 -1
- package/dist/binding-extraction/js-identifiers.d.ts +14 -0
- package/dist/binding-extraction/js-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/js-identifiers.js +168 -0
- package/dist/binding-extraction/js-identifiers.js.map +1 -1
- package/dist/binding-extraction/python-identifiers.d.ts +5 -0
- package/dist/binding-extraction/python-identifiers.d.ts.map +1 -1
- package/dist/binding-extraction/python-identifiers.js +76 -7
- package/dist/binding-extraction/python-identifiers.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +73 -3
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-manager.d.ts.map +1 -1
- package/dist/file-system-manager.js +6 -4
- package/dist/file-system-manager.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lock-service/activity-tracker.d.ts +14 -2
- package/dist/lock-service/activity-tracker.d.ts.map +1 -1
- package/dist/lock-service/activity-tracker.js +43 -6
- package/dist/lock-service/activity-tracker.js.map +1 -1
- package/dist/lock-service/index.d.ts +13 -2
- package/dist/lock-service/index.d.ts.map +1 -1
- package/dist/lock-service/index.js +130 -44
- package/dist/lock-service/index.js.map +1 -1
- package/dist/parsing/jsx.d.ts.map +1 -1
- package/dist/parsing/jsx.js +78 -66
- package/dist/parsing/jsx.js.map +1 -1
- package/dist/socket-manager.js +1 -1
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/list-dir.d.ts.map +1 -1
- package/dist/sync-service/list-dir.js +41 -18
- package/dist/sync-service/list-dir.js.map +1 -1
- package/dist/vite-plugin-yaml-types.d.ts.map +1 -1
- package/dist/vite-plugin-yaml-types.js +2 -4
- package/dist/vite-plugin-yaml-types.js.map +1 -1
- package/package.json +7 -7
- package/dist/ai-service/agent/subagents/apis/api-executor.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/api-executor.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/context.d.ts +0 -12
- package/dist/ai-service/agent/subagents/apis/context.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/context.js +0 -18
- package/dist/ai-service/agent/subagents/apis/context.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/generate-api-source.d.ts +0 -40
- package/dist/ai-service/agent/subagents/apis/generate-api-source.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/generate-api-source.js +0 -516
- package/dist/ai-service/agent/subagents/apis/generate-api-source.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/state.d.ts +0 -49
- package/dist/ai-service/agent/subagents/apis/state.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/state.js +0 -25
- package/dist/ai-service/agent/subagents/apis/state.js.map +0 -1
- package/dist/ai-service/agent/subagents/apis/system-prompt.d.ts +0 -3
- package/dist/ai-service/agent/subagents/apis/system-prompt.d.ts.map +0 -1
- package/dist/ai-service/agent/subagents/apis/system-prompt.js +0 -1704
- package/dist/ai-service/agent/subagents/apis/system-prompt.js.map +0 -1
- package/dist/ai-service/agent/tools/apis/finalize-api.d.ts +0 -11
- package/dist/ai-service/agent/tools/apis/finalize-api.d.ts.map +0 -1
- package/dist/ai-service/agent/tools/apis/finalize-api.js +0 -133
- package/dist/ai-service/agent/tools/apis/finalize-api.js.map +0 -1
- package/dist/ai-service/llm/middleware/retry.d.ts +0 -112
- package/dist/ai-service/llm/middleware/retry.d.ts.map +0 -1
- package/dist/ai-service/llm/middleware/retry.js +0 -239
- package/dist/ai-service/llm/middleware/retry.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-step LLM interaction system with provider interface and middleware.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a clean, SDK-agnostic interface for LLM streaming
|
|
5
|
+
* with composable middleware. Key features:
|
|
6
|
+
* - Provider interface abstracts away SDK details
|
|
7
|
+
* - onFinally lifecycle hook for cleanup after stream consumption
|
|
8
|
+
* - Composable middlewares for cross-cutting concerns
|
|
9
|
+
* - Adapter pattern for SDK flexibility
|
|
10
|
+
*
|
|
11
|
+
* ## Architecture
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* Middlewares (Context, Logging, Profiler, LLMObs)
|
|
15
|
+
* ↓
|
|
16
|
+
* StreamTextProvider Interface (with onFinally)
|
|
17
|
+
* ↓
|
|
18
|
+
* VercelStreamTextAdapter
|
|
19
|
+
* ↓
|
|
20
|
+
* Vercel AI SDK
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* ## Usage
|
|
24
|
+
*
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import {
|
|
27
|
+
* createVercelProvider,
|
|
28
|
+
* applyMiddleware,
|
|
29
|
+
* createContextMiddleware,
|
|
30
|
+
* createLoggingMiddleware,
|
|
31
|
+
* } from "./interaction";
|
|
32
|
+
*
|
|
33
|
+
* // Create base provider
|
|
34
|
+
* const baseProvider = createVercelProvider();
|
|
35
|
+
*
|
|
36
|
+
* // Apply middlewares
|
|
37
|
+
* const provider = applyMiddleware(
|
|
38
|
+
* baseProvider,
|
|
39
|
+
* createContextMiddleware({ ... }),
|
|
40
|
+
* createLoggingMiddleware({ ... })
|
|
41
|
+
* );
|
|
42
|
+
*
|
|
43
|
+
* // Use the provider
|
|
44
|
+
* const result = await provider.streamText({
|
|
45
|
+
* model,
|
|
46
|
+
* messages,
|
|
47
|
+
* tools,
|
|
48
|
+
* onFinally: async () => {
|
|
49
|
+
* // Cleanup after stream consumption
|
|
50
|
+
* }
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* for await (const chunk of result.fullStream) {
|
|
54
|
+
* // Process chunks
|
|
55
|
+
* }
|
|
56
|
+
* // onFinally runs here ^
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
// Composition utilities
|
|
60
|
+
export { compose, applyMiddleware, createMiddleware } from "./compose.js";
|
|
61
|
+
// Stream lifecycle utilities
|
|
62
|
+
export { withStreamLifecycle } from "./stream-lifecycle.js";
|
|
63
|
+
// Vercel SDK adapter
|
|
64
|
+
export { VercelStreamTextAdapter, createVercelProvider, } from "./adapters/vercel.js";
|
|
65
|
+
// Built-in middlewares
|
|
66
|
+
export { createLoggingMiddleware, } from "./middlewares/logging.js";
|
|
67
|
+
export { createProfilerMiddleware, } from "./middlewares/profiler.js";
|
|
68
|
+
export { createLLMObsMiddleware, } from "./middlewares/llmobs.js";
|
|
69
|
+
export { createStreamRetryMiddleware, } from "./middlewares/stream-retry.js";
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/interaction/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAgBH,wBAAwB;AACxB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE1E,6BAA6B;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,uBAAuB;AACvB,OAAO,EACL,uBAAuB,GAGxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,wBAAwB,GAEzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,sBAAsB,GAEvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,2BAA2B,GAE5B,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware interface for multi-step LLM interactions.
|
|
3
|
+
*
|
|
4
|
+
* Provides a composable wrap pattern for intercepting and transforming
|
|
5
|
+
* StreamTextProvider calls. Each middleware can:
|
|
6
|
+
* - Transform input options before execution
|
|
7
|
+
* - Add lifecycle hooks (onFinally, etc.)
|
|
8
|
+
* - Wrap and transform output streams
|
|
9
|
+
* - Handle errors and control flow
|
|
10
|
+
* - Short-circuit execution if needed
|
|
11
|
+
*
|
|
12
|
+
* Middlewares operate on the high-level StreamTextProvider interface,
|
|
13
|
+
* not on SDK-specific details. This makes them portable across different
|
|
14
|
+
* LLM SDKs (Vercel, Anthropic, OpenAI, etc.).
|
|
15
|
+
*/
|
|
16
|
+
import type { StreamTextProvider } from "./provider.js";
|
|
17
|
+
/**
|
|
18
|
+
* Middleware interface using the wrap pattern.
|
|
19
|
+
*
|
|
20
|
+
* Each middleware wraps a StreamTextProvider, allowing it to:
|
|
21
|
+
* - Intercept and transform streamText() calls
|
|
22
|
+
* - Execute logic before/after the call
|
|
23
|
+
* - Transform or wrap the options and results
|
|
24
|
+
* - Handle errors and control flow
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const loggingMiddleware: StreamTextMiddleware = {
|
|
29
|
+
* wrap(provider) {
|
|
30
|
+
* return {
|
|
31
|
+
* async streamText(options) {
|
|
32
|
+
* console.log('Starting streamText call');
|
|
33
|
+
* const result = await provider.streamText(options);
|
|
34
|
+
* console.log('Call complete');
|
|
35
|
+
* return result;
|
|
36
|
+
* }
|
|
37
|
+
* };
|
|
38
|
+
* }
|
|
39
|
+
* };
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export interface StreamTextMiddleware {
|
|
43
|
+
/**
|
|
44
|
+
* Wraps a StreamTextProvider with middleware behavior.
|
|
45
|
+
*
|
|
46
|
+
* @param provider - The provider to wrap
|
|
47
|
+
* @returns A wrapped provider with the middleware's behavior
|
|
48
|
+
*/
|
|
49
|
+
wrap(provider: StreamTextProvider): StreamTextProvider;
|
|
50
|
+
}
|
|
51
|
+
export type { StreamTextProvider, StreamTextOptions, StreamTextResult, StepParameters, StreamChunk, StepResult, FinalResult, } from "./provider.js";
|
|
52
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/interaction/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,CAAC;CACxD;AAGD,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware interface for multi-step LLM interactions.
|
|
3
|
+
*
|
|
4
|
+
* Provides a composable wrap pattern for intercepting and transforming
|
|
5
|
+
* StreamTextProvider calls. Each middleware can:
|
|
6
|
+
* - Transform input options before execution
|
|
7
|
+
* - Add lifecycle hooks (onFinally, etc.)
|
|
8
|
+
* - Wrap and transform output streams
|
|
9
|
+
* - Handle errors and control flow
|
|
10
|
+
* - Short-circuit execution if needed
|
|
11
|
+
*
|
|
12
|
+
* Middlewares operate on the high-level StreamTextProvider interface,
|
|
13
|
+
* not on SDK-specific details. This makes them portable across different
|
|
14
|
+
* LLM SDKs (Vercel, Anthropic, OpenAI, etc.).
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/interaction/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMObs middleware adapter.
|
|
3
|
+
*
|
|
4
|
+
* This middleware wraps the existing LLMObsStreamTextMiddleware to work
|
|
5
|
+
* with the new provider-based middleware interface. It provides observability
|
|
6
|
+
* tracing for LLM interactions.
|
|
7
|
+
*/
|
|
8
|
+
import type { Logger } from "../../../../util/logger.js";
|
|
9
|
+
import type { LLMObsTracer } from "../../../llmobs/index.js";
|
|
10
|
+
import type { StreamTextMiddleware } from "../middleware.js";
|
|
11
|
+
/**
|
|
12
|
+
* Options for configuring the LLMObs middleware.
|
|
13
|
+
*/
|
|
14
|
+
export interface LLMObsMiddlewareOptions {
|
|
15
|
+
/** LLMObs tracer instance */
|
|
16
|
+
tracer?: LLMObsTracer;
|
|
17
|
+
/** Logger instance */
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates a middleware that adds LLMObs observability tracing.
|
|
22
|
+
*
|
|
23
|
+
* This middleware wraps the existing LLMObsStreamTextMiddleware to provide:
|
|
24
|
+
* - Workflow and LLM span hierarchy
|
|
25
|
+
* - Token usage tracking
|
|
26
|
+
* - Tool call tracing
|
|
27
|
+
* - Segment-level tracking (thinking, text, tool-input)
|
|
28
|
+
* - Error and abort handling
|
|
29
|
+
*
|
|
30
|
+
* @param options - Configuration for the middleware
|
|
31
|
+
* @returns A StreamTextMiddleware
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const middleware = createLLMObsMiddleware({
|
|
36
|
+
* tracer: LLMObsTracer.instance,
|
|
37
|
+
* logger: getLogger()
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* const streamText = applyMiddleware(baseStreamText, middleware);
|
|
41
|
+
* const result = await streamText({ model, messages, tools });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function createLLMObsMiddleware(options?: LLMObsMiddlewareOptions): StreamTextMiddleware;
|
|
45
|
+
//# sourceMappingURL=llmobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmobs.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/llmobs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,oBAAoB,CAwEtB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLMObs middleware adapter.
|
|
3
|
+
*
|
|
4
|
+
* This middleware wraps the existing LLMObsStreamTextMiddleware to work
|
|
5
|
+
* with the new provider-based middleware interface. It provides observability
|
|
6
|
+
* tracing for LLM interactions.
|
|
7
|
+
*/
|
|
8
|
+
import { LLMObsStreamTextMiddleware, wrapStream, } from "../../../llmobs/middleware/stream-text.js";
|
|
9
|
+
/**
|
|
10
|
+
* Creates a middleware that adds LLMObs observability tracing.
|
|
11
|
+
*
|
|
12
|
+
* This middleware wraps the existing LLMObsStreamTextMiddleware to provide:
|
|
13
|
+
* - Workflow and LLM span hierarchy
|
|
14
|
+
* - Token usage tracking
|
|
15
|
+
* - Tool call tracing
|
|
16
|
+
* - Segment-level tracking (thinking, text, tool-input)
|
|
17
|
+
* - Error and abort handling
|
|
18
|
+
*
|
|
19
|
+
* @param options - Configuration for the middleware
|
|
20
|
+
* @returns A StreamTextMiddleware
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const middleware = createLLMObsMiddleware({
|
|
25
|
+
* tracer: LLMObsTracer.instance,
|
|
26
|
+
* logger: getLogger()
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* const streamText = applyMiddleware(baseStreamText, middleware);
|
|
30
|
+
* const result = await streamText({ model, messages, tools });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function createLLMObsMiddleware(options = {}) {
|
|
34
|
+
const { tracer, logger } = options;
|
|
35
|
+
return {
|
|
36
|
+
wrap(provider) {
|
|
37
|
+
return {
|
|
38
|
+
async streamText(streamOptions) {
|
|
39
|
+
// Create LLMObs middleware instance
|
|
40
|
+
const llmobs = new LLMObsStreamTextMiddleware(streamOptions.model, streamOptions.tools, tracer, logger);
|
|
41
|
+
try {
|
|
42
|
+
// Call provider with wrapped callbacks and tools
|
|
43
|
+
const result = await provider.streamText({
|
|
44
|
+
...streamOptions,
|
|
45
|
+
tools: streamOptions.tools
|
|
46
|
+
? llmobs.wrapTools(streamOptions.tools)
|
|
47
|
+
: undefined,
|
|
48
|
+
prepareStep: async (step) => {
|
|
49
|
+
return await llmobs.prepareStep(step, streamOptions.model, streamOptions.prepareStep);
|
|
50
|
+
},
|
|
51
|
+
onChunk: async (event) => {
|
|
52
|
+
await llmobs.onChunk(event.chunk, streamOptions.onChunk);
|
|
53
|
+
},
|
|
54
|
+
onStepFinish: async (step) => {
|
|
55
|
+
await llmobs.onStepFinish(step, streamOptions.onStepFinish);
|
|
56
|
+
},
|
|
57
|
+
onFinish: async (result) => {
|
|
58
|
+
await llmobs.onFinish(result, streamOptions.onFinish);
|
|
59
|
+
},
|
|
60
|
+
onError: async (error) => {
|
|
61
|
+
await llmobs.onError(error, streamOptions.onError);
|
|
62
|
+
},
|
|
63
|
+
onAbort: async () => {
|
|
64
|
+
await llmobs.onAbort(streamOptions.onAbort);
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
// Wrap result streams with error/finally handlers using the wrapStream utility
|
|
68
|
+
// from stream-text.ts which properly creates AsyncIterableStream
|
|
69
|
+
return {
|
|
70
|
+
...result,
|
|
71
|
+
textStream: wrapStream(result.textStream, async (error) => llmobs.handleStreamError(error), async () => llmobs.onFinally()),
|
|
72
|
+
fullStream: wrapStream(result.fullStream, async (error) => llmobs.handleStreamError(error), async () => llmobs.onFinally()),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Clean up spans if error occurs before streams are created
|
|
77
|
+
llmobs.handleStreamError(error);
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=llmobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmobs.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/llmobs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,0BAA0B,EAC1B,UAAU,GACX,MAAM,2CAA2C,CAAC;AAsBnD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAmC,EAAE;IAErC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEnC,OAAO;QACL,IAAI,CAAC,QAA4B;YAC/B,OAAO;gBACL,KAAK,CAAC,UAAU,CACd,aAAuC;oBAEvC,oCAAoC;oBACpC,MAAM,MAAM,GAAG,IAAI,0BAA0B,CAC3C,aAAa,CAAC,KAAK,EACnB,aAAa,CAAC,KAAK,EACnB,MAAM,EACN,MAAM,CACP,CAAC;oBAEF,IAAI,CAAC;wBACH,iDAAiD;wBACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAQ;4BAC9C,GAAG,aAAa;4BAChB,KAAK,EAAE,aAAa,CAAC,KAAK;gCACxB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;gCACvC,CAAC,CAAC,SAAS;4BACb,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gCAC1B,OAAO,MAAM,MAAM,CAAC,WAAW,CAC7B,IAAI,EACJ,aAAa,CAAC,KAAK,EACnB,aAAa,CAAC,WAAW,CAC1B,CAAC;4BACJ,CAAC;4BACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gCACvB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;4BAC3D,CAAC;4BACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gCAC3B,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;4BAC9D,CAAC;4BACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gCACzB,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;4BACxD,CAAC;4BACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gCACvB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;4BACrD,CAAC;4BACD,OAAO,EAAE,KAAK,IAAI,EAAE;gCAClB,MAAM,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;4BAC9C,CAAC;yBACF,CAAC,CAAC;wBAEH,+EAA+E;wBAC/E,iEAAiE;wBACjE,OAAO;4BACL,GAAG,MAAM;4BACT,UAAU,EAAE,UAAU,CACpB,MAAM,CAAC,UAAU,EACjB,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAChD,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAC/B;4BACD,UAAU,EAAE,UAAU,CACpB,MAAM,CAAC,UAAU,EACjB,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAChD,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAC/B;yBACF,CAAC;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,4DAA4D;wBAC5D,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;wBAChC,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging middleware for LLM interactions.
|
|
3
|
+
*
|
|
4
|
+
* This middleware captures detailed logs of the entire LLM interaction including:
|
|
5
|
+
* - Configuration and model details
|
|
6
|
+
* - Input messages and context
|
|
7
|
+
* - Each step's outputs (text, reasoning, tool calls)
|
|
8
|
+
* - Token usage per step and total
|
|
9
|
+
* - Timing information
|
|
10
|
+
*
|
|
11
|
+
* The accumulated log content is made available for saving as an artifact.
|
|
12
|
+
*/
|
|
13
|
+
import type { FileArtifact } from "../../../types.js";
|
|
14
|
+
import type { StreamTextMiddleware } from "../middleware.js";
|
|
15
|
+
/**
|
|
16
|
+
* Reference to a mutable log content string.
|
|
17
|
+
* Allows external access to accumulated log content during streaming.
|
|
18
|
+
*/
|
|
19
|
+
export interface LogRef {
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Options for configuring the logging middleware.
|
|
24
|
+
*/
|
|
25
|
+
export interface LoggingMiddlewareOptions {
|
|
26
|
+
/** Unique identifier for this conversation */
|
|
27
|
+
conversationId?: string;
|
|
28
|
+
/** Function to save the log artifact after stream completes */
|
|
29
|
+
saveArtifact: (artifact: FileArtifact, stepId: string, runTimestamp: string) => Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Optional log reference to use for accumulating log content.
|
|
32
|
+
* If provided, the middleware will write to this reference.
|
|
33
|
+
* If not provided, an internal reference is created.
|
|
34
|
+
* Useful when you need external access to logs during streaming.
|
|
35
|
+
*/
|
|
36
|
+
logRef?: LogRef;
|
|
37
|
+
/** Optional additional metadata to log */
|
|
38
|
+
metadata?: {
|
|
39
|
+
mode?: string;
|
|
40
|
+
provider?: string;
|
|
41
|
+
thinking?: boolean;
|
|
42
|
+
thinkingBudgetTokens?: number;
|
|
43
|
+
disabledTools?: string[];
|
|
44
|
+
headers?: Record<string, string | undefined>;
|
|
45
|
+
[key: string]: unknown;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates a middleware that logs all LLM interaction details.
|
|
50
|
+
*
|
|
51
|
+
* The middleware wraps the streamText call to capture:
|
|
52
|
+
* - Initial configuration and messages
|
|
53
|
+
* - Each step's output (text, reasoning, tool calls, usage)
|
|
54
|
+
* - Final aggregated statistics
|
|
55
|
+
*
|
|
56
|
+
* The log is automatically saved as a file artifact after the stream completes.
|
|
57
|
+
*
|
|
58
|
+
* @param options - Configuration for the middleware
|
|
59
|
+
* @returns A StreamTextMiddleware
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* // Basic usage - internal logRef
|
|
64
|
+
* const middleware = createLoggingMiddleware({
|
|
65
|
+
* conversationId: "conv-123",
|
|
66
|
+
* runTimestamp: new Date().toISOString(),
|
|
67
|
+
* saveArtifact: services.appShell.saveGeneratedArtifact,
|
|
68
|
+
* metadata: { mode: "build", provider: "anthropic" }
|
|
69
|
+
* });
|
|
70
|
+
*
|
|
71
|
+
* // With external logRef for accessing logs during streaming
|
|
72
|
+
* const logRef = { content: "" };
|
|
73
|
+
* const middleware = createLoggingMiddleware({
|
|
74
|
+
* conversationId: "conv-123",
|
|
75
|
+
* runTimestamp: new Date().toISOString(),
|
|
76
|
+
* saveArtifact: services.appShell.saveGeneratedArtifact,
|
|
77
|
+
* logRef, // Pass your own reference
|
|
78
|
+
* metadata: { mode: "build", provider: "anthropic" }
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* const streamText = applyMiddleware(baseStreamText, middleware);
|
|
82
|
+
* const result = await streamText({ model, messages, tools });
|
|
83
|
+
* // Access logs during streaming: console.log(logRef.content)
|
|
84
|
+
* // Log is automatically saved after stream completes
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function createLoggingMiddleware(options: LoggingMiddlewareOptions): StreamTextMiddleware;
|
|
88
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAG1B;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,+DAA+D;IAC/D,YAAY,EAAE,CACZ,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,oBAAoB,CAuLtB"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging middleware for LLM interactions.
|
|
3
|
+
*
|
|
4
|
+
* This middleware captures detailed logs of the entire LLM interaction including:
|
|
5
|
+
* - Configuration and model details
|
|
6
|
+
* - Input messages and context
|
|
7
|
+
* - Each step's outputs (text, reasoning, tool calls)
|
|
8
|
+
* - Token usage per step and total
|
|
9
|
+
* - Timing information
|
|
10
|
+
*
|
|
11
|
+
* The accumulated log content is made available for saving as an artifact.
|
|
12
|
+
*/
|
|
13
|
+
import { getLogger } from "../../../../util/logger.js";
|
|
14
|
+
import { safeJsonStringify } from "../../../util/safe-stringify.js";
|
|
15
|
+
/**
|
|
16
|
+
* Creates a middleware that logs all LLM interaction details.
|
|
17
|
+
*
|
|
18
|
+
* The middleware wraps the streamText call to capture:
|
|
19
|
+
* - Initial configuration and messages
|
|
20
|
+
* - Each step's output (text, reasoning, tool calls, usage)
|
|
21
|
+
* - Final aggregated statistics
|
|
22
|
+
*
|
|
23
|
+
* The log is automatically saved as a file artifact after the stream completes.
|
|
24
|
+
*
|
|
25
|
+
* @param options - Configuration for the middleware
|
|
26
|
+
* @returns A StreamTextMiddleware
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // Basic usage - internal logRef
|
|
31
|
+
* const middleware = createLoggingMiddleware({
|
|
32
|
+
* conversationId: "conv-123",
|
|
33
|
+
* runTimestamp: new Date().toISOString(),
|
|
34
|
+
* saveArtifact: services.appShell.saveGeneratedArtifact,
|
|
35
|
+
* metadata: { mode: "build", provider: "anthropic" }
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // With external logRef for accessing logs during streaming
|
|
39
|
+
* const logRef = { content: "" };
|
|
40
|
+
* const middleware = createLoggingMiddleware({
|
|
41
|
+
* conversationId: "conv-123",
|
|
42
|
+
* runTimestamp: new Date().toISOString(),
|
|
43
|
+
* saveArtifact: services.appShell.saveGeneratedArtifact,
|
|
44
|
+
* logRef, // Pass your own reference
|
|
45
|
+
* metadata: { mode: "build", provider: "anthropic" }
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* const streamText = applyMiddleware(baseStreamText, middleware);
|
|
49
|
+
* const result = await streamText({ model, messages, tools });
|
|
50
|
+
* // Access logs during streaming: console.log(logRef.content)
|
|
51
|
+
* // Log is automatically saved after stream completes
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function createLoggingMiddleware(options) {
|
|
55
|
+
const { saveArtifact, metadata = {} } = options;
|
|
56
|
+
// Use provided logRef or create one internally
|
|
57
|
+
const logRef = options.logRef ?? { content: "" };
|
|
58
|
+
// Use provided conversationId or generate one
|
|
59
|
+
const conversationId = options.conversationId ?? String(Date.now());
|
|
60
|
+
return {
|
|
61
|
+
wrap(provider) {
|
|
62
|
+
return {
|
|
63
|
+
async streamText(streamOptions) {
|
|
64
|
+
// Timestamp for the run, used when saving the artifact
|
|
65
|
+
const runTimestamp = new Date().toISOString();
|
|
66
|
+
const modelId = typeof streamOptions.model === "string"
|
|
67
|
+
? streamOptions.model
|
|
68
|
+
: streamOptions.model.modelId;
|
|
69
|
+
// Log conversation header
|
|
70
|
+
logRef.content += `=== LLM CONVERSATION START [${conversationId}] ===\n`;
|
|
71
|
+
logRef.content += `Timestamp: ${runTimestamp}\n`;
|
|
72
|
+
logRef.content += `Model: ${modelId}\n`;
|
|
73
|
+
// Log provider configuration if available
|
|
74
|
+
if (metadata.provider || metadata.thinking !== undefined) {
|
|
75
|
+
logRef.content += `Provider Config: provider=${metadata.provider || "anthropic (default)"}`;
|
|
76
|
+
if (metadata.thinking !== undefined) {
|
|
77
|
+
logRef.content += `, thinking=${metadata.thinking}`;
|
|
78
|
+
}
|
|
79
|
+
if (metadata.thinkingBudgetTokens) {
|
|
80
|
+
logRef.content += `, budget=${metadata.thinkingBudgetTokens}`;
|
|
81
|
+
}
|
|
82
|
+
if (metadata.disabledTools?.length) {
|
|
83
|
+
logRef.content += `, disabledTools=${metadata.disabledTools.join(",")}`;
|
|
84
|
+
}
|
|
85
|
+
if (metadata.headers && Object.keys(metadata.headers).length > 0) {
|
|
86
|
+
logRef.content += `, headers=${safeJsonStringify(metadata.headers)}`;
|
|
87
|
+
}
|
|
88
|
+
logRef.content += "\n";
|
|
89
|
+
}
|
|
90
|
+
// Log input messages
|
|
91
|
+
logRef.content += `--- INPUT MESSAGES ---\n`;
|
|
92
|
+
if (streamOptions.messages) {
|
|
93
|
+
for (const message of streamOptions.messages) {
|
|
94
|
+
logRef.content += formatMessage(message);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (streamOptions.user) {
|
|
98
|
+
logRef.content += formatMessage(streamOptions.user);
|
|
99
|
+
}
|
|
100
|
+
logRef.content += "\n";
|
|
101
|
+
// Log mode and tools
|
|
102
|
+
if (metadata.mode) {
|
|
103
|
+
logRef.content += `[MODE] ${metadata.mode}\n`;
|
|
104
|
+
}
|
|
105
|
+
if (streamOptions.tools) {
|
|
106
|
+
const toolNames = Object.keys(streamOptions.tools);
|
|
107
|
+
logRef.content += `Available tools: ${toolNames.length}\n`;
|
|
108
|
+
logRef.content += `Tools: ${toolNames.join(", ")}\n`;
|
|
109
|
+
}
|
|
110
|
+
logRef.content += "\n";
|
|
111
|
+
// Track step number ourselves (Vercel SDK doesn't provide it)
|
|
112
|
+
let stepNumber = 0;
|
|
113
|
+
// Call provider with wrapped callbacks
|
|
114
|
+
return await provider.streamText({
|
|
115
|
+
...streamOptions,
|
|
116
|
+
onStepFinish: async (step) => {
|
|
117
|
+
stepNumber++;
|
|
118
|
+
const stepTimestamp = new Date().toISOString();
|
|
119
|
+
logRef.content += `--- OUTPUT STEP ${stepNumber} [${stepTimestamp}] ---\n`;
|
|
120
|
+
// Log token usage
|
|
121
|
+
if (step.usage) {
|
|
122
|
+
const stepInputTokens = step.usage.inputTokens ?? 0;
|
|
123
|
+
const stepOutputTokens = step.usage.outputTokens ?? 0;
|
|
124
|
+
const stepCachedTokens = step.usage.cachedInputTokens ?? 0;
|
|
125
|
+
logRef.content += `[TOKEN USAGE] Input: ${stepInputTokens}, Output: ${stepOutputTokens}, Total: ${step.usage.totalTokens ?? 0}`;
|
|
126
|
+
if (stepCachedTokens) {
|
|
127
|
+
logRef.content += `, Cached: ${stepCachedTokens}`;
|
|
128
|
+
}
|
|
129
|
+
logRef.content += `\n`;
|
|
130
|
+
}
|
|
131
|
+
// Log tool calls
|
|
132
|
+
if (step.toolCalls && step.toolCalls.length > 0) {
|
|
133
|
+
logRef.content += `[TOOLS CALLED]\n`;
|
|
134
|
+
step.toolCalls.forEach((toolCall, idx) => {
|
|
135
|
+
logRef.content += ` Tool ${idx + 1}: ${toolCall.toolName}\n`;
|
|
136
|
+
logRef.content += ` Input: ${safeJsonStringify(toolCall.args)}\n`;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Log tool results
|
|
140
|
+
if (step.toolResults && step.toolResults.length > 0) {
|
|
141
|
+
logRef.content += `[TOOL RESULTS]\n`;
|
|
142
|
+
step.toolResults.forEach((result, idx) => {
|
|
143
|
+
logRef.content += ` Tool ${idx + 1}: ${result.toolName}\n`;
|
|
144
|
+
logRef.content += ` Output: ${safeJsonStringify(result.result)}\n`;
|
|
145
|
+
if (result.isError) {
|
|
146
|
+
logRef.content += ` [ERROR]\n`;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// Log reasoning (if present)
|
|
151
|
+
if (step.reasoningText && step.reasoningText.length > 0) {
|
|
152
|
+
logRef.content += `[REASONING]\n${step.reasoningText}\n`;
|
|
153
|
+
}
|
|
154
|
+
// Log assistant text
|
|
155
|
+
if (step.text) {
|
|
156
|
+
logRef.content += `[ASSISTANT TEXT] ${step.text}\n`;
|
|
157
|
+
}
|
|
158
|
+
logRef.content += `\n`;
|
|
159
|
+
return await streamOptions.onStepFinish?.(step);
|
|
160
|
+
},
|
|
161
|
+
onFinish: async (result) => {
|
|
162
|
+
const endTimestamp = new Date().toISOString();
|
|
163
|
+
logRef.content += `=== LLM CONVERSATION END [${conversationId}] ===\n`;
|
|
164
|
+
logRef.content += `Finish reason: ${result.finishReason}\n`;
|
|
165
|
+
logRef.content += `End Timestamp: ${endTimestamp}\n`;
|
|
166
|
+
logRef.content += `Total Steps: ${result.steps.length}\n`;
|
|
167
|
+
const usage = result.totalUsage;
|
|
168
|
+
// Log final token usage
|
|
169
|
+
logRef.content += `[TOTAL TOKEN USAGE] Input: ${usage.inputTokens ?? 0}, Output: ${usage.outputTokens ?? 0}, Total: ${usage.totalTokens ?? 0}`;
|
|
170
|
+
if (usage.cachedInputTokens ?? 0 > 0) {
|
|
171
|
+
logRef.content += `, Cached: ${usage.cachedInputTokens ?? 0}`;
|
|
172
|
+
}
|
|
173
|
+
logRef.content += `\n`;
|
|
174
|
+
return await streamOptions.onFinish?.(result);
|
|
175
|
+
},
|
|
176
|
+
onAbort: async () => {
|
|
177
|
+
const abortTimestamp = new Date().toISOString();
|
|
178
|
+
logRef.content += `=== LLM CONVERSATION ABORTED [${conversationId}] ===\n`;
|
|
179
|
+
logRef.content += `Abort Timestamp: ${abortTimestamp}\n\n`;
|
|
180
|
+
return await streamOptions.onAbort?.();
|
|
181
|
+
},
|
|
182
|
+
onFinally: async () => {
|
|
183
|
+
// Save the log artifact
|
|
184
|
+
try {
|
|
185
|
+
const logArtifact = {
|
|
186
|
+
type: "file",
|
|
187
|
+
filePath: `llm-conversation-${conversationId}.log`,
|
|
188
|
+
content: logRef.content,
|
|
189
|
+
};
|
|
190
|
+
const stepId = `llm-conversation-${conversationId}`;
|
|
191
|
+
await saveArtifact(logArtifact, stepId, runTimestamp);
|
|
192
|
+
getLogger().debug("LLM conversation log saved");
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
getLogger().error("Failed to save LLM conversation log", {
|
|
196
|
+
error: {
|
|
197
|
+
kind: "SaveLogError",
|
|
198
|
+
message: error instanceof Error ? error.message : String(error),
|
|
199
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return await streamOptions.onFinally?.();
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Formats a message for logging.
|
|
213
|
+
*/
|
|
214
|
+
function formatMessage(message) {
|
|
215
|
+
const role = message.role.toUpperCase();
|
|
216
|
+
if (typeof message.content === "string") {
|
|
217
|
+
return `[${role}] ${message.content}\n\n`;
|
|
218
|
+
}
|
|
219
|
+
// Handle array content
|
|
220
|
+
let output = `[${role}]\n`;
|
|
221
|
+
for (const part of message.content) {
|
|
222
|
+
if (part.type === "text") {
|
|
223
|
+
output += ` ${part.text}\n`;
|
|
224
|
+
}
|
|
225
|
+
else if (part.type === "image") {
|
|
226
|
+
output += ` [IMAGE]\n`;
|
|
227
|
+
}
|
|
228
|
+
else if (part.type === "tool-call") {
|
|
229
|
+
output += ` [TOOL CALL] ${part.toolName}: ${safeJsonStringify(part.args)}\n`;
|
|
230
|
+
}
|
|
231
|
+
else if (part.type === "tool-result") {
|
|
232
|
+
output += ` [TOOL RESULT] ${part.toolName}: ${safeJsonStringify(part.result)}\n`;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
output += "\n";
|
|
236
|
+
return output;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/logging.ts"],"names":[],"mappings":"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"}
|