Workflow et Readme

Merge d'agent_V3
This commit is contained in:
2026-02-12 16:23:20 +01:00
3 changed files with 331 additions and 2 deletions

78
GEMINI.md Normal file
View File

@@ -0,0 +1,78 @@
# GEMINI.md - Project Context for Gemini CLI
This document provides a comprehensive overview of the "Rapport-automatique" project for the Gemini CLI, enabling it to understand the project's purpose, architecture, and key components for effective collaboration.
## Project Overview
The goal of this project is to create an AI agent that can automatically write an internship report. The agent uses a Retrieval-Augmented Generation (RAG) system to source information from a collection of notes (weekly internship reports) provided in the `documents_projet/` directory.
The project is built in Python and leverages the LangChain and LangGraph frameworks to create a sophisticated agent.
**Key Technologies:**
* **Orchestration:** LangChain & LangGraph
* **LLM:** `mistral-large-latest` via `ChatMistralAI`
* **Vector Database (RAG):** ChromaDB (persisted in `chroma_db/`)
* **Embeddings:** `jinaai/jina-embeddings-v3` from HuggingFace
* **Document Loading:** `Unstructured` (for `.txt` files)
* **Web Search:** Tavily
* **Experiment Tracking:** MLflow
## Architecture
The system is designed as a LangGraph agent with a clear, cyclical flow:
1. **Start (LLM Call):** The agent starts by calling the Mistral LLM (`reponse_question` node) with the current conversation history.
2. **Tool Decision:** The LLM decides whether to generate a direct response or use one of its available tools.
3. **Conditional Routing:** The `should_continue` function checks the LLM's output. If tool calls are present, the graph transitions to the `tool_node`. Otherwise, the session ends.
4. **Tool Execution:** The `tool_node` executes the requested tools (e.g., `search_in_files` for RAG, `internet_search`, file I/O).
5. **Loop:** The output of the tools is passed back to the LLM (`reponse_question` node) for it to process the results and decide the next action, continuing the cycle.
The agent's state (`CustomState`) is explicitly managed and includes conversation history, a `todo` list for task management, and the query and results from the RAG system.
## Building and Running
### 1. Setup
**a. Install Dependencies:**
First, set up and activate a Python virtual environment. Then, install the required packages.
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
**b. Configure Environment Variables:**
Copy the template `.env.template` file and fill in your API keys (e.g., for Mistral, Tavily).
```bash
cp AgentReact/.env.template AgentReact/.env
# Edit AgentReact/.env with your credentials
```
### 2. Data Ingestion (RAG Setup)
Place your source documents (as `.txt` files) into the `documents_projet/` directory at the project root. Then, run the initialization script to populate the Chroma vector database.
```bash
python RAG/init.py
```
### 3. Running the Agent
The main entry point for the agent is `AgentReact/start.py`.
```bash
python AgentReact/start.py
```
This script will invoke the agent graph with a hardcoded sample question and print the resulting messages.
## Development Conventions
* **Modularity:** The code is well-structured into directories for the agent (`AgentReact`), RAG components (`RAG`), and data (`documents_projet`). The agent's logic is further divided into `agent.py` (graph), `nodes.py`, `state.py`, and `tools.py`.
* **Singleton Pattern:** The `VectorDatabase` is implemented as a Singleton to ensure a single, shared instance throughout the application.
* **State Management:** The agent's state is explicitly defined in `AgentReact/utils/state.py`, making it clear what information is tracked across turns.
* **Human-in-the-Loop:** The `ask_human` tool provides a mechanism for the agent to request user input, although the full "supervised tools" workflow from the diagram is not yet implemented.
* **Roadmap:** The `roadmap.md` file tracks the project's progress and outlines future development goals, such as moving from ChromaDB to PG Vector and adding PDF generation.

View File

