@superblocksteam/vite-plugin-file-sync 2.0.70 → 2.0.71-next.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/dist/ai-service/agent/prompts/build-base-system-prompt.js +1 -1
- package/dist/ai-service/agent/subagents/types.d.ts.map +1 -1
- package/dist/ai-service/agent/subagents/types.js +1 -0
- package/dist/ai-service/agent/subagents/types.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 +5 -0
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +2 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/sample-json.d.ts +2 -0
- package/dist/ai-service/agent/tools/apis/sample-json.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/apis/sample-json.js +16 -0
- package/dist/ai-service/agent/tools/apis/sample-json.js.map +1 -0
- package/dist/ai-service/agent/tools/apis/test-api.d.ts +4 -4
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +16 -5
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +35 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +90 -15
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
- package/dist/ai-service/agent/tools/build-validate-icons.d.ts +3 -18
- package/dist/ai-service/agent/tools/build-validate-icons.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-validate-icons.js +12 -50
- package/dist/ai-service/agent/tools/build-validate-icons.js.map +1 -1
- package/dist/ai-service/agent/tools/debug-cache.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +1 -1
- package/dist/ai-service/agent/tools/shared-helpers.d.ts +0 -35
- package/dist/ai-service/agent/tools/shared-helpers.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/shared-helpers.js +0 -89
- package/dist/ai-service/agent/tools/shared-helpers.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts +1 -23
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +3 -68
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +16 -5
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/bash.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/bash.js +2 -1
- package/dist/ai-service/agent/tools2/tools/bash.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 +10 -2
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/grep.js +2 -1
- package/dist/ai-service/agent/tools2/tools/grep.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ls.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/ls.js +3 -1
- package/dist/ai-service/agent/tools2/tools/ls.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +2 -1
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +31 -11
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +5 -10
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/clark-provider/clark-chat-settings.d.ts +2 -1
- package/dist/ai-service/clark-provider/clark-chat-settings.d.ts.map +1 -1
- package/dist/ai-service/clark-provider/clark-chat-settings.js +1 -0
- package/dist/ai-service/clark-provider/clark-chat-settings.js.map +1 -1
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +7 -4
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integrations/store.d.ts +1 -0
- package/dist/ai-service/integrations/store.d.ts.map +1 -1
- package/dist/ai-service/integrations/store.js +1 -0
- package/dist/ai-service/integrations/store.js.map +1 -1
- package/dist/ai-service/llm/client.d.ts +14 -117
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +57 -149
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +7 -2
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +17 -17
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/impl/anthropic.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/anthropic.js +2 -1
- package/dist/ai-service/llm/impl/anthropic.js.map +1 -1
- package/dist/ai-service/llm/impl/clark.d.ts.map +1 -1
- package/dist/ai-service/llm/impl/clark.js +2 -1
- package/dist/ai-service/llm/impl/clark.js.map +1 -1
- package/dist/ai-service/llm/interaction/index.d.ts +0 -64
- package/dist/ai-service/llm/interaction/index.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/index.js +0 -65
- package/dist/ai-service/llm/interaction/index.js.map +1 -1
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +2 -6
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llm/stream/config.d.ts +56 -0
- package/dist/ai-service/llm/stream/config.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/config.js +41 -0
- package/dist/ai-service/llm/stream/config.js.map +1 -0
- package/dist/ai-service/llm/stream/errors.d.ts +16 -0
- package/dist/ai-service/llm/stream/errors.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/errors.js +68 -0
- package/dist/ai-service/llm/stream/errors.js.map +1 -0
- package/dist/ai-service/llm/stream/event-bus.d.ts +68 -0
- package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/event-bus.js +51 -0
- package/dist/ai-service/llm/stream/event-bus.js.map +1 -0
- package/dist/ai-service/llm/stream/index.d.ts +49 -0
- package/dist/ai-service/llm/stream/index.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/index.js +46 -0
- package/dist/ai-service/llm/stream/index.js.map +1 -0
- package/dist/ai-service/llm/stream/managed-stream.d.ts +25 -0
- package/dist/ai-service/llm/stream/managed-stream.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/managed-stream.js +68 -0
- package/dist/ai-service/llm/stream/managed-stream.js.map +1 -0
- package/dist/ai-service/llm/stream/observer.d.ts +34 -0
- package/dist/ai-service/llm/stream/observer.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observer.js +2 -0
- package/dist/ai-service/llm/stream/observer.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts +40 -0
- package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/context.js +55 -0
- package/dist/ai-service/llm/stream/observers/context.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/index.d.ts +8 -0
- package/dist/ai-service/llm/stream/observers/index.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/index.js +8 -0
- package/dist/ai-service/llm/stream/observers/index.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts +78 -0
- package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/llmobs.js +504 -0
- package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts +46 -0
- package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/logging.js +296 -0
- package/dist/ai-service/llm/stream/observers/logging.js.map +1 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.d.ts +17 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.js +36 -0
- package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -0
- package/dist/ai-service/llm/stream/orchestrator.d.ts +73 -0
- package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/orchestrator.js +285 -0
- package/dist/ai-service/llm/stream/orchestrator.js.map +1 -0
- package/dist/ai-service/llm/stream/retry-engine.d.ts +58 -0
- package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/retry-engine.js +151 -0
- package/dist/ai-service/llm/stream/retry-engine.js.map +1 -0
- package/dist/ai-service/llm/stream/session.d.ts +58 -0
- package/dist/ai-service/llm/stream/session.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/session.js +116 -0
- package/dist/ai-service/llm/stream/session.js.map +1 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.d.ts +129 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.js +508 -0
- package/dist/ai-service/llm/stream/tests/helpers/mock-provider.js.map +1 -0
- package/dist/ai-service/llm/stream/types.d.ts +15 -0
- package/dist/ai-service/llm/stream/types.d.ts.map +1 -0
- package/dist/ai-service/llm/stream/types.js +2 -0
- package/dist/ai-service/llm/stream/types.js.map +1 -0
- package/dist/ai-service/llm/types.d.ts +1 -1
- package/dist/ai-service/llm/types.d.ts.map +1 -1
- package/dist/ai-service/llmobs/helpers.d.ts +0 -19
- package/dist/ai-service/llmobs/helpers.d.ts.map +1 -1
- package/dist/ai-service/llmobs/helpers.js +0 -23
- package/dist/ai-service/llmobs/helpers.js.map +1 -1
- package/dist/ai-service/llmobs/tracer.d.ts +1 -0
- package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
- package/dist/ai-service/llmobs/tracer.js +1 -0
- package/dist/ai-service/llmobs/tracer.js.map +1 -1
- package/dist/ai-service/llmobs/types.d.ts +2 -0
- package/dist/ai-service/llmobs/types.d.ts.map +1 -1
- package/dist/ai-service/llmobs/utils.d.ts.map +1 -1
- package/dist/ai-service/llmobs/utils.js +8 -0
- package/dist/ai-service/llmobs/utils.js.map +1 -1
- package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -1
- package/dist/ai-service/mcp/playwright-server.js.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts +1 -3
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +6 -28
- 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 +9 -11
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/awaiting-user.js +3 -2
- package/dist/ai-service/state-machine/handlers/awaiting-user.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 +18 -4
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.d.ts +5 -4
- package/dist/ai-service/state-machine/traced-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/traced-fsm.js +25 -25
- package/dist/ai-service/state-machine/traced-fsm.js.map +1 -1
- package/dist/ai-service/types.d.ts +3 -3
- package/dist/ai-service/types.d.ts.map +1 -1
- package/dist/ai-service/types.js +10 -10
- package/dist/ai-service/types.js.map +1 -1
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +10 -3
- package/dist/socket-manager.js.map +1 -1
- package/dist/source-tracker.d.ts.map +1 -1
- package/dist/source-tracker.js +8 -0
- package/dist/source-tracker.js.map +1 -1
- package/dist/sync-service/index.d.ts +7 -2
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +16 -9
- package/dist/sync-service/index.js.map +1 -1
- package/package.json +11 -11
- package/dist/ai-service/llm/interaction/compose.d.ts +0 -71
- package/dist/ai-service/llm/interaction/compose.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/compose.js +0 -88
- package/dist/ai-service/llm/interaction/compose.js.map +0 -1
- package/dist/ai-service/llm/interaction/middleware.d.ts +0 -52
- package/dist/ai-service/llm/interaction/middleware.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middleware.js +0 -17
- package/dist/ai-service/llm/interaction/middleware.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts +0 -45
- package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js +0 -85
- package/dist/ai-service/llm/interaction/middlewares/llmobs.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts +0 -88
- package/dist/ai-service/llm/interaction/middlewares/logging.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/logging.js +0 -238
- package/dist/ai-service/llm/interaction/middlewares/logging.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts +0 -47
- package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/profiler.js +0 -183
- package/dist/ai-service/llm/interaction/middlewares/profiler.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts +0 -115
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js +0 -231
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.d.ts +0 -41
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.js +0 -74
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.d.ts +0 -61
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.js +0 -116
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.d.ts +0 -47
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.js +0 -141
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.d.ts +0 -30
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.js +0 -36
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.js.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.d.ts +0 -42
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.d.ts.map +0 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.js +0 -208
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.js.map +0 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts +0 -56
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +0 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js +0 -597
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +0 -1
|
@@ -1,88 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,238 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profiler middleware for LLM interactions.
|
|
3
|
-
*
|
|
4
|
-
* This middleware creates performance traces for LLM operations including:
|
|
5
|
-
* - Waiting for first token (waiting_on_llm span)
|
|
6
|
-
* - Streaming response (stream_text span)
|
|
7
|
-
* - Individual reasoning and text generation segments
|
|
8
|
-
*
|
|
9
|
-
* The traces are recorded in Perfetto format for visualization.
|
|
10
|
-
*/
|
|
11
|
-
import type { ClarkProfiler } from "../../../profiler/clark-profiler.js";
|
|
12
|
-
import type { StreamTextMiddleware } from "../middleware.js";
|
|
13
|
-
/**
|
|
14
|
-
* Options for configuring the profiler middleware.
|
|
15
|
-
*/
|
|
16
|
-
export interface ProfilerMiddlewareOptions {
|
|
17
|
-
/** The Clark profiler instance */
|
|
18
|
-
profiler: ClarkProfiler;
|
|
19
|
-
/** Model identifier for logging */
|
|
20
|
-
modelId?: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Creates a middleware that profiles LLM interactions.
|
|
24
|
-
*
|
|
25
|
-
* The middleware wraps the streamText call to create timing spans:
|
|
26
|
-
* 1. waiting_on_llm: From call start to first token received
|
|
27
|
-
* 2. stream_text: From first token to stream completion
|
|
28
|
-
* 3. thinking/text_generation: Individual reasoning and text segments
|
|
29
|
-
*
|
|
30
|
-
* All timing data is recorded to the profiler for later export.
|
|
31
|
-
*
|
|
32
|
-
* @param options - Configuration for the middleware
|
|
33
|
-
* @returns A StreamTextMiddleware
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* ```typescript
|
|
37
|
-
* const middleware = createProfilerMiddleware({
|
|
38
|
-
* profiler: services.clarkProfiler,
|
|
39
|
-
* modelId: model.modelId
|
|
40
|
-
* });
|
|
41
|
-
*
|
|
42
|
-
* const streamText = applyMiddleware(baseStreamText, middleware);
|
|
43
|
-
* const result = await streamText({ model, messages, tools });
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export declare function createProfilerMiddleware(options: ProfilerMiddlewareOptions): StreamTextMiddleware;
|
|
47
|
-
//# sourceMappingURL=profiler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/profiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,kCAAkC;IAClC,QAAQ,EAAE,aAAa,CAAC;IAExB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,yBAAyB,GACjC,oBAAoB,CAwKtB"}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profiler middleware for LLM interactions.
|
|
3
|
-
*
|
|
4
|
-
* This middleware creates performance traces for LLM operations including:
|
|
5
|
-
* - Waiting for first token (waiting_on_llm span)
|
|
6
|
-
* - Streaming response (stream_text span)
|
|
7
|
-
* - Individual reasoning and text generation segments
|
|
8
|
-
*
|
|
9
|
-
* The traces are recorded in Perfetto format for visualization.
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Creates a middleware that profiles LLM interactions.
|
|
13
|
-
*
|
|
14
|
-
* The middleware wraps the streamText call to create timing spans:
|
|
15
|
-
* 1. waiting_on_llm: From call start to first token received
|
|
16
|
-
* 2. stream_text: From first token to stream completion
|
|
17
|
-
* 3. thinking/text_generation: Individual reasoning and text segments
|
|
18
|
-
*
|
|
19
|
-
* All timing data is recorded to the profiler for later export.
|
|
20
|
-
*
|
|
21
|
-
* @param options - Configuration for the middleware
|
|
22
|
-
* @returns A StreamTextMiddleware
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const middleware = createProfilerMiddleware({
|
|
27
|
-
* profiler: services.clarkProfiler,
|
|
28
|
-
* modelId: model.modelId
|
|
29
|
-
* });
|
|
30
|
-
*
|
|
31
|
-
* const streamText = applyMiddleware(baseStreamText, middleware);
|
|
32
|
-
* const result = await streamText({ model, messages, tools });
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
export function createProfilerMiddleware(options) {
|
|
36
|
-
const { profiler, modelId } = options;
|
|
37
|
-
return {
|
|
38
|
-
wrap(provider) {
|
|
39
|
-
return {
|
|
40
|
-
async streamText(streamOptions) {
|
|
41
|
-
let firstTokenReceived = false;
|
|
42
|
-
let thinkingSpanActive = false;
|
|
43
|
-
let textSpanActive = false;
|
|
44
|
-
const thinkingTrack = "thinking";
|
|
45
|
-
const textTrack = "text_generation";
|
|
46
|
-
let stepCount = 0;
|
|
47
|
-
// Start waiting span before the call
|
|
48
|
-
profiler.startLLMWaiting({
|
|
49
|
-
messages: streamOptions.messages,
|
|
50
|
-
model: modelId || streamOptions.model.modelId || "unknown",
|
|
51
|
-
});
|
|
52
|
-
// Wrap onChunk to track first token and segment transitions
|
|
53
|
-
const originalOnChunk = streamOptions.onChunk;
|
|
54
|
-
const wrappedOnChunk = async (chunk) => {
|
|
55
|
-
// Start streaming span on first token
|
|
56
|
-
if (!firstTokenReceived) {
|
|
57
|
-
firstTokenReceived = true;
|
|
58
|
-
const firstChunk = chunk.chunk.type === "text-delta"
|
|
59
|
-
? chunk.chunk.text
|
|
60
|
-
: chunk.chunk.type === "reasoning-delta"
|
|
61
|
-
? chunk.chunk.reasoning
|
|
62
|
-
: undefined;
|
|
63
|
-
profiler.startLLMStreaming({
|
|
64
|
-
firstChunk,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
// Track reasoning segments
|
|
68
|
-
if (chunk.chunk.type === "reasoning-delta") {
|
|
69
|
-
if (!thinkingSpanActive) {
|
|
70
|
-
profiler
|
|
71
|
-
.getProfiler()
|
|
72
|
-
.createTrack(thinkingTrack, "AI Thinking/Reasoning", "llm");
|
|
73
|
-
profiler
|
|
74
|
-
.getProfiler()
|
|
75
|
-
.startFrame(`Thinking Step ${stepCount + 1}`, thinkingTrack);
|
|
76
|
-
thinkingSpanActive = true;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
else if (thinkingSpanActive) {
|
|
80
|
-
// End thinking span when switching to different chunk type
|
|
81
|
-
profiler.getProfiler().endFrame(thinkingTrack);
|
|
82
|
-
thinkingSpanActive = false;
|
|
83
|
-
}
|
|
84
|
-
// Track text generation segments
|
|
85
|
-
if (chunk.chunk.type === "text-delta") {
|
|
86
|
-
if (!textSpanActive) {
|
|
87
|
-
profiler
|
|
88
|
-
.getProfiler()
|
|
89
|
-
.createTrack(textTrack, "Text Generation", "llm");
|
|
90
|
-
profiler
|
|
91
|
-
.getProfiler()
|
|
92
|
-
.startFrame(`Text Generation Step ${stepCount + 1}`, textTrack);
|
|
93
|
-
textSpanActive = true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else if (textSpanActive) {
|
|
97
|
-
// End text span when switching to different chunk type
|
|
98
|
-
profiler.getProfiler().endFrame(textTrack);
|
|
99
|
-
textSpanActive = false;
|
|
100
|
-
}
|
|
101
|
-
// Call original onChunk if present
|
|
102
|
-
if (originalOnChunk) {
|
|
103
|
-
await originalOnChunk(chunk);
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
// Wrap onStepFinish to track step count
|
|
107
|
-
const originalOnStepFinish = streamOptions.onStepFinish;
|
|
108
|
-
const wrappedOnStepFinish = async (step) => {
|
|
109
|
-
stepCount++;
|
|
110
|
-
// Call original onStepFinish if present
|
|
111
|
-
if (originalOnStepFinish) {
|
|
112
|
-
await originalOnStepFinish(step);
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
// Wrap onFinish to end all active spans
|
|
116
|
-
const originalOnFinish = streamOptions.onFinish;
|
|
117
|
-
const wrappedOnFinish = async (result) => {
|
|
118
|
-
// End streaming span if it was started
|
|
119
|
-
if (firstTokenReceived) {
|
|
120
|
-
profiler.endFrame(); // End stream_text
|
|
121
|
-
}
|
|
122
|
-
profiler.endFrame(); // End waiting_on_llm
|
|
123
|
-
// End any active segment spans
|
|
124
|
-
if (thinkingSpanActive) {
|
|
125
|
-
profiler.getProfiler().endFrame(thinkingTrack);
|
|
126
|
-
}
|
|
127
|
-
if (textSpanActive) {
|
|
128
|
-
profiler.getProfiler().endFrame(textTrack);
|
|
129
|
-
}
|
|
130
|
-
// Call original onFinish if present
|
|
131
|
-
if (originalOnFinish) {
|
|
132
|
-
await originalOnFinish(result);
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
// Wrap onError to clean up spans on error
|
|
136
|
-
const originalOnError = streamOptions.onError;
|
|
137
|
-
const wrappedOnError = async (error) => {
|
|
138
|
-
// End all active spans on error
|
|
139
|
-
if (firstTokenReceived) {
|
|
140
|
-
profiler.endFrame(); // End stream_text
|
|
141
|
-
}
|
|
142
|
-
profiler.endFrame(); // End waiting_on_llm
|
|
143
|
-
if (thinkingSpanActive) {
|
|
144
|
-
profiler.getProfiler().endFrame(thinkingTrack);
|
|
145
|
-
}
|
|
146
|
-
if (textSpanActive) {
|
|
147
|
-
profiler.getProfiler().endFrame(textTrack);
|
|
148
|
-
}
|
|
149
|
-
// Call original onError if present
|
|
150
|
-
if (originalOnError) {
|
|
151
|
-
await originalOnError(error);
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
// Call provider with wrapped callbacks
|
|
155
|
-
try {
|
|
156
|
-
return await provider.streamText({
|
|
157
|
-
...streamOptions,
|
|
158
|
-
onChunk: wrappedOnChunk,
|
|
159
|
-
onStepFinish: wrappedOnStepFinish,
|
|
160
|
-
onFinish: wrappedOnFinish,
|
|
161
|
-
onError: wrappedOnError,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
// Clean up spans if an error is thrown before onError is called
|
|
166
|
-
if (firstTokenReceived) {
|
|
167
|
-
profiler.endFrame();
|
|
168
|
-
}
|
|
169
|
-
profiler.endFrame();
|
|
170
|
-
if (thinkingSpanActive) {
|
|
171
|
-
profiler.getProfiler().endFrame(thinkingTrack);
|
|
172
|
-
}
|
|
173
|
-
if (textSpanActive) {
|
|
174
|
-
profiler.getProfiler().endFrame(textTrack);
|
|
175
|
-
}
|
|
176
|
-
throw error;
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
},
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
//# sourceMappingURL=profiler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiler.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/profiler.ts"],"names":[],"mappings":"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"}
|