mojentic 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +459 -0
- package/dist/agents/async-aggregator-agent.d.ts +101 -0
- package/dist/agents/async-aggregator-agent.d.ts.map +1 -0
- package/dist/agents/async-aggregator-agent.js +160 -0
- package/dist/agents/async-aggregator-agent.js.map +1 -0
- package/dist/agents/async-dispatcher.d.ts +98 -0
- package/dist/agents/async-dispatcher.d.ts.map +1 -0
- package/dist/agents/async-dispatcher.js +173 -0
- package/dist/agents/async-dispatcher.js.map +1 -0
- package/dist/agents/async-llm-agent-with-memory.d.ts +95 -0
- package/dist/agents/async-llm-agent-with-memory.d.ts.map +1 -0
- package/dist/agents/async-llm-agent-with-memory.js +136 -0
- package/dist/agents/async-llm-agent-with-memory.js.map +1 -0
- package/dist/agents/async-llm-agent.d.ts +85 -0
- package/dist/agents/async-llm-agent.d.ts.map +1 -0
- package/dist/agents/async-llm-agent.js +87 -0
- package/dist/agents/async-llm-agent.js.map +1 -0
- package/dist/agents/base-agent.d.ts +59 -0
- package/dist/agents/base-agent.d.ts.map +1 -0
- package/dist/agents/base-agent.js +24 -0
- package/dist/agents/base-agent.js.map +1 -0
- package/dist/agents/base-async-agent.d.ts +42 -0
- package/dist/agents/base-async-agent.d.ts.map +1 -0
- package/dist/agents/base-async-agent.js +6 -0
- package/dist/agents/base-async-agent.js.map +1 -0
- package/dist/agents/event.d.ts +26 -0
- package/dist/agents/event.d.ts.map +1 -0
- package/dist/agents/event.js +13 -0
- package/dist/agents/event.js.map +1 -0
- package/dist/agents/index.d.ts +14 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +30 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/iterative-problem-solver.d.ts +83 -0
- package/dist/agents/iterative-problem-solver.d.ts.map +1 -0
- package/dist/agents/iterative-problem-solver.js +120 -0
- package/dist/agents/iterative-problem-solver.js.map +1 -0
- package/dist/agents/router.d.ts +44 -0
- package/dist/agents/router.d.ts.map +1 -0
- package/dist/agents/router.js +53 -0
- package/dist/agents/router.js.map +1 -0
- package/dist/agents/simple-recursive-agent.d.ts +182 -0
- package/dist/agents/simple-recursive-agent.d.ts.map +1 -0
- package/dist/agents/simple-recursive-agent.js +272 -0
- package/dist/agents/simple-recursive-agent.js.map +1 -0
- package/dist/context/index.d.ts +5 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +21 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/shared-working-memory.d.ts +76 -0
- package/dist/context/shared-working-memory.d.ts.map +1 -0
- package/dist/context/shared-working-memory.js +121 -0
- package/dist/context/shared-working-memory.js.map +1 -0
- package/dist/error.d.ts +93 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +149 -0
- package/dist/error.js.map +1 -0
- package/dist/examples/react/decisioning-agent.d.ts +48 -0
- package/dist/examples/react/decisioning-agent.d.ts.map +1 -0
- package/dist/examples/react/decisioning-agent.js +204 -0
- package/dist/examples/react/decisioning-agent.js.map +1 -0
- package/dist/examples/react/events.d.ts +77 -0
- package/dist/examples/react/events.d.ts.map +1 -0
- package/dist/examples/react/events.js +9 -0
- package/dist/examples/react/events.js.map +1 -0
- package/dist/examples/react/formatters.d.ts +23 -0
- package/dist/examples/react/formatters.d.ts.map +1 -0
- package/dist/examples/react/formatters.js +68 -0
- package/dist/examples/react/formatters.js.map +1 -0
- package/dist/examples/react/index.d.ts +12 -0
- package/dist/examples/react/index.d.ts.map +1 -0
- package/dist/examples/react/index.js +28 -0
- package/dist/examples/react/index.js.map +1 -0
- package/dist/examples/react/models.d.ts +57 -0
- package/dist/examples/react/models.d.ts.map +1 -0
- package/dist/examples/react/models.js +19 -0
- package/dist/examples/react/models.js.map +1 -0
- package/dist/examples/react/output-agent.d.ts +23 -0
- package/dist/examples/react/output-agent.d.ts.map +1 -0
- package/dist/examples/react/output-agent.js +28 -0
- package/dist/examples/react/output-agent.js.map +1 -0
- package/dist/examples/react/summarization-agent.d.ts +46 -0
- package/dist/examples/react/summarization-agent.d.ts.map +1 -0
- package/dist/examples/react/summarization-agent.js +102 -0
- package/dist/examples/react/summarization-agent.js.map +1 -0
- package/dist/examples/react/thinking-agent.d.ts +47 -0
- package/dist/examples/react/thinking-agent.d.ts.map +1 -0
- package/dist/examples/react/thinking-agent.js +127 -0
- package/dist/examples/react/thinking-agent.js.map +1 -0
- package/dist/examples/react/tool-call-agent.d.ts +25 -0
- package/dist/examples/react/tool-call-agent.d.ts.map +1 -0
- package/dist/examples/react/tool-call-agent.js +83 -0
- package/dist/examples/react/tool-call-agent.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/agent.d.ts +68 -0
- package/dist/llm/agent.d.ts.map +1 -0
- package/dist/llm/agent.js +85 -0
- package/dist/llm/agent.js.map +1 -0
- package/dist/llm/broker.d.ts +150 -0
- package/dist/llm/broker.d.ts.map +1 -0
- package/dist/llm/broker.js +355 -0
- package/dist/llm/broker.js.map +1 -0
- package/dist/llm/chat-session.d.ts +98 -0
- package/dist/llm/chat-session.d.ts.map +1 -0
- package/dist/llm/chat-session.js +156 -0
- package/dist/llm/chat-session.js.map +1 -0
- package/dist/llm/gateway.d.ts +28 -0
- package/dist/llm/gateway.d.ts.map +1 -0
- package/dist/llm/gateway.js +6 -0
- package/dist/llm/gateway.js.map +1 -0
- package/dist/llm/gateways/index.d.ts +9 -0
- package/dist/llm/gateways/index.d.ts.map +1 -0
- package/dist/llm/gateways/index.js +25 -0
- package/dist/llm/gateways/index.js.map +1 -0
- package/dist/llm/gateways/ollama.d.ts +30 -0
- package/dist/llm/gateways/ollama.d.ts.map +1 -0
- package/dist/llm/gateways/ollama.js +322 -0
- package/dist/llm/gateways/ollama.js.map +1 -0
- package/dist/llm/gateways/openai-messages-adapter.d.ts +29 -0
- package/dist/llm/gateways/openai-messages-adapter.d.ts.map +1 -0
- package/dist/llm/gateways/openai-messages-adapter.js +188 -0
- package/dist/llm/gateways/openai-messages-adapter.js.map +1 -0
- package/dist/llm/gateways/openai-model-registry.d.ts +82 -0
- package/dist/llm/gateways/openai-model-registry.d.ts.map +1 -0
- package/dist/llm/gateways/openai-model-registry.js +352 -0
- package/dist/llm/gateways/openai-model-registry.js.map +1 -0
- package/dist/llm/gateways/openai.d.ts +40 -0
- package/dist/llm/gateways/openai.d.ts.map +1 -0
- package/dist/llm/gateways/openai.js +469 -0
- package/dist/llm/gateways/openai.js.map +1 -0
- package/dist/llm/gateways/tokenizerGateway.d.ts +61 -0
- package/dist/llm/gateways/tokenizerGateway.d.ts.map +1 -0
- package/dist/llm/gateways/tokenizerGateway.js +75 -0
- package/dist/llm/gateways/tokenizerGateway.js.map +1 -0
- package/dist/llm/index.d.ts +11 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +27 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/models.d.ts +95 -0
- package/dist/llm/models.d.ts.map +1 -0
- package/dist/llm/models.js +50 -0
- package/dist/llm/models.js.map +1 -0
- package/dist/llm/tools/ask-user.d.ts +39 -0
- package/dist/llm/tools/ask-user.d.ts.map +1 -0
- package/dist/llm/tools/ask-user.js +111 -0
- package/dist/llm/tools/ask-user.js.map +1 -0
- package/dist/llm/tools/current-datetime.d.ts +17 -0
- package/dist/llm/tools/current-datetime.d.ts.map +1 -0
- package/dist/llm/tools/current-datetime.js +76 -0
- package/dist/llm/tools/current-datetime.js.map +1 -0
- package/dist/llm/tools/date-resolver.d.ts +17 -0
- package/dist/llm/tools/date-resolver.d.ts.map +1 -0
- package/dist/llm/tools/date-resolver.js +135 -0
- package/dist/llm/tools/date-resolver.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/append-task.d.ts +13 -0
- package/dist/llm/tools/ephemeral-task-manager/append-task.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/append-task.js +54 -0
- package/dist/llm/tools/ephemeral-task-manager/append-task.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/clear-tasks.d.ts +13 -0
- package/dist/llm/tools/ephemeral-task-manager/clear-tasks.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/clear-tasks.js +37 -0
- package/dist/llm/tools/ephemeral-task-manager/clear-tasks.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/complete-task.d.ts +15 -0
- package/dist/llm/tools/ephemeral-task-manager/complete-task.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/complete-task.js +56 -0
- package/dist/llm/tools/ephemeral-task-manager/complete-task.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/index.d.ts +44 -0
- package/dist/llm/tools/ephemeral-task-manager/index.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/index.js +73 -0
- package/dist/llm/tools/ephemeral-task-manager/index.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/insert-task-after.d.ts +13 -0
- package/dist/llm/tools/ephemeral-task-manager/insert-task-after.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/insert-task-after.js +59 -0
- package/dist/llm/tools/ephemeral-task-manager/insert-task-after.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/list-tasks.d.ts +14 -0
- package/dist/llm/tools/ephemeral-task-manager/list-tasks.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/list-tasks.js +45 -0
- package/dist/llm/tools/ephemeral-task-manager/list-tasks.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/prepend-task.d.ts +13 -0
- package/dist/llm/tools/ephemeral-task-manager/prepend-task.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/prepend-task.js +54 -0
- package/dist/llm/tools/ephemeral-task-manager/prepend-task.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/start-task.d.ts +15 -0
- package/dist/llm/tools/ephemeral-task-manager/start-task.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/start-task.js +56 -0
- package/dist/llm/tools/ephemeral-task-manager/start-task.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/task-list.d.ts +68 -0
- package/dist/llm/tools/ephemeral-task-manager/task-list.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/task-list.js +120 -0
- package/dist/llm/tools/ephemeral-task-manager/task-list.js.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/task.d.ts +21 -0
- package/dist/llm/tools/ephemeral-task-manager/task.d.ts.map +1 -0
- package/dist/llm/tools/ephemeral-task-manager/task.js +24 -0
- package/dist/llm/tools/ephemeral-task-manager/task.js.map +1 -0
- package/dist/llm/tools/file-manager.d.ts +127 -0
- package/dist/llm/tools/file-manager.d.ts.map +1 -0
- package/dist/llm/tools/file-manager.js +598 -0
- package/dist/llm/tools/file-manager.js.map +1 -0
- package/dist/llm/tools/index.d.ts +11 -0
- package/dist/llm/tools/index.d.ts.map +1 -0
- package/dist/llm/tools/index.js +27 -0
- package/dist/llm/tools/index.js.map +1 -0
- package/dist/llm/tools/tell-user.d.ts +31 -0
- package/dist/llm/tools/tell-user.d.ts.map +1 -0
- package/dist/llm/tools/tell-user.js +57 -0
- package/dist/llm/tools/tell-user.js.map +1 -0
- package/dist/llm/tools/tool-wrapper.d.ts +54 -0
- package/dist/llm/tools/tool-wrapper.d.ts.map +1 -0
- package/dist/llm/tools/tool-wrapper.js +91 -0
- package/dist/llm/tools/tool-wrapper.js.map +1 -0
- package/dist/llm/tools/tool.d.ts +70 -0
- package/dist/llm/tools/tool.d.ts.map +1 -0
- package/dist/llm/tools/tool.js +19 -0
- package/dist/llm/tools/tool.js.map +1 -0
- package/dist/llm/tools/web-search-tool.d.ts +35 -0
- package/dist/llm/tools/web-search-tool.d.ts.map +1 -0
- package/dist/llm/tools/web-search-tool.js +105 -0
- package/dist/llm/tools/web-search-tool.js.map +1 -0
- package/dist/llm/utils/image.d.ts +30 -0
- package/dist/llm/utils/image.d.ts.map +1 -0
- package/dist/llm/utils/image.js +65 -0
- package/dist/llm/utils/image.js.map +1 -0
- package/dist/tracer/eventStore.d.ts +101 -0
- package/dist/tracer/eventStore.d.ts.map +1 -0
- package/dist/tracer/eventStore.js +120 -0
- package/dist/tracer/eventStore.js.map +1 -0
- package/dist/tracer/index.d.ts +8 -0
- package/dist/tracer/index.d.ts.map +1 -0
- package/dist/tracer/index.js +24 -0
- package/dist/tracer/index.js.map +1 -0
- package/dist/tracer/nullTracer.d.ts +127 -0
- package/dist/tracer/nullTracer.d.ts.map +1 -0
- package/dist/tracer/nullTracer.js +148 -0
- package/dist/tracer/nullTracer.js.map +1 -0
- package/dist/tracer/tracerEvents.d.ts +209 -0
- package/dist/tracer/tracerEvents.d.ts.map +1 -0
- package/dist/tracer/tracerEvents.js +312 -0
- package/dist/tracer/tracerEvents.js.map +1 -0
- package/dist/tracer/tracerSystem.d.ts +149 -0
- package/dist/tracer/tracerSystem.d.ts.map +1 -0
- package/dist/tracer/tracerSystem.js +196 -0
- package/dist/tracer/tracerSystem.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Async Aggregator Agent - Collects and processes multiple related events
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AsyncAggregatorAgent = void 0;
|
|
7
|
+
const error_1 = require("../error");
|
|
8
|
+
/**
|
|
9
|
+
* Base class for agents that aggregate multiple events before processing.
|
|
10
|
+
*
|
|
11
|
+
* This agent collects events with the same correlation ID until all required
|
|
12
|
+
* event types have been received, then calls `processEvents` with the complete set.
|
|
13
|
+
*
|
|
14
|
+
* Useful for workflows where multiple agents process parts of a request in parallel,
|
|
15
|
+
* and a final agent combines their results.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* class FinalAnswerAgent extends AsyncAggregatorAgent {
|
|
20
|
+
* constructor() {
|
|
21
|
+
* super(['FactCheckEvent', 'AnswerEvent']);
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* async processEvents(events: Event[]): Promise<Result<Event[], Error>> {
|
|
25
|
+
* const facts = events.find(e => e.type === 'FactCheckEvent') as FactCheckEvent;
|
|
26
|
+
* const answer = events.find(e => e.type === 'AnswerEvent') as AnswerEvent;
|
|
27
|
+
*
|
|
28
|
+
* return Ok([new FinalAnswerEvent({
|
|
29
|
+
* answer: answer.answer,
|
|
30
|
+
* facts: facts.facts
|
|
31
|
+
* })]);
|
|
32
|
+
* }
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
class AsyncAggregatorAgent {
|
|
37
|
+
/** Map of correlation IDs to accumulated events */
|
|
38
|
+
results = new Map();
|
|
39
|
+
/** Map of correlation IDs to waiting promise resolvers */
|
|
40
|
+
waiters = new Map();
|
|
41
|
+
/** Event type names that must be collected before processing */
|
|
42
|
+
eventTypesNeeded;
|
|
43
|
+
/**
|
|
44
|
+
* Create a new aggregator agent.
|
|
45
|
+
*
|
|
46
|
+
* @param eventTypesNeeded - Array of event type names to wait for
|
|
47
|
+
*/
|
|
48
|
+
constructor(eventTypesNeeded) {
|
|
49
|
+
this.eventTypesNeeded = eventTypesNeeded;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if all required event types have been received for a correlation ID.
|
|
53
|
+
*
|
|
54
|
+
* @param correlationId - The correlation ID to check
|
|
55
|
+
* @returns True if all needed event types are present
|
|
56
|
+
*/
|
|
57
|
+
hasAllNeeded(correlationId) {
|
|
58
|
+
const events = this.results.get(correlationId) || [];
|
|
59
|
+
const capturedTypes = events.map((e) => e.type || e.constructor.name);
|
|
60
|
+
return this.eventTypesNeeded.every((needed) => capturedTypes.includes(needed));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Capture an event and check if processing should trigger.
|
|
64
|
+
*
|
|
65
|
+
* @param event - The event to capture
|
|
66
|
+
*/
|
|
67
|
+
captureEvent(event) {
|
|
68
|
+
const correlationId = event.correlationId;
|
|
69
|
+
if (!correlationId) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const events = this.results.get(correlationId) || [];
|
|
73
|
+
events.push(event);
|
|
74
|
+
this.results.set(correlationId, events);
|
|
75
|
+
// Notify waiters if we have all needed events
|
|
76
|
+
if (this.hasAllNeeded(correlationId)) {
|
|
77
|
+
const resolvers = this.waiters.get(correlationId) || [];
|
|
78
|
+
for (const resolve of resolvers) {
|
|
79
|
+
resolve(events);
|
|
80
|
+
}
|
|
81
|
+
this.waiters.delete(correlationId);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get and clear the accumulated events for a correlation ID.
|
|
86
|
+
*
|
|
87
|
+
* @param correlationId - The correlation ID
|
|
88
|
+
* @returns Array of events
|
|
89
|
+
*/
|
|
90
|
+
getAndResetResults(correlationId) {
|
|
91
|
+
const events = this.results.get(correlationId) || [];
|
|
92
|
+
this.results.delete(correlationId);
|
|
93
|
+
return events;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Wait for all required events to be received for a correlation ID.
|
|
97
|
+
*
|
|
98
|
+
* This method blocks until all events specified in `eventTypesNeeded` have
|
|
99
|
+
* been received with the given correlation ID, or until the timeout expires.
|
|
100
|
+
*
|
|
101
|
+
* @param correlationId - The correlation ID to wait for
|
|
102
|
+
* @param timeout - Optional timeout in milliseconds
|
|
103
|
+
* @returns Result containing the complete set of events or an error
|
|
104
|
+
*/
|
|
105
|
+
async waitForEvents(correlationId, timeout) {
|
|
106
|
+
// Check if we already have all events
|
|
107
|
+
if (this.hasAllNeeded(correlationId)) {
|
|
108
|
+
return (0, error_1.Ok)(this.results.get(correlationId) || []);
|
|
109
|
+
}
|
|
110
|
+
// Create a promise that resolves when all events arrive
|
|
111
|
+
const promise = new Promise((resolve) => {
|
|
112
|
+
const resolvers = this.waiters.get(correlationId) || [];
|
|
113
|
+
resolvers.push(resolve);
|
|
114
|
+
this.waiters.set(correlationId, resolvers);
|
|
115
|
+
});
|
|
116
|
+
// Apply timeout if specified
|
|
117
|
+
if (timeout !== undefined) {
|
|
118
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
119
|
+
setTimeout(() => {
|
|
120
|
+
reject(new Error(`Timeout waiting for events (${timeout}ms)`));
|
|
121
|
+
}, timeout);
|
|
122
|
+
});
|
|
123
|
+
try {
|
|
124
|
+
const events = await Promise.race([promise, timeoutPromise]);
|
|
125
|
+
return (0, error_1.Ok)(events);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return (0, error_1.Err)(error instanceof Error ? error : new Error(String(error)));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const events = await promise;
|
|
132
|
+
return (0, error_1.Ok)(events);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Receive and process an event.
|
|
136
|
+
*
|
|
137
|
+
* Events are accumulated until all required types are present, then
|
|
138
|
+
* `processEvents` is called with the complete set.
|
|
139
|
+
*
|
|
140
|
+
* @param event - The event to process
|
|
141
|
+
* @returns Result containing new events to dispatch or an error
|
|
142
|
+
*/
|
|
143
|
+
async receiveEventAsync(event) {
|
|
144
|
+
const correlationId = event.correlationId;
|
|
145
|
+
if (!correlationId) {
|
|
146
|
+
return (0, error_1.Err)(new Error('Event missing correlation ID'));
|
|
147
|
+
}
|
|
148
|
+
// Capture the event
|
|
149
|
+
this.captureEvent(event);
|
|
150
|
+
// Check if we have all needed events
|
|
151
|
+
if (this.hasAllNeeded(correlationId)) {
|
|
152
|
+
const events = this.getAndResetResults(correlationId);
|
|
153
|
+
return this.processEvents(events);
|
|
154
|
+
}
|
|
155
|
+
// Not ready yet
|
|
156
|
+
return (0, error_1.Ok)([]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.AsyncAggregatorAgent = AsyncAggregatorAgent;
|
|
160
|
+
//# sourceMappingURL=async-aggregator-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-aggregator-agent.js","sourceRoot":"","sources":["../../src/agents/async-aggregator-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Dispatcher - Event processing loop for async agent systems
|
|
3
|
+
*/
|
|
4
|
+
import { Event } from './event';
|
|
5
|
+
import { Router } from './router';
|
|
6
|
+
/**
|
|
7
|
+
* Asynchronous event dispatcher with background processing loop.
|
|
8
|
+
*
|
|
9
|
+
* The dispatcher maintains an event queue and continuously routes events
|
|
10
|
+
* to appropriate agents via a Router. Agents process events asynchronously
|
|
11
|
+
* and can produce new events to continue the workflow.
|
|
12
|
+
*
|
|
13
|
+
* The processing loop runs in the background and can be stopped gracefully.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const router = new Router();
|
|
18
|
+
* router.addRoute('QuestionEvent', factCheckerAgent);
|
|
19
|
+
* router.addRoute('QuestionEvent', answerGeneratorAgent);
|
|
20
|
+
*
|
|
21
|
+
* const dispatcher = new AsyncDispatcher(router);
|
|
22
|
+
* await dispatcher.start();
|
|
23
|
+
*
|
|
24
|
+
* dispatcher.dispatch(new QuestionEvent({ question: 'What is TypeScript?' }));
|
|
25
|
+
*
|
|
26
|
+
* await dispatcher.waitForEmptyQueue(5000);
|
|
27
|
+
* await dispatcher.stop();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class AsyncDispatcher {
|
|
31
|
+
private readonly router;
|
|
32
|
+
private readonly eventQueue;
|
|
33
|
+
private stopFlag;
|
|
34
|
+
private processingLoop?;
|
|
35
|
+
private readonly batchSize;
|
|
36
|
+
/**
|
|
37
|
+
* Create a new async dispatcher.
|
|
38
|
+
*
|
|
39
|
+
* @param router - Router to use for directing events to agents
|
|
40
|
+
* @param batchSize - Number of events to process per iteration (default: 5)
|
|
41
|
+
*/
|
|
42
|
+
constructor(router: Router, batchSize?: number);
|
|
43
|
+
/**
|
|
44
|
+
* Start the background event processing loop.
|
|
45
|
+
*
|
|
46
|
+
* The loop continues until `stop()` is called or a TerminateEvent is processed.
|
|
47
|
+
*
|
|
48
|
+
* @returns Promise that resolves when the loop starts
|
|
49
|
+
*/
|
|
50
|
+
start(): Promise<AsyncDispatcher>;
|
|
51
|
+
/**
|
|
52
|
+
* Stop the background event processing loop.
|
|
53
|
+
*
|
|
54
|
+
* Waits for the current batch of events to finish processing before stopping.
|
|
55
|
+
*
|
|
56
|
+
* @returns Promise that resolves when processing has stopped
|
|
57
|
+
*/
|
|
58
|
+
stop(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Add an event to the processing queue.
|
|
61
|
+
*
|
|
62
|
+
* If the event doesn't have a correlation ID, one will be assigned.
|
|
63
|
+
* Events are processed asynchronously by the background loop.
|
|
64
|
+
*
|
|
65
|
+
* @param event - The event to dispatch
|
|
66
|
+
*/
|
|
67
|
+
dispatch(event: Event): void;
|
|
68
|
+
/**
|
|
69
|
+
* Wait for the event queue to become empty.
|
|
70
|
+
*
|
|
71
|
+
* Useful for ensuring all events have been processed before proceeding.
|
|
72
|
+
*
|
|
73
|
+
* @param timeout - Optional timeout in milliseconds
|
|
74
|
+
* @returns Promise resolving to true if queue emptied, false if timeout
|
|
75
|
+
*/
|
|
76
|
+
waitForEmptyQueue(timeout?: number): Promise<boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* Background event processing loop.
|
|
79
|
+
*
|
|
80
|
+
* Continuously processes events from the queue in batches, routing them
|
|
81
|
+
* through the router to appropriate agents. Runs until stopped or a
|
|
82
|
+
* TerminateEvent is encountered.
|
|
83
|
+
*/
|
|
84
|
+
private dispatchEventsLoop;
|
|
85
|
+
/**
|
|
86
|
+
* Get the current number of events in the queue.
|
|
87
|
+
*
|
|
88
|
+
* @returns Number of queued events
|
|
89
|
+
*/
|
|
90
|
+
getQueueLength(): number;
|
|
91
|
+
/**
|
|
92
|
+
* Check if the dispatcher is currently running.
|
|
93
|
+
*
|
|
94
|
+
* @returns True if the processing loop is active
|
|
95
|
+
*/
|
|
96
|
+
isRunning(): boolean;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=async-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-dispatcher.d.ts","sourceRoot":"","sources":["../../src/agents/async-dispatcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAoB,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU;IAKjD;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAMvC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAO5B;;;;;;;OAOG;IACG,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa3D;;;;;;OAMG;YACW,kBAAkB;IA4ChC;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;OAIG;IACH,SAAS,IAAI,OAAO;CAGrB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Async Dispatcher - Event processing loop for async agent systems
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AsyncDispatcher = void 0;
|
|
7
|
+
const event_1 = require("./event");
|
|
8
|
+
const error_1 = require("../error");
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
/**
|
|
11
|
+
* Asynchronous event dispatcher with background processing loop.
|
|
12
|
+
*
|
|
13
|
+
* The dispatcher maintains an event queue and continuously routes events
|
|
14
|
+
* to appropriate agents via a Router. Agents process events asynchronously
|
|
15
|
+
* and can produce new events to continue the workflow.
|
|
16
|
+
*
|
|
17
|
+
* The processing loop runs in the background and can be stopped gracefully.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const router = new Router();
|
|
22
|
+
* router.addRoute('QuestionEvent', factCheckerAgent);
|
|
23
|
+
* router.addRoute('QuestionEvent', answerGeneratorAgent);
|
|
24
|
+
*
|
|
25
|
+
* const dispatcher = new AsyncDispatcher(router);
|
|
26
|
+
* await dispatcher.start();
|
|
27
|
+
*
|
|
28
|
+
* dispatcher.dispatch(new QuestionEvent({ question: 'What is TypeScript?' }));
|
|
29
|
+
*
|
|
30
|
+
* await dispatcher.waitForEmptyQueue(5000);
|
|
31
|
+
* await dispatcher.stop();
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
class AsyncDispatcher {
|
|
35
|
+
router;
|
|
36
|
+
eventQueue = [];
|
|
37
|
+
stopFlag = false;
|
|
38
|
+
processingLoop;
|
|
39
|
+
batchSize;
|
|
40
|
+
/**
|
|
41
|
+
* Create a new async dispatcher.
|
|
42
|
+
*
|
|
43
|
+
* @param router - Router to use for directing events to agents
|
|
44
|
+
* @param batchSize - Number of events to process per iteration (default: 5)
|
|
45
|
+
*/
|
|
46
|
+
constructor(router, batchSize = 5) {
|
|
47
|
+
this.router = router;
|
|
48
|
+
this.batchSize = batchSize;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Start the background event processing loop.
|
|
52
|
+
*
|
|
53
|
+
* The loop continues until `stop()` is called or a TerminateEvent is processed.
|
|
54
|
+
*
|
|
55
|
+
* @returns Promise that resolves when the loop starts
|
|
56
|
+
*/
|
|
57
|
+
async start() {
|
|
58
|
+
this.stopFlag = false;
|
|
59
|
+
this.processingLoop = this.dispatchEventsLoop();
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stop the background event processing loop.
|
|
64
|
+
*
|
|
65
|
+
* Waits for the current batch of events to finish processing before stopping.
|
|
66
|
+
*
|
|
67
|
+
* @returns Promise that resolves when processing has stopped
|
|
68
|
+
*/
|
|
69
|
+
async stop() {
|
|
70
|
+
this.stopFlag = true;
|
|
71
|
+
if (this.processingLoop) {
|
|
72
|
+
await this.processingLoop;
|
|
73
|
+
this.processingLoop = undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Add an event to the processing queue.
|
|
78
|
+
*
|
|
79
|
+
* If the event doesn't have a correlation ID, one will be assigned.
|
|
80
|
+
* Events are processed asynchronously by the background loop.
|
|
81
|
+
*
|
|
82
|
+
* @param event - The event to dispatch
|
|
83
|
+
*/
|
|
84
|
+
dispatch(event) {
|
|
85
|
+
if (!event.correlationId) {
|
|
86
|
+
event.correlationId = (0, crypto_1.randomUUID)();
|
|
87
|
+
}
|
|
88
|
+
this.eventQueue.push(event);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Wait for the event queue to become empty.
|
|
92
|
+
*
|
|
93
|
+
* Useful for ensuring all events have been processed before proceeding.
|
|
94
|
+
*
|
|
95
|
+
* @param timeout - Optional timeout in milliseconds
|
|
96
|
+
* @returns Promise resolving to true if queue emptied, false if timeout
|
|
97
|
+
*/
|
|
98
|
+
async waitForEmptyQueue(timeout) {
|
|
99
|
+
const startTime = Date.now();
|
|
100
|
+
while (this.eventQueue.length > 0) {
|
|
101
|
+
if (timeout !== undefined && Date.now() - startTime > timeout) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Background event processing loop.
|
|
110
|
+
*
|
|
111
|
+
* Continuously processes events from the queue in batches, routing them
|
|
112
|
+
* through the router to appropriate agents. Runs until stopped or a
|
|
113
|
+
* TerminateEvent is encountered.
|
|
114
|
+
*/
|
|
115
|
+
async dispatchEventsLoop() {
|
|
116
|
+
while (!this.stopFlag) {
|
|
117
|
+
// Process up to batchSize events per iteration
|
|
118
|
+
for (let i = 0; i < this.batchSize && this.eventQueue.length > 0; i++) {
|
|
119
|
+
const event = this.eventQueue.shift();
|
|
120
|
+
if (!event) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
// Check for terminate event
|
|
124
|
+
if ((0, event_1.isTerminateEvent)(event)) {
|
|
125
|
+
this.stopFlag = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
// Route event to agents
|
|
129
|
+
const agents = this.router.getAgents(event);
|
|
130
|
+
// Process through each agent
|
|
131
|
+
for (const agent of agents) {
|
|
132
|
+
try {
|
|
133
|
+
const result = await agent.receiveEventAsync(event);
|
|
134
|
+
if ((0, error_1.isOk)(result)) {
|
|
135
|
+
// Dispatch any events produced by the agent
|
|
136
|
+
const events = result.value;
|
|
137
|
+
for (const newEvent of events) {
|
|
138
|
+
this.dispatch(newEvent);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Log error but continue processing
|
|
143
|
+
console.error(`Agent error processing event:`, result.error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error(`Unexpected error in agent:`, error);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Small delay before next batch
|
|
152
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the current number of events in the queue.
|
|
157
|
+
*
|
|
158
|
+
* @returns Number of queued events
|
|
159
|
+
*/
|
|
160
|
+
getQueueLength() {
|
|
161
|
+
return this.eventQueue.length;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if the dispatcher is currently running.
|
|
165
|
+
*
|
|
166
|
+
* @returns True if the processing loop is active
|
|
167
|
+
*/
|
|
168
|
+
isRunning() {
|
|
169
|
+
return !this.stopFlag && this.processingLoop !== undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.AsyncDispatcher = AsyncDispatcher;
|
|
173
|
+
//# sourceMappingURL=async-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-dispatcher.js","sourceRoot":"","sources":["../../src/agents/async-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async LLM Agent with Memory - Base class for agents that use shared memory
|
|
3
|
+
*/
|
|
4
|
+
import { AsyncLlmAgent, AsyncLlmAgentConfig } from './async-llm-agent';
|
|
5
|
+
import { SharedWorkingMemory } from '../context';
|
|
6
|
+
import { LlmMessage } from '../llm/models';
|
|
7
|
+
import { Result } from '../error';
|
|
8
|
+
/**
|
|
9
|
+
* Configuration for AsyncLlmAgentWithMemory
|
|
10
|
+
*/
|
|
11
|
+
export interface AsyncLlmAgentWithMemoryConfig extends Omit<AsyncLlmAgentConfig, 'responseModel'> {
|
|
12
|
+
/** Shared working memory instance for reading and writing context */
|
|
13
|
+
memory: SharedWorkingMemory;
|
|
14
|
+
/** Instructions for the agent on how to process events and use memory */
|
|
15
|
+
instructions: string;
|
|
16
|
+
/** JSON schema for the agent's response (required for memory agents) */
|
|
17
|
+
responseModel: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Base class for async agents that use an LLM with shared working memory.
|
|
21
|
+
*
|
|
22
|
+
* This agent extends AsyncLlmAgent to add memory capabilities. The agent
|
|
23
|
+
* automatically includes current memory in its context and can update memory
|
|
24
|
+
* based on new information learned during processing.
|
|
25
|
+
*
|
|
26
|
+
* Memory is provided to the LLM in the system messages, and the LLM response
|
|
27
|
+
* includes a memory field that is merged back into the shared memory.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* interface QuestionResponse {
|
|
32
|
+
* answer: string;
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* class QuestionAgent extends AsyncLlmAgentWithMemory {
|
|
36
|
+
* constructor(broker: LlmBroker, memory: SharedWorkingMemory) {
|
|
37
|
+
* super({
|
|
38
|
+
* broker,
|
|
39
|
+
* memory,
|
|
40
|
+
* behaviour: 'You are a helpful assistant who remembers what you learn.',
|
|
41
|
+
* instructions: 'Answer questions using your memory and remember new facts.',
|
|
42
|
+
* responseModel: {
|
|
43
|
+
* type: 'object',
|
|
44
|
+
* properties: {
|
|
45
|
+
* answer: { type: 'string' }
|
|
46
|
+
* },
|
|
47
|
+
* required: ['answer']
|
|
48
|
+
* }
|
|
49
|
+
* });
|
|
50
|
+
* }
|
|
51
|
+
*
|
|
52
|
+
* async receiveEventAsync(event: Event): Promise<Result<Event[], Error>> {
|
|
53
|
+
* if (isQuestionEvent(event)) {
|
|
54
|
+
* const result = await this.generateResponseWithMemory<QuestionResponse>(
|
|
55
|
+
* event.question
|
|
56
|
+
* );
|
|
57
|
+
* if (isOk(result)) {
|
|
58
|
+
* return Ok([new AnswerEvent({ answer: result.value.answer })]);
|
|
59
|
+
* }
|
|
60
|
+
* }
|
|
61
|
+
* return Ok([]);
|
|
62
|
+
* }
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare abstract class AsyncLlmAgentWithMemory extends AsyncLlmAgent {
|
|
67
|
+
protected readonly memory: SharedWorkingMemory;
|
|
68
|
+
protected readonly instructions: string;
|
|
69
|
+
constructor(config: AsyncLlmAgentWithMemoryConfig);
|
|
70
|
+
/**
|
|
71
|
+
* Create the initial message set including memory context.
|
|
72
|
+
*
|
|
73
|
+
* This includes:
|
|
74
|
+
* 1. System message with behaviour
|
|
75
|
+
* 2. Memory context with current working memory
|
|
76
|
+
* 3. Instructions on how to use memory
|
|
77
|
+
*
|
|
78
|
+
* @returns Array of messages to send to the LLM
|
|
79
|
+
*/
|
|
80
|
+
protected createInitialMessagesWithMemory(): LlmMessage[];
|
|
81
|
+
/**
|
|
82
|
+
* Generate a response from the LLM with memory context and update memory.
|
|
83
|
+
*
|
|
84
|
+
* This method:
|
|
85
|
+
* 1. Includes current memory in the context
|
|
86
|
+
* 2. Requests a response with updated memory
|
|
87
|
+
* 3. Merges new memory into shared memory
|
|
88
|
+
* 4. Returns the response without the memory field
|
|
89
|
+
*
|
|
90
|
+
* @param content - The user message content to send to the LLM
|
|
91
|
+
* @returns Result containing the LLM response or an error
|
|
92
|
+
*/
|
|
93
|
+
protected generateResponseWithMemory<T>(content: string): Promise<Result<T, Error>>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=async-llm-agent-with-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-llm-agent-with-memory.d.ts","sourceRoot":"","sources":["../../src/agents/async-llm-agent-with-memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAW,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC/F,qEAAqE;IACrE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,8BAAsB,uBAAwB,SAAQ,aAAa;IACjE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAE5B,MAAM,EAAE,6BAA6B;IAUjD;;;;;;;;;OASG;IACH,SAAS,CAAC,+BAA+B,IAAI,UAAU,EAAE;IAazD;;;;;;;;;;;OAWG;cACa,0BAA0B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;CA4C1F"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Async LLM Agent with Memory - Base class for agents that use shared memory
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AsyncLlmAgentWithMemory = void 0;
|
|
7
|
+
const async_llm_agent_1 = require("./async-llm-agent");
|
|
8
|
+
const models_1 = require("../llm/models");
|
|
9
|
+
const error_1 = require("../error");
|
|
10
|
+
/**
|
|
11
|
+
* Base class for async agents that use an LLM with shared working memory.
|
|
12
|
+
*
|
|
13
|
+
* This agent extends AsyncLlmAgent to add memory capabilities. The agent
|
|
14
|
+
* automatically includes current memory in its context and can update memory
|
|
15
|
+
* based on new information learned during processing.
|
|
16
|
+
*
|
|
17
|
+
* Memory is provided to the LLM in the system messages, and the LLM response
|
|
18
|
+
* includes a memory field that is merged back into the shared memory.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* interface QuestionResponse {
|
|
23
|
+
* answer: string;
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* class QuestionAgent extends AsyncLlmAgentWithMemory {
|
|
27
|
+
* constructor(broker: LlmBroker, memory: SharedWorkingMemory) {
|
|
28
|
+
* super({
|
|
29
|
+
* broker,
|
|
30
|
+
* memory,
|
|
31
|
+
* behaviour: 'You are a helpful assistant who remembers what you learn.',
|
|
32
|
+
* instructions: 'Answer questions using your memory and remember new facts.',
|
|
33
|
+
* responseModel: {
|
|
34
|
+
* type: 'object',
|
|
35
|
+
* properties: {
|
|
36
|
+
* answer: { type: 'string' }
|
|
37
|
+
* },
|
|
38
|
+
* required: ['answer']
|
|
39
|
+
* }
|
|
40
|
+
* });
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* async receiveEventAsync(event: Event): Promise<Result<Event[], Error>> {
|
|
44
|
+
* if (isQuestionEvent(event)) {
|
|
45
|
+
* const result = await this.generateResponseWithMemory<QuestionResponse>(
|
|
46
|
+
* event.question
|
|
47
|
+
* );
|
|
48
|
+
* if (isOk(result)) {
|
|
49
|
+
* return Ok([new AnswerEvent({ answer: result.value.answer })]);
|
|
50
|
+
* }
|
|
51
|
+
* }
|
|
52
|
+
* return Ok([]);
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
class AsyncLlmAgentWithMemory extends async_llm_agent_1.AsyncLlmAgent {
|
|
58
|
+
memory;
|
|
59
|
+
instructions;
|
|
60
|
+
constructor(config) {
|
|
61
|
+
super({
|
|
62
|
+
...config,
|
|
63
|
+
// Memory agents always need a response model for structured memory updates
|
|
64
|
+
responseModel: config.responseModel,
|
|
65
|
+
});
|
|
66
|
+
this.memory = config.memory;
|
|
67
|
+
this.instructions = config.instructions;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create the initial message set including memory context.
|
|
71
|
+
*
|
|
72
|
+
* This includes:
|
|
73
|
+
* 1. System message with behaviour
|
|
74
|
+
* 2. Memory context with current working memory
|
|
75
|
+
* 3. Instructions on how to use memory
|
|
76
|
+
*
|
|
77
|
+
* @returns Array of messages to send to the LLM
|
|
78
|
+
*/
|
|
79
|
+
createInitialMessagesWithMemory() {
|
|
80
|
+
const currentMemory = this.memory.getWorkingMemory();
|
|
81
|
+
return [
|
|
82
|
+
models_1.Message.system(this.behaviour),
|
|
83
|
+
models_1.Message.user(`This is what you remember:\n${JSON.stringify(currentMemory, null, 2)}\n\n` +
|
|
84
|
+
`Remember anything new you learn by storing it to your working memory in your response.`),
|
|
85
|
+
models_1.Message.user(this.instructions),
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate a response from the LLM with memory context and update memory.
|
|
90
|
+
*
|
|
91
|
+
* This method:
|
|
92
|
+
* 1. Includes current memory in the context
|
|
93
|
+
* 2. Requests a response with updated memory
|
|
94
|
+
* 3. Merges new memory into shared memory
|
|
95
|
+
* 4. Returns the response without the memory field
|
|
96
|
+
*
|
|
97
|
+
* @param content - The user message content to send to the LLM
|
|
98
|
+
* @returns Result containing the LLM response or an error
|
|
99
|
+
*/
|
|
100
|
+
async generateResponseWithMemory(content) {
|
|
101
|
+
// Create augmented response model that includes memory field
|
|
102
|
+
const responseWithMemorySchema = {
|
|
103
|
+
type: 'object',
|
|
104
|
+
properties: {
|
|
105
|
+
...this.responseModel?.properties,
|
|
106
|
+
memory: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
description: 'Add anything new that you have learned here.',
|
|
109
|
+
default: this.memory.getWorkingMemory(),
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
required: [...(this.responseModel?.required || [])],
|
|
113
|
+
};
|
|
114
|
+
// Build messages with memory context
|
|
115
|
+
const messages = [
|
|
116
|
+
...this.createInitialMessagesWithMemory(),
|
|
117
|
+
models_1.Message.user(content),
|
|
118
|
+
];
|
|
119
|
+
// Generate structured response
|
|
120
|
+
const result = await this.broker.generateObject(messages, responseWithMemorySchema);
|
|
121
|
+
if ((0, error_1.isOk)(result)) {
|
|
122
|
+
const responseWithMemory = result.value;
|
|
123
|
+
// Extract and merge memory if present
|
|
124
|
+
if (responseWithMemory.memory) {
|
|
125
|
+
this.memory.mergeToWorkingMemory(responseWithMemory.memory);
|
|
126
|
+
}
|
|
127
|
+
// Remove memory field from response before returning
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
129
|
+
const { memory: _memory, ...responseWithoutMemory } = responseWithMemory;
|
|
130
|
+
return (0, error_1.Ok)(responseWithoutMemory);
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.AsyncLlmAgentWithMemory = AsyncLlmAgentWithMemory;
|
|
136
|
+
//# sourceMappingURL=async-llm-agent-with-memory.js.map
|