@@ -34,10 +34,13 @@
"id": "mjYzkEJVi3l0_nPI_79lO" "id": "mjYzkEJVi3l0_nPI_79lO"
}, },
{ {
<<<<<<< HEAD
"id": "vStojcTZILB7M3l8fts8O", "id": "vStojcTZILB7M3l8fts8O",
"type": "arrow" "type": "arrow"
}, },
{ {
=======
>>>>>>> Agent_V3
"id": "kzOvH8jh2OlOyTVkT4LF8", "id": "kzOvH8jh2OlOyTVkT4LF8",
"type": "arrow" "type": "arrow"
} }
@@ -187,7 +190,11 @@
"version": 17, "version": 17,
"versionNonce": 1042800435, "versionNonce": 1042800435,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417251147, "updated": 1770417251147,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -267,7 +274,11 @@
"version": 279, "version": 279,
"versionNonce": 1429790675, "versionNonce": 1429790675,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417294072, "updated": 1770417294072,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -306,7 +317,11 @@
"version": 88, "version": 88,
"versionNonce": 37313267, "versionNonce": 37313267,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417303969, "updated": 1770417303969,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -388,7 +403,11 @@
"version": 149, "version": 149,
"versionNonce": 994294813, "versionNonce": 994294813,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417343501, "updated": 1770417343501,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -482,7 +501,11 @@
"version": 6, "version": 6,
"versionNonce": 1198529779, "versionNonce": 1198529779,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417357123, "updated": 1770417357123,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -562,7 +585,11 @@
"version": 591, "version": 591,
"versionNonce": 523492829, "versionNonce": 523492829,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417693766, "updated": 1770417693766,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -657,7 +684,11 @@
"version": 5, "version": 5,
"versionNonce": 229284221, "versionNonce": 229284221,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417411028, "updated": 1770417411028,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -696,7 +727,11 @@
"version": 86, "version": 86,
"versionNonce": 1980762749, "versionNonce": 1980762749,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417415364, "updated": 1770417415364,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1153,7 +1188,11 @@
"version": 440, "version": 440,
"versionNonce": 1055028157, "versionNonce": 1055028157,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418626952, "updated": 1770418626952,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1229,7 +1268,11 @@
"version": 451, "version": 451,
"versionNonce": 177441011, "versionNonce": 177441011,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418794768, "updated": 1770418794768,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1331,7 +1374,11 @@
"version": 21, "version": 21,
"versionNonce": 1254768477, "versionNonce": 1254768477,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770417975290, "updated": 1770417975290,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1368,7 +1415,11 @@
"version": 592, "version": 592,
"versionNonce": 476951933, "versionNonce": 476951933,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418883744, "updated": 1770418883744,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1407,7 +1458,11 @@
"version": 68, "version": 68,
"versionNonce": 355106739, "versionNonce": 355106739,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418638301, "updated": 1770418638301,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1503,7 +1558,11 @@
"version": 82, "version": 82,
"versionNonce": 1090370813, "versionNonce": 1090370813,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418756612, "updated": 1770418756612,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1542,7 +1601,11 @@
"version": 251, "version": 251,
"versionNonce": 650609181, "versionNonce": 650609181,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418773643, "updated": 1770418773643,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1599,7 +1662,11 @@
"version": 380, "version": 380,
"versionNonce": 1408063059, "versionNonce": 1408063059,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770418886059, "updated": 1770418886059,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1714,7 +1781,11 @@
"version": 316, "version": 316,
"versionNonce": 1430635741, "versionNonce": 1430635741,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770420407935, "updated": 1770420407935,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -1756,16 +1827,26 @@
"type": 3 "type": 3
}, },
"seed": 1330640563, "seed": 1330640563,
<<<<<<< HEAD
"version": 1780, "version": 1780,
"versionNonce": 1276788595, "versionNonce": 1276788595,
"isDeleted": false, "isDeleted": false,
=======
"version": 1781,
"versionNonce": 369546318,
"isDeleted": true,
>>>>>>> Agent_V3
"boundElements": [ "boundElements": [
{ {
"type": "text", "type": "text",
"id": "ZlpTEnVsGE5MNP3Rz3_OW" "id": "ZlpTEnVsGE5MNP3Rz3_OW"
} }
], ],
<<<<<<< HEAD
"updated": 1770420437747, "updated": 1770420437747,
=======
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false "locked": false
}, },
@@ -1789,11 +1870,19 @@
"index": "b0t", "index": "b0t",
"roundness": null, "roundness": null,
"seed": 707045459, "seed": 707045459,
<<<<<<< HEAD
"version": 1262, "version": 1262,
"versionNonce": 1344788755, "versionNonce": 1344788755,
"isDeleted": false, "isDeleted": false,
"boundElements": [], "boundElements": [],
"updated": 1770420437747, "updated": 1770420437747,
=======
"version": 1263,
"versionNonce": 1371135890,
"isDeleted": true,
"boundElements": [],
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"text": "Choix d'un outil", "text": "Choix d'un outil",
@@ -1828,16 +1917,26 @@
"type": 2 "type": 2
}, },
"seed": 1905921885, "seed": 1905921885,
<<<<<<< HEAD
"version": 1063, "version": 1063,
"versionNonce": 1586577075, "versionNonce": 1586577075,
"isDeleted": false, "isDeleted": false,
=======
"version": 1064,
"versionNonce": 654514830,
"isDeleted": true,
>>>>>>> Agent_V3
"boundElements": [ "boundElements": [
{ {
"type": "text", "type": "text",
"id": "_Vdye40s2it50McRTxP6-" "id": "_Vdye40s2it50McRTxP6-"
} }
], ],
<<<<<<< HEAD
"updated": 1770420437747, "updated": 1770420437747,
=======
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false "locked": false
}, },
@@ -1861,11 +1960,19 @@
"index": "b0v", "index": "b0v",
"roundness": null, "roundness": null,
"seed": 1706695613, "seed": 1706695613,
<<<<<<< HEAD
"version": 1107, "version": 1107,
"versionNonce": 1375531091, "versionNonce": 1375531091,
"isDeleted": false, "isDeleted": false,
"boundElements": [], "boundElements": [],
"updated": 1770420437747, "updated": 1770420437747,
=======
"version": 1108,
"versionNonce": 305929554,
"isDeleted": true,
"boundElements": [],
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"text": "Recherche\ninternet", "text": "Recherche\ninternet",
@@ -1900,16 +2007,26 @@
"type": 2 "type": 2
}, },
"seed": 114924573, "seed": 114924573,
<<<<<<< HEAD
"version": 1211, "version": 1211,
"versionNonce": 1816227315, "versionNonce": 1816227315,
"isDeleted": false, "isDeleted": false,
=======
"version": 1212,
"versionNonce": 1427937486,
"isDeleted": true,
>>>>>>> Agent_V3
"boundElements": [ "boundElements": [
{ {
"type": "text", "type": "text",
"id": "yWWYzwYhaAa_eHJjompIF" "id": "yWWYzwYhaAa_eHJjompIF"
} }
], ],
<<<<<<< HEAD
"updated": 1770420437747, "updated": 1770420437747,
=======
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false "locked": false
}, },
@@ -1933,11 +2050,19 @@
"index": "b0x", "index": "b0x",
"roundness": null, "roundness": null,
"seed": 1827278973, "seed": 1827278973,
<<<<<<< HEAD
"version": 1278, "version": 1278,
"versionNonce": 1885681555, "versionNonce": 1885681555,
"isDeleted": false, "isDeleted": false,
"boundElements": [], "boundElements": [],
"updated": 1770420437747, "updated": 1770420437747,
=======
"version": 1279,
"versionNonce": 187736850,
"isDeleted": true,
"boundElements": [],
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"text": "Recherche locale\nRAG", "text": "Recherche locale\nRAG",
@@ -1972,16 +2097,26 @@
"type": 3 "type": 3
}, },
"seed": 1804668093, "seed": 1804668093,
<<<<<<< HEAD
"version": 275, "version": 275,
"versionNonce": 1609736381, "versionNonce": 1609736381,
"isDeleted": false, "isDeleted": false,
=======
"version": 276,
"versionNonce": 1768720018,
"isDeleted": true,
>>>>>>> Agent_V3
"boundElements": [ "boundElements": [
{ {
"type": "text", "type": "text",
"id": "HQFVuw63Y-jvrg-EJwYr9" "id": "HQFVuw63Y-jvrg-EJwYr9"
} }
], ],
<<<<<<< HEAD
"updated": 1770420237204, "updated": 1770420237204,
=======
"updated": 1770906279327,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false "locked": false
}, },
@@ -2005,11 +2140,19 @@
"index": "b0z", "index": "b0z",
"roundness": null, "roundness": null,
"seed": 1682082803, "seed": 1682082803,
<<<<<<< HEAD
"version": 82, "version": 82,
"versionNonce": 79236403, "versionNonce": 79236403,
"isDeleted": false, "isDeleted": false,
"boundElements": null, "boundElements": null,
"updated": 1770420256334, "updated": 1770420256334,
=======
"version": 83,
"versionNonce": 376595342,
"isDeleted": true,
"boundElements": [],
"updated": 1770906279327,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"text": "LLM conçu pour\napprofondir\nchaque outil /\nthème dans ce\ndocument", "text": "LLM conçu pour\napprofondir\nchaque outil /\nthème dans ce\ndocument",
@@ -2025,7 +2168,11 @@
{ {
"id": "oSB5sLrfxEglGORQRyTMJ", "id": "oSB5sLrfxEglGORQRyTMJ",
"type": "arrow", "type": "arrow",
<<<<<<< HEAD
"x": 674.8986380387142, "x": 674.8986380387142,
=======
"x": 677.623908930641,
>>>>>>> Agent_V3
"y": -456.52110529266406, "y": -456.52110529266406,
"width": 1.955986325654294, "width": 1.955986325654294,
"height": 78.9047372000764, "height": 78.9047372000764,
@@ -2044,11 +2191,19 @@
"type": 2 "type": 2
}, },
"seed": 881121341, "seed": 881121341,
<<<<<<< HEAD
"version": 96, "version": 96,
"versionNonce": 1222138035, "versionNonce": 1222138035,
"isDeleted": false, "isDeleted": false,
"boundElements": null, "boundElements": null,
"updated": 1770420433429, "updated": 1770420433429,
=======
"version": 99,
"versionNonce": 1668623502,
"isDeleted": true,
"boundElements": [],
"updated": 1770906279981,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"points": [ "points": [
@@ -2089,11 +2244,19 @@
"type": 2 "type": 2
}, },
"seed": 1224037021, "seed": 1224037021,
<<<<<<< HEAD
"version": 49, "version": 49,
"versionNonce": 873988563, "versionNonce": 873988563,
"isDeleted": false, "isDeleted": false,
"boundElements": null, "boundElements": null,
"updated": 1770420301415, "updated": 1770420301415,
=======
"version": 50,
"versionNonce": 1380664914,
"isDeleted": true,
"boundElements": [],
"updated": 1770906282991,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"points": [ "points": [
@@ -2135,11 +2298,19 @@
"type": 2 "type": 2
}, },
"seed": 895931709, "seed": 895931709,
<<<<<<< HEAD
"version": 58, "version": 58,
"versionNonce": 748661587, "versionNonce": 748661587,
"isDeleted": false, "isDeleted": false,
"boundElements": null, "boundElements": null,
"updated": 1770420320028, "updated": 1770420320028,
=======
"version": 59,
"versionNonce": 1068531662,
"isDeleted": true,
"boundElements": [],
"updated": 1770906282991,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"points": [ "points": [
@@ -2220,7 +2391,11 @@
"version": 138, "version": 138,
"versionNonce": 1001875603, "versionNonce": 1001875603,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770420513963, "updated": 1770420513963,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -2259,7 +2434,11 @@
"version": 139, "version": 139,
"versionNonce": 1586909747, "versionNonce": 1586909747,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770420515984, "updated": 1770420515984,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -2366,7 +2545,11 @@
"version": 46, "version": 46,
"versionNonce": 1063591539, "versionNonce": 1063591539,
"isDeleted": false, "isDeleted": false,
<<<<<<< HEAD
"boundElements": null, "boundElements": null,
=======
"boundElements": [],
>>>>>>> Agent_V3
"updated": 1770420504496, "updated": 1770420504496,
"link": null, "link": null,
"locked": false, "locked": false,
@@ -2400,11 +2583,19 @@
"index": "b18", "index": "b18",
"roundness": null, "roundness": null,
"seed": 265053661, "seed": 265053661,
<<<<<<< HEAD
"version": 469, "version": 469,
"versionNonce": 1632473651, "versionNonce": 1632473651,
"isDeleted": false, "isDeleted": false,
"boundElements": null, "boundElements": null,
"updated": 1770420599893, "updated": 1770420599893,
=======
"version": 470,
"versionNonce": 2011975438,
"isDeleted": true,
"boundElements": [],
"updated": 1770906278283,
>>>>>>> Agent_V3
"link": null, "link": null,
"locked": false, "locked": false,
"text": "Récupérer des infos sur l'entreprise,\nsur les outils utilisés, l'utilité des logiciels, ...", "text": "Récupérer des infos sur l'entreprise,\nsur les outils utilisés, l'utilité des logiciels, ...",

View File

@@ -36,7 +36,7 @@ Il faut le coller comme une seule ligne dans l'input, produira des bugs lors de
**Les outils de gestion TODO ont été désactivés dans tools.py! Ces outils sont très instables, et le modèle sous-performe quand il doit les gérer.** **Les outils de gestion TODO ont été désactivés dans tools.py! Ces outils sont très instables, et le modèle sous-performe quand il doit les gérer.**
#### Sans TODO #### Sans TODO
``` ```
Ton but est d'écrire un rapport de stage sur l'entreprise Diag'n Grow. Commence par préparer un plan avec ton skill "Creation_plan", tu peux rechercher des informations sur l'entreprise avec une recherche internet en utilisant "internet_search". Ensuite, rédige chacune des parties du plan, en utilisant l'outil "append_part_to_report". Fais de petits paragraphes pour rédiger tes parties. Ton but est d'écrire un rapport de stage sur l'entreprise Diag'n Grow. Commence par préparer un plan avec ton skill "Creation_plan", tu peux rechercher des informations sur l'entreprise avec une recherche internet en utilisant "internet_search". Ensuite, rédige chacune des parties du plan, en utilisant l'outil "append_part_to_report". Fais de petits paragraphes pour rédiger tes parties.
Tu as aussi des rapports de chaque semaine de stage dans le dossier `rapports_resumes`, tu peux en lister les fichiers avec l'outil "list_files". Tu as aussi des rapports de chaque semaine de stage dans le dossier `rapports_resumes`, tu peux en lister les fichiers avec l'outil "list_files".
@@ -51,4 +51,64 @@ Ton but est d'écrire un rapport de stage sur l'entreprise Diag'n Grow. Commence
Tu as aussi des rapports de chaque semaine de stage dans le dossier `rapports_resumes`, tu peux en lister les fichiers avec l'outil "list_files". Tu as aussi des rapports de chaque semaine de stage dans le dossier `rapports_resumes`, tu peux en lister les fichiers avec l'outil "list_files".
En plus de ces rapports, tu as une base de données de ce qui a été fait, en plus détaillé, avec l'outil "search_in_files". En plus de ces rapports, tu as une base de données de ce qui a été fait, en plus détaillé, avec l'outil "search_in_files".
Bon couraj, il y a 25 semaines différentes, essaie de les regrouper en groupes de 5 pour aller plus vite. Regarde en particulier le fichier 'rapports_resumes/rapport_outils.txt' qui te donne une liste des outils utilisés. Bon couraj, il y a 25 semaines différentes, essaie de les regrouper en groupes de 5 pour aller plus vite. Regarde en particulier le fichier 'rapports_resumes/rapport_outils.txt' qui te donne une liste des outils utilisés.
``` ```
## Rapport du projet
### Roadmap
J'ai préparé la Roadmap comme une sorte de TODO liste, qui répertorie toutes les étapes nécéssaires à la mise en place du système. J'y ai donc noté tout ce qui a été fait et implémenté. J'ai aussi séparé les étapes en grands thèmes, séparant les différentes phases de création de l'agent.
### Workflow
Au départ, le système vérifie si le dossier `AgentReact/rapports_resumes/` existe. S'il n'est pas présent, une première étape de préparation est lancée.
Un premier nœud va injecter un `HumanMessage` qui donnera les ordres au système de préparation, qui aura ensuite pour objectif de préparer la liste des tâches exécutées et des outils, techniques, entreprises, ... utilisés tout au long du stage, en utilisant des outils dédiés.
Une fois cette première étape terminée, le contexte est réduit, avant de passer à la partie principale.
La partie principale vise à suivre le plan définit dans `skills.md`, en utilisant les outils à disposition, et réduisant la taille du contexte chaque fois que nécessaire. Le système revient vers le nœud *user_prompt* chaque fois que le modèle a besoin d'un prompt, où l'utilisateur peut décider de répondre pour relancer la machine, ou d'envoyer `exit` pour terminer le programme.
### Architecture
Je me suis reposé sur l'architecture du TP3 que nous avions fait en cours. L'idée étant de séparer proprement les outils, les nodes, le `State`, et les différents utilitaires, j'ai pensé que cette lisibilité serait bénéfique pour un projet donc la complexité peut viter augmenter.
Aussi, j'ai repris une approche de mes anciens projets, où j'ai implémenté des classes utilitaires pour représenter certaines choses (`TodoElement`, `InterruptPayload`), ce qui me fournit une interface propre pour travailler avec les TODO, ou la fonction `interrupt()`. Le `State`, ou `interrupt()` ne peuvent prendre que des données sérializables, et j'ai donc implémenté des méthodes pour exporter et importer les objets dans le format *JSON*.
La base de données vectorielle est implémentée dans `VectorDatabase.py`, ce qui permet de facilement changer de source de données, et d'obtenir un poitn d'accès aux données depuis n'importe quel emplacement du programme.
L'affichage des messages/du graphe est fait via `StreamGraph.py`, une fonction d'affichage récursive capable de gérer les interuptions et reprises, tout en gardant une trace du parcours des messages pour ne jamais afficher deux fois le même. Cette fonction a aussi un réglage pour dissimuler l'affichage des messages Système et des outils.
Le fichier `nodes.py` contient des paramètres sur le graphe, tel que la taille maximale du contexte (avant réduction), le système de résumé, ou le prompt anti-injections. Tous les nœuds y sont définits.
### State
Le `State` contient trois variables:
- **todo**, une liste de tâches à faire, au format JSON, pouvant être reformées vers de vraies instances avec `TodoElement.fromJSON(...)`. Ces tâches sont injectables avant chaque prompt de l'utilisateur via un message système injecté dans l'appel au LLM.
- **lastSummarizedMessage**: Pour éviter de résumer des messages déjà résumés, le système garde une trace d'où l'on s'était arrêté lors du dernier appel au nœud de gestion du contexte.
- **stop**: Passera à `True` si l'utilisateur écrit `exit` dans le prompt, mettant fin à l'exécution.
### Outils
Plusieurs jeux d'outils sont disponibles, permettant de lister des fichiers, rechercher sur internet, ou dans la base vectorielle, de lire des fichiers locaux, de gérer les tâches en cours (*désactivé dans la dernière version, instable*), ou de récupérer un skill de `skills.md`.
Un jeu d'outils réservé au LLM en charge du résumé de éléments du stage est disponible, avec un outil pour écrire le résumé d'une semaine, un pour faire un rapport sur les outils utilisés par le stagiaire, une recherche internet, ou dans la base vectorielle.
Toutes les recherches dans la base vectorielle (outil `search_in_files`) sont reliées à un *cross-encodeur*, qui vérifie si les documents retrouvés correspondent à la requête. Si besoin, une IA va reformuler la question pour recommencer la recherche.
La philosophie derrière la mise en place des outils était de ne pas laisser d'outils trop généralistes ou dangereux. Il n'y a donc pas d'outil pour écrire dans un fichier de façon générale, uniquement `append_part_to_report` qui ajoute une partie dans le rapport de stage, après validation humaine.
### Gestion du contexte
Le contexte est maintenu en-dessous d'une certaine limite par le nœud `context_shortener`. Il permet de faire un résumé de tous les messages qui en ont besoin, sans repasser deux fois sur le même; tandis que les retours des appels aux outils sont placés dans des fichiers et remplacés par le chemin vers le fichier créé.
La limite de taille du contexte est définie dans `nodes.py`.
La taille du contexte est vérifiée après les résultats des outils. Si besoin, le LLM peut toujours retrouver le résultat des outils en allant lire le fichier généré.
### Human In The Loop
La classe `InterruptPayload` est dédiée à cette partie. L'idée est que l'on puisse placer un `interrupt()` à n'importe quel endroit du workflow, pour y passer un une requête à l'utilisateur. Cette requête peut être des arguments d'un appel de fonction, ou une demande de prompt.
Dans les outils, `InterruptPayload` peut prendre les arguments d'appel dans un dictionnaire, les convertir en JSON pour être passés dans l'`interrupt()` puis réassemblés de l'autre côté. L'affichage utilisateur implémenté dans cette classe permet ensuite d'accepter, de refuser ou de modifier une demande de lancement d'outil.
Dans le nœud `user_prompt`, `InterruptPayload` peut demander le prompt à l'utilisateur, toujours en le sérialisant en JSON, pour le renvoyer dans le workflow.
Les outils de recherche internet, et d'écriture dans le rapport de stage sont protégés par `InterruptPayload`, et l'utilisateur pourra toujours voir la requête du LLM avant qu'elle ne soit exécutée.
Aussi,`StreamGraph.py`, qui affiche le graphe dans une boucle récursive, est compatible avec `InterruptPayload` pour l'affichage et la gestion du retour utilisateur.
### Observabilité
Lors du lancement du programme, tous les messages sont affichés dans la console. Il est possible de cacher les messages système et d'outils dans les paramètres de `StreamGraph.py` (appelé depuis `start.py`) pour augmenter la lisibilité.
Aussi, lors du dévelopement, *Mlflow* a été utilisé pour analyser l'évolution du `State` et les arguments d'appel exacts pour le LLM.
Aussi, *Mlflow* ne semble pas apprécier l'appel aux `interrupt()` dans le code, considérant cela comme un plantage du système, sans qu'une solution a ce problème n'a pu être trouvée. Cela ne concerne que *Mlflow* et n'a aucun impact sur l'agent IA créé.