@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,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock agent implementation for testing.
|
|
3
|
+
*
|
|
4
|
+
* Provides a fully configurable mock agent that can be used in tests
|
|
5
|
+
* without making real API calls.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { LanguageModel, LanguageModelUsage, ToolSet } from "ai";
|
|
10
|
+
import type { BackendProtocol } from "../backend.js";
|
|
11
|
+
import type { AgentState } from "../backends/state.js";
|
|
12
|
+
import type { Agent, FinishReason, GenerateOptions, GenerateStep, SkillDefinition, StreamPart } from "../types.js";
|
|
13
|
+
/**
|
|
14
|
+
* Configuration for a mock response.
|
|
15
|
+
*
|
|
16
|
+
* @category Testing
|
|
17
|
+
*/
|
|
18
|
+
export interface MockResponse {
|
|
19
|
+
/** The text response to return */
|
|
20
|
+
text: string;
|
|
21
|
+
/** Finish reason */
|
|
22
|
+
finishReason?: FinishReason;
|
|
23
|
+
/** Token usage information */
|
|
24
|
+
usage?: LanguageModelUsage;
|
|
25
|
+
/** Structured output if using output schema */
|
|
26
|
+
output?: unknown;
|
|
27
|
+
/** Steps to include in the response */
|
|
28
|
+
steps?: GenerateStep[];
|
|
29
|
+
/** Delay in milliseconds before responding */
|
|
30
|
+
delay?: number;
|
|
31
|
+
/** Error to throw instead of returning a response */
|
|
32
|
+
error?: Error;
|
|
33
|
+
/** Stream chunks for streaming responses */
|
|
34
|
+
streamChunks?: StreamPart[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for creating a mock agent.
|
|
38
|
+
*
|
|
39
|
+
* @category Testing
|
|
40
|
+
*/
|
|
41
|
+
export interface MockAgentOptions {
|
|
42
|
+
/** Static response to return for all requests */
|
|
43
|
+
response?: MockResponse;
|
|
44
|
+
/** Function to dynamically generate responses based on input */
|
|
45
|
+
responseHandler?: (options: GenerateOptions) => MockResponse | Promise<MockResponse>;
|
|
46
|
+
/** Queue of responses to return in order */
|
|
47
|
+
responseQueue?: MockResponse[];
|
|
48
|
+
/** Initial state for the agent */
|
|
49
|
+
initialState?: Partial<AgentState>;
|
|
50
|
+
/** Backend to use (defaults to StateBackend) */
|
|
51
|
+
backend?: BackendProtocol;
|
|
52
|
+
/** Tools available to the mock agent */
|
|
53
|
+
tools?: ToolSet;
|
|
54
|
+
/** Skills available to the mock agent */
|
|
55
|
+
skills?: SkillDefinition[];
|
|
56
|
+
/** System prompt for the mock agent */
|
|
57
|
+
systemPrompt?: string;
|
|
58
|
+
/** Max steps configuration */
|
|
59
|
+
maxSteps?: number;
|
|
60
|
+
/** ID for the mock agent */
|
|
61
|
+
id?: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* A mock agent for testing purposes.
|
|
65
|
+
*
|
|
66
|
+
* Extends the standard Agent interface with additional methods
|
|
67
|
+
* for configuring mock behavior and inspecting calls.
|
|
68
|
+
*
|
|
69
|
+
* @category Testing
|
|
70
|
+
*/
|
|
71
|
+
export interface MockAgent extends Agent {
|
|
72
|
+
/**
|
|
73
|
+
* All calls made to generate().
|
|
74
|
+
*/
|
|
75
|
+
readonly generateCalls: GenerateOptions[];
|
|
76
|
+
/**
|
|
77
|
+
* All calls made to stream().
|
|
78
|
+
*/
|
|
79
|
+
readonly streamCalls: GenerateOptions[];
|
|
80
|
+
/**
|
|
81
|
+
* Set a static response for all subsequent requests.
|
|
82
|
+
*/
|
|
83
|
+
setResponse(response: MockResponse): void;
|
|
84
|
+
/**
|
|
85
|
+
* Set a response handler for dynamic responses.
|
|
86
|
+
*/
|
|
87
|
+
setResponseHandler(handler: (options: GenerateOptions) => MockResponse | Promise<MockResponse>): void;
|
|
88
|
+
/**
|
|
89
|
+
* Queue responses to be returned in order.
|
|
90
|
+
*/
|
|
91
|
+
queueResponses(...responses: MockResponse[]): void;
|
|
92
|
+
/**
|
|
93
|
+
* Clear all queued responses.
|
|
94
|
+
*/
|
|
95
|
+
clearQueue(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Reset all call history.
|
|
98
|
+
*/
|
|
99
|
+
resetHistory(): void;
|
|
100
|
+
/**
|
|
101
|
+
* Get the number of times generate was called.
|
|
102
|
+
*/
|
|
103
|
+
getGenerateCallCount(): number;
|
|
104
|
+
/**
|
|
105
|
+
* Get the number of times stream was called.
|
|
106
|
+
*/
|
|
107
|
+
getStreamCallCount(): number;
|
|
108
|
+
/**
|
|
109
|
+
* Assert that generate was called with specific options.
|
|
110
|
+
*/
|
|
111
|
+
assertGenerateCalledWith(expected: Partial<GenerateOptions>): void;
|
|
112
|
+
/**
|
|
113
|
+
* Assert that generate was called a specific number of times.
|
|
114
|
+
*/
|
|
115
|
+
assertGenerateCallCount(count: number): void;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Creates a mock agent for testing.
|
|
119
|
+
*
|
|
120
|
+
* Mock agents provide predictable responses and call tracking
|
|
121
|
+
* without making real API calls. They're useful for unit testing
|
|
122
|
+
* agent-dependent code.
|
|
123
|
+
*
|
|
124
|
+
* @param options - Configuration for the mock agent
|
|
125
|
+
* @returns A mock agent instance
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* import { createMockAgent } from "@lleverage-ai/agent-sdk/testing";
|
|
130
|
+
*
|
|
131
|
+
* const agent = createMockAgent({
|
|
132
|
+
* response: { text: "Hello from mock!" },
|
|
133
|
+
* });
|
|
134
|
+
*
|
|
135
|
+
* const result = await agent.generate({ prompt: "Hi" });
|
|
136
|
+
* expect(result.text).toBe("Hello from mock!");
|
|
137
|
+
* expect(agent.generateCalls).toHaveLength(1);
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* // Dynamic responses based on input
|
|
143
|
+
* const agent = createMockAgent({
|
|
144
|
+
* responseHandler: (opts) => ({
|
|
145
|
+
* text: `You said: ${opts.prompt}`,
|
|
146
|
+
* }),
|
|
147
|
+
* });
|
|
148
|
+
*
|
|
149
|
+
* const result = await agent.generate({ prompt: "hello" });
|
|
150
|
+
* expect(result.text).toBe("You said: hello");
|
|
151
|
+
* ```
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```typescript
|
|
155
|
+
* // Queue multiple responses
|
|
156
|
+
* const agent = createMockAgent();
|
|
157
|
+
* agent.queueResponses(
|
|
158
|
+
* { text: "First response" },
|
|
159
|
+
* { text: "Second response" },
|
|
160
|
+
* );
|
|
161
|
+
*
|
|
162
|
+
* const r1 = await agent.generate({ prompt: "1" });
|
|
163
|
+
* const r2 = await agent.generate({ prompt: "2" });
|
|
164
|
+
* expect(r1.text).toBe("First response");
|
|
165
|
+
* expect(r2.text).toBe("Second response");
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @category Testing
|
|
169
|
+
*/
|
|
170
|
+
export declare function createMockAgent(options?: MockAgentOptions): MockAgent;
|
|
171
|
+
/**
|
|
172
|
+
* Options for creating a mock language model.
|
|
173
|
+
*
|
|
174
|
+
* @category Testing
|
|
175
|
+
*/
|
|
176
|
+
export interface MockModelOptions {
|
|
177
|
+
/** Default text response */
|
|
178
|
+
text?: string;
|
|
179
|
+
/** Default tool calls to return */
|
|
180
|
+
toolCalls?: Array<{
|
|
181
|
+
toolName: string;
|
|
182
|
+
input: unknown;
|
|
183
|
+
}>;
|
|
184
|
+
/** Default finish reason */
|
|
185
|
+
finishReason?: FinishReason;
|
|
186
|
+
/** Default usage */
|
|
187
|
+
usage?: LanguageModelUsage;
|
|
188
|
+
/** Provider name */
|
|
189
|
+
provider?: string;
|
|
190
|
+
/** Model ID */
|
|
191
|
+
modelId?: string;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Creates a mock language model for testing.
|
|
195
|
+
*
|
|
196
|
+
* This is a lower-level utility for creating mock models that can be
|
|
197
|
+
* passed to createAgent() when you need more control over the model behavior.
|
|
198
|
+
*
|
|
199
|
+
* @param options - Configuration for the mock model
|
|
200
|
+
* @returns A mock LanguageModel instance
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* import { createMockModel } from "@lleverage-ai/agent-sdk/testing";
|
|
205
|
+
* import { createAgent } from "@lleverage-ai/agent-sdk";
|
|
206
|
+
*
|
|
207
|
+
* const model = createMockModel({ text: "Custom response" });
|
|
208
|
+
* const agent = createAgent({ model });
|
|
209
|
+
* ```
|
|
210
|
+
*
|
|
211
|
+
* @category Testing
|
|
212
|
+
*/
|
|
213
|
+
export declare function createMockModel(options?: MockModelOptions): LanguageModel;
|
|
214
|
+
//# sourceMappingURL=mock-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-agent.d.ts","sourceRoot":"","sources":["../../src/testing/mock-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock agent implementation for testing.
|
|
3
|
+
*
|
|
4
|
+
* Provides a fully configurable mock agent that can be used in tests
|
|
5
|
+
* without making real API calls.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { StateBackend } from "../backends/state.js";
|
|
10
|
+
/**
|
|
11
|
+
* Default mock response configuration.
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_MOCK_RESPONSE = {
|
|
14
|
+
text: "Mock response",
|
|
15
|
+
finishReason: "stop",
|
|
16
|
+
usage: {
|
|
17
|
+
inputTokens: 10,
|
|
18
|
+
outputTokens: 20,
|
|
19
|
+
totalTokens: 30,
|
|
20
|
+
inputTokenDetails: {
|
|
21
|
+
noCacheTokens: 10,
|
|
22
|
+
cacheReadTokens: 0,
|
|
23
|
+
cacheWriteTokens: 0,
|
|
24
|
+
},
|
|
25
|
+
outputTokenDetails: {
|
|
26
|
+
textTokens: 20,
|
|
27
|
+
reasoningTokens: 0,
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
steps: [],
|
|
31
|
+
};
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Mock Agent Implementation
|
|
34
|
+
// =============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Module-level counter for generating unique mock agent IDs.
|
|
37
|
+
* This ensures each call to createMockAgent() produces a unique ID.
|
|
38
|
+
*/
|
|
39
|
+
let mockAgentIdCounter = 0;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a mock agent for testing.
|
|
42
|
+
*
|
|
43
|
+
* Mock agents provide predictable responses and call tracking
|
|
44
|
+
* without making real API calls. They're useful for unit testing
|
|
45
|
+
* agent-dependent code.
|
|
46
|
+
*
|
|
47
|
+
* @param options - Configuration for the mock agent
|
|
48
|
+
* @returns A mock agent instance
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { createMockAgent } from "@lleverage-ai/agent-sdk/testing";
|
|
53
|
+
*
|
|
54
|
+
* const agent = createMockAgent({
|
|
55
|
+
* response: { text: "Hello from mock!" },
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* const result = await agent.generate({ prompt: "Hi" });
|
|
59
|
+
* expect(result.text).toBe("Hello from mock!");
|
|
60
|
+
* expect(agent.generateCalls).toHaveLength(1);
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* // Dynamic responses based on input
|
|
66
|
+
* const agent = createMockAgent({
|
|
67
|
+
* responseHandler: (opts) => ({
|
|
68
|
+
* text: `You said: ${opts.prompt}`,
|
|
69
|
+
* }),
|
|
70
|
+
* });
|
|
71
|
+
*
|
|
72
|
+
* const result = await agent.generate({ prompt: "hello" });
|
|
73
|
+
* expect(result.text).toBe("You said: hello");
|
|
74
|
+
* ```
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Queue multiple responses
|
|
79
|
+
* const agent = createMockAgent();
|
|
80
|
+
* agent.queueResponses(
|
|
81
|
+
* { text: "First response" },
|
|
82
|
+
* { text: "Second response" },
|
|
83
|
+
* );
|
|
84
|
+
*
|
|
85
|
+
* const r1 = await agent.generate({ prompt: "1" });
|
|
86
|
+
* const r2 = await agent.generate({ prompt: "2" });
|
|
87
|
+
* expect(r1.text).toBe("First response");
|
|
88
|
+
* expect(r2.text).toBe("Second response");
|
|
89
|
+
* ```
|
|
90
|
+
*
|
|
91
|
+
* @category Testing
|
|
92
|
+
*/
|
|
93
|
+
export function createMockAgent(options = {}) {
|
|
94
|
+
const id = options.id ?? `mock-agent-${++mockAgentIdCounter}`;
|
|
95
|
+
// Initialize state
|
|
96
|
+
const state = {
|
|
97
|
+
todos: options.initialState?.todos ?? [],
|
|
98
|
+
files: options.initialState?.files ?? {},
|
|
99
|
+
};
|
|
100
|
+
// Initialize backend
|
|
101
|
+
const backend = options.backend ?? new StateBackend(state);
|
|
102
|
+
// Response configuration
|
|
103
|
+
let currentResponse = options.response ?? DEFAULT_MOCK_RESPONSE;
|
|
104
|
+
let responseHandler = options.responseHandler;
|
|
105
|
+
const responseQueue = [...(options.responseQueue ?? [])];
|
|
106
|
+
// Call tracking
|
|
107
|
+
const generateCalls = [];
|
|
108
|
+
const streamCalls = [];
|
|
109
|
+
// Mock model (not actually used, but needed for interface)
|
|
110
|
+
const mockModel = {
|
|
111
|
+
specificationVersion: "v3",
|
|
112
|
+
provider: "mock",
|
|
113
|
+
modelId: "mock-model",
|
|
114
|
+
defaultObjectGenerationMode: "json",
|
|
115
|
+
doGenerate: async () => ({
|
|
116
|
+
text: currentResponse.text,
|
|
117
|
+
content: [{ type: "text", text: currentResponse.text }],
|
|
118
|
+
toolCalls: [],
|
|
119
|
+
finishReason: currentResponse.finishReason ?? "stop",
|
|
120
|
+
usage: currentResponse.usage ?? DEFAULT_MOCK_RESPONSE.usage,
|
|
121
|
+
request: { body: {} },
|
|
122
|
+
response: {
|
|
123
|
+
id: "mock-response-id",
|
|
124
|
+
timestamp: new Date(),
|
|
125
|
+
modelId: "mock-model",
|
|
126
|
+
headers: {},
|
|
127
|
+
},
|
|
128
|
+
warnings: [],
|
|
129
|
+
sources: [],
|
|
130
|
+
providerMetadata: undefined,
|
|
131
|
+
}),
|
|
132
|
+
doStream: async () => ({
|
|
133
|
+
stream: new ReadableStream({
|
|
134
|
+
start(controller) {
|
|
135
|
+
controller.enqueue({
|
|
136
|
+
type: "text-delta",
|
|
137
|
+
text: currentResponse.text,
|
|
138
|
+
});
|
|
139
|
+
controller.enqueue({
|
|
140
|
+
type: "finish",
|
|
141
|
+
finishReason: currentResponse.finishReason ?? "stop",
|
|
142
|
+
usage: currentResponse.usage ?? DEFAULT_MOCK_RESPONSE.usage,
|
|
143
|
+
});
|
|
144
|
+
controller.close();
|
|
145
|
+
},
|
|
146
|
+
}),
|
|
147
|
+
rawCall: { rawPrompt: null, rawSettings: {} },
|
|
148
|
+
}),
|
|
149
|
+
};
|
|
150
|
+
const agentOptions = {
|
|
151
|
+
model: mockModel,
|
|
152
|
+
systemPrompt: options.systemPrompt,
|
|
153
|
+
tools: options.tools,
|
|
154
|
+
skills: options.skills,
|
|
155
|
+
maxSteps: options.maxSteps,
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Get the next response to use.
|
|
159
|
+
*/
|
|
160
|
+
async function getNextResponse(genOptions) {
|
|
161
|
+
// Check queue first
|
|
162
|
+
if (responseQueue.length > 0) {
|
|
163
|
+
return responseQueue.shift();
|
|
164
|
+
}
|
|
165
|
+
// Use handler if provided
|
|
166
|
+
if (responseHandler) {
|
|
167
|
+
return await responseHandler(genOptions);
|
|
168
|
+
}
|
|
169
|
+
// Fall back to static response
|
|
170
|
+
return currentResponse;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Convert MockResponse to GenerateResult.
|
|
174
|
+
*/
|
|
175
|
+
function toGenerateResult(response) {
|
|
176
|
+
return {
|
|
177
|
+
status: "complete",
|
|
178
|
+
text: response.text,
|
|
179
|
+
finishReason: response.finishReason ?? "stop",
|
|
180
|
+
usage: response.usage ?? DEFAULT_MOCK_RESPONSE.usage,
|
|
181
|
+
output: response.output,
|
|
182
|
+
steps: response.steps ?? [],
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Convert MockResponse to stream chunks.
|
|
187
|
+
*/
|
|
188
|
+
function* toStreamChunks(response) {
|
|
189
|
+
// Use custom stream chunks if provided
|
|
190
|
+
if (response.streamChunks) {
|
|
191
|
+
for (const chunk of response.streamChunks) {
|
|
192
|
+
yield chunk;
|
|
193
|
+
}
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Default: yield text as a single chunk, then finish
|
|
197
|
+
yield { type: "text-delta", text: response.text };
|
|
198
|
+
yield {
|
|
199
|
+
type: "finish",
|
|
200
|
+
finishReason: response.finishReason ?? "stop",
|
|
201
|
+
usage: response.usage,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
const mockAgent = {
|
|
205
|
+
id,
|
|
206
|
+
options: agentOptions,
|
|
207
|
+
backend,
|
|
208
|
+
state,
|
|
209
|
+
// Call tracking
|
|
210
|
+
generateCalls,
|
|
211
|
+
streamCalls,
|
|
212
|
+
getSkills() {
|
|
213
|
+
return [...(options.skills ?? [])];
|
|
214
|
+
},
|
|
215
|
+
async generate(genOptions) {
|
|
216
|
+
generateCalls.push({ ...genOptions });
|
|
217
|
+
const response = await getNextResponse(genOptions);
|
|
218
|
+
// Handle delay
|
|
219
|
+
if (response.delay && response.delay > 0) {
|
|
220
|
+
await new Promise((resolve) => setTimeout(resolve, response.delay));
|
|
221
|
+
}
|
|
222
|
+
// Handle error
|
|
223
|
+
if (response.error) {
|
|
224
|
+
throw response.error;
|
|
225
|
+
}
|
|
226
|
+
return toGenerateResult(response);
|
|
227
|
+
},
|
|
228
|
+
async *stream(genOptions) {
|
|
229
|
+
streamCalls.push({ ...genOptions });
|
|
230
|
+
const response = await getNextResponse(genOptions);
|
|
231
|
+
// Handle delay
|
|
232
|
+
if (response.delay && response.delay > 0) {
|
|
233
|
+
await new Promise((resolve) => setTimeout(resolve, response.delay));
|
|
234
|
+
}
|
|
235
|
+
// Handle error
|
|
236
|
+
if (response.error) {
|
|
237
|
+
yield { type: "error", error: response.error };
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
for (const chunk of toStreamChunks(response)) {
|
|
241
|
+
yield chunk;
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
async streamResponse(genOptions) {
|
|
245
|
+
streamCalls.push({ ...genOptions });
|
|
246
|
+
const response = await getNextResponse(genOptions);
|
|
247
|
+
// Handle delay
|
|
248
|
+
if (response.delay && response.delay > 0) {
|
|
249
|
+
await new Promise((resolve) => setTimeout(resolve, response.delay));
|
|
250
|
+
}
|
|
251
|
+
// Handle error
|
|
252
|
+
if (response.error) {
|
|
253
|
+
return new Response(JSON.stringify({ error: response.error.message }), {
|
|
254
|
+
status: 500,
|
|
255
|
+
headers: { "Content-Type": "application/json" },
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
// Return a simple text response
|
|
259
|
+
return new Response(response.text, {
|
|
260
|
+
status: 200,
|
|
261
|
+
headers: { "Content-Type": "text/plain" },
|
|
262
|
+
});
|
|
263
|
+
},
|
|
264
|
+
async streamDataResponse(genOptions) {
|
|
265
|
+
// For mock agent, streamDataResponse behaves the same as streamResponse
|
|
266
|
+
// since we don't have real streaming tools to exercise
|
|
267
|
+
return mockAgent.streamResponse(genOptions);
|
|
268
|
+
},
|
|
269
|
+
async streamRaw(genOptions) {
|
|
270
|
+
streamCalls.push({ ...genOptions });
|
|
271
|
+
const response = await getNextResponse(genOptions);
|
|
272
|
+
// Return a mock streamText-like result
|
|
273
|
+
return {
|
|
274
|
+
fullStream: (async function* () {
|
|
275
|
+
if (response.error) {
|
|
276
|
+
yield { type: "error", error: response.error };
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
yield { type: "text-delta", text: response.text };
|
|
280
|
+
yield {
|
|
281
|
+
type: "finish",
|
|
282
|
+
finishReason: response.finishReason ?? "stop",
|
|
283
|
+
totalUsage: response.usage,
|
|
284
|
+
};
|
|
285
|
+
})(),
|
|
286
|
+
text: Promise.resolve(response.text),
|
|
287
|
+
usage: Promise.resolve(response.usage ?? DEFAULT_MOCK_RESPONSE.usage),
|
|
288
|
+
finishReason: Promise.resolve(response.finishReason ?? "stop"),
|
|
289
|
+
steps: Promise.resolve(response.steps ?? []),
|
|
290
|
+
output: Promise.resolve(response.output),
|
|
291
|
+
toolCalls: Promise.resolve([]),
|
|
292
|
+
toolResults: Promise.resolve([]),
|
|
293
|
+
response: Promise.resolve({
|
|
294
|
+
id: "mock-response-id",
|
|
295
|
+
timestamp: new Date(),
|
|
296
|
+
modelId: "mock-model",
|
|
297
|
+
messages: [],
|
|
298
|
+
}),
|
|
299
|
+
warnings: Promise.resolve([]),
|
|
300
|
+
toUIMessageStreamResponse: () => new Response(response.text),
|
|
301
|
+
toTextStreamResponse: () => new Response(response.text),
|
|
302
|
+
};
|
|
303
|
+
},
|
|
304
|
+
// Configuration methods
|
|
305
|
+
setResponse(response) {
|
|
306
|
+
currentResponse = response;
|
|
307
|
+
},
|
|
308
|
+
setResponseHandler(handler) {
|
|
309
|
+
responseHandler = handler;
|
|
310
|
+
},
|
|
311
|
+
queueResponses(...responses) {
|
|
312
|
+
responseQueue.push(...responses);
|
|
313
|
+
},
|
|
314
|
+
clearQueue() {
|
|
315
|
+
responseQueue.length = 0;
|
|
316
|
+
},
|
|
317
|
+
resetHistory() {
|
|
318
|
+
generateCalls.length = 0;
|
|
319
|
+
streamCalls.length = 0;
|
|
320
|
+
},
|
|
321
|
+
getGenerateCallCount() {
|
|
322
|
+
return generateCalls.length;
|
|
323
|
+
},
|
|
324
|
+
getStreamCallCount() {
|
|
325
|
+
return streamCalls.length;
|
|
326
|
+
},
|
|
327
|
+
assertGenerateCalledWith(expected) {
|
|
328
|
+
const found = generateCalls.some((call) => {
|
|
329
|
+
for (const [key, value] of Object.entries(expected)) {
|
|
330
|
+
if (call[key] !== value) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return true;
|
|
335
|
+
});
|
|
336
|
+
if (!found) {
|
|
337
|
+
const callsStr = generateCalls.map((c) => JSON.stringify(c)).join("\n");
|
|
338
|
+
throw new Error(`Expected generate to be called with ${JSON.stringify(expected)}, but calls were:\n${callsStr}`);
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
assertGenerateCallCount(count) {
|
|
342
|
+
if (generateCalls.length !== count) {
|
|
343
|
+
throw new Error(`Expected generate to be called ${count} times, but was called ${generateCalls.length} times`);
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
getActiveTools() {
|
|
347
|
+
return { ...(options.tools ?? {}) };
|
|
348
|
+
},
|
|
349
|
+
loadTools(_toolNames) {
|
|
350
|
+
// Mock agent doesn't support lazy loading
|
|
351
|
+
return { loaded: [], notFound: _toolNames };
|
|
352
|
+
},
|
|
353
|
+
setPermissionMode(_mode) {
|
|
354
|
+
// Mock agent permission mode setter (no-op in mock)
|
|
355
|
+
},
|
|
356
|
+
async getInterrupt(_threadId) {
|
|
357
|
+
// Mock agent always returns undefined (no pending interrupts)
|
|
358
|
+
return undefined;
|
|
359
|
+
},
|
|
360
|
+
async resume(threadId, _interruptId, _response, genOptions) {
|
|
361
|
+
// Mock implementation: just call generate with the threadId
|
|
362
|
+
return mockAgent.generate({
|
|
363
|
+
threadId,
|
|
364
|
+
...genOptions,
|
|
365
|
+
});
|
|
366
|
+
},
|
|
367
|
+
// Mock agent is always ready immediately
|
|
368
|
+
ready: Promise.resolve(),
|
|
369
|
+
};
|
|
370
|
+
return mockAgent;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Creates a mock language model for testing.
|
|
374
|
+
*
|
|
375
|
+
* This is a lower-level utility for creating mock models that can be
|
|
376
|
+
* passed to createAgent() when you need more control over the model behavior.
|
|
377
|
+
*
|
|
378
|
+
* @param options - Configuration for the mock model
|
|
379
|
+
* @returns A mock LanguageModel instance
|
|
380
|
+
*
|
|
381
|
+
* @example
|
|
382
|
+
* ```typescript
|
|
383
|
+
* import { createMockModel } from "@lleverage-ai/agent-sdk/testing";
|
|
384
|
+
* import { createAgent } from "@lleverage-ai/agent-sdk";
|
|
385
|
+
*
|
|
386
|
+
* const model = createMockModel({ text: "Custom response" });
|
|
387
|
+
* const agent = createAgent({ model });
|
|
388
|
+
* ```
|
|
389
|
+
*
|
|
390
|
+
* @category Testing
|
|
391
|
+
*/
|
|
392
|
+
export function createMockModel(options = {}) {
|
|
393
|
+
const text = options.text ?? "Mock response";
|
|
394
|
+
const finishReason = options.finishReason ?? "stop";
|
|
395
|
+
const usage = options.usage ?? {
|
|
396
|
+
inputTokens: 10,
|
|
397
|
+
outputTokens: 20,
|
|
398
|
+
totalTokens: 30,
|
|
399
|
+
inputTokenDetails: {
|
|
400
|
+
noCacheTokens: 10,
|
|
401
|
+
cacheReadTokens: 0,
|
|
402
|
+
cacheWriteTokens: 0,
|
|
403
|
+
},
|
|
404
|
+
outputTokenDetails: {
|
|
405
|
+
textTokens: 20,
|
|
406
|
+
reasoningTokens: 0,
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
return {
|
|
410
|
+
specificationVersion: "v3",
|
|
411
|
+
provider: options.provider ?? "mock",
|
|
412
|
+
modelId: options.modelId ?? "mock-model",
|
|
413
|
+
defaultObjectGenerationMode: "json",
|
|
414
|
+
doGenerate: async () => ({
|
|
415
|
+
text,
|
|
416
|
+
content: [{ type: "text", text }],
|
|
417
|
+
toolCalls: options.toolCalls ?? [],
|
|
418
|
+
finishReason,
|
|
419
|
+
usage,
|
|
420
|
+
request: { body: {} },
|
|
421
|
+
response: {
|
|
422
|
+
id: "mock-response-id",
|
|
423
|
+
timestamp: new Date(),
|
|
424
|
+
modelId: options.modelId ?? "mock-model",
|
|
425
|
+
headers: {},
|
|
426
|
+
},
|
|
427
|
+
warnings: [],
|
|
428
|
+
sources: [],
|
|
429
|
+
providerMetadata: undefined,
|
|
430
|
+
}),
|
|
431
|
+
doStream: async () => ({
|
|
432
|
+
stream: new ReadableStream({
|
|
433
|
+
start(controller) {
|
|
434
|
+
controller.enqueue({ type: "text-delta", text });
|
|
435
|
+
controller.enqueue({
|
|
436
|
+
type: "finish",
|
|
437
|
+
finishReason,
|
|
438
|
+
usage,
|
|
439
|
+
providerMetadata: undefined,
|
|
440
|
+
});
|
|
441
|
+
controller.close();
|
|
442
|
+
},
|
|
443
|
+
}),
|
|
444
|
+
rawCall: { rawPrompt: null, rawSettings: {} },
|
|
445
|
+
}),
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=mock-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-agent.js","sourceRoot":"","sources":["../../src/testing/mock-agent.ts"],"names":[],"mappings":"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"}
|