@ai.ntellect/core 0.1.8 ā†’ 0.1.83

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,8 +17,32 @@ class Orchestrator {
17
17
  parameters: zod_1.z.object({
18
18
  query: zod_1.z.string(),
19
19
  }),
20
- execute: async (params) => {
21
- const memories = await this.memory.searchSimilarQueries(params.value);
20
+ execute: async ({ query }) => {
21
+ const memories = await this.memory.searchSimilarQueries(query);
22
+ return memories;
23
+ },
24
+ },
25
+ {
26
+ name: "save_memory",
27
+ description: "Save a query in the internal knowledge base",
28
+ parameters: zod_1.z.object({
29
+ query: zod_1.z.string(),
30
+ purpose: zod_1.z.string(),
31
+ data: zod_1.z.any(),
32
+ scope: zod_1.z.enum(["GLOBAL", "USER"]),
33
+ userId: zod_1.z.string().optional(),
34
+ whyStored: zod_1.z.string(),
35
+ }),
36
+ execute: async ({ query, purpose, data, scope, userId, }) => {
37
+ const memories = await this.memory.storeMemory({
38
+ query,
39
+ purpose,
40
+ data,
41
+ scope,
42
+ userId,
43
+ createdAt: new Date(),
44
+ id: crypto.randomUUID(),
45
+ });
22
46
  return memories;
23
47
  },
24
48
  },
@@ -31,10 +55,10 @@ class Orchestrator {
31
55
  schema: zod_1.z.object({
32
56
  actions: zod_1.z.array(zod_1.z.object({
33
57
  name: zod_1.z.string(),
34
- parameters: zod_1.z.object({
58
+ parameters: zod_1.z.array(zod_1.z.object({
35
59
  name: zod_1.z.string(),
36
60
  value: zod_1.z.string(),
37
- }),
61
+ })),
38
62
  })),
39
63
  answer: zod_1.z.string(),
40
64
  }),
@@ -1,4 +1,4 @@
1
- import { CacheMemoryOptions, CreateMemoryInput, MatchOptions, MemoryScope } from "../types";
1
+ import { CacheMemoryOptions, CacheMemoryType, CreateMemoryInput, MatchOptions, MemoryScope } from "../types";
2
2
  export declare class CacheMemory {
3
3
  private redis;
4
4
  private readonly CACHE_PREFIX;
@@ -7,15 +7,15 @@ export declare class CacheMemory {
7
7
  private initRedis;
8
8
  private getMemoryKey;
9
9
  private storeMemory;
10
- findBestMatches(query: string, options?: MatchOptions & {
10
+ findSimilarQueries(query: string, options?: MatchOptions & {
11
11
  userId?: string;
12
12
  scope?: MemoryScope;
13
13
  }): Promise<{
14
14
  data: any;
15
15
  similarityPercentage: number;
16
- purpose: string;
16
+ query: string;
17
17
  }[]>;
18
- private getAllMemories;
18
+ getAllMemories(scope?: MemoryScope, userId?: string): Promise<CacheMemoryType[]>;
19
19
  private getMemoriesFromKeys;
20
20
  createMemory(input: CreateMemoryInput): Promise<string | undefined>;
21
21
  private createSingleMemory;
@@ -43,29 +43,29 @@ class CacheMemory {
43
43
  async storeMemory(memory) {
44
44
  const prefix = this.getMemoryKey(memory.scope, memory.userId);
45
45
  const key = `${prefix}${memory.id}`;
46
- await this.redis.set(key, JSON.stringify(memory), {
46
+ const result = await this.redis.set(key, JSON.stringify(memory), {
47
47
  EX: this.CACHE_TTL,
48
48
  });
49
+ console.log("Cache memory created: ", result);
49
50
  }
50
- async findBestMatches(query, options = {}) {
51
- console.log("\nšŸ” Searching in cache for query:", query);
51
+ async findSimilarQueries(query, options = {}) {
52
+ console.log("\nSearching in cache for query:", query);
52
53
  const { embedding } = await (0, ai_1.embed)({
53
54
  model: openai_1.openai.embedding("text-embedding-3-small"),
54
55
  value: query,
55
56
  });
56
57
  const memories = await this.getAllMemories(options.scope, options.userId);
57
- console.log("\nšŸ“š Found", memories.length, "memories to compare with");
58
+ console.log("\nšŸ“š Found", memories.length, "queries to compare with");
58
59
  const matches = memories
59
60
  .map((memory) => {
60
61
  const similarity = (0, ai_1.cosineSimilarity)(embedding, memory.embedding);
61
62
  const similarityPercentage = (similarity + 1) * 50; // Conversion en pourcentage
62
- console.log(`\nšŸ“Š Memory "${memory.purpose}":
63
- - Similarity: ${similarityPercentage.toFixed(2)}%
64
- - Query: ${memory.query}`);
63
+ console.log(`\nšŸ“Š Query "${memory.query}":
64
+ - Similarity: ${similarityPercentage.toFixed(2)}%`);
65
65
  return {
66
66
  data: memory.data,
67
+ query: memory.query,
67
68
  similarityPercentage,
68
- purpose: memory.purpose,
69
69
  // Optionnel : ajouter des mĆ©tadonnĆ©es utiles
70
70
  memoryId: memory.id,
71
71
  };
@@ -76,9 +76,9 @@ class CacheMemory {
76
76
  ? matches.slice(0, options.maxResults)
77
77
  : matches;
78
78
  if (results.length > 0) {
79
- console.log("\nāœØ Best matches found:");
79
+ console.log("\nāœØ Similar queries found:");
80
80
  results.forEach((match) => {
81
- console.log(`- ${match.purpose} (${match.similarityPercentage.toFixed(2)}%)`);
81
+ console.log(`- ${match.query} (${match.similarityPercentage.toFixed(2)}%)`);
82
82
  });
83
83
  }
84
84
  else {
@@ -114,19 +114,23 @@ class CacheMemory {
114
114
  return memories;
115
115
  }
116
116
  async createMemory(input) {
117
- const existingPattern = await this.findBestMatches(input.content, {
117
+ console.log("Searching for similar memory", input);
118
+ const existingPattern = await this.findSimilarQueries(input.content, {
118
119
  similarityThreshold: 95,
119
120
  userId: input.userId,
120
121
  scope: input.scope,
121
122
  });
122
123
  if (existingPattern.length > 0) {
123
- console.log("\nšŸ” Similar memory found:");
124
+ console.log("\nSimilar cache memory found:");
124
125
  existingPattern.forEach((match) => {
125
- console.log(`- ${match.purpose} (${match.similarityPercentage.toFixed(2)}%)`);
126
+ console.log(`- ${match.query} (${match.similarityPercentage.toFixed(2)}%)`);
126
127
  });
128
+ console.log("Cache memory already exists. No need to create new one..");
127
129
  return;
128
130
  }
131
+ console.log("No similar memory found");
129
132
  // GĆ©nĆ©rer les variations via GPT-4
133
+ console.log("Generating variations...");
130
134
  const variations = await (0, ai_1.generateObject)({
131
135
  model: (0, openai_1.openai)("gpt-4"),
132
136
  schema: zod_1.z.object({
@@ -134,19 +138,17 @@ class CacheMemory {
134
138
  queries: zod_1.z.array(zod_1.z.object({ text: zod_1.z.string() })),
135
139
  }),
136
140
  prompt: `For this input: "${input.content}"
137
- Generate similar variations that should match the same context.
138
- Context type: ${input.type}
139
- Data: ${JSON.stringify(input.data)}
141
+ Generate similar way to ask the same question.
142
+ Action results: ${JSON.stringify(input.data)}
140
143
  - Keep variations natural and human-like
141
- - Include the original input
142
144
  - Add 3-5 variations`,
143
145
  });
146
+ console.log("Variations generated:", variations.object.queries);
144
147
  await this.createSingleMemory({
145
148
  id: crypto.randomUUID(),
146
149
  content: input.content,
147
150
  type: input.type,
148
151
  data: input.data,
149
- purpose: variations.object.request,
150
152
  userId: input.userId,
151
153
  scope: input.scope,
152
154
  });
@@ -157,7 +159,6 @@ class CacheMemory {
157
159
  content: variation.text,
158
160
  type: input.type,
159
161
  data: input.data,
160
- purpose: variations.object.request,
161
162
  userId: input.userId,
162
163
  scope: input.scope,
163
164
  });
@@ -167,15 +168,17 @@ class CacheMemory {
167
168
  return variations.object.request;
168
169
  }
169
170
  async createSingleMemory(params) {
171
+ console.log("Creating new cache memory...", params.content);
172
+ console.log("Creating embedding...");
170
173
  const { embedding } = await (0, ai_1.embed)({
171
174
  model: openai_1.openai.embedding("text-embedding-3-small"),
172
175
  value: params.content,
173
176
  });
177
+ console.log("Embedding created");
174
178
  const memory = {
175
179
  id: params.id,
176
180
  type: params.type,
177
181
  data: params.data,
178
- purpose: params.purpose,
179
182
  query: params.content,
180
183
  embedding,
181
184
  userId: params.userId,
@@ -28,7 +28,6 @@ class PersistentMemory {
28
28
  */
29
29
  async _makeRequest(path, options = {}) {
30
30
  const url = `${this.host}${path}`;
31
- console.log("Making request to:", url);
32
31
  const response = await fetch(url, {
33
32
  ...options,
34
33
  headers: {
@@ -122,7 +121,7 @@ class PersistentMemory {
122
121
  * Find best matching memories
123
122
  */
124
123
  async searchSimilarQueries(query, options = {}) {
125
- console.log("\nšŸ” Searching in persistent memory:", query);
124
+ console.log("\nSearching in persistent memory:", query);
126
125
  // Generate embedding for the query
127
126
  const { embedding: queryEmbedding } = await (0, ai_1.embed)({
128
127
  model: openai_1.openai.embedding("text-embedding-3-small"),
@@ -162,7 +161,7 @@ class PersistentMemory {
162
161
  searchResults.push(...userResults.hits);
163
162
  }
164
163
  }
165
- console.log("Found in persistent memory:", searchResults);
164
+ console.log(`šŸ“š Found ${searchResults.length} queries in persistent memory`);
166
165
  // Process and filter results using cosine similarity
167
166
  const results = searchResults
168
167
  .flatMap((hit) => {
@@ -183,7 +182,7 @@ class PersistentMemory {
183
182
  .sort((a, b) => b.similarityPercentage - a.similarityPercentage);
184
183
  // Log results
185
184
  if (results.length > 0) {
186
- console.log("\nāœØ Best matches found:");
185
+ console.log("\nāœØ Similar queries found:");
187
186
  results.forEach((match) => {
188
187
  console.log(`- ${match.query} : ${match.similarityPercentage.toFixed(2)}% (${match.purpose})`);
189
188
  console.log(` Matching content: "${match.chunk}"`);
@@ -44,6 +44,7 @@ class ActionQueueManager {
44
44
  continue;
45
45
  }
46
46
  }
47
+ const parameters = this.formatArguments(action.parameters);
47
48
  actionPromises.push(this.executeAction(action)
48
49
  .then((result) => {
49
50
  this.callbacks.onActionComplete?.(result);
@@ -52,7 +53,7 @@ class ActionQueueManager {
52
53
  .catch((error) => {
53
54
  const result = {
54
55
  name: action.name,
55
- parameters: this.formatArguments(action.parameters),
56
+ parameters,
56
57
  result: null,
57
58
  error: error.message || "Unknown error occurred",
58
59
  };
@@ -76,7 +77,23 @@ class ActionQueueManager {
76
77
  }
77
78
  formatArguments(args) {
78
79
  return args.reduce((acc, arg) => {
79
- acc[arg.name] = arg.value;
80
+ try {
81
+ // Parse the JSON string if the value is a stringified JSON object
82
+ const parsedValue = JSON.parse(arg.value);
83
+ if (parsedValue &&
84
+ typeof parsedValue === "object" &&
85
+ "value" in parsedValue) {
86
+ acc[parsedValue.name] = parsedValue.value;
87
+ }
88
+ else {
89
+ // Fallback to original value if not in expected format
90
+ acc[arg.name] = arg.value;
91
+ }
92
+ }
93
+ catch {
94
+ // If JSON parsing fails, use the original value
95
+ acc[arg.name] = arg.value;
96
+ }
80
97
  return acc;
81
98
  }, {});
82
99
  }
@@ -92,10 +109,7 @@ class ActionQueueManager {
92
109
  error: `Action '${action.name}' not found in actions list`,
93
110
  };
94
111
  }
95
- const actionArgs = action.parameters.reduce((acc, arg) => {
96
- acc[arg.name] = arg.value;
97
- return acc;
98
- }, {});
112
+ const actionArgs = this.formatArguments(action.parameters);
99
113
  try {
100
114
  const result = await actionConfig.execute(actionArgs);
101
115
  const actionResult = {
@@ -104,8 +118,7 @@ class ActionQueueManager {
104
118
  result,
105
119
  error: null,
106
120
  };
107
- console.log("Action executed successfully: ", action.name);
108
- console.dir(actionResult, { depth: null });
121
+ console.log("Action executed successfully: ", action.name, "šŸŽ‰");
109
122
  return actionResult;
110
123
  }
111
124
  catch (error) {
package/dist/t.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ export interface NetworkConfig {
2
+ name: string;
3
+ id?: number;
4
+ rpc: string;
5
+ explorerUrl: string;
6
+ nativeToken: string;
7
+ }
8
+ export declare const networkConfigs: Record<string, NetworkConfig>;
9
+ export declare const getNetworkProvider: (networkName: string) => {
10
+ config: NetworkConfig;
11
+ };
12
+ import { z } from "zod";
13
+ export type TransactionPrepared = {
14
+ to: string;
15
+ value: string;
16
+ data?: string;
17
+ chain: {
18
+ id: number;
19
+ rpc: string;
20
+ };
21
+ type: "transfer" | "approve" | "swap";
22
+ method?: string;
23
+ params?: any[];
24
+ };
25
+ export declare const prepareEvmTransaction: {
26
+ name: string;
27
+ description: string;
28
+ parameters: z.ZodObject<{
29
+ walletAddress: z.ZodString;
30
+ amount: z.ZodString;
31
+ network: z.ZodString;
32
+ }, "strip", z.ZodTypeAny, {
33
+ walletAddress: string;
34
+ amount: string;
35
+ network: string;
36
+ }, {
37
+ walletAddress: string;
38
+ amount: string;
39
+ network: string;
40
+ }>;
41
+ execute: ({ walletAddress, amount, network, }: {
42
+ walletAddress: string;
43
+ amount: string;
44
+ network: string;
45
+ }) => Promise<TransactionPrepared>;
46
+ };
package/dist/t.js ADDED
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareEvmTransaction = exports.getNetworkProvider = exports.networkConfigs = void 0;
4
+ exports.networkConfigs = {
5
+ ethereum: {
6
+ name: "Ethereum Mainnet",
7
+ id: 1,
8
+ rpc: "https://eth.llamarpc.com",
9
+ explorerUrl: "https://etherscan.io",
10
+ nativeToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
11
+ },
12
+ polygon: {
13
+ name: "Polygon Mainnet",
14
+ id: 137,
15
+ rpc: "https://polygon.llamarpc.com",
16
+ explorerUrl: "https://polygonscan.com",
17
+ nativeToken: "0x0000000000000000000000000000000000001010",
18
+ },
19
+ arbitrum: {
20
+ name: "Arbitrum Mainnet",
21
+ id: 42161,
22
+ rpc: "https://arbitrum.llamarpc.com",
23
+ explorerUrl: "https://arbiscan.io",
24
+ nativeToken: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
25
+ },
26
+ base: {
27
+ name: "Base Mainnet",
28
+ id: 8453,
29
+ rpc: "https://base.llamarpc.com",
30
+ explorerUrl: "https://basescan.org",
31
+ nativeToken: "0x4200000000000000000000000000000000000006",
32
+ },
33
+ solana: {
34
+ name: "Solana Mainnet",
35
+ rpc: "https://api.mainnet-beta.solana.com",
36
+ explorerUrl: "https://solscan.io",
37
+ nativeToken: "So11111111111111111111111111111111111111112",
38
+ },
39
+ sepolia: {
40
+ name: "Sepolia Testnet",
41
+ id: 11155111,
42
+ rpc: "https://sepolia.llamarpc.com",
43
+ explorerUrl: "https://sepolia.etherscan.io",
44
+ nativeToken: "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14",
45
+ },
46
+ baseSepolia: {
47
+ name: "Base Sepolia Testnet",
48
+ id: 84532,
49
+ rpc: "https://base-sepolia-rpc.publicnode.com",
50
+ explorerUrl: "https://sepolia.basescan.org",
51
+ nativeToken: "0x4200000000000000000000000000000000000006",
52
+ },
53
+ };
54
+ const getNetworkProvider = (networkName) => {
55
+ const config = exports.networkConfigs[networkName.toLowerCase()];
56
+ if (!config) {
57
+ throw new Error(`Network ${networkName} not supported`);
58
+ }
59
+ return { config };
60
+ };
61
+ exports.getNetworkProvider = getNetworkProvider;
62
+ const ethers_1 = require("ethers");
63
+ const zod_1 = require("zod");
64
+ exports.prepareEvmTransaction = {
65
+ name: "prepare-evm-transaction",
66
+ description: "Prepare a transaction for the user to sign.",
67
+ parameters: zod_1.z.object({
68
+ walletAddress: zod_1.z.string(),
69
+ amount: zod_1.z
70
+ .string()
71
+ .describe("Ask the user for the amount to send, if not specified"),
72
+ network: zod_1.z
73
+ .string()
74
+ .describe("Examples networks: ethereum, arbitrum, base. IMPORTANT: You must respect the network name."),
75
+ }),
76
+ execute: async ({ walletAddress, amount, network, }) => {
77
+ try {
78
+ console.log("šŸ’° Preparing transaction", {
79
+ to: walletAddress,
80
+ amount,
81
+ network,
82
+ });
83
+ const networkConfig = exports.networkConfigs[network.toLowerCase()];
84
+ if (!networkConfig) {
85
+ throw new Error(`Network ${network} not found`);
86
+ }
87
+ return {
88
+ to: walletAddress,
89
+ value: (0, ethers_1.parseEther)(amount).toString(),
90
+ chain: {
91
+ id: networkConfig.id || 0,
92
+ rpc: networkConfig.rpc,
93
+ },
94
+ type: "transfer",
95
+ };
96
+ }
97
+ catch (error) {
98
+ console.error("šŸ’° Error sending transaction:", error);
99
+ throw new Error("An error occurred while sending the transaction");
100
+ }
101
+ },
102
+ };
package/dist/test.js CHANGED
@@ -8,6 +8,7 @@ const rss_parser_1 = __importDefault(require("rss-parser"));
8
8
  const zod_1 = require("zod");
9
9
  const agent_1 = require("./agent");
10
10
  const orchestrator_1 = require("./llm/orchestrator");
11
+ const cache_1 = require("./memory/cache");
11
12
  const persistent_1 = require("./memory/persistent");
12
13
  exports.getChainsTVL = {
13
14
  name: "get_chains_tvl",
@@ -103,25 +104,32 @@ exports.getRssNews = {
103
104
  },
104
105
  };
105
106
  (async () => {
107
+ const cacheMemory = new cache_1.CacheMemory();
106
108
  const memory = new persistent_1.PersistentMemory({
107
109
  host: "http://localhost:7700",
108
110
  apiKey: "aSampleMasterKey",
109
111
  });
110
- const orchestrator = new orchestrator_1.Orchestrator([], memory);
112
+ const orchestrator = new orchestrator_1.Orchestrator([exports.getRssNews, exports.getChainsTVL], memory);
111
113
  const agent = new agent_1.Agent({
112
114
  user: {
113
115
  id: "1",
114
116
  },
115
117
  orchestrator,
118
+ cacheMemory,
116
119
  persistentMemory: memory,
117
120
  stream: false,
118
121
  maxEvaluatorIteration: 1,
119
122
  });
120
- const prompt = "fais moi une analyse ethereum";
123
+ const prompt = "fais moi une analyse de xrp";
121
124
  const context = prompt;
122
- const result = await agent.process(prompt, context, {
123
- onMessage: (message) => {
124
- console.log({ message });
125
- },
126
- });
125
+ // const save = await cacheMemory.createMemory({
126
+ // content: prompt,
127
+ // data: [],
128
+ // scope: MemoryScope.GLOBAL,
129
+ // type: MemoryType.ACTION,
130
+ // });
131
+ // console.log({ save });
132
+ // const memo = await cacheMemory.getAllMemories();
133
+ // console.log({ memo });
134
+ const result = await agent.process(prompt, context, {});
127
135
  })();
package/dist/types.d.ts CHANGED
@@ -99,9 +99,9 @@ export interface CacheMemoryOptions {
99
99
  cachePrefix?: string;
100
100
  }
101
101
  export interface CreateMemoryInput {
102
- content: string;
102
+ content: any;
103
103
  type: MemoryType;
104
- data: any;
104
+ data: ActionSchema[];
105
105
  userId?: string;
106
106
  scope?: MemoryScope;
107
107
  }
@@ -109,7 +109,6 @@ export interface CacheMemoryType {
109
109
  id: string;
110
110
  type: MemoryType;
111
111
  data: any;
112
- purpose: string;
113
112
  query: string;
114
113
  embedding: Embedding;
115
114
  userId?: string;
@@ -5,7 +5,7 @@ const injectActions = (actions) => {
5
5
  return actions.map((action) => {
6
6
  const parameters = action.parameters;
7
7
  const schemaShape = Object.keys(parameters._def.shape()).join(", ");
8
- const actionString = `Name: ${action.name}, Description: ${action.description}, Arguments: { ${schemaShape} }`;
8
+ const actionString = `Name: ${action.name}, Description: ${action.description}, Arguments (STRICTLY REQUIRED): { ${schemaShape} }`;
9
9
  return actionString;
10
10
  });
11
11
  };
package/index.ts CHANGED
@@ -2,7 +2,6 @@ export * from "./agent";
2
2
  export * from "./llm/orchestrator";
3
3
  export * from "./llm/synthesizer";
4
4
 
5
- export * from "./services/queue";
6
5
  export * from "./types";
7
6
 
8
7
  export * from "./memory/cache";
@@ -6,7 +6,7 @@ export const orchestratorContext = {
6
6
  guidelines: {
7
7
  important: [
8
8
  "If there is no action to do, you must answer in the 'answer' field.",
9
- "If some parameters are not clear or missing, YOU MUST ask the user for them.",
9
+ "If some parameters are not clear or missing, don't add the action, YOU MUST ask the user for them.",
10
10
  "ALWAYS use the same language as user request. (If it's English, use English, if it's French, use French, etc.)",
11
11
  "For QUESTIONS or ANALYSIS, BEFORE executing ANY actions, you MUST search in memory for similar queries AS THE ONLY ACTION TO EXECUTE.",
12
12
  ],
@@ -1,9 +1,8 @@
1
1
  import { openai } from "@ai-sdk/openai";
2
2
  import { generateObject } from "ai";
3
3
  import { z } from "zod";
4
- import { CacheMemory } from "../../memory/cache";
5
4
  import { PersistentMemory } from "../../memory/persistent";
6
- import { ActionSchema, BaseLLM } from "../../types";
5
+ import { ActionSchema, BaseLLM, MemoryScopeType } from "../../types";
7
6
  import { orchestratorContext } from "./context";
8
7
 
9
8
  export class Orchestrator implements BaseLLM {
@@ -21,8 +20,44 @@ export class Orchestrator implements BaseLLM {
21
20
  parameters: z.object({
22
21
  query: z.string(),
23
22
  }),
24
- execute: async (params) => {
25
- const memories = await this.memory.searchSimilarQueries(params.value);
23
+ execute: async ({ query }: { query: string }) => {
24
+ const memories = await this.memory.searchSimilarQueries(query);
25
+ return memories;
26
+ },
27
+ },
28
+ {
29
+ name: "save_memory",
30
+ description: "Save a query in the internal knowledge base",
31
+ parameters: z.object({
32
+ query: z.string(),
33
+ purpose: z.string(),
34
+ data: z.any(),
35
+ scope: z.enum(["GLOBAL", "USER"]),
36
+ userId: z.string().optional(),
37
+ whyStored: z.string(),
38
+ }),
39
+ execute: async ({
40
+ query,
41
+ purpose,
42
+ data,
43
+ scope,
44
+ userId,
45
+ }: {
46
+ query: string;
47
+ purpose: string;
48
+ data: any;
49
+ scope: MemoryScopeType;
50
+ userId?: string;
51
+ }) => {
52
+ const memories = await this.memory.storeMemory({
53
+ query,
54
+ purpose,
55
+ data,
56
+ scope,
57
+ userId,
58
+ createdAt: new Date(),
59
+ id: crypto.randomUUID(),
60
+ });
26
61
  return memories;
27
62
  },
28
63
  },
@@ -37,10 +72,12 @@ export class Orchestrator implements BaseLLM {
37
72
  actions: z.array(
38
73
  z.object({
39
74
  name: z.string(),
40
- parameters: z.object({
41
- name: z.string(),
42
- value: z.string(),
43
- }),
75
+ parameters: z.array(
76
+ z.object({
77
+ name: z.string(),
78
+ value: z.string(),
79
+ })
80
+ ),
44
81
  })
45
82
  ),
46
83
  answer: z.string(),