@lleverage-ai/agent-sdk 0.0.1
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/LICENSE +21 -0
- package/README.md +2321 -0
- package/dist/agent.d.ts +52 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +2122 -0
- package/dist/agent.js.map +1 -0
- package/dist/backend.d.ts +378 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +71 -0
- package/dist/backend.js.map +1 -0
- package/dist/backends/composite.d.ts +258 -0
- package/dist/backends/composite.d.ts.map +1 -0
- package/dist/backends/composite.js +437 -0
- package/dist/backends/composite.js.map +1 -0
- package/dist/backends/filesystem.d.ts +268 -0
- package/dist/backends/filesystem.d.ts.map +1 -0
- package/dist/backends/filesystem.js +623 -0
- package/dist/backends/filesystem.js.map +1 -0
- package/dist/backends/index.d.ts +14 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +14 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/persistent.d.ts +312 -0
- package/dist/backends/persistent.d.ts.map +1 -0
- package/dist/backends/persistent.js +519 -0
- package/dist/backends/persistent.js.map +1 -0
- package/dist/backends/sandbox.d.ts +315 -0
- package/dist/backends/sandbox.d.ts.map +1 -0
- package/dist/backends/sandbox.js +490 -0
- package/dist/backends/sandbox.js.map +1 -0
- package/dist/backends/state.d.ts +225 -0
- package/dist/backends/state.d.ts.map +1 -0
- package/dist/backends/state.js +396 -0
- package/dist/backends/state.js.map +1 -0
- package/dist/checkpointer/file-saver.d.ts +182 -0
- package/dist/checkpointer/file-saver.d.ts.map +1 -0
- package/dist/checkpointer/file-saver.js +298 -0
- package/dist/checkpointer/file-saver.js.map +1 -0
- package/dist/checkpointer/index.d.ts +40 -0
- package/dist/checkpointer/index.d.ts.map +1 -0
- package/dist/checkpointer/index.js +40 -0
- package/dist/checkpointer/index.js.map +1 -0
- package/dist/checkpointer/kv-saver.d.ts +142 -0
- package/dist/checkpointer/kv-saver.d.ts.map +1 -0
- package/dist/checkpointer/kv-saver.js +176 -0
- package/dist/checkpointer/kv-saver.js.map +1 -0
- package/dist/checkpointer/memory-saver.d.ts +158 -0
- package/dist/checkpointer/memory-saver.d.ts.map +1 -0
- package/dist/checkpointer/memory-saver.js +222 -0
- package/dist/checkpointer/memory-saver.js.map +1 -0
- package/dist/checkpointer/types.d.ts +353 -0
- package/dist/checkpointer/types.d.ts.map +1 -0
- package/dist/checkpointer/types.js +159 -0
- package/dist/checkpointer/types.js.map +1 -0
- package/dist/context-manager.d.ts +627 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +1039 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/context.d.ts +57 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +76 -0
- package/dist/context.js.map +1 -0
- package/dist/errors/index.d.ts +611 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +1023 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/generation-helpers.d.ts +126 -0
- package/dist/generation-helpers.d.ts.map +1 -0
- package/dist/generation-helpers.js +181 -0
- package/dist/generation-helpers.js.map +1 -0
- package/dist/hooks/audit.d.ts +210 -0
- package/dist/hooks/audit.d.ts.map +1 -0
- package/dist/hooks/audit.js +305 -0
- package/dist/hooks/audit.js.map +1 -0
- package/dist/hooks/cache.d.ts +180 -0
- package/dist/hooks/cache.d.ts.map +1 -0
- package/dist/hooks/cache.js +273 -0
- package/dist/hooks/cache.js.map +1 -0
- package/dist/hooks/guardrails.d.ts +145 -0
- package/dist/hooks/guardrails.d.ts.map +1 -0
- package/dist/hooks/guardrails.js +326 -0
- package/dist/hooks/guardrails.js.map +1 -0
- package/dist/hooks/index.d.ts +18 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +32 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/logging.d.ts +193 -0
- package/dist/hooks/logging.d.ts.map +1 -0
- package/dist/hooks/logging.js +345 -0
- package/dist/hooks/logging.js.map +1 -0
- package/dist/hooks/parallel-guardrails.d.ts +268 -0
- package/dist/hooks/parallel-guardrails.d.ts.map +1 -0
- package/dist/hooks/parallel-guardrails.js +416 -0
- package/dist/hooks/parallel-guardrails.js.map +1 -0
- package/dist/hooks/rate-limit.d.ts +305 -0
- package/dist/hooks/rate-limit.d.ts.map +1 -0
- package/dist/hooks/rate-limit.js +372 -0
- package/dist/hooks/rate-limit.js.map +1 -0
- package/dist/hooks/retry.d.ts +144 -0
- package/dist/hooks/retry.d.ts.map +1 -0
- package/dist/hooks/retry.js +210 -0
- package/dist/hooks/retry.js.map +1 -0
- package/dist/hooks/secrets.d.ts +174 -0
- package/dist/hooks/secrets.d.ts.map +1 -0
- package/dist/hooks/secrets.js +306 -0
- package/dist/hooks/secrets.js.map +1 -0
- package/dist/hooks.d.ts +229 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +352 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/env.d.ts +25 -0
- package/dist/mcp/env.d.ts.map +1 -0
- package/dist/mcp/env.js +18 -0
- package/dist/mcp/env.js.map +1 -0
- package/dist/mcp/index.d.ts +16 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +17 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +184 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +446 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +58 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/validation.d.ts +119 -0
- package/dist/mcp/validation.d.ts.map +1 -0
- package/dist/mcp/validation.js +407 -0
- package/dist/mcp/validation.js.map +1 -0
- package/dist/mcp/virtual-server.d.ts +78 -0
- package/dist/mcp/virtual-server.d.ts.map +1 -0
- package/dist/mcp/virtual-server.js +137 -0
- package/dist/mcp/virtual-server.js.map +1 -0
- package/dist/memory/filesystem-store.d.ts +217 -0
- package/dist/memory/filesystem-store.d.ts.map +1 -0
- package/dist/memory/filesystem-store.js +343 -0
- package/dist/memory/filesystem-store.js.map +1 -0
- package/dist/memory/index.d.ts +46 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +46 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/loader.d.ts +396 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +419 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/memory/permissions.d.ts +282 -0
- package/dist/memory/permissions.d.ts.map +1 -0
- package/dist/memory/permissions.js +297 -0
- package/dist/memory/permissions.js.map +1 -0
- package/dist/memory/rules.d.ts +249 -0
- package/dist/memory/rules.d.ts.map +1 -0
- package/dist/memory/rules.js +362 -0
- package/dist/memory/rules.js.map +1 -0
- package/dist/memory/store.d.ts +286 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +263 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/middleware/apply.d.ts +73 -0
- package/dist/middleware/apply.d.ts.map +1 -0
- package/dist/middleware/apply.js +219 -0
- package/dist/middleware/apply.js.map +1 -0
- package/dist/middleware/context.d.ts +33 -0
- package/dist/middleware/context.d.ts.map +1 -0
- package/dist/middleware/context.js +176 -0
- package/dist/middleware/context.js.map +1 -0
- package/dist/middleware/index.d.ts +31 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +32 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logging.d.ts +137 -0
- package/dist/middleware/logging.d.ts.map +1 -0
- package/dist/middleware/logging.js +374 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/types.d.ts +183 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +11 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/observability/events.d.ts +183 -0
- package/dist/observability/events.d.ts.map +1 -0
- package/dist/observability/events.js +305 -0
- package/dist/observability/events.js.map +1 -0
- package/dist/observability/index.d.ts +55 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +87 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +318 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +436 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +341 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +490 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/preset.d.ts +161 -0
- package/dist/observability/preset.d.ts.map +1 -0
- package/dist/observability/preset.js +133 -0
- package/dist/observability/preset.js.map +1 -0
- package/dist/observability/streaming.d.ts +113 -0
- package/dist/observability/streaming.d.ts.map +1 -0
- package/dist/observability/streaming.js +114 -0
- package/dist/observability/streaming.js.map +1 -0
- package/dist/observability/tracing.d.ts +378 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +539 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/plugins.d.ts +55 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +63 -0
- package/dist/plugins.js.map +1 -0
- package/dist/presets/index.d.ts +7 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +7 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/production.d.ts +262 -0
- package/dist/presets/production.d.ts.map +1 -0
- package/dist/presets/production.js +295 -0
- package/dist/presets/production.js.map +1 -0
- package/dist/security/index.d.ts +179 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +323 -0
- package/dist/security/index.js.map +1 -0
- package/dist/subagents/advanced.d.ts +413 -0
- package/dist/subagents/advanced.d.ts.map +1 -0
- package/dist/subagents/advanced.js +396 -0
- package/dist/subagents/advanced.js.map +1 -0
- package/dist/subagents/index.d.ts +14 -0
- package/dist/subagents/index.d.ts.map +1 -0
- package/dist/subagents/index.js +15 -0
- package/dist/subagents/index.js.map +1 -0
- package/dist/subagents.d.ts +73 -0
- package/dist/subagents.d.ts.map +1 -0
- package/dist/subagents.js +213 -0
- package/dist/subagents.js.map +1 -0
- package/dist/task-store/file-store.d.ts +76 -0
- package/dist/task-store/file-store.d.ts.map +1 -0
- package/dist/task-store/file-store.js +190 -0
- package/dist/task-store/file-store.js.map +1 -0
- package/dist/task-store/index.d.ts +11 -0
- package/dist/task-store/index.d.ts.map +1 -0
- package/dist/task-store/index.js +10 -0
- package/dist/task-store/index.js.map +1 -0
- package/dist/task-store/kv-store.d.ts +140 -0
- package/dist/task-store/kv-store.d.ts.map +1 -0
- package/dist/task-store/kv-store.js +169 -0
- package/dist/task-store/kv-store.js.map +1 -0
- package/dist/task-store/memory-store.d.ts +66 -0
- package/dist/task-store/memory-store.d.ts.map +1 -0
- package/dist/task-store/memory-store.js +125 -0
- package/dist/task-store/memory-store.js.map +1 -0
- package/dist/task-store/types.d.ts +235 -0
- package/dist/task-store/types.d.ts.map +1 -0
- package/dist/task-store/types.js +110 -0
- package/dist/task-store/types.js.map +1 -0
- package/dist/testing/assertions.d.ts +401 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +630 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/index.d.ts +343 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +360 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-agent.d.ts +214 -0
- package/dist/testing/mock-agent.d.ts.map +1 -0
- package/dist/testing/mock-agent.js +448 -0
- package/dist/testing/mock-agent.js.map +1 -0
- package/dist/testing/recorder.d.ts +288 -0
- package/dist/testing/recorder.d.ts.map +1 -0
- package/dist/testing/recorder.js +499 -0
- package/dist/testing/recorder.js.map +1 -0
- package/dist/tools/execute.d.ts +104 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +191 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/factory.d.ts +260 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +241 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/filesystem.d.ts +215 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +311 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/index.d.ts +33 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +59 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +94 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/skills.d.ts +354 -0
- package/dist/tools/skills.d.ts.map +1 -0
- package/dist/tools/skills.js +413 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/task.d.ts +272 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +521 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todos.d.ts +131 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +120 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +424 -0
- package/dist/tools/tool-registry.d.ts.map +1 -0
- package/dist/tools/tool-registry.js +607 -0
- package/dist/tools/tool-registry.js.map +1 -0
- package/dist/tools/user-interaction.d.ts +116 -0
- package/dist/tools/user-interaction.d.ts.map +1 -0
- package/dist/tools/user-interaction.js +147 -0
- package/dist/tools/user-interaction.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +189 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools.d.ts +74 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +73 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +2421 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logging hook utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides logging hooks for observability and debugging using the unified
|
|
5
|
+
* hook system.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Truncates text to maximum length with ellipsis.
|
|
11
|
+
*/
|
|
12
|
+
function truncate(text, maxLength) {
|
|
13
|
+
if (text.length <= maxLength) {
|
|
14
|
+
return text;
|
|
15
|
+
}
|
|
16
|
+
return `${text.slice(0, maxLength)}...`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Formats message count by role.
|
|
20
|
+
*/
|
|
21
|
+
function formatMessageCount(messages = []) {
|
|
22
|
+
const byRole = {};
|
|
23
|
+
for (const msg of messages) {
|
|
24
|
+
if (typeof msg === "object" && msg !== null && "role" in msg) {
|
|
25
|
+
const role = String(msg.role);
|
|
26
|
+
byRole[role] = (byRole[role] ?? 0) + 1;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return Object.entries(byRole)
|
|
30
|
+
.map(([role, count]) => `${count} ${role}`)
|
|
31
|
+
.join(", ");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates logging hooks for generation lifecycle events.
|
|
35
|
+
*
|
|
36
|
+
* Provides Pre/Post logging for generation with timing information,
|
|
37
|
+
* usage statistics, and error logging.
|
|
38
|
+
*
|
|
39
|
+
* @param options - Configuration options
|
|
40
|
+
* @returns Array of hooks for generation events
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const logHooks = createLoggingHooks({
|
|
45
|
+
* prefix: "[MyAgent]",
|
|
46
|
+
* logTiming: true,
|
|
47
|
+
* maxTextLength: 100,
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* const agent = createAgent({
|
|
51
|
+
* model,
|
|
52
|
+
* hooks: {
|
|
53
|
+
* PreGenerate: [{ hooks: [logHooks[0]] }],
|
|
54
|
+
* PostGenerate: [{ hooks: [logHooks[1]] }],
|
|
55
|
+
* PostGenerateFailure: [{ hooks: [logHooks[2]] }],
|
|
56
|
+
* },
|
|
57
|
+
* });
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* // Custom logger (e.g., structured logging)
|
|
63
|
+
* const logHooks = createLoggingHooks({
|
|
64
|
+
* log: (msg) => logger.info(msg),
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @category Hooks
|
|
69
|
+
*/
|
|
70
|
+
export function createLoggingHooks(options = {}) {
|
|
71
|
+
const { log = console.log, logGeneration = true, logTiming = true, maxTextLength = 200, prefix = "[Agent]", logFullMessages = false, } = options;
|
|
72
|
+
const startTimes = new Map();
|
|
73
|
+
// PreGenerate: Log request
|
|
74
|
+
const preGenerate = async (input) => {
|
|
75
|
+
if (input.hook_event_name !== "PreGenerate")
|
|
76
|
+
return {};
|
|
77
|
+
if (!logGeneration)
|
|
78
|
+
return {};
|
|
79
|
+
const preGenInput = input;
|
|
80
|
+
const { messages, temperature, maxTokens } = preGenInput.options;
|
|
81
|
+
const messageInfo = logFullMessages ? JSON.stringify(messages) : formatMessageCount(messages);
|
|
82
|
+
let logMsg = `${prefix} PreGenerate:`;
|
|
83
|
+
logMsg += `\n Messages: ${messageInfo}`;
|
|
84
|
+
if (temperature !== undefined)
|
|
85
|
+
logMsg += `\n Temperature: ${temperature}`;
|
|
86
|
+
if (maxTokens !== undefined)
|
|
87
|
+
logMsg += `\n MaxTokens: ${maxTokens}`;
|
|
88
|
+
log(logMsg);
|
|
89
|
+
// Track start time for this session
|
|
90
|
+
if (logTiming) {
|
|
91
|
+
startTimes.set(preGenInput.session_id, Date.now());
|
|
92
|
+
}
|
|
93
|
+
return {};
|
|
94
|
+
};
|
|
95
|
+
// PostGenerate: Log response
|
|
96
|
+
const postGenerate = async (input) => {
|
|
97
|
+
if (input.hook_event_name !== "PostGenerate")
|
|
98
|
+
return {};
|
|
99
|
+
if (!logGeneration)
|
|
100
|
+
return {};
|
|
101
|
+
const postGenInput = input;
|
|
102
|
+
const { result } = postGenInput;
|
|
103
|
+
let logMsg = `${prefix} PostGenerate:`;
|
|
104
|
+
logMsg += `\n Text: ${truncate(result.text || "", maxTextLength)}`;
|
|
105
|
+
logMsg += `\n Finish: ${result.finishReason}`;
|
|
106
|
+
if (result.usage) {
|
|
107
|
+
logMsg += `\n Tokens: ${result.usage.totalTokens} (${result.usage.inputTokens} in, ${result.usage.outputTokens} out)`;
|
|
108
|
+
}
|
|
109
|
+
// Add timing if available
|
|
110
|
+
if (logTiming) {
|
|
111
|
+
const startTime = startTimes.get(postGenInput.session_id);
|
|
112
|
+
if (startTime) {
|
|
113
|
+
const duration = Date.now() - startTime;
|
|
114
|
+
logMsg += `\n Duration: ${duration}ms`;
|
|
115
|
+
startTimes.delete(postGenInput.session_id);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
log(logMsg);
|
|
119
|
+
return {};
|
|
120
|
+
};
|
|
121
|
+
// PostGenerateFailure: Log error
|
|
122
|
+
const postGenerateFailure = async (input) => {
|
|
123
|
+
if (input.hook_event_name !== "PostGenerateFailure")
|
|
124
|
+
return {};
|
|
125
|
+
const failureInput = input;
|
|
126
|
+
let logMsg = `${prefix} PostGenerateFailure:`;
|
|
127
|
+
logMsg += `\n Error: ${failureInput.error.message}`;
|
|
128
|
+
// Add timing if available
|
|
129
|
+
if (logTiming) {
|
|
130
|
+
const startTime = startTimes.get(failureInput.session_id);
|
|
131
|
+
if (startTime) {
|
|
132
|
+
const duration = Date.now() - startTime;
|
|
133
|
+
logMsg += `\n Duration: ${duration}ms (failed)`;
|
|
134
|
+
startTimes.delete(failureInput.session_id);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
log(logMsg);
|
|
138
|
+
return {};
|
|
139
|
+
};
|
|
140
|
+
return [preGenerate, postGenerate, postGenerateFailure];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Creates logging hooks for tool execution events.
|
|
144
|
+
*
|
|
145
|
+
* Provides Pre/Post logging for tool calls with arguments, results,
|
|
146
|
+
* and error information.
|
|
147
|
+
*
|
|
148
|
+
* @param options - Configuration options
|
|
149
|
+
* @returns Array of hooks for tool events
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* const toolLogHooks = createToolLoggingHooks({
|
|
154
|
+
* prefix: "[Tools]",
|
|
155
|
+
* maxTextLength: 150,
|
|
156
|
+
* });
|
|
157
|
+
*
|
|
158
|
+
* const agent = createAgent({
|
|
159
|
+
* model,
|
|
160
|
+
* hooks: {
|
|
161
|
+
* PreToolUse: [{ hooks: [toolLogHooks[0]] }],
|
|
162
|
+
* PostToolUse: [{ hooks: [toolLogHooks[1]] }],
|
|
163
|
+
* PostToolUseFailure: [{ hooks: [toolLogHooks[2]] }],
|
|
164
|
+
* },
|
|
165
|
+
* });
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @category Hooks
|
|
169
|
+
*/
|
|
170
|
+
export function createToolLoggingHooks(options = {}) {
|
|
171
|
+
const { log = console.log, logTools = true, logTiming = true, logErrors = true, maxTextLength = 200, prefix = "[Agent]", } = options;
|
|
172
|
+
const toolStartTimes = new Map();
|
|
173
|
+
// PreToolUse: Log tool call
|
|
174
|
+
const preToolUse = async (input, toolUseId) => {
|
|
175
|
+
if (input.hook_event_name !== "PreToolUse")
|
|
176
|
+
return {};
|
|
177
|
+
if (!logTools)
|
|
178
|
+
return {};
|
|
179
|
+
const preToolInput = input;
|
|
180
|
+
let logMsg = `${prefix} PreToolUse: ${preToolInput.tool_name}`;
|
|
181
|
+
logMsg += `\n Input: ${truncate(JSON.stringify(preToolInput.tool_input), maxTextLength)}`;
|
|
182
|
+
log(logMsg);
|
|
183
|
+
// Track start time
|
|
184
|
+
if (logTiming && toolUseId) {
|
|
185
|
+
toolStartTimes.set(toolUseId, Date.now());
|
|
186
|
+
}
|
|
187
|
+
return {};
|
|
188
|
+
};
|
|
189
|
+
// PostToolUse: Log tool result
|
|
190
|
+
const postToolUse = async (input, toolUseId) => {
|
|
191
|
+
if (input.hook_event_name !== "PostToolUse")
|
|
192
|
+
return {};
|
|
193
|
+
if (!logTools)
|
|
194
|
+
return {};
|
|
195
|
+
const postToolInput = input;
|
|
196
|
+
let logMsg = `${prefix} PostToolUse: ${postToolInput.tool_name}`;
|
|
197
|
+
logMsg += `\n Result: ${truncate(String(postToolInput.tool_response), maxTextLength)}`;
|
|
198
|
+
// Add timing if available
|
|
199
|
+
if (logTiming && toolUseId) {
|
|
200
|
+
const startTime = toolStartTimes.get(toolUseId);
|
|
201
|
+
if (startTime) {
|
|
202
|
+
const duration = Date.now() - startTime;
|
|
203
|
+
logMsg += `\n Duration: ${duration}ms`;
|
|
204
|
+
toolStartTimes.delete(toolUseId);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
log(logMsg);
|
|
208
|
+
return {};
|
|
209
|
+
};
|
|
210
|
+
// PostToolUseFailure: Log tool error
|
|
211
|
+
const postToolUseFailure = async (input, toolUseId) => {
|
|
212
|
+
if (input.hook_event_name !== "PostToolUseFailure")
|
|
213
|
+
return {};
|
|
214
|
+
if (!logErrors)
|
|
215
|
+
return {};
|
|
216
|
+
const failureInput = input;
|
|
217
|
+
let logMsg = `${prefix} PostToolUseFailure: ${failureInput.tool_name}`;
|
|
218
|
+
logMsg += `\n Error: ${failureInput.error}`;
|
|
219
|
+
// Add timing if available
|
|
220
|
+
if (logTiming && toolUseId) {
|
|
221
|
+
const startTime = toolStartTimes.get(toolUseId);
|
|
222
|
+
if (startTime) {
|
|
223
|
+
const duration = Date.now() - startTime;
|
|
224
|
+
logMsg += `\n Duration: ${duration}ms (failed)`;
|
|
225
|
+
toolStartTimes.delete(toolUseId);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
log(logMsg);
|
|
229
|
+
return {};
|
|
230
|
+
};
|
|
231
|
+
return [preToolUse, postToolUse, postToolUseFailure];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Creates logging hooks for context compaction events.
|
|
235
|
+
*
|
|
236
|
+
* Provides Pre/Post logging for compaction with token savings
|
|
237
|
+
* and message count information.
|
|
238
|
+
*
|
|
239
|
+
* @param options - Configuration options
|
|
240
|
+
* @returns Array of hooks for compaction events
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* const compactLogHooks = createCompactionLoggingHooks({
|
|
245
|
+
* prefix: "[Compaction]",
|
|
246
|
+
* });
|
|
247
|
+
*
|
|
248
|
+
* const agent = createAgent({
|
|
249
|
+
* model,
|
|
250
|
+
* hooks: {
|
|
251
|
+
* PreCompact: [compactLogHooks[0]],
|
|
252
|
+
* PostCompact: [compactLogHooks[1]],
|
|
253
|
+
* },
|
|
254
|
+
* });
|
|
255
|
+
* ```
|
|
256
|
+
*
|
|
257
|
+
* @category Hooks
|
|
258
|
+
*/
|
|
259
|
+
export function createCompactionLoggingHooks(options = {}) {
|
|
260
|
+
const { log = console.log, logCompaction = true, logTiming = true, prefix = "[Agent]" } = options;
|
|
261
|
+
const compactionStartTimes = new Map();
|
|
262
|
+
// PreCompact: Log compaction start
|
|
263
|
+
const preCompact = async (input) => {
|
|
264
|
+
if (input.hook_event_name !== "PreCompact")
|
|
265
|
+
return {};
|
|
266
|
+
if (!logCompaction)
|
|
267
|
+
return {};
|
|
268
|
+
const preCompactInput = input;
|
|
269
|
+
let logMsg = `${prefix} PreCompact:`;
|
|
270
|
+
logMsg += `\n Messages: ${preCompactInput.message_count}`;
|
|
271
|
+
logMsg += `\n Tokens: ${preCompactInput.tokens_before}`;
|
|
272
|
+
log(logMsg);
|
|
273
|
+
// Track start time
|
|
274
|
+
if (logTiming) {
|
|
275
|
+
compactionStartTimes.set(preCompactInput.session_id, Date.now());
|
|
276
|
+
}
|
|
277
|
+
return {};
|
|
278
|
+
};
|
|
279
|
+
// PostCompact: Log compaction result
|
|
280
|
+
const postCompact = async (input) => {
|
|
281
|
+
if (input.hook_event_name !== "PostCompact")
|
|
282
|
+
return {};
|
|
283
|
+
if (!logCompaction)
|
|
284
|
+
return {};
|
|
285
|
+
const postCompactInput = input;
|
|
286
|
+
const reductionPercent = postCompactInput.tokens_before > 0
|
|
287
|
+
? ((postCompactInput.tokens_saved / postCompactInput.tokens_before) * 100).toFixed(1)
|
|
288
|
+
: "0.0";
|
|
289
|
+
let logMsg = `${prefix} PostCompact:`;
|
|
290
|
+
logMsg += `\n Messages: ${postCompactInput.messages_before} → ${postCompactInput.messages_after}`;
|
|
291
|
+
logMsg += `\n Tokens: ${postCompactInput.tokens_before} → ${postCompactInput.tokens_after} (saved ${postCompactInput.tokens_saved}, ${reductionPercent}% reduction)`;
|
|
292
|
+
// Add timing if available
|
|
293
|
+
if (logTiming) {
|
|
294
|
+
const startTime = compactionStartTimes.get(postCompactInput.session_id);
|
|
295
|
+
if (startTime) {
|
|
296
|
+
const duration = Date.now() - startTime;
|
|
297
|
+
logMsg += `\n Duration: ${duration}ms`;
|
|
298
|
+
compactionStartTimes.delete(postCompactInput.session_id);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
log(logMsg);
|
|
302
|
+
return {};
|
|
303
|
+
};
|
|
304
|
+
return [preCompact, postCompact];
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Creates comprehensive logging hooks for all lifecycle events.
|
|
308
|
+
*
|
|
309
|
+
* Combines generation, tool, and compaction logging into a single set of hooks.
|
|
310
|
+
*
|
|
311
|
+
* @param options - Configuration options
|
|
312
|
+
* @returns Object with hooks for all events
|
|
313
|
+
*
|
|
314
|
+
* @example
|
|
315
|
+
* ```typescript
|
|
316
|
+
* const { generationHooks, toolHooks, compactionHooks } = createComprehensiveLoggingHooks({
|
|
317
|
+
* prefix: "[MyAgent]",
|
|
318
|
+
* logTiming: true,
|
|
319
|
+
* });
|
|
320
|
+
*
|
|
321
|
+
* const agent = createAgent({
|
|
322
|
+
* model,
|
|
323
|
+
* hooks: {
|
|
324
|
+
* PreGenerate: [generationHooks[0]],
|
|
325
|
+
* PostGenerate: [generationHooks[1]],
|
|
326
|
+
* PostGenerateFailure: [generationHooks[2]],
|
|
327
|
+
* PreToolUse: [toolHooks[0]],
|
|
328
|
+
* PostToolUse: [toolHooks[1]],
|
|
329
|
+
* PostToolUseFailure: [toolHooks[2]],
|
|
330
|
+
* PreCompact: [compactionHooks[0]],
|
|
331
|
+
* PostCompact: [compactionHooks[1]],
|
|
332
|
+
* },
|
|
333
|
+
* });
|
|
334
|
+
* ```
|
|
335
|
+
*
|
|
336
|
+
* @category Hooks
|
|
337
|
+
*/
|
|
338
|
+
export function createComprehensiveLoggingHooks(options = {}) {
|
|
339
|
+
return {
|
|
340
|
+
generationHooks: createLoggingHooks(options),
|
|
341
|
+
toolHooks: createToolLoggingHooks(options),
|
|
342
|
+
compactionHooks: createCompactionLoggingHooks(options),
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/hooks/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrails - Content moderation utilities for AI generation.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a simple, composable approach to content moderation:
|
|
5
|
+
* - Guardrails are just async functions that return pass/block results
|
|
6
|
+
* - Multiple guardrails can race against generation
|
|
7
|
+
* - First failure aborts everything via shared AbortSignal
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
import type { UIMessage } from "ai";
|
|
12
|
+
/**
|
|
13
|
+
* Result from a guardrail check.
|
|
14
|
+
*/
|
|
15
|
+
export interface GuardrailCheckResult {
|
|
16
|
+
/** Whether the content should be blocked */
|
|
17
|
+
blocked: boolean;
|
|
18
|
+
/** Reason for blocking (if blocked) */
|
|
19
|
+
reason?: string;
|
|
20
|
+
/** IDs of messages that caused the block */
|
|
21
|
+
blockedMessageIds?: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A guardrail is a function that checks content and returns a result.
|
|
25
|
+
*
|
|
26
|
+
* Guardrails can be sync or async. They receive the text to check and
|
|
27
|
+
* an optional AbortSignal for cancellation.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // Simple regex guardrail
|
|
32
|
+
* const noSecrets: Guardrail = async (text) => ({
|
|
33
|
+
* blocked: /SECRET_API_KEY/i.test(text),
|
|
34
|
+
* reason: "Contains sensitive pattern",
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // LLM-based guardrail
|
|
38
|
+
* const llmModeration: Guardrail = async (text, signal) => {
|
|
39
|
+
* const result = await moderateWithLLM(text, { signal });
|
|
40
|
+
* return {
|
|
41
|
+
* blocked: result.flagged,
|
|
42
|
+
* reason: result.reason,
|
|
43
|
+
* };
|
|
44
|
+
* };
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export type Guardrail = (text: string, signal?: AbortSignal) => Promise<GuardrailCheckResult> | GuardrailCheckResult;
|
|
48
|
+
/**
|
|
49
|
+
* Options for raceGuardrails.
|
|
50
|
+
*/
|
|
51
|
+
export interface RaceGuardrailsOptions {
|
|
52
|
+
/** Message to show when content is blocked */
|
|
53
|
+
blockedMessage?: string;
|
|
54
|
+
/** IDs of messages to remove from client history if blocked */
|
|
55
|
+
blockedMessageIds?: string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Race multiple guardrails - first failure blocks, all run in parallel.
|
|
59
|
+
*
|
|
60
|
+
* Returns a Promise that resolves when all guardrails pass, or rejects
|
|
61
|
+
* with GeneratePermissionDeniedError if any guardrail blocks.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const controller = new AbortController();
|
|
66
|
+
*
|
|
67
|
+
* // Start guardrails and generation in parallel
|
|
68
|
+
* const guardrailsPromise = raceGuardrails(
|
|
69
|
+
* text,
|
|
70
|
+
* [regexGuardrail, llmGuardrail],
|
|
71
|
+
* controller.signal,
|
|
72
|
+
* {
|
|
73
|
+
* blockedMessage: "Content blocked",
|
|
74
|
+
* onBlock: () => controller.abort(),
|
|
75
|
+
* }
|
|
76
|
+
* );
|
|
77
|
+
*
|
|
78
|
+
* const generation = agent.streamRaw({
|
|
79
|
+
* messages,
|
|
80
|
+
* signal: controller.signal,
|
|
81
|
+
* });
|
|
82
|
+
*
|
|
83
|
+
* // Wait for guardrails to pass (or throw)
|
|
84
|
+
* await guardrailsPromise;
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare function raceGuardrails(text: string, guardrails: Guardrail[], signal?: AbortSignal, options?: RaceGuardrailsOptions): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Run guardrails in parallel with generation, aborting on first failure.
|
|
90
|
+
*
|
|
91
|
+
* This is a convenience wrapper that sets up the abort controller and
|
|
92
|
+
* coordinates guardrails with the generation function.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```typescript
|
|
96
|
+
* const result = await runWithGuardrails(
|
|
97
|
+
* extractText(messages),
|
|
98
|
+
* [regexGuardrail, llmGuardrail],
|
|
99
|
+
* (signal) => agent.generate({ messages, signal })
|
|
100
|
+
* );
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export declare function runWithGuardrails<T>(text: string, guardrails: Guardrail[], generateFn: (signal: AbortSignal) => Promise<T>, options?: RaceGuardrailsOptions): Promise<T>;
|
|
104
|
+
/**
|
|
105
|
+
* Create a regex-based guardrail.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const noSecrets = createRegexGuardrail([
|
|
110
|
+
* /SECRET_API_KEY/i,
|
|
111
|
+
* /password\s*=\s*["'][^"']+["']/i,
|
|
112
|
+
* ], "Contains sensitive data");
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function createRegexGuardrail(patterns: RegExp[], reason?: string): Guardrail;
|
|
116
|
+
/**
|
|
117
|
+
* Create a guardrail with a timeout.
|
|
118
|
+
*
|
|
119
|
+
* If the guardrail doesn't complete within the timeout, it returns
|
|
120
|
+
* a non-blocking result (fail-open behavior).
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const timedLLMGuardrail = withTimeout(llmGuardrail, 5000);
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function withTimeout(guardrail: Guardrail, timeoutMs: number, failOpen?: boolean): Guardrail;
|
|
128
|
+
/**
|
|
129
|
+
* Extract text content from UI messages.
|
|
130
|
+
*/
|
|
131
|
+
export declare function extractTextFromMessages(messages: UIMessage[]): string;
|
|
132
|
+
/**
|
|
133
|
+
* Find the last user message ID from a list of messages.
|
|
134
|
+
*/
|
|
135
|
+
export declare function findLastUserMessageId(messages: UIMessage[]): string | undefined;
|
|
136
|
+
/**
|
|
137
|
+
* Configuration for buffered output guardrails.
|
|
138
|
+
*/
|
|
139
|
+
export interface OutputGuardrailConfig {
|
|
140
|
+
/**
|
|
141
|
+
* Guardrail to run on accumulated output.
|
|
142
|
+
* Can be a single guardrail or multiple that will be raced.
|
|
143
|
+
*/
|
|
144
|
+
guardrails: Guardrail | Guardrail[];
|
|
145
|
+
/**
|
|
146
|
+
* Minimum buffer size (in characters) before running checks.
|
|
147
|
+
* Helps avoid excessive API calls for small outputs.
|
|
148
|
+
* @default 100
|
|
149
|
+
*/
|
|
150
|
+
minBufferSize?: number;
|
|
151
|
+
/**
|
|
152
|
+
* Check interval in milliseconds.
|
|
153
|
+
* If set, runs periodic checks on accumulated buffer.
|
|
154
|
+
* @default undefined (only check at end)
|
|
155
|
+
*/
|
|
156
|
+
checkIntervalMs?: number;
|
|
157
|
+
/**
|
|
158
|
+
* Timeout for guardrail checks in milliseconds.
|
|
159
|
+
* @default 30000 (30 seconds)
|
|
160
|
+
*/
|
|
161
|
+
timeout?: number;
|
|
162
|
+
/**
|
|
163
|
+
* Message to show when content is blocked.
|
|
164
|
+
* @default "Output blocked by guardrail"
|
|
165
|
+
*/
|
|
166
|
+
blockedMessage?: string;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* State of the buffered output guardrail.
|
|
170
|
+
*/
|
|
171
|
+
export type BufferedGuardrailState = "buffering" | "passed" | "blocked" | "error";
|
|
172
|
+
/**
|
|
173
|
+
* Controller for buffered output guardrails.
|
|
174
|
+
*
|
|
175
|
+
* Buffers output content and runs guardrail checks before releasing
|
|
176
|
+
* content to the client.
|
|
177
|
+
*/
|
|
178
|
+
export declare class BufferedOutputGuardrail {
|
|
179
|
+
private buffer;
|
|
180
|
+
private chunks;
|
|
181
|
+
private state;
|
|
182
|
+
private blockReason;
|
|
183
|
+
private abortController;
|
|
184
|
+
private checkPromise;
|
|
185
|
+
private lastCheckTime;
|
|
186
|
+
private guardrails;
|
|
187
|
+
private config;
|
|
188
|
+
constructor(config: OutputGuardrailConfig);
|
|
189
|
+
/** Get current state of the guardrail. */
|
|
190
|
+
get currentState(): BufferedGuardrailState;
|
|
191
|
+
/** Get the block reason (if blocked). */
|
|
192
|
+
get reason(): string | null;
|
|
193
|
+
/** Get the abort signal. */
|
|
194
|
+
get signal(): AbortSignal;
|
|
195
|
+
/** Check if guardrail is still buffering. */
|
|
196
|
+
isBuffering(): boolean;
|
|
197
|
+
/** Check if guardrail has passed. */
|
|
198
|
+
hasPassed(): boolean;
|
|
199
|
+
/** Check if guardrail has blocked content. */
|
|
200
|
+
hasBlocked(): boolean;
|
|
201
|
+
/**
|
|
202
|
+
* Add content to the buffer.
|
|
203
|
+
* Returns true if content should be forwarded, false if blocked.
|
|
204
|
+
*/
|
|
205
|
+
addContent(text: string): boolean;
|
|
206
|
+
/**
|
|
207
|
+
* Add a chunk to the buffer for later flushing.
|
|
208
|
+
*/
|
|
209
|
+
addChunk(chunk: unknown): boolean;
|
|
210
|
+
private startCheck;
|
|
211
|
+
/**
|
|
212
|
+
* Finalize the guardrail check.
|
|
213
|
+
* Call this when output is complete to ensure final check passes.
|
|
214
|
+
*/
|
|
215
|
+
finalize(): Promise<void>;
|
|
216
|
+
/** Get the buffered content. */
|
|
217
|
+
getBuffer(): string;
|
|
218
|
+
/** Get the buffered chunks. */
|
|
219
|
+
getChunks(): unknown[];
|
|
220
|
+
/** Clear the buffer and chunks. */
|
|
221
|
+
clear(): void;
|
|
222
|
+
/** Abort the guardrail. */
|
|
223
|
+
abort(): void;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Creates a buffered output guardrail.
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* const guardrail = createBufferedOutputGuardrail({
|
|
231
|
+
* guardrails: [noSecretsGuardrail, noPIIGuardrail],
|
|
232
|
+
* minBufferSize: 100,
|
|
233
|
+
* });
|
|
234
|
+
*
|
|
235
|
+
* for await (const chunk of stream) {
|
|
236
|
+
* if (chunk.type === 'text-delta') {
|
|
237
|
+
* if (!guardrail.addContent(chunk.delta)) break;
|
|
238
|
+
* }
|
|
239
|
+
* guardrail.addChunk(chunk);
|
|
240
|
+
* }
|
|
241
|
+
*
|
|
242
|
+
* await guardrail.finalize();
|
|
243
|
+
* for (const chunk of guardrail.getChunks()) {
|
|
244
|
+
* writer.write(chunk);
|
|
245
|
+
* }
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export declare function createBufferedOutputGuardrail(config: OutputGuardrailConfig): BufferedOutputGuardrail;
|
|
249
|
+
/**
|
|
250
|
+
* Wraps a ReadableStream with buffered output guardrails.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* const guardedStream = wrapStreamWithOutputGuardrail(sourceStream, {
|
|
255
|
+
* guardrails: noSecretsGuardrail,
|
|
256
|
+
* });
|
|
257
|
+
*
|
|
258
|
+
* for await (const chunk of guardedStream) {
|
|
259
|
+
* writer.write(chunk);
|
|
260
|
+
* }
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
export declare function wrapStreamWithOutputGuardrail<T extends {
|
|
264
|
+
type?: string;
|
|
265
|
+
delta?: string;
|
|
266
|
+
text?: string;
|
|
267
|
+
}>(stream: ReadableStream<T>, config: OutputGuardrailConfig): ReadableStream<T>;
|
|
268
|
+
//# sourceMappingURL=parallel-guardrails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel-guardrails.d.ts","sourceRoot":"","sources":["../../src/hooks/parallel-guardrails.ts"],"names":[],"mappings":"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"}
|