@ai.ntellect/core 0.2.8 → 0.3.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/README.FR.md +58 -19
- package/README.md +40 -17
- package/agent/index.ts +54 -26
- 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 +3 -12
- package/llm/evaluator/index.ts +57 -27
- package/llm/interpreter/context.ts +89 -0
- package/llm/{synthesizer → interpreter}/index.ts +20 -26
- package/llm/orchestrator/context.ts +1 -1
- package/llm/orchestrator/index.ts +14 -67
- package/memory/cache.ts +5 -6
- package/memory/persistent.ts +3 -1
- 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
package/dist/test.js
CHANGED
@@ -3,15 +3,113 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.getRssNews = exports.getChainsTVL = exports.fetchMarkPrice = exports.prepareEvmTransaction = exports.getNetworkProvider = exports.networkConfigs = void 0;
|
6
|
+
exports.getRssNews = exports.getChainsTVL = exports.fetchMarkPrice = exports.prepareEvmTransaction = exports.getNetworkProvider = exports.networkConfigs = exports.checkHoneypot = void 0;
|
7
7
|
const ccxt_1 = __importDefault(require("ccxt"));
|
8
8
|
const ethers_1 = require("ethers");
|
9
9
|
const rss_parser_1 = __importDefault(require("rss-parser"));
|
10
10
|
const zod_1 = require("zod");
|
11
11
|
const agent_1 = require("./agent");
|
12
|
+
const interpreter_1 = require("./llm/interpreter");
|
13
|
+
const context_1 = require("./llm/interpreter/context");
|
12
14
|
const orchestrator_1 = require("./llm/orchestrator");
|
13
15
|
const cache_1 = require("./memory/cache");
|
14
16
|
const persistent_1 = require("./memory/persistent");
|
17
|
+
// Mapping des noms de chaînes vers leurs IDs
|
18
|
+
const CHAIN_IDS = {
|
19
|
+
ethereum: "1",
|
20
|
+
bsc: "56",
|
21
|
+
polygon: "137",
|
22
|
+
matic: "137",
|
23
|
+
avalanche: "43114",
|
24
|
+
avax: "43114",
|
25
|
+
fantom: "250",
|
26
|
+
ftm: "250",
|
27
|
+
arbitrum: "42161",
|
28
|
+
arb: "42161",
|
29
|
+
optimism: "10",
|
30
|
+
base: "8453",
|
31
|
+
zksync: "324",
|
32
|
+
solana: "solana",
|
33
|
+
sol: "solana",
|
34
|
+
};
|
35
|
+
exports.checkHoneypot = {
|
36
|
+
name: "check-honeypot",
|
37
|
+
description: `Analyze a token to detect if it is a honeypot. RESPECT THIS FORMAT FOR CHAIN NAME: ${CHAIN_IDS.toString()}`,
|
38
|
+
parameters: zod_1.z.object({
|
39
|
+
address: zod_1.z.string().describe("Address of the token"),
|
40
|
+
chainName: zod_1.z.string().describe("Chain name (default: eth)"),
|
41
|
+
}),
|
42
|
+
execute: async ({ address, chainName, }) => {
|
43
|
+
try {
|
44
|
+
const API_URL = "https://api.honeypot.is/v2/IsHoneypot";
|
45
|
+
const chainId = getChainId(chainName);
|
46
|
+
console.log("💰 Checking honeypot for token", {
|
47
|
+
address,
|
48
|
+
chainId,
|
49
|
+
});
|
50
|
+
if (chainId === "solana") {
|
51
|
+
return {
|
52
|
+
status: "error",
|
53
|
+
message: "L'analyse des tokens Solana n'est pas encore supportée. Cette fonctionnalité sera disponible prochainement.",
|
54
|
+
chain: {
|
55
|
+
name: "Solana",
|
56
|
+
id: "solana",
|
57
|
+
},
|
58
|
+
};
|
59
|
+
}
|
60
|
+
const queryParams = new URLSearchParams({
|
61
|
+
address: address,
|
62
|
+
...(chainId && { chainId }),
|
63
|
+
...{ simulateLiquidity: "true" },
|
64
|
+
});
|
65
|
+
const response = await fetch(`${API_URL}?${queryParams}`);
|
66
|
+
if (!response.ok) {
|
67
|
+
throw new Error(`Erreur API: ${response.status} ${response.statusText}`);
|
68
|
+
}
|
69
|
+
const data = await response.json();
|
70
|
+
const result = {
|
71
|
+
status: "success",
|
72
|
+
token: {
|
73
|
+
name: data.token.name,
|
74
|
+
symbol: data.token.symbol,
|
75
|
+
address: data.token.address,
|
76
|
+
holders: data.token.totalHolders,
|
77
|
+
},
|
78
|
+
risk: {
|
79
|
+
level: data.summary.risk,
|
80
|
+
score: data.summary.riskLevel,
|
81
|
+
flags: data.summary.flags || [],
|
82
|
+
},
|
83
|
+
analysis: {
|
84
|
+
isHoneypot: data.honeypotResult?.isHoneypot || false,
|
85
|
+
reason: data.honeypotResult?.honeypotReason || null,
|
86
|
+
buyTax: data.simulationResult?.buyTax || 0,
|
87
|
+
sellTax: data.simulationResult?.sellTax || 0,
|
88
|
+
holders: {
|
89
|
+
total: data.holderAnalysis?.holders || 0,
|
90
|
+
successful: data.holderAnalysis?.successful || 0,
|
91
|
+
failed: data.holderAnalysis?.failed || 0,
|
92
|
+
siphoned: data.holderAnalysis?.siphoned || 0,
|
93
|
+
},
|
94
|
+
},
|
95
|
+
chain: {
|
96
|
+
name: data.chain.name,
|
97
|
+
id: data.chain.id,
|
98
|
+
},
|
99
|
+
};
|
100
|
+
return result;
|
101
|
+
}
|
102
|
+
catch (error) {
|
103
|
+
throw error;
|
104
|
+
}
|
105
|
+
},
|
106
|
+
};
|
107
|
+
function getChainId(chainName) {
|
108
|
+
if (!chainName)
|
109
|
+
return undefined;
|
110
|
+
const normalizedChainName = chainName.toLowerCase();
|
111
|
+
return CHAIN_IDS[normalizedChainName];
|
112
|
+
}
|
15
113
|
exports.networkConfigs = {
|
16
114
|
ethereum: {
|
17
115
|
name: "Ethereum Mainnet",
|
@@ -239,30 +337,37 @@ exports.getRssNews = {
|
|
239
337
|
host: "http://localhost:7700",
|
240
338
|
apiKey: "aSampleMasterKey",
|
241
339
|
});
|
242
|
-
const orchestrator = new orchestrator_1.Orchestrator(
|
243
|
-
|
244
|
-
|
340
|
+
const orchestrator = new orchestrator_1.Orchestrator({
|
341
|
+
id: "1",
|
342
|
+
tools: [],
|
343
|
+
memory: {
|
344
|
+
persistent: memory,
|
345
|
+
cache: cacheMemory,
|
346
|
+
},
|
245
347
|
});
|
348
|
+
const securityInterpreter = new interpreter_1.Interpreter("security", context_1.securityInterpreterContext);
|
349
|
+
const marketInterpreter = new interpreter_1.Interpreter("market", context_1.marketInterpreterContext);
|
350
|
+
const generalInterpreter = new interpreter_1.Interpreter("general", context_1.generalInterpreterContext);
|
351
|
+
// const ccacheMemory = await cacheMemory.findSimilarActions(
|
352
|
+
// "le top 3 des chaines par TVL en DeFi",
|
353
|
+
// {
|
354
|
+
// similarityThreshold: 50,
|
355
|
+
// maxResults: 5,
|
356
|
+
// userId: "1",
|
357
|
+
// scope: MemoryScope.GLOBAL,
|
358
|
+
// }
|
359
|
+
// );
|
360
|
+
// console.log("✅ RECENT_ACTIONS: ", ccacheMemory);
|
246
361
|
const agent = new agent_1.Agent({
|
247
|
-
|
248
|
-
id: "1",
|
249
|
-
},
|
362
|
+
interpreters: [securityInterpreter, marketInterpreter, generalInterpreter],
|
250
363
|
orchestrator,
|
251
|
-
|
252
|
-
|
364
|
+
memory: {
|
365
|
+
persistent: memory,
|
366
|
+
cache: cacheMemory,
|
367
|
+
},
|
253
368
|
stream: false,
|
254
369
|
maxEvaluatorIteration: 1,
|
255
370
|
});
|
256
|
-
const prompt = "
|
257
|
-
const context = prompt;
|
258
|
-
// const save = await cacheMemory.createMemory({
|
259
|
-
// content: prompt,
|
260
|
-
// data: [],
|
261
|
-
// scope: MemoryScope.GLOBAL,
|
262
|
-
// type: MemoryType.ACTION,
|
263
|
-
// });
|
264
|
-
// consoleil.log({ save });
|
265
|
-
// const memo = await cacheMemory.getAllMemories();
|
266
|
-
// console.log({ memo });
|
371
|
+
const prompt = "c quoi le top 3 des chaines par TVL en DeFi";
|
267
372
|
const result = await agent.process(prompt, {});
|
268
373
|
})();
|
package/dist/types.d.ts
CHANGED
@@ -45,24 +45,23 @@ export interface ProcessPromptCallbacks {
|
|
45
45
|
onQueueComplete?: (actions: QueueResult[]) => void | Promise<void>;
|
46
46
|
onConfirmationRequired?: (message: string) => Promise<boolean>;
|
47
47
|
}
|
48
|
-
export type
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
steps?: string[];
|
56
|
-
};
|
48
|
+
export type Behavior = {
|
49
|
+
role: string;
|
50
|
+
language: string;
|
51
|
+
guidelines: {
|
52
|
+
important: string[];
|
53
|
+
warnings: string[];
|
54
|
+
steps?: string[];
|
57
55
|
};
|
58
|
-
userRequest: string;
|
59
|
-
actions: ActionSchema[];
|
60
|
-
results: string;
|
61
56
|
examplesMessages?: {
|
62
57
|
role: string;
|
63
58
|
content: string;
|
64
59
|
}[];
|
65
60
|
};
|
61
|
+
export type State = {
|
62
|
+
userRequest: string;
|
63
|
+
results: string;
|
64
|
+
};
|
66
65
|
export interface ActionSchema {
|
67
66
|
name: string;
|
68
67
|
description: string;
|
@@ -126,7 +125,7 @@ export interface CacheMemoryOptions {
|
|
126
125
|
export interface CreateMemoryInput {
|
127
126
|
content: any;
|
128
127
|
type: MemoryType;
|
129
|
-
data:
|
128
|
+
data: string[];
|
130
129
|
userId?: string;
|
131
130
|
scope?: MemoryScope;
|
132
131
|
}
|
package/index.ts
CHANGED
package/llm/evaluator/context.ts
CHANGED
@@ -6,23 +6,14 @@ export const evaluatorContext = {
|
|
6
6
|
important: [
|
7
7
|
"Verify if all required actions were executed successfully.",
|
8
8
|
"Check if the results align with the initial goal.",
|
9
|
-
"
|
10
|
-
"
|
11
|
-
" - Associate a wallet address (e.g., '0x1234...abcd') to a user-friendly name (e.g., 'Work Wallet').",
|
12
|
-
" - Map a token address (e.g., '0x6B17...71d0F') back to its symbol or name (e.g., 'DAI').",
|
13
|
-
"Store these facts in memory with their type (episodic, semantic, or procedural).",
|
9
|
+
"If you retrieved the informations from your internal knowledge base, no need to store them in 'extraInformationsToStore'.",
|
10
|
+
"Store ONLY extra new needed informations in 'extraInformationsToStore' (choose the most relevant informations and memory type: episodic, semantic, or procedural).",
|
14
11
|
],
|
15
12
|
warnings: [
|
16
|
-
"NEVER
|
13
|
+
"NEVER store an old data you retrieve from your internal knowledge base.",
|
17
14
|
"NEVER make assumptions about missing data.",
|
18
15
|
"NEVER repeat actions already completed unless explicitly required.",
|
19
16
|
],
|
20
|
-
steps: [
|
21
|
-
"Verify success: Confirm if the goal has been fully or partially achieved. If partially, describe what's missing.",
|
22
|
-
"Recommend next actions: Clearly state what needs to be done next (if applicable) and why.",
|
23
|
-
"Store key facts: Store any relevant information in memory with their type (episodic, semantic, or procedural).",
|
24
|
-
"Be clear, concise, and prioritize storing key facts that may help improve future interactions.",
|
25
|
-
],
|
26
17
|
},
|
27
18
|
},
|
28
19
|
};
|
package/llm/evaluator/index.ts
CHANGED
@@ -1,25 +1,39 @@
|
|
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";
|
4
5
|
import { PersistentMemory } from "../../memory/persistent";
|
5
|
-
import { ActionSchema, MemoryScope, State } from "../../types";
|
6
|
+
import { ActionSchema, MemoryScope, MemoryType, State } from "../../types";
|
6
7
|
import { injectActions } from "../../utils/inject-actions";
|
8
|
+
import { Interpreter } from "../interpreter";
|
7
9
|
import { evaluatorContext } from "./context";
|
8
10
|
|
9
11
|
export class Evaluator {
|
10
12
|
private readonly model = openai("gpt-4o");
|
11
13
|
public tools: ActionSchema[];
|
12
|
-
private memory:
|
14
|
+
private memory: {
|
15
|
+
persistent: PersistentMemory;
|
16
|
+
cache?: CacheMemory;
|
17
|
+
};
|
18
|
+
private interpreters: Interpreter[];
|
13
19
|
|
14
|
-
constructor(
|
20
|
+
constructor(
|
21
|
+
tools: ActionSchema[],
|
22
|
+
memory: {
|
23
|
+
persistent: PersistentMemory;
|
24
|
+
cache?: CacheMemory;
|
25
|
+
},
|
26
|
+
interpreters: Interpreter[]
|
27
|
+
) {
|
15
28
|
this.tools = tools;
|
16
29
|
this.memory = memory;
|
30
|
+
this.interpreters = interpreters;
|
17
31
|
}
|
18
32
|
|
19
33
|
composeContext(state: State) {
|
20
|
-
const {
|
21
|
-
const { role, language, guidelines } = behavior;
|
22
|
-
const { important, warnings
|
34
|
+
const { userRequest, results } = state;
|
35
|
+
const { role, language, guidelines } = evaluatorContext.behavior;
|
36
|
+
const { important, warnings } = guidelines;
|
23
37
|
|
24
38
|
const context = `
|
25
39
|
# ROLE: ${role}
|
@@ -27,9 +41,11 @@ export class Evaluator {
|
|
27
41
|
# IMPORTANT: ${important.join("\n")}
|
28
42
|
# NEVER: ${warnings.join("\n")}
|
29
43
|
# USER_REQUEST: ${userRequest}
|
30
|
-
# ACTIONS AVAILABLE: ${injectActions(
|
44
|
+
# ACTIONS AVAILABLE: ${injectActions(this.tools)}
|
31
45
|
# CURRENT_RESULTS: ${results}
|
32
|
-
#
|
46
|
+
# INTERPRETERS: ${this.interpreters
|
47
|
+
.map((interpreter) => interpreter.name)
|
48
|
+
.join(", ")}
|
33
49
|
`;
|
34
50
|
return context;
|
35
51
|
}
|
@@ -37,9 +53,7 @@ export class Evaluator {
|
|
37
53
|
async process(prompt: string, results: string): Promise<any> {
|
38
54
|
try {
|
39
55
|
const context = this.composeContext({
|
40
|
-
behavior: evaluatorContext.behavior,
|
41
56
|
userRequest: prompt,
|
42
|
-
actions: this.tools,
|
43
57
|
results: results,
|
44
58
|
});
|
45
59
|
console.log("\n🔍 Evaluator processing");
|
@@ -50,12 +64,12 @@ export class Evaluator {
|
|
50
64
|
schema: z.object({
|
51
65
|
actionsCompleted: z.array(z.string()),
|
52
66
|
actionsFailed: z.array(z.string()),
|
53
|
-
|
54
|
-
importantToRemembers: z.array(
|
67
|
+
extraInformationsToStore: z.array(
|
55
68
|
z.object({
|
56
|
-
memoryType: z.
|
57
|
-
|
69
|
+
memoryType: z.enum(["episodic", "semantic", "procedural"]),
|
70
|
+
queryForData: z.string(),
|
58
71
|
data: z.string(),
|
72
|
+
tags: z.array(z.string()),
|
59
73
|
})
|
60
74
|
),
|
61
75
|
response: z.string(),
|
@@ -72,9 +86,10 @@ export class Evaluator {
|
|
72
86
|
})
|
73
87
|
),
|
74
88
|
why: z.string(),
|
89
|
+
interpreter: z.string(),
|
75
90
|
}),
|
76
91
|
prompt: prompt,
|
77
|
-
system: context
|
92
|
+
system: `${context}`,
|
78
93
|
temperature: 0,
|
79
94
|
});
|
80
95
|
|
@@ -86,20 +101,20 @@ export class Evaluator {
|
|
86
101
|
})),
|
87
102
|
};
|
88
103
|
|
89
|
-
if (validatedResponse.
|
104
|
+
if (validatedResponse.extraInformationsToStore.length > 0) {
|
90
105
|
console.log(
|
91
106
|
"\n💭 Processing important memories to store",
|
92
107
|
validatedResponse
|
93
108
|
);
|
94
|
-
for (const item of validatedResponse.
|
109
|
+
for (const item of validatedResponse.extraInformationsToStore) {
|
95
110
|
console.log("\n📝 Processing memory item:");
|
96
111
|
console.log("Type:", item.memoryType);
|
97
|
-
console.log("Content:", item.
|
112
|
+
console.log("Content:", item.queryForData);
|
98
113
|
|
99
|
-
const memories = await this.memory.searchSimilarQueries(
|
100
|
-
item.
|
114
|
+
const memories = await this.memory.persistent.searchSimilarQueries(
|
115
|
+
item.queryForData,
|
101
116
|
{
|
102
|
-
similarityThreshold:
|
117
|
+
similarityThreshold: 70,
|
103
118
|
}
|
104
119
|
);
|
105
120
|
|
@@ -109,10 +124,10 @@ export class Evaluator {
|
|
109
124
|
}
|
110
125
|
|
111
126
|
console.log("✨ Storing new memory");
|
112
|
-
await this.memory.createMemory({
|
127
|
+
await this.memory.persistent.createMemory({
|
113
128
|
id: crypto.randomUUID(),
|
114
129
|
purpose: item.memoryType,
|
115
|
-
query: item.
|
130
|
+
query: item.queryForData,
|
116
131
|
data: item.data,
|
117
132
|
scope: MemoryScope.GLOBAL,
|
118
133
|
createdAt: new Date(),
|
@@ -120,6 +135,21 @@ export class Evaluator {
|
|
120
135
|
}
|
121
136
|
}
|
122
137
|
|
138
|
+
// Storing workflow actions completed
|
139
|
+
const cacheMemory = this.memory.cache;
|
140
|
+
if (cacheMemory) {
|
141
|
+
cacheMemory.createMemory({
|
142
|
+
content: prompt,
|
143
|
+
type: MemoryType.ACTION,
|
144
|
+
data: validatedResponse.actionsCompleted,
|
145
|
+
scope: MemoryScope.GLOBAL,
|
146
|
+
});
|
147
|
+
console.log(
|
148
|
+
"✅ Workflow actions completed stored in cache",
|
149
|
+
prompt,
|
150
|
+
validatedResponse.actionsCompleted
|
151
|
+
);
|
152
|
+
}
|
123
153
|
console.log("\n✅ Evaluation completed");
|
124
154
|
console.log("─".repeat(50));
|
125
155
|
console.log("Results:", JSON.stringify(validatedResponse, null, 2));
|
@@ -131,10 +161,10 @@ export class Evaluator {
|
|
131
161
|
console.log("Evaluator error");
|
132
162
|
console.dir(error.value, { depth: null });
|
133
163
|
console.error(error.message);
|
134
|
-
if (error.value.
|
135
|
-
for (const item of error.value.
|
164
|
+
if (error.value.extraInformationsToStore.length > 0) {
|
165
|
+
for (const item of error.value.extraInformationsToStore) {
|
136
166
|
// Check if the item is already in the memory
|
137
|
-
const memories = await this.memory.searchSimilarQueries(
|
167
|
+
const memories = await this.memory.persistent.searchSimilarQueries(
|
138
168
|
item.content
|
139
169
|
);
|
140
170
|
if (memories.length === 0) {
|
@@ -142,7 +172,7 @@ export class Evaluator {
|
|
142
172
|
query: item.content,
|
143
173
|
data: item.data,
|
144
174
|
});
|
145
|
-
await this.memory.createMemory({
|
175
|
+
await this.memory.persistent.createMemory({
|
146
176
|
id: crypto.randomUUID(),
|
147
177
|
purpose: "importantToRemember",
|
148
178
|
query: item.content,
|
@@ -0,0 +1,89 @@
|
|
1
|
+
export const generalInterpreterContext = {
|
2
|
+
role: "You are the general assistant. Your role is to provide a clear and factual analysis of the results.",
|
3
|
+
language: "user_language",
|
4
|
+
guidelines: {
|
5
|
+
important: [],
|
6
|
+
warnings: [],
|
7
|
+
},
|
8
|
+
};
|
9
|
+
|
10
|
+
export const securityInterpreterContext = {
|
11
|
+
role: "You are the security expert. Your role is to provide a clear and factual analysis of the security of the token/coin.",
|
12
|
+
language: "user_language",
|
13
|
+
guidelines: {
|
14
|
+
important: [
|
15
|
+
"Start with a clear security analysis of the token/coin.",
|
16
|
+
"One section for good points of the security check. One section, no sub-sections.",
|
17
|
+
"One section for bad points of the security check. One section, no sub-sections.",
|
18
|
+
"STOP AFTER SECURITY CHECK SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS",
|
19
|
+
],
|
20
|
+
warnings: [
|
21
|
+
"NEVER provide any financial advice.",
|
22
|
+
"NEVER speak about details of your system or your capabilities.",
|
23
|
+
"NEVER ADD ANY CONCLUDING STATEMENT OR DISCLAIMER AT THE END",
|
24
|
+
"NEVER explain technical errors or issues. Just say retry later.",
|
25
|
+
],
|
26
|
+
},
|
27
|
+
examplesMessages: [
|
28
|
+
{
|
29
|
+
role: "user",
|
30
|
+
content: "Analysis security of token/coin",
|
31
|
+
},
|
32
|
+
{
|
33
|
+
role: "assistant",
|
34
|
+
content: `
|
35
|
+
## Security analysis of x/y:
|
36
|
+
|
37
|
+
### Good:
|
38
|
+
Speak about the good points of the security check. If there is no good point, say "No good point found"
|
39
|
+
|
40
|
+
### Bad:
|
41
|
+
Speak about the bad points of the security check. If there is no bad point, say "No bad point found"
|
42
|
+
|
43
|
+
STOP AFTER SECURITY CHECK SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS
|
44
|
+
--------------------------------
|
45
|
+
`,
|
46
|
+
},
|
47
|
+
],
|
48
|
+
};
|
49
|
+
|
50
|
+
export const marketInterpreterContext = {
|
51
|
+
role: "You are the market expert. Your role is to provide a clear and factual analysis of the market sentiment of the token/coin.",
|
52
|
+
language: "user_language",
|
53
|
+
guidelines: {
|
54
|
+
important: [
|
55
|
+
"Start with a clear market sentiment (Bullish/Bearish/Neutral) without any additional comments before.",
|
56
|
+
"One section for fundamental analysis (important events, news, trends..etc). One section, no sub-sections.",
|
57
|
+
"One section for technical analysis (key price levels, trading volume, technical indicators, market activity). One section, no sub-sections.",
|
58
|
+
"STOP AFTER TECHNICAL ANALYSIS SECTION WITHOUT ANY ADDITIONAL COMMENTS",
|
59
|
+
],
|
60
|
+
warnings: [
|
61
|
+
"NEVER provide any financial advice.",
|
62
|
+
"NEVER speak about details of your system or your capabilities.",
|
63
|
+
"NEVER ADD ANY CONCLUDING STATEMENT OR DISCLAIMER AT THE END",
|
64
|
+
],
|
65
|
+
},
|
66
|
+
examplesMessages: [
|
67
|
+
{
|
68
|
+
role: "user",
|
69
|
+
content: "Analysis market sentiment of token/coin",
|
70
|
+
},
|
71
|
+
{
|
72
|
+
role: "assistant",
|
73
|
+
content: `
|
74
|
+
## Analysis of x/y:
|
75
|
+
|
76
|
+
Market sentiment: Bullish 📈 (Adapt the emoji to the market sentiment)
|
77
|
+
|
78
|
+
### Fundamental analysis (No sub-sections):
|
79
|
+
Speak about important events, news, trends..etc
|
80
|
+
|
81
|
+
### Technical analysis (No sub-sections):
|
82
|
+
Speak about key price levels, trading volume, technical indicators, market activity..etc
|
83
|
+
|
84
|
+
STOP AFTER TECHNICAL ANALYSIS SECTION WITHOUT ANY CONCLUDING STATEMENT OR DISCLAIMER OR ADDITIONAL COMMENTS
|
85
|
+
--------------------------------
|
86
|
+
`,
|
87
|
+
},
|
88
|
+
],
|
89
|
+
};
|
@@ -1,19 +1,21 @@
|
|
1
1
|
import { openai } from "@ai-sdk/openai";
|
2
2
|
import { generateObject, streamText, StreamTextResult } from "ai";
|
3
3
|
import { z } from "zod";
|
4
|
-
import { State } from "../../types";
|
5
|
-
import { synthesizerContext } from "./context";
|
4
|
+
import { Behavior, State } from "../../types";
|
6
5
|
|
7
|
-
export class
|
6
|
+
export class Interpreter {
|
8
7
|
private readonly model = openai("gpt-4o");
|
8
|
+
public readonly name: string;
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
constructor(name: string, private readonly behavior: Behavior) {
|
11
|
+
this.name = name;
|
12
|
+
this.behavior = behavior;
|
13
|
+
}
|
14
|
+
|
15
|
+
composeContext(state: State) {
|
16
|
+
const { userRequest, results } = state;
|
17
|
+
const { role, language, guidelines, examplesMessages } = this.behavior;
|
12
18
|
|
13
|
-
if (!behavior) {
|
14
|
-
return "";
|
15
|
-
}
|
16
|
-
const { role, language, guidelines } = behavior;
|
17
19
|
const { important, warnings, steps } = guidelines;
|
18
20
|
|
19
21
|
const context = `
|
@@ -31,7 +33,7 @@ export class Synthesizer {
|
|
31
33
|
|
32
34
|
async process(
|
33
35
|
prompt: string,
|
34
|
-
|
36
|
+
state: State,
|
35
37
|
onFinish?: (event: any) => void
|
36
38
|
): Promise<
|
37
39
|
| {
|
@@ -43,15 +45,11 @@ export class Synthesizer {
|
|
43
45
|
}
|
44
46
|
| StreamTextResult<Record<string, any>>
|
45
47
|
> {
|
46
|
-
console.log("\n🎨 Starting
|
48
|
+
console.log("\n🎨 Starting interpretation process");
|
47
49
|
console.log("Prompt:", prompt);
|
48
|
-
console.log("Results to
|
50
|
+
console.log("Results to interpret:", JSON.stringify(state, null, 2));
|
49
51
|
|
50
|
-
const context = this.composeContext(
|
51
|
-
behavior: synthesizerContext.behavior,
|
52
|
-
userRequest: prompt,
|
53
|
-
results: results,
|
54
|
-
});
|
52
|
+
const context = this.composeContext(state);
|
55
53
|
|
56
54
|
const result = await generateObject({
|
57
55
|
model: this.model,
|
@@ -69,7 +67,7 @@ export class Synthesizer {
|
|
69
67
|
system: context,
|
70
68
|
});
|
71
69
|
|
72
|
-
console.log("\n✅
|
70
|
+
console.log("\n✅ Interpretation completed");
|
73
71
|
console.log("─".repeat(50));
|
74
72
|
console.log("Generated response:", result.object);
|
75
73
|
|
@@ -88,22 +86,18 @@ export class Synthesizer {
|
|
88
86
|
|
89
87
|
async streamProcess(
|
90
88
|
prompt: string,
|
91
|
-
|
89
|
+
state: State,
|
92
90
|
onFinish?: (event: any) => void
|
93
91
|
): Promise<any> {
|
94
|
-
console.log("\n🎨 Starting streaming
|
92
|
+
console.log("\n🎨 Starting streaming interpretation");
|
95
93
|
console.log("Prompt:", prompt);
|
96
94
|
|
97
|
-
const context = this.composeContext(
|
98
|
-
behavior: synthesizerContext.behavior,
|
99
|
-
userRequest: prompt,
|
100
|
-
results: results,
|
101
|
-
});
|
95
|
+
const context = this.composeContext(state);
|
102
96
|
|
103
97
|
const result = await streamText({
|
104
98
|
model: this.model,
|
105
99
|
onFinish: (event) => {
|
106
|
-
console.log("\n✅ Streaming
|
100
|
+
console.log("\n✅ Streaming interpretation completed");
|
107
101
|
if (onFinish) onFinish(event);
|
108
102
|
},
|
109
103
|
prompt,
|
@@ -8,7 +8,7 @@ export const orchestratorContext = {
|
|
8
8
|
"If some parameters are not clear or missing, don't add the action, YOU MUST ask the user for them.",
|
9
9
|
"ALWAYS use the same language as user request. (If it's English, use English, if it's French, use French, etc.)",
|
10
10
|
"For ON-CHAIN actions, just use the useful actions.",
|
11
|
-
"For QUESTIONS or ANALYSIS, you
|
11
|
+
"For QUESTIONS or ANALYSIS, you MUST search in your cache memory or/and internal knowledge base.",
|
12
12
|
"NEVER repeat same actions if the user doesn't ask for it.",
|
13
13
|
],
|
14
14
|
warnings: [],
|