@ai.ntellect/core 0.1.81 → 0.1.84

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. package/README.FR.md +31 -60
  2. package/README.md +74 -96
  3. package/agent/handlers/ActionHandler.ts +1 -1
  4. package/agent/index.ts +85 -43
  5. package/dist/agent/index.d.ts +1 -1
  6. package/dist/agent/index.js +61 -33
  7. package/dist/index.d.ts +0 -1
  8. package/dist/index.js +0 -1
  9. package/dist/llm/evaluator/context.js +3 -5
  10. package/dist/llm/evaluator/index.js +25 -29
  11. package/dist/llm/orchestrator/context.js +1 -1
  12. package/dist/llm/orchestrator/index.js +30 -9
  13. package/dist/llm/synthesizer/index.d.ts +1 -5
  14. package/dist/llm/synthesizer/index.js +1 -5
  15. package/dist/memory/cache.d.ts +5 -5
  16. package/dist/memory/cache.js +19 -49
  17. package/dist/memory/persistent.d.ts +1 -1
  18. package/dist/memory/persistent.js +5 -6
  19. package/dist/services/queue.js +21 -8
  20. package/dist/t.d.ts +46 -0
  21. package/dist/t.js +102 -0
  22. package/dist/test.d.ts +68 -0
  23. package/dist/test.js +167 -0
  24. package/dist/types.d.ts +27 -3
  25. package/dist/types.js +9 -1
  26. package/dist/utils/inject-actions.js +1 -1
  27. package/dist/utils/queue-item-transformer.d.ts +2 -2
  28. package/dist/utils/queue-item-transformer.js +5 -6
  29. package/dist/utils/sanitize-results.d.ts +17 -0
  30. package/dist/utils/sanitize-results.js +60 -0
  31. package/index.ts +0 -1
  32. package/llm/evaluator/context.ts +3 -5
  33. package/llm/evaluator/index.ts +25 -31
  34. package/llm/orchestrator/context.ts +1 -1
  35. package/llm/orchestrator/index.ts +42 -13
  36. package/llm/synthesizer/index.ts +2 -10
  37. package/memory/cache.ts +23 -61
  38. package/memory/persistent.ts +7 -6
  39. package/package.json +3 -1
  40. package/services/queue.ts +21 -12
  41. package/t.ts +133 -0
  42. package/types.ts +14 -3
  43. package/utils/inject-actions.ts +1 -1
  44. package/utils/queue-item-transformer.ts +25 -11
  45. package/utils/sanitize-results.ts +66 -0
@@ -5,12 +5,14 @@ const evaluator_1 = require("../llm/evaluator");
5
5
  const synthesizer_1 = require("../llm/synthesizer");
6
6
  const types_1 = require("../types");
7
7
  const queue_item_transformer_1 = require("../utils/queue-item-transformer");
8
+ const sanitize_results_1 = require("../utils/sanitize-results");
8
9
  const ActionHandler_1 = require("./handlers/ActionHandler");
