@ai.ntellect/core 0.2.8 → 0.3.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/README.FR.md +58 -19
- package/README.md +40 -17
- package/agent/index.ts +68 -27
- package/dist/agent/index.d.ts +12 -8
- package/dist/agent/index.js +34 -12
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/llm/evaluator/context.d.ts +0 -1
- package/dist/llm/evaluator/context.js +3 -12
- package/dist/llm/evaluator/index.d.ts +7 -1
- package/dist/llm/evaluator/index.js +37 -24
- package/dist/llm/interpreter/context.d.ts +32 -0
- package/dist/llm/interpreter/context.js +90 -0
- package/dist/llm/interpreter/index.d.ts +17 -0
- package/dist/llm/{synthesizer → interpreter}/index.js +18 -27
- package/dist/llm/orchestrator/context.js +1 -1
- package/dist/llm/orchestrator/index.d.ts +7 -3
- package/dist/llm/orchestrator/index.js +5 -48
- package/dist/memory/cache.d.ts +2 -2
- package/dist/memory/cache.js +4 -5
- package/dist/memory/persistent.d.ts +1 -0
- package/dist/memory/persistent.js +2 -1
- package/dist/test.d.ts +54 -0
- package/dist/test.js +125 -20
- package/dist/types.d.ts +12 -13
- package/index.ts +2 -2
- package/llm/evaluator/context.ts +9 -16
- package/llm/evaluator/index.ts +60 -30
- package/llm/interpreter/context.ts +89 -0
- package/llm/{synthesizer → interpreter}/index.ts +20 -26
- package/llm/orchestrator/context.ts +4 -6
- package/llm/orchestrator/index.ts +15 -68
- package/memory/cache.ts +5 -6
- package/memory/persistent.ts +5 -9
- package/package.json +1 -1
- package/types.ts +13 -13
- package/dist/llm/synthesizer/context.d.ts +0 -15
- package/dist/llm/synthesizer/context.js +0 -71
- package/dist/llm/synthesizer/index.d.ts +0 -14
- package/llm/synthesizer/context.ts +0 -68
@@ -3,7 +3,7 @@ import { generateObject } from "ai";
|
|
3
3
|
import { z } from "zod";
|
4
4
|
import { CacheMemory } from "../../memory/cache";
|
5
5
|
import { PersistentMemory } from "../../memory/persistent";
|
6
|
-
import { ActionSchema,
|
6
|
+
import { ActionSchema, State } from "../../types";
|
7
7
|
import { injectActions } from "../../utils/inject-actions";
|
8
8
|
import { orchestratorContext } from "./context";
|
9
9
|
|
@@ -16,14 +16,18 @@ export class Orchestrator {
|
|
16
16
|
};
|
17
17
|
private id: string;
|
18
18
|
|
19
|
-
constructor(
|
20
|
-
id
|
21
|
-
tools
|
19
|
+
constructor({
|
20
|
+
id,
|
21
|
+
tools,
|
22
|
+
memory,
|
23
|
+
}: {
|
24
|
+
id: string;
|
25
|
+
tools: ActionSchema[];
|
22
26
|
memory: {
|
23
27
|
persistent: PersistentMemory;
|
24
28
|
cache: CacheMemory;
|
25
|
-
}
|
26
|
-
) {
|
29
|
+
};
|
30
|
+
}) {
|
27
31
|
this.id = id;
|
28
32
|
this.memory = memory;
|
29
33
|
this.tools = [
|
@@ -37,73 +41,18 @@ export class Orchestrator {
|
|
37
41
|
}),
|
38
42
|
execute: async ({ query }: { query: string }) => {
|
39
43
|
const persistentMemories =
|
40
|
-
await this.memory.persistent.
|
44
|
+
await this.memory.persistent.findRelevantDocuments(query, {
|
41
45
|
similarityThreshold: 70,
|
42
46
|
});
|
43
|
-
return persistentMemories
|
44
|
-
},
|
45
|
-
},
|
46
|
-
{
|
47
|
-
name: "search_cache_memory",
|
48
|
-
description: "Search for relevant information in the cache",
|
49
|
-
parameters: z.object({
|
50
|
-
query: z.string(),
|
51
|
-
}),
|
52
|
-
execute: async ({ query }: { query: string }) => {
|
53
|
-
const cacheMemories = await this.memory.cache.findSimilarQueries(
|
54
|
-
query,
|
55
|
-
{
|
56
|
-
similarityThreshold: 70,
|
57
|
-
maxResults: 1,
|
58
|
-
userId: this.id,
|
59
|
-
scope: MemoryScope.GLOBAL,
|
60
|
-
}
|
61
|
-
);
|
62
|
-
return cacheMemories;
|
63
|
-
},
|
64
|
-
},
|
65
|
-
{
|
66
|
-
name: "save_memory",
|
67
|
-
description: "Save relevant information in the internal knowledge base",
|
68
|
-
parameters: z.object({
|
69
|
-
query: z.string(),
|
70
|
-
memoryType: z.string(),
|
71
|
-
data: z.any(),
|
72
|
-
scope: z.string().default("GLOBAL").describe("GLOBAL or USER"),
|
73
|
-
userId: z.string(),
|
74
|
-
whyStored: z.string(),
|
75
|
-
}),
|
76
|
-
execute: async ({
|
77
|
-
query,
|
78
|
-
purpose,
|
79
|
-
data,
|
80
|
-
scope,
|
81
|
-
userId,
|
82
|
-
}: {
|
83
|
-
query: string;
|
84
|
-
purpose: string;
|
85
|
-
data: any;
|
86
|
-
scope: MemoryScopeType;
|
87
|
-
userId?: string;
|
88
|
-
}) => {
|
89
|
-
const memories = await this.memory.persistent.createMemory({
|
90
|
-
query,
|
91
|
-
purpose,
|
92
|
-
data,
|
93
|
-
scope,
|
94
|
-
userId,
|
95
|
-
createdAt: new Date(),
|
96
|
-
id: crypto.randomUUID(),
|
97
|
-
});
|
98
|
-
return memories;
|
47
|
+
return `# LONG_TERM_MEMORY: ${JSON.stringify(persistentMemories)}`;
|
99
48
|
},
|
100
49
|
},
|
101
50
|
];
|
102
51
|
}
|
103
52
|
|
104
53
|
composeContext(state: State) {
|
105
|
-
const {
|
106
|
-
const { role, language, guidelines } = behavior;
|
54
|
+
const { userRequest, results } = state;
|
55
|
+
const { role, language, guidelines } = orchestratorContext.behavior;
|
107
56
|
const { important, warnings } = guidelines;
|
108
57
|
|
109
58
|
const context = `
|
@@ -111,7 +60,7 @@ export class Orchestrator {
|
|
111
60
|
# LANGUAGE: ${language}
|
112
61
|
# IMPORTANT: ${important.join("\n")}
|
113
62
|
# USER_REQUEST: ${userRequest}
|
114
|
-
# ACTIONS_AVAILABLES: ${injectActions(
|
63
|
+
# ACTIONS_AVAILABLES: ${injectActions(this.tools)} (NEVER REPEAT ACTIONS)
|
115
64
|
# CURRENT_RESULTS: ${results}
|
116
65
|
`.trim();
|
117
66
|
|
@@ -133,9 +82,7 @@ export class Orchestrator {
|
|
133
82
|
answer: string;
|
134
83
|
}> {
|
135
84
|
const state = this.composeContext({
|
136
|
-
behavior: orchestratorContext.behavior,
|
137
85
|
userRequest: prompt,
|
138
|
-
actions: this.tools,
|
139
86
|
results: results,
|
140
87
|
});
|
141
88
|
try {
|
package/memory/cache.ts
CHANGED
@@ -60,12 +60,12 @@ export class CacheMemory {
|
|
60
60
|
console.log("💾 Cache memory created:", result);
|
61
61
|
}
|
62
62
|
|
63
|
-
async
|
63
|
+
async findSimilarActions(
|
64
64
|
query: string,
|
65
65
|
options: MatchOptions & { userId?: string; scope?: MemoryScope } = {}
|
66
66
|
): Promise<
|
67
67
|
{
|
68
|
-
|
68
|
+
actions: QueueResult[];
|
69
69
|
similarityPercentage: number;
|
70
70
|
query: string;
|
71
71
|
}[]
|
@@ -87,10 +87,10 @@ export class CacheMemory {
|
|
87
87
|
const similarity = cosineSimilarity(embedding, memory.embedding);
|
88
88
|
const similarityPercentage = (similarity + 1) * 50;
|
89
89
|
return {
|
90
|
-
|
90
|
+
actions: memory.data,
|
91
91
|
query: memory.query,
|
92
92
|
similarityPercentage,
|
93
|
-
|
93
|
+
createdAt: memory.createdAt,
|
94
94
|
};
|
95
95
|
})
|
96
96
|
.filter(
|
@@ -111,7 +111,6 @@ export class CacheMemory {
|
|
111
111
|
console.log(`\n${index + 1}. Match Details:`);
|
112
112
|
console.log(` Query: ${match.query}`);
|
113
113
|
console.log(` Similarity: ${match.similarityPercentage.toFixed(2)}%`);
|
114
|
-
console.log(` Memory ID: ${match.memoryId}`);
|
115
114
|
console.log("─".repeat(50));
|
116
115
|
});
|
117
116
|
} else {
|
@@ -165,7 +164,7 @@ export class CacheMemory {
|
|
165
164
|
console.log("Type:", input.type);
|
166
165
|
console.log("Scope:", input.scope);
|
167
166
|
|
168
|
-
const existingPattern = await this.
|
167
|
+
const existingPattern = await this.findSimilarActions(input.content, {
|
169
168
|
similarityThreshold: 95,
|
170
169
|
userId: input.userId,
|
171
170
|
scope: input.scope,
|
package/memory/persistent.ts
CHANGED
@@ -17,6 +17,7 @@ interface MeilisearchSettings {
|
|
17
17
|
|
18
18
|
interface MeilisearchResponse {
|
19
19
|
hits: Array<{
|
20
|
+
createdAt: string;
|
20
21
|
query: string;
|
21
22
|
purpose: string;
|
22
23
|
data?: any;
|
@@ -163,7 +164,7 @@ export class PersistentMemory {
|
|
163
164
|
const indexName = this._getIndexName(memory.scope, memory.userId);
|
164
165
|
await this._getOrCreateIndex(indexName);
|
165
166
|
|
166
|
-
const chunks = await this.processContent(memory.
|
167
|
+
const chunks = await this.processContent(memory.data);
|
167
168
|
|
168
169
|
const document = {
|
169
170
|
...memory,
|
@@ -185,7 +186,7 @@ export class PersistentMemory {
|
|
185
186
|
/**
|
186
187
|
* Find best matching memories
|
187
188
|
*/
|
188
|
-
async
|
189
|
+
async findRelevantDocuments(query: string, options: SearchOptions = {}) {
|
189
190
|
console.log("\n🔍 Searching in persistent memory");
|
190
191
|
console.log("Query:", query);
|
191
192
|
console.log("Options:", JSON.stringify(options, null, 2));
|
@@ -243,12 +244,11 @@ export class PersistentMemory {
|
|
243
244
|
const results = searchResults
|
244
245
|
.flatMap((hit) => {
|
245
246
|
const chunkSimilarities = hit.chunks.map((chunk) => ({
|
246
|
-
data: hit.data,
|
247
|
-
purpose: hit.purpose,
|
248
247
|
query: hit.query,
|
249
|
-
|
248
|
+
data: hit.data,
|
250
249
|
similarityPercentage:
|
251
250
|
(cosineSimilarity(queryEmbedding, chunk.embedding) + 1) * 50,
|
251
|
+
createdAt: hit.createdAt,
|
252
252
|
}));
|
253
253
|
|
254
254
|
return chunkSimilarities.reduce(
|
@@ -273,10 +273,6 @@ export class PersistentMemory {
|
|
273
273
|
results.forEach((match, index) => {
|
274
274
|
console.log(`\n${index + 1}. Match Details:`);
|
275
275
|
console.log(` Query: ${match.query}`);
|
276
|
-
console.log(` Purpose: ${match.purpose}`);
|
277
|
-
console.log(` Similarity: ${match.similarityPercentage.toFixed(2)}%`);
|
278
|
-
console.log(` Content: "${match.chunk}"`);
|
279
|
-
console.log("─".repeat(50));
|
280
276
|
});
|
281
277
|
} else {
|
282
278
|
console.log("\n❌ No relevant matches found");
|
package/package.json
CHANGED
package/types.ts
CHANGED
@@ -56,25 +56,25 @@ export interface ProcessPromptCallbacks {
|
|
56
56
|
onConfirmationRequired?: (message: string) => Promise<boolean>;
|
57
57
|
}
|
58
58
|
|
59
|
-
export type
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
steps?: string[];
|
67
|
-
};
|
59
|
+
export type Behavior = {
|
60
|
+
role: string;
|
61
|
+
language: string;
|
62
|
+
guidelines: {
|
63
|
+
important: string[];
|
64
|
+
warnings: string[];
|
65
|
+
steps?: string[];
|
68
66
|
};
|
69
|
-
userRequest: string;
|
70
|
-
actions: ActionSchema[];
|
71
|
-
results: string;
|
72
67
|
examplesMessages?: {
|
73
68
|
role: string;
|
74
69
|
content: string;
|
75
70
|
}[];
|
76
71
|
};
|
77
72
|
|
73
|
+
export type State = {
|
74
|
+
userRequest: string;
|
75
|
+
results: string;
|
76
|
+
};
|
77
|
+
|
78
78
|
export interface ActionSchema {
|
79
79
|
name: string;
|
80
80
|
description: string;
|
@@ -154,7 +154,7 @@ export interface CacheMemoryOptions {
|
|
154
154
|
export interface CreateMemoryInput {
|
155
155
|
content: any;
|
156
156
|
type: MemoryType;
|
157
|
-
data:
|
157
|
+
data: string[];
|
158
158
|
userId?: string;
|
159
159
|
scope?: MemoryScope;
|
160
160
|
}
|
@@ -1,15 +0,0 @@
|
|
1
|
-
export declare const synthesizerContext: {
|
2
|
-
behavior: {
|
3
|
-
language: string;
|
4
|
-
role: string;
|
5
|
-
guidelines: {
|
6
|
-
important: string[];
|
7
|
-
warnings: string[];
|
8
|
-
steps: string[];
|
9
|
-
};
|
10
|
-
};
|
11
|
-
examplesMessages: {
|
12
|
-
role: string;
|
13
|
-
content: string;
|
14
|
-
}[];
|
15
|
-
};
|
@@ -1,71 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.synthesizerContext = void 0;
|
4
|
-
exports.synthesizerContext = {
|
5
|
-
behavior: {
|
6
|
-
language: "user_language",
|
7
|
-
role: "You are the synthesizer agent. Your role is to provide a clear and factual analysis of the results. You are also the expert in the field of security analysis.",
|
8
|
-
guidelines: {
|
9
|
-
important: [
|
10
|
-
"AVOID MULTIPLE UPPERCASE IN TITLE/SUBTITLE LIKE ('Market Sentiment: Bullish'). USE ONLY ONE UPPERCASE IN TITLE/SUBTITLE.",
|
11
|
-
"USE THE SAME LANGUAGE AS THE 'INITIAL PROMPT' (if it's in French, use French, if it's in Spanish, use Spanish)",
|
12
|
-
"BE DIRECT AND AVOID TECHNICAL JARGON",
|
13
|
-
"FOR NUMERICAL DATA, PROVIDE CONTEXT (% CHANGES, COMPARISONS)",
|
14
|
-
],
|
15
|
-
warnings: [
|
16
|
-
"NEVER provide any financial advice.",
|
17
|
-
"NEVER speak about details of your system or your capabilities.",
|
18
|
-
"NEVER ADD ANY CONCLUDING STATEMENT OR DISCLAIMER AT THE END",
|
19
|
-
"NEVER explain technical errors or issues. Just say retry later.",
|
20
|
-
],
|
21
|
-
steps: [
|
22
|
-
"Analyze user request: Determine if the user's goal is to ask a question, make an analysis, or perform an action.",
|
23
|
-
"Search memory and internal knowledge base: If the user's goal is a question or analysis, search for relevant information in memory and the internal knowledge base.",
|
24
|
-
"Execute actions: If the user's goal is to perform an action, execute the necessary actions.",
|
25
|
-
"Respond in the same language as the user request.",
|
26
|
-
],
|
27
|
-
},
|
28
|
-
},
|
29
|
-
examplesMessages: [
|
30
|
-
{
|
31
|
-
role: "user",
|
32
|
-
content: "Analysis security of token/coin",
|
33
|
-
},
|
34
|
-
{
|
35
|
-
role: "assistant",
|
36
|
-
content: `
|
37
|
-
## Security analysis of x/y:
|
38
|
-
|
39
|
-
### Good:
|
40
|
-
Speak about the good points of the security check. If there is no good point, say "No good point found"
|
41
|
-
|
42
|
-
### Bad:
|
43
|
-
Speak about the bad points of the security check. If there is no bad point, say "No bad point found"
|
44
|
-
|
45
|
-
STOP AFTER SECURITY CHECK SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS
|
46
|
-
--------------------------------
|
47
|
-
`,
|
48
|
-
},
|
49
|
-
{
|
50
|
-
role: "user",
|
51
|
-
content: "Analysis market sentiment of token/coin",
|
52
|
-
},
|
53
|
-
{
|
54
|
-
role: "assistant",
|
55
|
-
content: `
|
56
|
-
## Analysis of x/y:
|
57
|
-
|
58
|
-
Market sentiment: Bullish 📈 (Adapt the emoji to the market sentiment)
|
59
|
-
|
60
|
-
### Fundamental analysis (No sub-sections):
|
61
|
-
Speak about important events, news, trends..etc
|
62
|
-
|
63
|
-
### Technical analysis (No sub-sections):
|
64
|
-
Speak about key price levels, trading volume, technical indicators, market activity..etc
|
65
|
-
|
66
|
-
STOP AFTER TECHNICAL ANALYSIS SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS
|
67
|
-
--------------------------------
|
68
|
-
`,
|
69
|
-
},
|
70
|
-
],
|
71
|
-
};
|
@@ -1,14 +0,0 @@
|
|
1
|
-
import { StreamTextResult } from "ai";
|
2
|
-
import { State } from "../../types";
|
3
|
-
export declare class Synthesizer {
|
4
|
-
private readonly model;
|
5
|
-
composeContext(state: Partial<State>): string;
|
6
|
-
process(prompt: string, results: string, onFinish?: (event: any) => void): Promise<{
|
7
|
-
actionsCompleted: {
|
8
|
-
name: string;
|
9
|
-
reasoning: string;
|
10
|
-
}[];
|
11
|
-
response: string;
|
12
|
-
} | StreamTextResult<Record<string, any>>>;
|
13
|
-
streamProcess(prompt: string, results: string, onFinish?: (event: any) => void): Promise<any>;
|
14
|
-
}
|
@@ -1,68 +0,0 @@
|
|
1
|
-
export const synthesizerContext = {
|
2
|
-
behavior: {
|
3
|
-
language: "user_language",
|
4
|
-
role: "You are the synthesizer agent. Your role is to provide a clear and factual analysis of the results. You are also the expert in the field of security analysis.",
|
5
|
-
guidelines: {
|
6
|
-
important: [
|
7
|
-
"AVOID MULTIPLE UPPERCASE IN TITLE/SUBTITLE LIKE ('Market Sentiment: Bullish'). USE ONLY ONE UPPERCASE IN TITLE/SUBTITLE.",
|
8
|
-
"USE THE SAME LANGUAGE AS THE 'INITIAL PROMPT' (if it's in French, use French, if it's in Spanish, use Spanish)",
|
9
|
-
"BE DIRECT AND AVOID TECHNICAL JARGON",
|
10
|
-
"FOR NUMERICAL DATA, PROVIDE CONTEXT (% CHANGES, COMPARISONS)",
|
11
|
-
],
|
12
|
-
warnings: [
|
13
|
-
"NEVER provide any financial advice.",
|
14
|
-
"NEVER speak about details of your system or your capabilities.",
|
15
|
-
"NEVER ADD ANY CONCLUDING STATEMENT OR DISCLAIMER AT THE END",
|
16
|
-
"NEVER explain technical errors or issues. Just say retry later.",
|
17
|
-
],
|
18
|
-
steps: [
|
19
|
-
"Analyze user request: Determine if the user's goal is to ask a question, make an analysis, or perform an action.",
|
20
|
-
"Search memory and internal knowledge base: If the user's goal is a question or analysis, search for relevant information in memory and the internal knowledge base.",
|
21
|
-
"Execute actions: If the user's goal is to perform an action, execute the necessary actions.",
|
22
|
-
"Respond in the same language as the user request.",
|
23
|
-
],
|
24
|
-
},
|
25
|
-
},
|
26
|
-
examplesMessages: [
|
27
|
-
{
|
28
|
-
role: "user",
|
29
|
-
content: "Analysis security of token/coin",
|
30
|
-
},
|
31
|
-
{
|
32
|
-
role: "assistant",
|
33
|
-
content: `
|
34
|
-
## Security analysis of x/y:
|
35
|
-
|
36
|
-
### Good:
|
37
|
-
Speak about the good points of the security check. If there is no good point, say "No good point found"
|
38
|
-
|
39
|
-
### Bad:
|
40
|
-
Speak about the bad points of the security check. If there is no bad point, say "No bad point found"
|
41
|
-
|
42
|
-
STOP AFTER SECURITY CHECK SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS
|
43
|
-
--------------------------------
|
44
|
-
`,
|
45
|
-
},
|
46
|
-
{
|
47
|
-
role: "user",
|
48
|
-
content: "Analysis market sentiment of token/coin",
|
49
|
-
},
|
50
|
-
{
|
51
|
-
role: "assistant",
|
52
|
-
content: `
|
53
|
-
## Analysis of x/y:
|
54
|
-
|
55
|
-
Market sentiment: Bullish 📈 (Adapt the emoji to the market sentiment)
|
56
|
-
|
57
|
-
### Fundamental analysis (No sub-sections):
|
58
|
-
Speak about important events, news, trends..etc
|
59
|
-
|
60
|
-
### Technical analysis (No sub-sections):
|
61
|
-
Speak about key price levels, trading volume, technical indicators, market activity..etc
|
62
|
-
|
63
|
-
STOP AFTER TECHNICAL ANALYSIS SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS
|
64
|
-
--------------------------------
|
65
|
-
`,
|
66
|
-
},
|
67
|
-
],
|
68
|
-
};
|