agentic-api 1.0.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.md +198 -0
- package/dist/src/agents/authentication.d.ts +6 -0
- package/dist/src/agents/authentication.js +216 -0
- package/dist/src/agents/digestor.d.ts +7 -0
- package/dist/src/agents/digestor.js +60 -0
- package/dist/src/agents/memory.d.ts +0 -0
- package/dist/src/agents/memory.js +1 -0
- package/dist/src/agents/prompts.d.ts +7 -0
- package/dist/src/agents/prompts.js +302 -0
- package/dist/src/agents/semantic.d.ts +4 -0
- package/dist/src/agents/semantic.js +20 -0
- package/dist/src/agents/simpleExample.d.ts +3 -0
- package/dist/src/agents/simpleExample.js +38 -0
- package/dist/src/agents/system-review.d.ts +5 -0
- package/dist/src/agents/system-review.js +181 -0
- package/dist/src/agents/system.d.ts +4 -0
- package/dist/src/agents/system.js +21 -0
- package/dist/src/agents/systemReview.d.ts +4 -0
- package/dist/src/agents/systemReview.js +22 -0
- package/dist/src/execute.d.ts +42 -0
- package/dist/src/execute.js +289 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.js +32 -0
- package/dist/src/princing.openai.d.ts +4 -0
- package/dist/src/princing.openai.js +49 -0
- package/dist/src/prompts.d.ts +5 -0
- package/dist/src/prompts.js +136 -0
- package/dist/src/scrapper.d.ts +54 -0
- package/dist/src/scrapper.js +294 -0
- package/dist/src/types.d.ts +126 -0
- package/dist/src/types.js +93 -0
- package/dist/src/utils.d.ts +27 -0
- package/dist/src/utils.js +288 -0
- package/package.json +45 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AgentConfig, AgenticContext, AgenticMemory, AgentModel, Feedback } from "./types";
|
|
2
|
+
import { Writable } from "stream";
|
|
3
|
+
export declare function modelConfig(model: string, custom?: any): AgentModel;
|
|
4
|
+
export declare function sendFeedback(params: Feedback): void;
|
|
5
|
+
export interface ReadCompletionsStreamOptions {
|
|
6
|
+
memory: AgenticMemory;
|
|
7
|
+
stdout: Writable;
|
|
8
|
+
session: AgenticContext;
|
|
9
|
+
final: any;
|
|
10
|
+
enrichWithMemory?: (role?: string) => Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
export declare function readCompletionsStream(params: ReadCompletionsStreamOptions): Promise<false | undefined>;
|
|
13
|
+
/**
|
|
14
|
+
* Parameters for executing an agent set
|
|
15
|
+
* @interface ExecuteAgentSetParams
|
|
16
|
+
* @property {OpenAI} openai - OpenAI client instance
|
|
17
|
+
* @property {string} query - User query to process
|
|
18
|
+
* @property {string} home - Name of the agent to start with
|
|
19
|
+
* @property {Writable} stdout - Stream to write output to
|
|
20
|
+
* @property {boolean} [verbose] - Whether to log verbose debug information
|
|
21
|
+
* @property {number} [maxSteps] - Maximum number of steps to execute
|
|
22
|
+
*/
|
|
23
|
+
export interface ExecuteAgentSetParams {
|
|
24
|
+
enrichWithMemory?: (role?: string) => Promise<string>;
|
|
25
|
+
query: string;
|
|
26
|
+
home: string;
|
|
27
|
+
stdout: Writable;
|
|
28
|
+
verbose?: boolean;
|
|
29
|
+
debug?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Executes a set of agents to process a user query
|
|
33
|
+
*
|
|
34
|
+
* This function initializes the agent memory, processes the user query through the appropriate
|
|
35
|
+
* agent, and handles any agent transfers or tool calls that occur during execution.
|
|
36
|
+
*
|
|
37
|
+
* @param {AgentConfig[]} agentSet - Array of agent configurations
|
|
38
|
+
* @param {AgenticContext} session - {memory, user, ...} - Session object to store/read conversation state
|
|
39
|
+
* @param {ExecuteAgentSetParams} params - Execution parameters
|
|
40
|
+
* @returns {Promise<void>}
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeAgentSet(agentSet: AgentConfig[], session: AgenticContext, params: ExecuteAgentSetParams): Promise<void>;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.modelConfig = modelConfig;
|
|
4
|
+
exports.sendFeedback = sendFeedback;
|
|
5
|
+
exports.readCompletionsStream = readCompletionsStream;
|
|
6
|
+
exports.executeAgentSet = executeAgentSet;
|
|
7
|
+
const princing_openai_1 = require("./princing.openai");
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
function modelConfig(model, custom) {
|
|
11
|
+
const defaultOptions = Object.assign({
|
|
12
|
+
max_completion_tokens: 15192,
|
|
13
|
+
stream_options: { "include_usage": true },
|
|
14
|
+
}, custom || {});
|
|
15
|
+
const mapping = {
|
|
16
|
+
"LOW": {
|
|
17
|
+
temperature: 0.3,
|
|
18
|
+
frequency_penalty: 0.0,
|
|
19
|
+
presence_penalty: 0.0,
|
|
20
|
+
model: "gpt-4.1-nano"
|
|
21
|
+
},
|
|
22
|
+
"MEDIUM": {
|
|
23
|
+
temperature: 0.3,
|
|
24
|
+
frequency_penalty: 0.0,
|
|
25
|
+
presence_penalty: 0.0,
|
|
26
|
+
model: "gpt-4.1-mini",
|
|
27
|
+
},
|
|
28
|
+
"HIGH": {
|
|
29
|
+
temperature: 0.3,
|
|
30
|
+
model: "gpt-4.1",
|
|
31
|
+
stream: true
|
|
32
|
+
},
|
|
33
|
+
"SEARCH": {
|
|
34
|
+
temperature: 0.2,
|
|
35
|
+
frequency_penalty: 0.0,
|
|
36
|
+
presence_penalty: 0.0,
|
|
37
|
+
model: "gpt-4o-mini-search-preview",
|
|
38
|
+
web_search_options: {
|
|
39
|
+
user_location: {
|
|
40
|
+
type: "approximate",
|
|
41
|
+
approximate: {
|
|
42
|
+
country: "CH",
|
|
43
|
+
city: "Geneva",
|
|
44
|
+
region: "Geneva",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
const options = Object.assign(mapping[model], defaultOptions);
|
|
51
|
+
return options;
|
|
52
|
+
}
|
|
53
|
+
function sendFeedback(params) {
|
|
54
|
+
const { agent, stdout, description, usage, state } = params;
|
|
55
|
+
const feedback = {
|
|
56
|
+
agent,
|
|
57
|
+
description,
|
|
58
|
+
usage,
|
|
59
|
+
state
|
|
60
|
+
};
|
|
61
|
+
console.log('--- DBG feedback --:', description);
|
|
62
|
+
//
|
|
63
|
+
// send agent state and description
|
|
64
|
+
stdout.write(`\n<step>${JSON.stringify(feedback)}</step>\n`);
|
|
65
|
+
}
|
|
66
|
+
async function readCompletionsStream(params) {
|
|
67
|
+
const openai = (0, utils_1.openaiInstance)();
|
|
68
|
+
//
|
|
69
|
+
// set default context here
|
|
70
|
+
const { memory, stdout, final, session } = params;
|
|
71
|
+
const model = memory.currentAgent.model.model;
|
|
72
|
+
const accumulatedFunctionCall = final.choices[0]?.message.tool_calls || [];
|
|
73
|
+
const content = final.choices[0]?.message.content;
|
|
74
|
+
let thinking = false;
|
|
75
|
+
(0, princing_openai_1.accumulateCost)(memory, model, final.usage);
|
|
76
|
+
memory.state = final.id;
|
|
77
|
+
//console.log("✅ DEBUG memory (IN messages):",memory.messages);
|
|
78
|
+
if (content) {
|
|
79
|
+
console.log("✅ Agent (1): 🌶️🌶️🌶️ content:", content);
|
|
80
|
+
memory.messages.push({ role: "assistant", content });
|
|
81
|
+
}
|
|
82
|
+
// Si le modèle décide d'appeler une fonction (par exemple "transferAgents")
|
|
83
|
+
for (const functionCall of accumulatedFunctionCall) {
|
|
84
|
+
const args = JSON.parse(functionCall?.function?.arguments || '{}');
|
|
85
|
+
if (args.justification) {
|
|
86
|
+
sendFeedback({
|
|
87
|
+
agent: memory.currentAgent.name,
|
|
88
|
+
stdout,
|
|
89
|
+
description: args.justification,
|
|
90
|
+
usage: memory.usage,
|
|
91
|
+
state: memory.state
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const functionCallResult = await (0, utils_1.handleTransferCall)(memory, functionCall, session);
|
|
95
|
+
// result can be
|
|
96
|
+
// {content, usage} {did_transfer}
|
|
97
|
+
thinking = functionCallResult.thinking;
|
|
98
|
+
if (functionCallResult.usage) {
|
|
99
|
+
(0, princing_openai_1.accumulateCost)(memory, model, functionCallResult.usage);
|
|
100
|
+
}
|
|
101
|
+
if (functionCallResult.did_transfer) {
|
|
102
|
+
console.log("✅ Agent transfer response:", functionCallResult.source_agent, ' call function ', functionCall.function.name, '::to', functionCallResult.destination_agent, ' transfer done ✅');
|
|
103
|
+
// Mise à jour du message système avec les nouvelles instructions du nouvel agent courant
|
|
104
|
+
const instructions = memory.currentAgent.instructions;
|
|
105
|
+
const enrichedInstructions = (await params.enrichWithMemory?.("system")) || '';
|
|
106
|
+
memory.messages[0] = { role: "system", content: instructions + '\n' + enrichedInstructions };
|
|
107
|
+
// Ajout de la réponse de l'appel de fonction dans le contexte conversationnel
|
|
108
|
+
const message = functionCallResult.content ?? `Le transfert vers l'agent "${memory.currentAgent?.name}" a été effectué, Tu dois répondre immédiatement à la question.`;
|
|
109
|
+
memory.messages.push({
|
|
110
|
+
role: "assistant",
|
|
111
|
+
name: functionCallResult.name,
|
|
112
|
+
content: message,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//
|
|
116
|
+
// other function call have a result
|
|
117
|
+
else if (functionCallResult.content) {
|
|
118
|
+
// console.log("✅ Agent tool response:",memory.currentAgent?.name,'::',functionCall.function.name, ' with content',functionCallResult.content);
|
|
119
|
+
memory.messages.push({
|
|
120
|
+
role: "assistant",
|
|
121
|
+
name: functionCallResult.name,
|
|
122
|
+
content: functionCallResult.content,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//
|
|
126
|
+
// send user feedback
|
|
127
|
+
if (functionCallResult.feedback) {
|
|
128
|
+
sendFeedback({
|
|
129
|
+
agent: memory.currentAgent.name,
|
|
130
|
+
stdout,
|
|
131
|
+
description: functionCallResult.feedback,
|
|
132
|
+
usage: memory.usage,
|
|
133
|
+
state: memory.state
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// Réactualisation de la liste des outils pour le nouvel agent courant
|
|
137
|
+
const tools = memory.currentAgent?.tools || [];
|
|
138
|
+
const followUpOptions = Object.assign({}, memory.currentAgent?.model);
|
|
139
|
+
followUpOptions.messages = memory.messages;
|
|
140
|
+
//
|
|
141
|
+
// always force HIGH model for follow up
|
|
142
|
+
followUpOptions.model = "gpt-4.1";
|
|
143
|
+
if (tools.length > 0) {
|
|
144
|
+
followUpOptions.tools = tools;
|
|
145
|
+
followUpOptions.tool_choice = "auto";
|
|
146
|
+
}
|
|
147
|
+
// if(!functionCallResult.did_transfer) {
|
|
148
|
+
// followUpOptions.tool_choice = "none";
|
|
149
|
+
// }
|
|
150
|
+
// Poursuite de la conversation avec le contexte mis à jour
|
|
151
|
+
const followUpStream = await openai.beta.chat.completions.stream(followUpOptions);
|
|
152
|
+
for await (const chunk of followUpStream) {
|
|
153
|
+
//process.stdout.write(chunk.choices[0]?.delta?.content || "");
|
|
154
|
+
const delta = chunk.choices[0]?.delta;
|
|
155
|
+
if (delta?.content) {
|
|
156
|
+
stdout.write(delta?.content);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const final = await followUpStream.finalChatCompletion();
|
|
160
|
+
// console.log("✅ DEBUG followUpOptions (OUT content):",final.choices[0]?.message.content);
|
|
161
|
+
// console.log("✅ DEBUG followUpOptions (OUT tool_calls):",final.choices[0]?.message.tool_calls);
|
|
162
|
+
//
|
|
163
|
+
// when called a function, agent must continue the conversation
|
|
164
|
+
if (final.choices[0]?.message.tool_calls) {
|
|
165
|
+
// console.log("✅ Agent (OUT):",currentAgent?.name,'continue with new call => go to readCompletionsStream (2)');
|
|
166
|
+
return await readCompletionsStream({ memory, stdout, final, session });
|
|
167
|
+
}
|
|
168
|
+
(0, princing_openai_1.accumulateCost)(memory, followUpOptions.model, final.usage);
|
|
169
|
+
memory.state = final.id;
|
|
170
|
+
//
|
|
171
|
+
// send the cost
|
|
172
|
+
sendFeedback({
|
|
173
|
+
agent: memory.currentAgent.name,
|
|
174
|
+
stdout,
|
|
175
|
+
description: '',
|
|
176
|
+
usage: memory.usage,
|
|
177
|
+
state: memory.state
|
|
178
|
+
});
|
|
179
|
+
const content = final.choices[0]?.message.content;
|
|
180
|
+
console.log("✅ Agent (OUT):", memory.currentAgent?.name, 'with content length', content?.length);
|
|
181
|
+
if (content) {
|
|
182
|
+
memory.messages.push({ role: "assistant", content });
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Executes a set of agents to process a user query
|
|
189
|
+
*
|
|
190
|
+
* This function initializes the agent memory, processes the user query through the appropriate
|
|
191
|
+
* agent, and handles any agent transfers or tool calls that occur during execution.
|
|
192
|
+
*
|
|
193
|
+
* @param {AgentConfig[]} agentSet - Array of agent configurations
|
|
194
|
+
* @param {AgenticContext} session - {memory, user, ...} - Session object to store/read conversation state
|
|
195
|
+
* @param {ExecuteAgentSetParams} params - Execution parameters
|
|
196
|
+
* @returns {Promise<void>}
|
|
197
|
+
*/
|
|
198
|
+
async function executeAgentSet(agentSet, session, params) {
|
|
199
|
+
const { query, home, verbose } = params;
|
|
200
|
+
const openai = (0, utils_1.openaiInstance)();
|
|
201
|
+
const agents = (0, utils_1.injectTransferTools)(agentSet);
|
|
202
|
+
const memory = types_1.AgenticMemoryManager.createOrLoad(session, agents, home);
|
|
203
|
+
//
|
|
204
|
+
// restore the current agent
|
|
205
|
+
const currentAgent = memory.currentAgent;
|
|
206
|
+
if (!currentAgent) {
|
|
207
|
+
throw new Error(`Agent ${home} not found`);
|
|
208
|
+
}
|
|
209
|
+
if (!currentAgent.instructions) {
|
|
210
|
+
throw new Error(`Agent ${home} has no instructions`);
|
|
211
|
+
}
|
|
212
|
+
//
|
|
213
|
+
// set the initial agent instructions and memory
|
|
214
|
+
if (!memory.messages.length) {
|
|
215
|
+
memory.usage = { prompt: 0, completion: 0, total: 0, cost: 0 };
|
|
216
|
+
//
|
|
217
|
+
// add the initial agent to his memory
|
|
218
|
+
// Handle two-shot prompting: if instructions is an array, use the first part as a system message
|
|
219
|
+
const enrichedInstructions = (await params.enrichWithMemory?.("system")) || '';
|
|
220
|
+
const instructions = currentAgent.instructions + '\n' + enrichedInstructions;
|
|
221
|
+
memory.messages.push({ role: "system", content: instructions });
|
|
222
|
+
}
|
|
223
|
+
// Append the user's query to the session-specific messages
|
|
224
|
+
// input: `${getMemoryString(relevantMemories)}\n${input}`,
|
|
225
|
+
memory.messages.push({ role: "user", content: query });
|
|
226
|
+
// Les outils (définition des fonctions) disponibles par l'agent courant
|
|
227
|
+
const tools = currentAgent.tools;
|
|
228
|
+
// console.log('--- DBG toolLogic (1)',memory.currentAgent, memory.currentAgent?.toolLogic);
|
|
229
|
+
if (verbose) {
|
|
230
|
+
console.log('--- DBG current agent', currentAgent.name);
|
|
231
|
+
console.log('--- DBG memory len:', memory.messages.length);
|
|
232
|
+
console.log('--- DBG query:', query);
|
|
233
|
+
}
|
|
234
|
+
// let shots = 1;
|
|
235
|
+
let thinking = false;
|
|
236
|
+
let message;
|
|
237
|
+
do {
|
|
238
|
+
thinking = false;
|
|
239
|
+
const options = Object.assign({}, currentAgent?.model);
|
|
240
|
+
options.messages = memory.messages;
|
|
241
|
+
if (tools.length > 0) {
|
|
242
|
+
options.tools = tools;
|
|
243
|
+
options.tool_choice = "auto";
|
|
244
|
+
}
|
|
245
|
+
const stream = await openai.beta.chat.completions.stream(options);
|
|
246
|
+
// const intialinfo = [
|
|
247
|
+
// "Analyse",
|
|
248
|
+
// "Analyse en cours…",
|
|
249
|
+
// "Hummm"
|
|
250
|
+
// ];
|
|
251
|
+
// const randomIndex = Math.floor(Math.random() * intialinfo.length);
|
|
252
|
+
// //
|
|
253
|
+
// // initial feedback
|
|
254
|
+
// sendFeedback({
|
|
255
|
+
// agent:memory.currentAgent.name,
|
|
256
|
+
// stdout:params.stdout,
|
|
257
|
+
// description:intialinfo[randomIndex],
|
|
258
|
+
// usage:memory.usage,
|
|
259
|
+
// state:memory.state!
|
|
260
|
+
// })
|
|
261
|
+
for await (const chunk of stream) {
|
|
262
|
+
if (verbose)
|
|
263
|
+
process.stdout.write(chunk.choices[0]?.delta?.content || "");
|
|
264
|
+
const delta = chunk.choices[0]?.delta;
|
|
265
|
+
if (delta?.content) {
|
|
266
|
+
params.stdout.write(delta?.content);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const final = await stream.finalChatCompletion();
|
|
270
|
+
thinking = await readCompletionsStream({
|
|
271
|
+
memory,
|
|
272
|
+
stdout: params.stdout,
|
|
273
|
+
session,
|
|
274
|
+
final,
|
|
275
|
+
enrichWithMemory: params.enrichWithMemory,
|
|
276
|
+
});
|
|
277
|
+
// Handle two-shot prompting: if instructions is an array, send the second part as a user message
|
|
278
|
+
// This allows for more complex agent behavior by providing additional context or instructions
|
|
279
|
+
// after the initial response, similar to chain-of-thought prompting
|
|
280
|
+
// if(Array.isArray(currentAgent.instructions && shots < currentAgent.instructions.length)){
|
|
281
|
+
// const instructions = currentAgent.instructions[shots];
|
|
282
|
+
// memory.messages.push({ role: "user", content: instructions });
|
|
283
|
+
// thinking = true;
|
|
284
|
+
// shots++;
|
|
285
|
+
// }
|
|
286
|
+
if (thinking)
|
|
287
|
+
console.log("🌶️🌶️🌶️ restart thinking:");
|
|
288
|
+
} while (thinking);
|
|
289
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agentic-api
|
|
3
|
+
* API pour l'orchestration d'agents intelligents avec séquences et escalades automatiques
|
|
4
|
+
*/
|
|
5
|
+
export * from './utils';
|
|
6
|
+
export * from './types';
|
|
7
|
+
export * from './execute';
|
|
8
|
+
export * from './princing.openai';
|
|
9
|
+
export * from './scrapper';
|
|
10
|
+
export * from './agents/semantic';
|
|
11
|
+
export * from './agents/system';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @agentic-api
|
|
4
|
+
* API pour l'orchestration d'agents intelligents avec séquences et escalades automatiques
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
// Export des utilitaires
|
|
22
|
+
__exportStar(require("./utils"), exports);
|
|
23
|
+
// Types
|
|
24
|
+
__exportStar(require("./types"), exports);
|
|
25
|
+
// Execute
|
|
26
|
+
__exportStar(require("./execute"), exports);
|
|
27
|
+
__exportStar(require("./princing.openai"), exports);
|
|
28
|
+
// Scrapper
|
|
29
|
+
__exportStar(require("./scrapper"), exports);
|
|
30
|
+
// Agents
|
|
31
|
+
__exportStar(require("./agents/semantic"), exports);
|
|
32
|
+
__exportStar(require("./agents/system"), exports);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CompletionUsage } from "openai/resources";
|
|
2
|
+
import { AgenticMemory } from "./types";
|
|
3
|
+
export declare function calculateCost(model: string, usage?: CompletionUsage): number;
|
|
4
|
+
export declare function accumulateCost(memory: AgenticMemory, model: string, usage?: CompletionUsage): number;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateCost = calculateCost;
|
|
4
|
+
exports.accumulateCost = accumulateCost;
|
|
5
|
+
//
|
|
6
|
+
// get/update pricing from openai
|
|
7
|
+
// - https://platform.openai.com/docs/pricing#latest-models
|
|
8
|
+
const modelPricing = {
|
|
9
|
+
"gpt-4.5-preview": { input: 0.000075, cachedInput: 0.0000325, output: 0.000125 },
|
|
10
|
+
"gpt-4.1": { input: 0.000002, cachedInput: 0.0000005, output: 0.000008 },
|
|
11
|
+
"gpt-4.1-mini": { input: 0.0000004, cachedInput: 0.0000001, output: 0.0000016 },
|
|
12
|
+
"gpt-4.1-nano": { input: 0.0000001, cachedInput: 0.000000025, output: 0.0000004 },
|
|
13
|
+
"gpt-4o": { input: 0.0000025, cachedInput: 0.00000125, output: 0.00001 },
|
|
14
|
+
"gpt-4o-audio-preview": { input: 0.0000025, output: 0.00001 },
|
|
15
|
+
"gpt-4o-realtime-preview": { input: 0.000005, cachedInput: 0.0000025, output: 0.00002 },
|
|
16
|
+
"gpt-4o-search-preview": { input: 0.000005, cachedInput: 0.0000025, output: 0.00002 },
|
|
17
|
+
"gpt-4o-mini": { input: 0.00000015, cachedInput: 0.000000075, output: 0.0000006 },
|
|
18
|
+
"gpt-4o-mini-audio-preview": { input: 0.00000015, output: 0.0000006 },
|
|
19
|
+
"gpt-4o-mini-realtime-preview": { input: 0.0000006, cachedInput: 0.0000003, output: 0.0000024 },
|
|
20
|
+
"gpt-4o-mini-search-preview": { input: 0.0000015, cachedInput: 0.00000075, output: 0.000006 },
|
|
21
|
+
"o1": { input: 0.000015, cachedInput: 0.0000075, output: 0.00006 },
|
|
22
|
+
"o3-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
|
|
23
|
+
"o1-mini": { input: 0.0000011, cachedInput: 0.00000055, output: 0.0000044 },
|
|
24
|
+
};
|
|
25
|
+
function calculateCost(model, usage) {
|
|
26
|
+
if (!usage) {
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
if (!modelPricing[model]) {
|
|
30
|
+
throw new Error("Unknown model");
|
|
31
|
+
}
|
|
32
|
+
const pricing = modelPricing[model];
|
|
33
|
+
const cost = usage.prompt_tokens * pricing.input +
|
|
34
|
+
// usage.completion_tokens * (pricing.cachedInput || 0) +
|
|
35
|
+
usage.completion_tokens * pricing.output;
|
|
36
|
+
return cost;
|
|
37
|
+
}
|
|
38
|
+
function accumulateCost(memory, model, usage) {
|
|
39
|
+
if (!usage) {
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
let _usage = memory.usage;
|
|
43
|
+
_usage.prompt += usage.prompt_tokens;
|
|
44
|
+
_usage.completion += usage.completion_tokens;
|
|
45
|
+
_usage.total += usage.total_tokens;
|
|
46
|
+
_usage.cost += calculateCost(model, usage);
|
|
47
|
+
memory.usage = _usage;
|
|
48
|
+
return _usage.cost;
|
|
49
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const transferAgentPrompt_ = "Triggers a transfer of the user to a more specialized agent. \n Calls escalate to a more specialized LLM agent or to a human agent, with additional context. \n Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.\n \n Let the user know you're about to transfer them before doing so.\n\nAvailable Agents:";
|
|
2
|
+
export declare const transferAgentPrompt = "\nTriggers a transfer of the user to a specialized agent, for one task.\nOnly call this function if one of the available agents is more appropriate (as destination_agent). Don't transfer to your own agent name \"__AGENT_NAME__\".\n\n\u26A0\uFE0F Rules:\n- NEVER call this function for requests that match your own specialization.\n\n\nAvailable Agents:";
|
|
3
|
+
export declare const defaultOutputPrompt = "\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n";
|
|
4
|
+
export declare const textToMarkdownPrompt = "# R\u00D4LE:\n- Tu es un expert en transformation de documents structur\u00E9 pour la cr\u00E9ation d'un RAG (HNSW cosine index).\n- Ton r\u00F4le consiste \u00E0 analyser et comprendre des contenus complexes (texte ou HTML) pour en extraire la structure s\u00E9mantique essentielle: titres, paragraphes, listes, liens, tableaux.\n- Tu agis comme un moteur de \"reader view\" capable de construire une version fluide, lisible et reflowable du document original sans supprimer le contenu.\n- Tu sais que le contenu du document concerne les Proc\u00E9dures de l'entreprise Pilet-Renaud SA. Ces proc\u00E9dures sont importantes pour aider les collaborateurs \u00E0 satisfaire les demandes des clients.\n- Tu sais comment organiser l'information en sections et sous-sections pour ensuite cr\u00E9er des entr\u00E9es individuelles dans un RAG .\n- Tu sais que pour \u00EAtre significatif chaque entr\u00E9e du RAG doit contenir de l'objectif du document.\n\n\n# MISSION:\n- Ta mission est de convertir le document, qu'il s'agisse de texte brut ou de HTML issu d'une conversion (par exemple, d'un PDF), en un contenu Markdown structur\u00E9 et COMPLET qui sera utilis\u00E9 pour g\u00E9n\u00E9rer un RAG. \n- Tu dois analyser le document ligne par ligne, de mani\u00E8re exhaustif pour inf\u00E9rer dans ta m\u00E9moire, l'objectif de la page et une repr\u00E9sentation hi\u00E9rarchique \u00E0 deux niveaux (titre1 et titre2) dans lesquelles toutes les \"proc\u00E9dures\" compl\u00E8tes seront d\u00E9velopp\u00E9es.\n- Tu sais que le document fait r\u00E9f\u00E9rence \u00E0 des proc\u00E9dures d'entreprise, tu dois assurer:\n - Que TOUS les titres \u00E0 produire sont des phrases courtes reformul\u00E9es (par toi) qui expriment le contexte du document et la section qui suit.\n - Que la logique du contenu est bien formul\u00E9e et les \u00E9tapes sont d\u00E9taill\u00E9es.\n - Lors d'une proc\u00E9dure de logiciel, les \u00E9tapes sont importantes et doivent \u00EAtre d\u00E9taill\u00E9es: nom des \u00E9crans, raccourcis clavier, commandes, onglets, les menus, etc. \n - Tous les contenus extraits en MAJUSCULES sont importants et doivent \u00EAtre en gras.\n \n# DIRECTIVES:\n- Analyser **chaque ligne du document**, qu\u2019il soit en **texte brut ou HTML converti depuis un PDF**, pour identifier sa structure logique. Cette directive s\u2019applique **\u00E0 tous les types de documents trait\u00E9s par l\u2019agent**.\n- Les \u00E9l\u00E9ments suivants doivent \u00EAtre d\u00E9tect\u00E9s et correctement interpr\u00E9t\u00E9s : **titres**, **paragraphes**, **listes \u00E0 puces**, **listes num\u00E9rot\u00E9es**, **tableaux**, **images** (via leurs balises ou l\u00E9gendes), **liens** (explicites ou implicites), **blocs de code**, **\u00E9l\u00E9ments r\u00E9p\u00E9titifs inutiles**.\n- Si une ligne ne permet pas d\u2019identifier une structure claire, appliquer la strat\u00E9gie suivante :\n 1. Si la ligne semble faire partie d\u2019un paragraphe continu, la rattacher au paragraphe pr\u00E9c\u00E9dent.\n 2. Si elle est isol\u00E9e et non interpr\u00E9table (caract\u00E8res seuls, artefacts de conversion), la supprimer.\n 3. Si elle contient des mots-cl\u00E9s m\u00E9tiers (urgence, type d\u2019intervention, proc\u00E9dure, r\u00F4le), la conserver comme \u00E9l\u00E9ment brut dans un bloc ind\u00E9pendant.\n\n- Supprimer les caract\u00E8res invisibles ou parasites fr\u00E9quents issus d\u2019une conversion PDF (ex : saut de page \"\f\", caract\u00E8res de contr\u00F4le, caract\u00E8res isol\u00E9s non imprimables). Ne jamais supprimer une ligne enti\u00E8re uniquement \u00E0 cause de ces caract\u00E8res.\n- Masquer toute information sensible li\u00E9e \u00E0 une authentification : identifiants utilisateurs, mots de passe, codes d\u2019acc\u00E8s, tokens, ou cha\u00EEnes de connexion. Appliquer un masquage partiel en ins\u00E9rant trois ast\u00E9risques `***` au milieu du mot ou de la cha\u00EEne (ex : `jo***3`, `Pa***024`).\n- \u00C9tablir une convention stricte pour le formatage des titres et sous-titres :\n - Si la section sous le titre principal (titre1) n'apporte rien \u00E0 la compr\u00E9hension, il ne doit pas \u00EAtre produit dans le rendu final.\n - Chaque section doit \u00EAtre introduite par un titre de niveau 2 (H2 en markdown). Ce titre (titre2) doit inclure une phrase descriptive combinant :\n - Le sujet : l\u2019objectif global du document.\n - La relation : la mani\u00E8re dont la section s\u2019inscrit dans le contexte g\u00E9n\u00E9ral.\n - Le qui: \u00E0 qui s'adresse la proc\u00E9dure.\n - L\u2019objet ou compl\u00E9ment d\u2019objet : la finalit\u00E9 sp\u00E9cifique de la section en r\u00E9f\u00E9rence \u00E0 l'objectif du document.\n - Chaque titre de section doit imp\u00E9rativement int\u00E9grer une r\u00E9f\u00E9rence contextuelle explicite au document de base pour garantir sa valeur sp\u00E9cifique dans le RAG.\n- Int\u00E9grer la liste de liens dans le document :\n - Si le libell\u00E9 d\u2019un lien correspond pr\u00E9cis\u00E9ment \u00E0 un texte existant, l\u2019int\u00E9grer directement dans le texte.\n - Sinon, placer ces liens sous forme de liste \u00E0 puces dans une section annexe intitul\u00E9e \"# R\u00E9f\u00E9rences externes\" \u00E0 la fin du document.\n- Tu utilises le s\u00E9parateur --- pour marquer la fin de chaque section du RAG.\n- Les sections peuvent contenir des puces, des tableaux, des images, etc..\n- Produire une ent\u00EAte JSON plac\u00E9e avant tout le reste du contenu, avec la structure suivante `\n {\n \"document\": \"{nom-du-fichier.extension}\",\n \"titre\": \"objectif global du document (pour qui, pourquoi, comment en 10 mots)\",\n \"date\": \"YYYY-MM-DD\",\n \"objetif\": \"pour qui, pourquoi et comment, en une phrase de maximum 15 mots.\"\n }`\n- S\u2019assurer que le document final respecte la logique exhaustive du contenu, corrige les erreurs de logique ou les biais d\u2019interpr\u00E9tation, et applique les conventions de formatage afin de permettre une extraction pr\u00E9cise des informations.\n\n\n# DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES\n- Ne jamais r\u00E9sumer les sections comportant des sc\u00E9narios conditionnels ou des d\u00E9cisions bas\u00E9es sur des questions (ex : \"Si vous avez de l\u2019eau froide...\"). Tous les cas doivent \u00EAtre explicitement d\u00E9velopp\u00E9s sous forme de **liste hi\u00E9rarchique, tableau ou arbre logique** selon la structure naturelle du texte.\n- Chaque situation d\u00E9crite sous forme de **plainte, question ou dialogue utilisateur** (ex : \u00AB J\u2019ai une fuite sous le lavabo \u00BB) doit \u00EAtre convertie en un **titre clair** suivi d\u2019une proc\u00E9dure d\u00E9taill\u00E9e, avec :\n - Les **questions \u00E0 poser**,\n - Les **v\u00E9rifications \u00E0 effectuer**,\n - Et les **actions \u00E0 entreprendre** selon chaque r\u00E9ponse.\n- Toute **logique de d\u00E9cision op\u00E9rationnelle** doit \u00EAtre repr\u00E9sent\u00E9e dans le Markdown avec une structure claire : **liste num\u00E9rot\u00E9e, liste imbriqu\u00E9e ou tableau de d\u00E9cision**. Aucun sous-cas ne doit \u00EAtre omis ou regroup\u00E9.\n- Lorsque le document mentionne une situation **urgente** (mots cl\u00E9s : \"URGENT\", \"imm\u00E9diat\", \"prioritaire\"), ajouter une ic\u00F4ne \"\u26A0\uFE0F\" au d\u00E9but de l\u2019\u00E9tape ou de la ligne correspondante dans le Markdown, pour faciliter la reconnaissance des cas critiques.\n- La sortie finale doit **refl\u00E9ter l'int\u00E9gralit\u00E9 de la logique du texte source**, sans perte d'information, en \u00E9vitant toute simplification excessive des proc\u00E9dures, m\u00EAme si cela allonge le contenu. L\u2019objectif est de garantir qu\u2019un lecteur puisse **suivre la proc\u00E9dure sans jamais devoir se r\u00E9f\u00E9rer au document original**.\n- \u26A0\uFE0F Les sections qui contiennent uniquement des liens relatifs \u00E0 des proc\u00E9dures sont supprim\u00E9s du r\u00E9sultat final.\n\n# DICTIONNAIRE:\n- Logiciels Sp\u00E9cifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.\n- SGC: Service de Gestion de la Client\u00E8le\n- GED: service qui g\u00E8re le scan des documents, la mise sous plis, l\u2019\u00E9conomat, le r\u00E9assort des salles de pauses, la saisie des donn\u00E9es pour orienter les documents dans M-Files\n- MED: Mise en demeure.\n- WC: Toilettes.\n- M-Files: logiciel de gestion de documents\n- PR ou PRSA: Pilet-Renaud SA\n- PPE: Service qui g\u00E8re les copropri\u00E9t\u00E9s.\n- GP: Garantie Bancaire\n- WC: Toilettes.\n- BAL: Boite \u00E0 Lettre\n- DD: Arrangement de paiement pour facture due mais qui n\u2019est pas du loyer.\n- copro: copropri\u00E9taire (attention \u00E0 ne pas confondre avec gopros)\n- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, cr\u00E9ation de bons, bons, etc).\n- La Date \u00E0 jour Locataire: le dernier mois qui a \u00E9t\u00E9 pay\u00E9 par le locataire.\n\n# APPROCHE CoT (Chain of Thought):\n- Utilise un processus de r\u00E9flexion structur\u00E9 encadr\u00E9 par les balises <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat final. \n- Dans cette section de raisonnement tu DOIS:\n 1. Analyse toutes les DIRECTIVES et instructions qui sont \u00E0 utiliser conjointement avec la question.\n 2. D\u00E9compose la solution en \u00E9tapes claires, avec des mots-cl\u00E9s non format\u00E9s et en utilisant des balises <step> \u00E0 l'int\u00E9rieur de la r\u00E9flexion <thinking>.\n 3. Ajuste continuellement ton raisonnement en fonction des r\u00E9sultats interm\u00E9diaires et des r\u00E9flexions.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
|
|
5
|
+
export declare const htmlToMarkdownPrompt = "\n# R\u00D4LE:\nTu es un expert pour analyser des documents HTML.\n\n# MISSION:\nTu es un expert mondial pour analyser des documents HTML.\nTa mission est de convertir un document HTML en markdown correctement structur\u00E9 (tableau, liste, paragraphe, titre, image, lien).\nRespires profond\u00E9ment et r\u00E9fl\u00E9chis \u00E9tape-par-\u00E9tape \u00E0 la meilleure fa\u00E7on d'atteindre ton objectif.\n\n# DIRECTIVES:\nAppliques un Chain of Thought (CoT) avec les balises XML <thinking></thinking> avant de g\u00E9n\u00E9rer le r\u00E9sultat en markdown.\n - Analyses le contenu HTML ligne par ligne.\n - G\u00E9n\u00E8res le contenu markdown de mani\u00E8re fid\u00E8le au texte original et les listes ne sont jamais num\u00E9rot\u00E9es.\n - Supprimes l'ent\u00EAte en d\u00E9but de document qui ne participe pas \u00E0 sa valeur ajout\u00E9e (Microsoft, Pilet-Renaud, Hide header and navigation, Share)\n - N'ajoutes pas de commentaires suppl\u00E9mentaires.\n\n\n# OUTPUT INSTRUCTIONS\n- Only output CoT and Markdown.\n- Do not output the markdown code syntax, only the content.\n- Use the name of the document on top of the markdown.\n- You use bulleted lists for output, not numbered lists.\n- Do not output the main index as a section.\n- Do not output the images which are not relevant in section.\n- Ensure you follow ALL these instructions when creating your output.\n- EXAMPLE OF SECTION: `# {{page name}} - {{titre}}\n{{content}}`\n\n";
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.htmlToMarkdownPrompt = exports.textToMarkdownPrompt = exports.defaultOutputPrompt = exports.transferAgentPrompt = exports.transferAgentPrompt_ = void 0;
|
|
4
|
+
exports.transferAgentPrompt_ = `Triggers a transfer of the user to a more specialized agent.
|
|
5
|
+
Calls escalate to a more specialized LLM agent or to a human agent, with additional context.
|
|
6
|
+
Only call this function if one of the available agents is appropriate. Don't transfer to your own agent type.
|
|
7
|
+
|
|
8
|
+
Let the user know you're about to transfer them before doing so.
|
|
9
|
+
|
|
10
|
+
Available Agents:`;
|
|
11
|
+
exports.transferAgentPrompt = `
|
|
12
|
+
Triggers a transfer of the user to a specialized agent, for one task.
|
|
13
|
+
Only call this function if one of the available agents is more appropriate (as destination_agent). Don't transfer to your own agent name "__AGENT_NAME__".
|
|
14
|
+
|
|
15
|
+
⚠️ Rules:
|
|
16
|
+
- NEVER call this function for requests that match your own specialization.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
Available Agents:`;
|
|
20
|
+
exports.defaultOutputPrompt = `
|
|
21
|
+
# OUTPUT INSTRUCTIONS
|
|
22
|
+
- Only output CoT and Markdown.
|
|
23
|
+
- Do not output the markdown code syntax, only the content.
|
|
24
|
+
- Use the name of the document on top of the markdown.
|
|
25
|
+
- You use bulleted lists for output, not numbered lists.
|
|
26
|
+
- Do not output the main index as a section.
|
|
27
|
+
- Do not output the images which are not relevant in section.
|
|
28
|
+
- Ensure you follow ALL these instructions when creating your output.
|
|
29
|
+
- EXAMPLE OF SECTION: \`# {{page name}} - {{titre}}\n{{content}}\`
|
|
30
|
+
`;
|
|
31
|
+
exports.textToMarkdownPrompt = `# RÔLE:
|
|
32
|
+
- Tu es un expert en transformation de documents structuré pour la création d'un RAG (HNSW cosine index).
|
|
33
|
+
- Ton rôle consiste à analyser et comprendre des contenus complexes (texte ou HTML) pour en extraire la structure sémantique essentielle: titres, paragraphes, listes, liens, tableaux.
|
|
34
|
+
- Tu agis comme un moteur de "reader view" capable de construire une version fluide, lisible et reflowable du document original sans supprimer le contenu.
|
|
35
|
+
- Tu sais que le contenu du document concerne les Procédures de l'entreprise Pilet-Renaud SA. Ces procédures sont importantes pour aider les collaborateurs à satisfaire les demandes des clients.
|
|
36
|
+
- Tu sais comment organiser l'information en sections et sous-sections pour ensuite créer des entrées individuelles dans un RAG .
|
|
37
|
+
- Tu sais que pour être significatif chaque entrée du RAG doit contenir de l'objectif du document.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# MISSION:
|
|
41
|
+
- Ta mission est de convertir le document, qu'il s'agisse de texte brut ou de HTML issu d'une conversion (par exemple, d'un PDF), en un contenu Markdown structuré et COMPLET qui sera utilisé pour générer un RAG.
|
|
42
|
+
- Tu dois analyser le document ligne par ligne, de manière exhaustif pour inférer dans ta mémoire, l'objectif de la page et une représentation hiérarchique à deux niveaux (titre1 et titre2) dans lesquelles toutes les "procédures" complètes seront développées.
|
|
43
|
+
- Tu sais que le document fait référence à des procédures d'entreprise, tu dois assurer:
|
|
44
|
+
- Que TOUS les titres à produire sont des phrases courtes reformulées (par toi) qui expriment le contexte du document et la section qui suit.
|
|
45
|
+
- Que la logique du contenu est bien formulée et les étapes sont détaillées.
|
|
46
|
+
- Lors d'une procédure de logiciel, les étapes sont importantes et doivent être détaillées: nom des écrans, raccourcis clavier, commandes, onglets, les menus, etc.
|
|
47
|
+
- Tous les contenus extraits en MAJUSCULES sont importants et doivent être en gras.
|
|
48
|
+
|
|
49
|
+
# DIRECTIVES:
|
|
50
|
+
- Analyser **chaque ligne du document**, qu’il soit en **texte brut ou HTML converti depuis un PDF**, pour identifier sa structure logique. Cette directive s’applique **à tous les types de documents traités par l’agent**.
|
|
51
|
+
- Les éléments suivants doivent être détectés et correctement interprétés : **titres**, **paragraphes**, **listes à puces**, **listes numérotées**, **tableaux**, **images** (via leurs balises ou légendes), **liens** (explicites ou implicites), **blocs de code**, **éléments répétitifs inutiles**.
|
|
52
|
+
- Si une ligne ne permet pas d’identifier une structure claire, appliquer la stratégie suivante :
|
|
53
|
+
1. Si la ligne semble faire partie d’un paragraphe continu, la rattacher au paragraphe précédent.
|
|
54
|
+
2. Si elle est isolée et non interprétable (caractères seuls, artefacts de conversion), la supprimer.
|
|
55
|
+
3. Si elle contient des mots-clés métiers (urgence, type d’intervention, procédure, rôle), la conserver comme élément brut dans un bloc indépendant.
|
|
56
|
+
|
|
57
|
+
- Supprimer les caractères invisibles ou parasites fréquents issus d’une conversion PDF (ex : saut de page "\f", caractères de contrôle, caractères isolés non imprimables). Ne jamais supprimer une ligne entière uniquement à cause de ces caractères.
|
|
58
|
+
- Masquer toute information sensible liée à une authentification : identifiants utilisateurs, mots de passe, codes d’accès, tokens, ou chaînes de connexion. Appliquer un masquage partiel en insérant trois astérisques \`***\` au milieu du mot ou de la chaîne (ex : \`jo***3\`, \`Pa***024\`).
|
|
59
|
+
- Établir une convention stricte pour le formatage des titres et sous-titres :
|
|
60
|
+
- Si la section sous le titre principal (titre1) n'apporte rien à la compréhension, il ne doit pas être produit dans le rendu final.
|
|
61
|
+
- Chaque section doit être introduite par un titre de niveau 2 (H2 en markdown). Ce titre (titre2) doit inclure une phrase descriptive combinant :
|
|
62
|
+
- Le sujet : l’objectif global du document.
|
|
63
|
+
- La relation : la manière dont la section s’inscrit dans le contexte général.
|
|
64
|
+
- Le qui: à qui s'adresse la procédure.
|
|
65
|
+
- L’objet ou complément d’objet : la finalité spécifique de la section en référence à l'objectif du document.
|
|
66
|
+
- Chaque titre de section doit impérativement intégrer une référence contextuelle explicite au document de base pour garantir sa valeur spécifique dans le RAG.
|
|
67
|
+
- Intégrer la liste de liens dans le document :
|
|
68
|
+
- Si le libellé d’un lien correspond précisément à un texte existant, l’intégrer directement dans le texte.
|
|
69
|
+
- Sinon, placer ces liens sous forme de liste à puces dans une section annexe intitulée "# Références externes" à la fin du document.
|
|
70
|
+
- Tu utilises le séparateur --- pour marquer la fin de chaque section du RAG.
|
|
71
|
+
- Les sections peuvent contenir des puces, des tableaux, des images, etc..
|
|
72
|
+
- Produire une entête JSON placée avant tout le reste du contenu, avec la structure suivante \`
|
|
73
|
+
{
|
|
74
|
+
"document": "{nom-du-fichier.extension}",
|
|
75
|
+
"titre": "objectif global du document (pour qui, pourquoi, comment en 10 mots)",
|
|
76
|
+
"date": "YYYY-MM-DD",
|
|
77
|
+
"objetif": "pour qui, pourquoi et comment, en une phrase de maximum 15 mots."
|
|
78
|
+
}\`
|
|
79
|
+
- S’assurer que le document final respecte la logique exhaustive du contenu, corrige les erreurs de logique ou les biais d’interprétation, et applique les conventions de formatage afin de permettre une extraction précise des informations.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# DIRECTIVES PRIORITAIRES POUR CAS COMPLEXES
|
|
83
|
+
- Ne jamais résumer les sections comportant des scénarios conditionnels ou des décisions basées sur des questions (ex : "Si vous avez de l’eau froide..."). Tous les cas doivent être explicitement développés sous forme de **liste hiérarchique, tableau ou arbre logique** selon la structure naturelle du texte.
|
|
84
|
+
- Chaque situation décrite sous forme de **plainte, question ou dialogue utilisateur** (ex : « J’ai une fuite sous le lavabo ») doit être convertie en un **titre clair** suivi d’une procédure détaillée, avec :
|
|
85
|
+
- Les **questions à poser**,
|
|
86
|
+
- Les **vérifications à effectuer**,
|
|
87
|
+
- Et les **actions à entreprendre** selon chaque réponse.
|
|
88
|
+
- Toute **logique de décision opérationnelle** doit être représentée dans le Markdown avec une structure claire : **liste numérotée, liste imbriquée ou tableau de décision**. Aucun sous-cas ne doit être omis ou regroupé.
|
|
89
|
+
- Lorsque le document mentionne une situation **urgente** (mots clés : "URGENT", "immédiat", "prioritaire"), ajouter une icône "⚠️" au début de l’étape ou de la ligne correspondante dans le Markdown, pour faciliter la reconnaissance des cas critiques.
|
|
90
|
+
- La sortie finale doit **refléter l'intégralité de la logique du texte source**, sans perte d'information, en évitant toute simplification excessive des procédures, même si cela allonge le contenu. L’objectif est de garantir qu’un lecteur puisse **suivre la procédure sans jamais devoir se référer au document original**.
|
|
91
|
+
- ⚠️ Les sections qui contiennent uniquement des liens relatifs à des procédures sont supprimés du résultat final.
|
|
92
|
+
|
|
93
|
+
# DICTIONNAIRE:
|
|
94
|
+
- Logiciels Spécifiques: Quorum, MFiles, Base de connaissance, Teams, HomePad, Todoist, Mammutt, E-banking, INCH, Ecopartage, Immowise.
|
|
95
|
+
- SGC: Service de Gestion de la Clientèle
|
|
96
|
+
- GED: service qui gère le scan des documents, la mise sous plis, l’économat, le réassort des salles de pauses, la saisie des données pour orienter les documents dans M-Files
|
|
97
|
+
- MED: Mise en demeure.
|
|
98
|
+
- WC: Toilettes.
|
|
99
|
+
- M-Files: logiciel de gestion de documents
|
|
100
|
+
- PR ou PRSA: Pilet-Renaud SA
|
|
101
|
+
- PPE: Service qui gère les copropriétés.
|
|
102
|
+
- GP: Garantie Bancaire
|
|
103
|
+
- WC: Toilettes.
|
|
104
|
+
- BAL: Boite à Lettre
|
|
105
|
+
- DD: Arrangement de paiement pour facture due mais qui n’est pas du loyer.
|
|
106
|
+
- copro: copropriétaire (attention à ne pas confondre avec gopros)
|
|
107
|
+
- un bon (bons): ordre d'intervention pour travaux (ex, bon de travail, création de bons, bons, etc).
|
|
108
|
+
- La Date à jour Locataire: le dernier mois qui a été payé par le locataire.
|
|
109
|
+
|
|
110
|
+
# APPROCHE CoT (Chain of Thought):
|
|
111
|
+
- Utilise un processus de réflexion structuré encadré par les balises <thinking></thinking> avant de générer le résultat final.
|
|
112
|
+
- Dans cette section de raisonnement tu DOIS:
|
|
113
|
+
1. Analyse toutes les DIRECTIVES et instructions qui sont à utiliser conjointement avec la question.
|
|
114
|
+
2. Décompose la solution en étapes claires, avec des mots-clés non formatés et en utilisant des balises <step> à l'intérieur de la réflexion <thinking>.
|
|
115
|
+
3. Ajuste continuellement ton raisonnement en fonction des résultats intermédiaires et des réflexions.
|
|
116
|
+
|
|
117
|
+
${exports.defaultOutputPrompt}
|
|
118
|
+
`;
|
|
119
|
+
exports.htmlToMarkdownPrompt = `
|
|
120
|
+
# RÔLE:
|
|
121
|
+
Tu es un expert pour analyser des documents HTML.
|
|
122
|
+
|
|
123
|
+
# MISSION:
|
|
124
|
+
Tu es un expert mondial pour analyser des documents HTML.
|
|
125
|
+
Ta mission est de convertir un document HTML en markdown correctement structuré (tableau, liste, paragraphe, titre, image, lien).
|
|
126
|
+
Respires profondément et réfléchis étape-par-étape à la meilleure façon d'atteindre ton objectif.
|
|
127
|
+
|
|
128
|
+
# DIRECTIVES:
|
|
129
|
+
Appliques un Chain of Thought (CoT) avec les balises XML <thinking></thinking> avant de générer le résultat en markdown.
|
|
130
|
+
- Analyses le contenu HTML ligne par ligne.
|
|
131
|
+
- Génères le contenu markdown de manière fidèle au texte original et les listes ne sont jamais numérotées.
|
|
132
|
+
- Supprimes l'entête en début de document qui ne participe pas à sa valeur ajoutée (Microsoft, Pilet-Renaud, Hide header and navigation, Share)
|
|
133
|
+
- N'ajoutes pas de commentaires supplémentaires.
|
|
134
|
+
|
|
135
|
+
${exports.defaultOutputPrompt}
|
|
136
|
+
`;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare function extractCaptcha(base64Image: string, openai: any): Promise<{
|
|
2
|
+
number: any;
|
|
3
|
+
cost: number;
|
|
4
|
+
}>;
|
|
5
|
+
/**
|
|
6
|
+
* Calls GPT to parse a PDF file and convert it to markdown format.
|
|
7
|
+
*
|
|
8
|
+
* @param {string} inputfile - The name of the PDF file being processed
|
|
9
|
+
* @param {any} pdfData - The extracted content from the PDF file
|
|
10
|
+
* @param {any} openai - The OpenAI client instance
|
|
11
|
+
* @param {any[]} links - Optional array of links extracted from the PDF to be integrated into the markdown
|
|
12
|
+
* @returns {Promise<{markdown: string, cost: number}>} - The parsed markdown content and the cost of the API call
|
|
13
|
+
*/
|
|
14
|
+
export declare function callGPTForParsingPDF(inputfile: string, pdfData: any, openai: any, links?: any[]): Promise<{
|
|
15
|
+
markdown: any;
|
|
16
|
+
cost: number;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Convertit un document HTML en markdown en appelant le modèle GPT (ex: gpt-4o-mini)
|
|
20
|
+
* pour analyser et reformater le document.
|
|
21
|
+
*
|
|
22
|
+
* @param {any} htmlData - Le document HTML à transformer en markdown.
|
|
23
|
+
* @param {any} openai - L'instance OpenAI configurée pour appeler l'API.
|
|
24
|
+
* @param {boolean} simple - Si true, utilise un prompt simplifié.
|
|
25
|
+
* @returns {Promise<Object>} - Le contenu markdown structuré créé par le modèle LLM.
|
|
26
|
+
*/
|
|
27
|
+
export declare function callGPTForParsingHTML(html: string, openai: any): Promise<any>;
|
|
28
|
+
/**
|
|
29
|
+
* Parses an HTML file and converts it to markdown using GPT.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} output - The directory path where the output markdown file will be saved.
|
|
32
|
+
* @param {string} file - The path to the HTML file to be parsed.
|
|
33
|
+
* @param {string} service - The service name used as part of the output filename output.
|
|
34
|
+
* @param {any} openai - The OpenAI instance to use for the GPT API calls.
|
|
35
|
+
* @returns {Promise<{markdown: string, cost: number}>} - The generated markdown content and the cost of the GPT API call.
|
|
36
|
+
*/
|
|
37
|
+
export declare function html2markdown(output: string, file: string, service: string, openai: any): Promise<{
|
|
38
|
+
markdown: any;
|
|
39
|
+
cost: number;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Parse un PDF en effectuant :
|
|
43
|
+
* 1. Le nettoyage du PDF avec Ghostscript.
|
|
44
|
+
* 2. Sa conversion en XML via pdftohtml.
|
|
45
|
+
* 3. (Optionnellement) Le passage du contenu converti au modèle GPT pour analyser la structure.
|
|
46
|
+
*
|
|
47
|
+
* @param {string} file - Chemin vers le fichier PDF à analyser.
|
|
48
|
+
* @param {any} openai - L'instance configurée pour appeler l'API OpenAI.
|
|
49
|
+
* @returns {Promise<any>} - Le markdown structuré (issue de GPT) ou tout autre traitement souhaité.
|
|
50
|
+
*/
|
|
51
|
+
export declare function pdf2markdown(output: string, file: string, service: string, openai: any): Promise<{
|
|
52
|
+
markdown: any;
|
|
53
|
+
cost: number;
|
|
54
|
+
}>;
|