9
10
  class Agent {
10
11
  constructor({ user, orchestrator, persistentMemory, cacheMemory, stream, maxEvaluatorIteration = 1, }) {
11
12
  this.SIMILARITY_THRESHOLD = 95;
12
13
  this.MAX_RESULTS = 1;
13
14
  this.evaluatorIteration = 0;
15
+ this.accumulatedResults = [];
14
16
  this.user = user;
15
17
  this.orchestrator = orchestrator;
16
18
  this.cacheMemory = cacheMemory;
@@ -18,21 +20,40 @@ class Agent {
18
20
  this.stream = stream;
19
21
  this.maxEvaluatorIteration = maxEvaluatorIteration;
20
22
  this.actionHandler = new ActionHandler_1.ActionHandler();
23
+ this.accumulatedResults = [];
21
24
  }
22
25
  async process(prompt, contextualizedPrompt, events) {
23
- const request = await this.orchestrator.process(contextualizedPrompt);
24
- events.onMessage?.(request);
25
- if (request.actions.length > 0) {
26
- return this.handleActions({
26
+ let actions = undefined;
27
+ let isSimilar = false;
28
+ if (this.cacheMemory) {
29
+ const similarActions = await this.cacheMemory.findSimilarQueries(prompt, {
30
+ similarityThreshold: this.SIMILARITY_THRESHOLD,
31
+ maxResults: this.MAX_RESULTS,
32
+ userId: this.user.id,
33
+ scope: types_1.MemoryScope.GLOBAL,
34
+ });
35
+ if (similarActions.length > 0) {
36
+ actions = queue_item_transformer_1.QueueItemTransformer.transformActionsToQueueItems(similarActions[0].data);
37
+ isSimilar = true;
38
+ }
39
+ }
40
+ if (!actions?.length && !isSimilar) {
41
+ console.log("No similar actions found in cache for query: ", prompt);
42
+ console.log("Requesting orchestrator for actions..");
43
+ const request = await this.orchestrator.process(contextualizedPrompt);
44
+ events.onMessage?.(request);
45
+ actions = request.actions;
46
+ }
47
+ return actions && actions.length > 0
48
+ ? this.handleActions({
27
49
  initialPrompt: prompt,
28
50
  contextualizedPrompt: contextualizedPrompt,
29
- actions: request.actions,
30
- }, events);
31
- }
51
+ actions: actions,
52
+ }, events)
53
+ : undefined;
32
54
  }
33
55
  async handleActions({ initialPrompt, contextualizedPrompt, actions, }, events) {
34
- const similarActions = await this.findSimilarActions(initialPrompt);
35
- const queueItems = this.transformActions(actions, similarActions);
56
+ const queueItems = this.transformActions(actions);
36
57
  const actionsResult = await this.actionHandler.executeActions(queueItems, this.orchestrator.tools, {
37
58
  onQueueStart: events.onQueueStart,
38
59
  onActionStart: events.onActionStart,
@@ -40,55 +61,62 @@ class Agent {
40
61
  onQueueComplete: events.onQueueComplete,
41
62
  onConfirmationRequired: events.onConfirmationRequired,
42
63
  });
64
+ this.accumulatedResults = [
65
+ ...this.accumulatedResults,
66
+ ...actionsResult.data,
67
+ ];
43
68
  if (this.evaluatorIteration >= this.maxEvaluatorIteration) {
44
- return this.handleActionResults({ ...actionsResult, initialPrompt });
69
+ return this.handleActionResults({
70
+ data: this.accumulatedResults,
71
+ initialPrompt,
72
+ });
45
73
  }
46
74
  const evaluator = new evaluator_1.Evaluator(this.orchestrator.tools, this.persistentMemory);
47
- const evaluation = await evaluator.process(initialPrompt, contextualizedPrompt, JSON.stringify(actionsResult.data));
75
+ console.log("Accumulated results:");
76
+ console.dir(this.accumulatedResults, { depth: null });
77
+ const sanitizedResults = sanitize_results_1.ResultSanitizer.sanitize(this.accumulatedResults);
78
+ const evaluation = await evaluator.process(initialPrompt, contextualizedPrompt, sanitizedResults);
48
79
  events.onMessage?.(evaluation);
49
- if (evaluation.nextActions.length > 0) {
80
+ if (evaluation.isNextActionNeeded) {
50
81
  this.evaluatorIteration++;
51
82
  return this.handleActions({
52
83
  initialPrompt: contextualizedPrompt,
53
84
  contextualizedPrompt: initialPrompt,
54
- actions: evaluation.nextActions,
85
+ actions: evaluation.nextActionsNeeded,
55
86
  }, events);
56
87
  }
57
- if (!this.actionHandler.hasNonPrepareActions(actionsResult.data)) {
88
+ if (!this.actionHandler.hasNonPrepareActions(this.accumulatedResults)) {
58
89
  return {
59
- data: actionsResult.data,
90
+ data: this.accumulatedResults,
60
91
  initialPrompt,
61
92
  };
62
93
  }
63
- return this.handleActionResults({ ...actionsResult, initialPrompt });
94
+ return this.handleActionResults({
95
+ data: this.accumulatedResults,
96
+ initialPrompt,
97
+ });
64
98
  }
65
99
  async handleActionResults(actionsResult) {
66
100
  const synthesizer = new synthesizer_1.Synthesizer();
101
+ const sanitizedResults = sanitize_results_1.ResultSanitizer.sanitize(this.accumulatedResults);
67
102
  const summaryData = JSON.stringify({
68
- result: actionsResult.data,
103
+ result: sanitizedResults,
69
104
  initialPrompt: actionsResult.initialPrompt,
70
105
  });
106
+ this.accumulatedResults = [];
107
+ this.evaluatorIteration = 0;
108
+ await this.cacheMemory?.createMemory({
109
+ content: actionsResult.initialPrompt,
110
+ data: actionsResult.data,
111
+ scope: types_1.MemoryScope.GLOBAL,
112
+ type: types_1.MemoryType.ACTION,
113
+ });
71
114
  return this.stream
72
115
  ? (await synthesizer.streamProcess(summaryData)).toDataStreamResponse()
73
116
  : await synthesizer.process(summaryData);
74
117
  }
75
- async findSimilarActions(prompt) {
76
- if (!this.cacheMemory) {
77
- return [];
78
- }
79
- return this.cacheMemory.findBestMatches(prompt, {
80
- similarityThreshold: this.SIMILARITY_THRESHOLD,
81
- maxResults: this.MAX_RESULTS,
82
- userId: this.user.id,
83
- scope: types_1.MemoryScope.USER,
84
- });
85
- }
86
- transformActions(actions, similarActions) {
118
+ transformActions(actions) {
87
119
  let predefinedActions = queue_item_transformer_1.QueueItemTransformer.transformActionsToQueueItems(actions) || [];
88
- if (similarActions?.length > 0) {
89
- predefinedActions =
90
- queue_item_transformer_1.QueueItemTransformer.transformFromSimilarActions(similarActions) || [];
91
- }
92
120
  return predefinedActions;
93
121
  }
94
122
  }
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from "./agent";
2
2
  export * from "./llm/orchestrator";
3
3
  export * from "./llm/synthesizer";
4
- export * from "./services/queue";
5
4
  export * from "./types";
6
5
  export * from "./memory/cache";
7
6
  export * from "./memory/persistent";
package/dist/index.js CHANGED
@@ -17,7 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./agent"), exports);
18
18
  __exportStar(require("./llm/orchestrator"), exports);
19
19
  __exportStar(require("./llm/synthesizer"), exports);
20
- __exportStar(require("./services/queue"), exports);
21
20
  __exportStar(require("./types"), exports);
22
21
  __exportStar(require("./memory/cache"), exports);
23
22
  __exportStar(require("./memory/persistent"), exports);
@@ -9,7 +9,7 @@ exports.evaluatorContext = {
9
9
  "Verify if all required actions were executed successfully",
10
10
  "Check if the results match the initial goal",
11
11
  "Identify any missing or incomplete information",
12
- "Examples of relavant information: link symbol to token address, name to wallet, etc.",
12
+ "Extra and relevant information they don't have be stored in the memory: link symbol to token address, name to wallet, etc.",
13
13
  ],
14
14
  warnings: [
15
15
  "NEVER modify the results directly",
@@ -31,10 +31,8 @@ exports.evaluatorContext = {
31
31
  1. Success status with explanation (no action needed)
32
32
  2. Next actions needed (if any)
33
33
  3. Why you are doing the next actions or why you are not doing them
34
- 4. Extract relevant information to remember. No need to remember specific numbers.
35
- 5. If there are no important results, let importantToRemembers be empty. No need to say something like "No relevant information found".
36
- 6. For each facts, generate a hypothetical query to search in the persistent memory.
37
- 7. For each facts, generate a memoryType (You have 3 memory types: episodic, semantic, procedural)
34
+ 4. Extract relevant information to remember
35
+ 5. For each facts, generate a memoryType (3 memory types: episodic, semantic, procedural)
38
36
  `;
39
37
  },
40
38
  };
@@ -17,35 +17,31 @@ class Evaluator {
17
17
  const response = await (0, ai_1.generateObject)({
18
18
  model: this.model,
19
19
  schema: zod_1.z.object({
20
- nextActions: zod_1.z.array(zod_1.z.object({
21
- name: zod_1.z.string(),
22
- parameters: zod_1.z.object({
23
- name: zod_1.z.string(),
24
- value: zod_1.z.string(),
25
- }),
26
- })),
27
- why: zod_1.z.string(),
28
- isImportantToRemember: zod_1.z.boolean(),
29
- importantToRemembers: zod_1.z.array(zod_1.z.object({
20
+ isRemindNeeded: zod_1.z.boolean(),
21
+ extraInformationsToRemember: zod_1.z.array(zod_1.z.object({
30
22
  memoryType: zod_1.z.string(),
31
- hypotheticalQuery: zod_1.z.string(),
32
- result: zod_1.z.string(),
23
+ content: zod_1.z.string(),
24
+ data: zod_1.z.string(),
33
25
  })),
26
+ response: zod_1.z.string(),
27
+ isNextActionNeeded: zod_1.z.boolean(),
28
+ nextActionsNeeded: types_1.ActionSchema,
29
+ why: zod_1.z.string(),
34
30
  }),
35
31
  prompt: prompt,
36
32
  system: context_1.evaluatorContext.compose(goal, results, this.tools),
37
33
  });
38
34
  const validatedResponse = {
39
35
  ...response.object,
40
- nextActions: response.object.nextActions.map((action) => ({
36
+ nextActions: response.object.nextActionsNeeded.map((action) => ({
41
37
  ...action,
42
38
  parameters: action.parameters || {},
43
39
  })),
44
40
  };
45
- if (validatedResponse.isImportantToRemember) {
46
- for (const item of validatedResponse.importantToRemembers) {
41
+ if (validatedResponse.isRemindNeeded) {
42
+ for (const item of validatedResponse.extraInformationsToRemember) {
47
43
  // Check if the item is already in the memory
48
- const memories = await this.memory.searchSimilarQueries(item.hypotheticalQuery, {
44
+ const memories = await this.memory.searchSimilarQueries(item.content, {
49
45
  similarityThreshold: 95,
50
46
  });
51
47
  if (memories.length > 0) {
@@ -56,14 +52,14 @@ class Evaluator {
56
52
  }
57
53
  if (memories.length === 0) {
58
54
  console.log("Adding to memory", {
59
- query: item.hypotheticalQuery,
60
- data: item.result,
55
+ query: item.content,
56
+ data: item.data,
61
57
  });
62
- await this.memory.storeMemory({
58
+ await this.memory.createMemory({
63
59
  id: crypto.randomUUID(),
64
60
  purpose: item.memoryType,
65
- query: item.hypotheticalQuery,
66
- data: item.result,
61
+ query: item.content,
62
+ data: item.data,
67
63
  scope: types_1.MemoryScope.GLOBAL,
68
64
  createdAt: new Date(),
69
65
  });
@@ -79,20 +75,20 @@ class Evaluator {
79
75
  console.log("Evaluator error");
80
76
  console.dir(error.value, { depth: null });
81
77
  console.error(error.message);
82
- if (error.value.importantToRemembers.length > 0) {
83
- for (const item of error.value.importantToRemembers) {
78
+ if (error.value.extraInformationsToRemember.length > 0) {
79
+ for (const item of error.value.extraInformationsToRemember) {
84
80
  // Check if the item is already in the memory
85
- const memories = await this.memory.searchSimilarQueries(item.hypotheticalQuery);
81
+ const memories = await this.memory.searchSimilarQueries(item.content);
86
82
  if (memories.length === 0) {
87
83
  console.log("Adding to memory", {
88
- query: item.hypotheticalQuery,
89
- data: item.result,
84
+ query: item.content,
85
+ data: item.data,
90
86
  });
91
- await this.memory.storeMemory({
87
+ await this.memory.createMemory({
92
88
  id: crypto.randomUUID(),
93
89
  purpose: "importantToRemember",
94
- query: item.hypotheticalQuery,
95
- data: item.result,
90
+ query: item.content,
91
+ data: item.data,
96
92
  scope: types_1.MemoryScope.USER,
97
93
  createdAt: new Date(),
98
94
  });
@@ -7,7 +7,7 @@ exports.orchestratorContext = {
7
7
  guidelines: {
8
8
  important: [
9
9
  "If there is no action to do, you must answer in the 'answer' field.",
10
- "If some parameters are not clear or missing, YOU MUST ask the user for them.",
10
+ "If some parameters are not clear or missing, don't add the action, YOU MUST ask the user for them.",
11
11
  "ALWAYS use the same language as user request. (If it's English, use English, if it's French, use French, etc.)",
12
12
  "For QUESTIONS or ANALYSIS, BEFORE executing ANY actions, you MUST search in memory for similar queries AS THE ONLY ACTION TO EXECUTE.",
13
13
  ],
@@ -4,6 +4,7 @@ exports.Orchestrator = void 0;
4
4
  const openai_1 = require("@ai-sdk/openai");
5
5
  const ai_1 = require("ai");
6
6
  const zod_1 = require("zod");
7
+ const types_1 = require("../../types");
7
8
  const context_1 = require("./context");
8
9
  class Orchestrator {
9
10
  constructor(tools, memory) {
@@ -17,8 +18,34 @@ class Orchestrator {
17
18
  parameters: zod_1.z.object({
18
19
  query: zod_1.z.string(),
19
20
  }),
20
- execute: async (params) => {
21
- const memories = await this.memory.searchSimilarQueries(params.value);
21
+ execute: async ({ query }) => {
22
+ const memories = await this.memory.searchSimilarQueries(query, {
23
+ similarityThreshold: 95,
24
+ });
25
+ return memories;
26
+ },
27
+ },
28
+ {
29
+ name: "save_memory",
30
+ description: "Save relevant information in the internal knowledge base",
31
+ parameters: zod_1.z.object({
32
+ query: zod_1.z.string(),
33
+ memoryType: zod_1.z.string(),
34
+ data: zod_1.z.any(),
35
+ scope: zod_1.z.string().default("GLOBAL").describe("GLOBAL or USER"),
36
+ userId: zod_1.z.string(),
37
+ whyStored: zod_1.z.string(),
38
+ }),
39
+ execute: async ({ query, purpose, data, scope, userId, }) => {
40
+ const memories = await this.memory.createMemory({
41
+ query,
42
+ purpose,
43
+ data,
44
+ scope,
45
+ userId,
46
+ createdAt: new Date(),
47
+ id: crypto.randomUUID(),
48
+ });
22
49
  return memories;
23
50
  },
24
51
  },
@@ -29,13 +56,7 @@ class Orchestrator {
29
56
  const response = await (0, ai_1.generateObject)({
30
57
  model: this.model,
31
58
  schema: zod_1.z.object({
32
- actions: zod_1.z.array(zod_1.z.object({
33
- name: zod_1.z.string(),
34
- parameters: zod_1.z.object({
35
- name: zod_1.z.string(),
36
- value: zod_1.z.string(),
37
- }),
38
- })),
59
+ actions: types_1.ActionSchema,
39
60
  answer: zod_1.z.string(),
40
61
  }),
41
62
  prompt: prompt,
@@ -5,11 +5,7 @@ export declare class Synthesizer implements BaseLLM {
5
5
  process(prompt: string, onFinish?: (event: any) => void): Promise<{
6
6
  actions: {
7
7
  name: string;
8
- relevantResult: string;
9
- explain: {
10
- how: string;
11
- why: string;
12
- };
8
+ reasoning: string;
13
9
  }[];
14
10
  response: string;
15
11
  } | StreamTextResult<Record<string, any>>>;
@@ -16,11 +16,7 @@ class Synthesizer {
16
16
  schema: zod_1.z.object({
17
17
  actions: zod_1.z.array(zod_1.z.object({
18
18
  name: zod_1.z.string(),
19
- relevantResult: zod_1.z.string(),
20
- explain: zod_1.z.object({
21
- how: zod_1.z.string(),
22
- why: zod_1.z.string(),
23
- }),
19
+ reasoning: zod_1.z.string(),
24
20
  })),
25
21
  response: zod_1.z.string(),
26
22
  }),
@@ -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,16 +7,16 @@ 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
- createMemory(input: CreateMemoryInput): Promise<string | undefined>;
20
+ createMemory(input: CreateMemoryInput): Promise<CacheMemoryType | undefined>;
21
21
  private createSingleMemory;
22
22
  }
@@ -4,7 +4,6 @@ exports.CacheMemory = void 0;
4
4
  const openai_1 = require("@ai-sdk/openai");
5
5
  const ai_1 = require("ai");
6
6
  const redis_1 = require("redis");
7
- const zod_1 = require("zod");
8
7
  const types_1 = require("../types");
9
8
  class CacheMemory {
10
9
  constructor(options = {}) {
@@ -43,30 +42,27 @@ class CacheMemory {
43
42
  async storeMemory(memory) {
44
43
  const prefix = this.getMemoryKey(memory.scope, memory.userId);
45
44
  const key = `${prefix}${memory.id}`;
46
- await this.redis.set(key, JSON.stringify(memory), {
45
+ const result = await this.redis.set(key, JSON.stringify(memory), {
47
46
  EX: this.CACHE_TTL,
48
47
  });
48
+ console.log("Cache memory created: ", result);
49
49
  }
50
- async findBestMatches(query, options = {}) {
51
- console.log("\n🔍 Searching in cache for query:", query);
50
+ async findSimilarQueries(query, options = {}) {
51
+ console.log("\nSearching in cache for query:", query);
52
52
  const { embedding } = await (0, ai_1.embed)({
53
53
  model: openai_1.openai.embedding("text-embedding-3-small"),
54
54
  value: query,
55
55
  });
56
56
  const memories = await this.getAllMemories(options.scope, options.userId);
57
- console.log("\n📚 Found", memories.length, "memories to compare with");
57
+ console.log("\n📚 Found", memories.length, "queries to compare with");
58
58
  const matches = memories
59
59
  .map((memory) => {
60
60
  const similarity = (0, ai_1.cosineSimilarity)(embedding, memory.embedding);
61
61
  const similarityPercentage = (similarity + 1) * 50; // Conversion en pourcentage
62
- console.log(`\n📊 Memory "${memory.purpose}":
63
- - Similarity: ${similarityPercentage.toFixed(2)}%
64
- - Query: ${memory.query}`);
65
62
  return {
66
63
  data: memory.data,
64
+ query: memory.query,
67
65
  similarityPercentage,
68
- purpose: memory.purpose,
69
- // Optionnel : ajouter des métadonnées utiles
70
66
  memoryId: memory.id,
71
67
  };
72
68
  })
@@ -76,15 +72,14 @@ class CacheMemory {
76
72
  ? matches.slice(0, options.maxResults)
77
73
  : matches;
78
74
  if (results.length > 0) {
79
- console.log("\n✨ Best matches found:");
75
+ console.log("\n✨ Similar queries found:");
80
76
  results.forEach((match) => {
81
- console.log(`- ${match.purpose} (${match.similarityPercentage.toFixed(2)}%)`);
77
+ console.log(`- ${match.query} (${match.similarityPercentage.toFixed(2)}%)`);
82
78
  });
83
79
  }
84
80
  else {
85
81
  console.log("No matches found");
86
82
  }
87
- console.dir({ results });
88
83
  return results;
89
84
  }
90
85
  async getAllMemories(scope, userId) {
@@ -114,68 +109,43 @@ class CacheMemory {
114
109
  return memories;
115
110
  }
116
111
  async createMemory(input) {
117
- const existingPattern = await this.findBestMatches(input.content, {
112
+ console.log("Searching for similar memory", input);
113
+ const existingPattern = await this.findSimilarQueries(input.content, {
118
114
  similarityThreshold: 95,
119
115
  userId: input.userId,
120
116
  scope: input.scope,
121
117
  });
122
118
  if (existingPattern.length > 0) {
123
- console.log("\n🔍 Similar memory found:");
119
+ console.log("\nSimilar cache memory found:");
124
120
  existingPattern.forEach((match) => {
125
- console.log(`- ${match.purpose} (${match.similarityPercentage.toFixed(2)}%)`);
121
+ console.log(`- ${match.query} (${match.similarityPercentage.toFixed(2)}%)`);
126
122
  });
123
+ console.log("Cache memory already exists. No need to create new one..");
127
124
  return;
128
125
  }
129
- // Générer les variations via GPT-4
130
- const variations = await (0, ai_1.generateObject)({
131
- model: (0, openai_1.openai)("gpt-4"),
132
- schema: zod_1.z.object({
133
- request: zod_1.z.string().describe("The request to be performed"),
134
- queries: zod_1.z.array(zod_1.z.object({ text: zod_1.z.string() })),
135
- }),
136
- 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)}
140
- - Keep variations natural and human-like
141
- - Include the original input
142
- - Add 3-5 variations`,
143
- });
144
- await this.createSingleMemory({
126
+ console.log("No similar memory found");
127
+ const memory = await this.createSingleMemory({
145
128
  id: crypto.randomUUID(),
146
129
  content: input.content,
147
130
  type: input.type,
148
131
  data: input.data,
149
- purpose: variations.object.request,
150
132
  userId: input.userId,
151
133
  scope: input.scope,
152
134
  });
153
- const variationPromises = variations.object.queries.map(async (variation) => {
154
- if (variation.text !== input.content) {
155
- await this.createSingleMemory({
156
- id: crypto.randomUUID(),
157
- content: variation.text,
158
- type: input.type,
159
- data: input.data,
160
- purpose: variations.object.request,
161
- userId: input.userId,
162
- scope: input.scope,
163
- });
164
- }
165
- });
166
- await Promise.all(variationPromises);
167
- return variations.object.request;
135
+ return memory;
168
136
  }
169
137
  async createSingleMemory(params) {
138
+ console.log("Creating new cache memory...", params.content);
139
+ console.log("Creating embedding...");
170
140
  const { embedding } = await (0, ai_1.embed)({
171
141
  model: openai_1.openai.embedding("text-embedding-3-small"),
172
142
  value: params.content,
173
143
  });
144
+ console.log("Embedding created");
174
145
  const memory = {
175
146
  id: params.id,
176
147
  type: params.type,
177
148
  data: params.data,
178
- purpose: params.purpose,
179
149
  query: params.content,
180
150
  embedding,
181
151
  userId: params.userId,
@@ -41,7 +41,7 @@ export declare class PersistentMemory {
41
41
  /**
42
42
  * Store a memory in the database
43
43
  */
44
- storeMemory(memory: Memory): Promise<unknown>;
44
+ createMemory(memory: Memory): Promise<unknown>;
45
45
  /**
46
46
  * Find best matching memories
47
47
  */
@@ -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: {
@@ -102,7 +101,7 @@ class PersistentMemory {
102
101
  /**
103
102
  * Store a memory in the database
104
103
  */
105
- async storeMemory(memory) {
104
+ async createMemory(memory) {
106
105
  const indexName = this._getIndexName(memory.scope, memory.userId);
107
106
  await this._getOrCreateIndex(indexName);
108
107
  const chunks = await this.processContent(memory.query);
@@ -115,14 +114,14 @@ class PersistentMemory {
115
114
  method: "POST",
116
115
  body: JSON.stringify([document]),
117
116
  });
118
- console.log("Stored memory response:", response);
117
+ console.log("Stored persistent memory response:", response);
119
118
  return response;
120
119
  }
121
120
  /**
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 in persistent memory:");
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}"`);