Agent de veille des marchés publics du Togo (LangGraph + RAG ChromaDB + Tavily + Streamlit), stylé d'après service-public.gouv.tg
# Agent Marchés Publics — Togo 🇹🇬
Assistant de veille des **appels d'offres et avis de marchés publics du Togo**, propulsé par un agent ReAct (LangGraph + LangChain) combinant **recherche vectorielle (RAG)**, **recherche web** et **scraping**. L'interface Streamlit est stylée d'après le portail officiel service-public.gouv.tg.
---
## Fonnalités
- **Veille RAG** — indexe les offres scrapées depuis `marches-publics-togo.com` dans une base vectorielle ChromaDB et répond avec les sources.
- **Recherche web & scraping** — complète la base RAG via Tavily et extraction du contenu des pages.
- **Recherche par secteur** — `trouver_par_secteur` (BTP, Fournitures, Informatique, Services, Autre) et `offres_recentes`.
- **Suggestions cliquables** dans le chat (état vide guidé).
- **Recherches sauvegardées** — historique de session dans la barre latérale.
- **UI institutionnelle** — palette teal/vert/bleu du portail, police Poppins, cartes, sidebar, bouton de chat.
## Architecture
| Fichier | Rôle |
|---|---|
| `agent.py` | Agent ReAct (gemma4 via Ollama + outils), prompt système. |
| `tools.py` | Outils : `web_search`, `scrape_web`, `rag_search`, `indexer_marches`, `trouver_par_secteur`, `offres_recentes`. |
| `rag.py` | Indexation / recherche ChromaDB (embeddings `nomic-embed-text`). |
| `scrapper.py` | Scraping du portail des marchés publics (BeautifulSoup). |
| `app.py` | Interface Streamlit (UI clonée service-public.gouv.tg). |
| `main.py` | Point d'entrée CLI. |
## Outils de l'agent
1. `rag_search(query, secteur)` — recherche dans la base vectorielle.
2. `web_search(query)` — recherche web (Tavily).
3. `scrape_web(url)` — extraction du contenu d'une page.
4. `indexer_marches()` — scrape + indexe les offres du portail.
5. `trouver_par_secteur(secteur)` — liste les offres d'un secteur.
6. `offres_recentes(k)` — dernières offres indexées.
## Démarrage
### Prérequis
- Python ≥ 3.13 (géré via `uv`)
- Ollama local avec les modèles `gemma4:e2b` et `nomic-embed-text`
- …