{"id":2110,"date":"2024-12-10T15:21:08","date_gmt":"2024-12-10T14:21:08","guid":{"rendered":"https:\/\/spgoo.org\/?page_id=2110"},"modified":"2026-01-14T11:17:13","modified_gmt":"2026-01-14T10:17:13","slug":"aizynthfinder","status":"publish","type":"page","link":"https:\/\/spgoo.org\/?page_id=2110","title":{"rendered":"Aizynthfinder"},"content":{"rendered":"\n<h2 class=\"wp-block-heading has-text-align-center\">CDA Aizynthfinder <\/h2>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-text-color has-link-color has-medium-font-size wp-elements-fb7b98a4e90c4ede48229d14fdeaac12\">Ressources SPGoO : Pascal Krezel, Yvan Stroppa (d\u00e9c 2024 &#8211; janv 2025)<\/p>\n\n\n\n<p><strong>Mise  en oeuvre d&#8217;un service autour de la solution de r\u00e9tro-synth\u00e8se AizynthFinder.  <\/strong><\/p>\n\n\n\n<p>Plusieurs \u00e9tapes dans cette mise en place. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La premi\u00e8re \u00e9tape permettra de v\u00e9rifier l&#8217;exhaustivit\u00e9 des \u00e9l\u00e9ments fournis sous le github, de consolider l&#8217;ensemble, de l&#8217;installer sur une machine, de l&#8217;ex\u00e9cuter et de v\u00e9rifier les r\u00e9sultats \u00e0 partir de mol\u00e9cules connues et de l&#8217;expertise des coll\u00e8gues.<\/li>\n\n\n\n<li>La deuxi\u00e8me \u00e9tape consistera \u00e0 encapsuler l&#8217;ensemble dans une image Docker, afin de pouvoir le mettre \u00e0 disposition et le transporter d&#8217;une machine \u00e0 une autre sans perte de temps.<\/li>\n\n\n\n<li>La troisi\u00e8me \u00e9tape consistera \u00e0 travailler sur l&#8217;ajout \u00e0 cet ensemble d&#8217;un service Web, qui devra permettre d&#8217;invoquer la r\u00e9solution d&#8217;une r\u00e9tro-synth\u00e8se via un appel de type API-REST. Objectif est de pouvoir connecter ce dispositif \u00e0 un frontal web ou \u00e0 une application tierce. <\/li>\n\n\n\n<li>La quatri\u00e8me \u00e9tape consistera au d\u00e9veloppement d&#8217;un frontal Web \u00e0 destination des coll\u00e8gues chimistes qui devrait leur permettre d&#8217;interroger via un environnement Graphique ce web service pour un ou plusieurs smiles et de visualiser les r\u00e9sultats de ces r\u00e9tro-synth\u00e8se pour leur mol\u00e9cules.<\/li>\n\n\n\n<li>La cinqui\u00e8me \u00e9tape consistera \u00e0 ajouter la possibilit\u00e9 de compl\u00e9ter la base de connaissance de ce dispositif pour rajouter des r\u00e9actions\/r\u00e9actifs suppl\u00e9mentaires.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-b5f7876d89c48fd1818fe90e78dd1786\">Etape 1 : Installation et v\u00e9rification :<\/p>\n\n\n\n<p>Fichiers de donn\u00e9es et mod\u00e8les : <\/p>\n\n\n\n<p>A partir des sources d\u00e9pos\u00e9es sur le github suivant, on installe anaconda et le param\u00e9trage de l&#8217;environnement conda comme indiqu\u00e9 dans le fichier README. Ce que ne fournit par le github c&#8217;est les fichiers hdf5 contenant les donn\u00e9es n\u00e9cessaires pour ex\u00e9cuter le code fourni et le fichier de configuration n\u00e9cessaire pour la r\u00e9solution: config.yml.<\/p>\n\n\n\n<p>A partir de la documentation du site de <a href=\"https:\/\/molecularai.github.io\/aizynthfinder\/\">https:\/\/molecularai.github.io\/aizynthfinder\/<\/a> on reconstitue le premier exemple fourni de fichier de configuration: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>expansion<\/strong><strong>:<\/strong>\n  <strong>full<\/strong><strong>:<\/strong>\n    <strong>-<\/strong> uspto_expansion.onnx\n    <strong>-<\/strong> uspto_templates.csv.gz\n<strong>stock<\/strong><strong>:<\/strong>\n  <strong>zinc<\/strong><strong>:<\/strong> zinc_stock.hdf5<\/pre>\n\n\n\n<p>Il faut retrouver les fichiers qui ne sont pas pr\u00e9sents sur le github des sources. On arrive \u00e0 retrouver les fichiers sur des sites diff\u00e9rents : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A trained Keras expansion model that is called&nbsp;<a href=\"https:\/\/zenodo.org\/records\/7797465\">uspto_expansion.onnx<\/a> : <a href=\"\/wp-content\/uploads\/2024\/12\/onnx_uspto_model.png\">voir<\/a><\/li>\n\n\n\n<li>A library of unique templates called&nbsp;uspto_templates.csv.gz   &#8211;&gt; Pascal Krezel <\/li>\n\n\n\n<li>A stock file in HDF5 format, called&nbsp;<a href=\"https:\/\/figshare.com\/articles\/dataset\/AiZynthFinder_a_fast_robust_and_flexible_open-source_software_for_retrosynthetic_planning\/12334577?file=23086469\">zinc_stock.hdf5<\/a> <\/li>\n<\/ul>\n\n\n\n<p>Description du contenu de ces trois fichiers : <\/p>\n\n\n\n<p>Contenu de l&#8217;archive : &#8220;zinc_stock_17_04_20.hdf5<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>show_hdf5_tree(&#8220;zinc_stock_17_04_20.hdf5&#8221;)<br>\u2514\u2500\u2500 table<br>\u251c\u2500\u2500 axis0 (1)<br>\u251c\u2500\u2500 axis1 (17422831)<br>\u251c\u2500\u2500 block0_items (1)<br>\u2514\u2500\u2500 block0_values (1)<\/p>\n<\/blockquote>\n<\/blockquote>\n<\/blockquote>\n\n\n\n<p>Structure et contenu du fichier uspto_templates.csv.gz<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>template_code retro_template template_hash classification library_occurence\n0 &#91;#7;a:4]:&#91;c:3]:c;H0;D3;+0:1:&#91;c:2]&gt;&gt;Br-c;H0;D3;+0:1:&#91;c:3]:&#91;#7;a:4].&#91;IH;D0;+0:5] 0001ead678cb363e3389b34d33a6bd38acc9f88da5403e820b7bc8c2800eb53a 0.0 Unrecognized 19\n1 &#91;N;D1;H0:4]#&#91;C:3]-&#91;CH2;D2;+0:1]-&#91;c:2]&gt;&gt;C-C(-C)(-C)-O-C(=O)-CH;D3;+0:1-&#91;C:3]#&#91;N;D1;H0:4] 0002f97a4d38f973095fc7d64488966c9d7b321beb0ea6c38dd61aefac810c0f 0.0 Unrecognized 7\n2 &#91;C:3]=&#91;C:2]-&#91;CH2;D2;+0:1]-&#91;S;H0;D2;+0:4]-&#91;c;H0;D3;+0:5]1:&#91;#16;a:6]:&#91;c:7]:&#91;#7;a:8]:&#91;n;H0;D2;+0:9]:1&gt;&gt;C-C(=O)-O-&#91;CH2;D2;+0:1]-&#91;C:2]=&#91;C:3].&#91;S;H0;D1;+0:4]=&#91;c;H0;D3;+0:5]1:&#91;#16;a:6]:&#91;c:7]:&#91;#7;a:8]:&#91;nH;D2;+0:9]:1 0005f9ceb67426e8a8b4a22b0254d8a1bdefd2b2a0a233c966f8b0f67c86738a 0.0 Unrecognized 4\n....\n....\n42552 &#91;#7:4]-C:5-&#91;c:7]1:&#91;c:8]:&#91;c:9]:&#91;c:10]:c:11:&#91;c:13]:1&gt;&gt;F-c;H0;D3;+0:1:&#91;c:3].&#91;#7:4]-C:5-&#91;c:7]1:&#91;c:8]:&#91;c:9]:&#91;c:10]:c:11:&#91;c:13]:1 ffff06aeed0e85fda8980c3e4e178ef6afbda0820acfe7a9558fbaffedeb64d6 0.0 Unrecognized 43\n42553 &#91;#7;a:2]:&#91;nH;D2;+0:1]:&#91;c:3]&gt;&gt;C-O-C(=O)-n;H0;D3;+0:1:&#91;c:3] fffff6d4a752349dce0db6afa525867fde3c248d45809392d62549ec926d30d0 0.0 Unrecognized 84<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Constitution du fichier smiles.txt <\/p>\n\n\n\n<p>Cc1cccc(c1N(CC(=O)Nc2ccc(cc2)c3ncon3)C(=O)C4CCS(=O)(=O)CC4)C<\/p>\n\n\n\n<p>Pour ex\u00e9cuter le script il suffit de lancer la commande suivante : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(aizynth-envv2) ystroppa@dragon:~\/ICOA\/aizynthfinder_v2\/aizynthfinder$ aizynthcli --config config.yml --smiles smiles.txt<br>Loading template-based expansion policy model from uspto_model.onnx to full<br>Loading templates from uspto_templates.csv.gz to full<br>Loading stock from InMemoryInchiKeyQuery to zinc<br>Selected as stock: zinc<br>Compounds in stock: 17422831<br>Selected as expansion policy: full<br>Done with Cc1cccc(c1N(CC(=O)Nc2ccc(cc2)c3ncon3)C(=O)C4CCS(=O)(=O)CC4)C in 24.1 s and is solved<br>Output saved to output.json.gz<\/code><\/pre>\n\n\n\n<p>Analyse et visualisation des r\u00e9sultats \u00e0 partit du fichier output.json.gz<\/p>\n\n\n\n<p class=\"has-text-align-left\">BenechMarks pour valider les r\u00e9sultats obtenus \u00e0 partir de la solution :<\/p>\n\n\n\n<p class=\"has-text-align-center has-vivid-green-cyan-color has-white-background-color has-text-color has-background has-link-color wp-elements-d3d24aad13e567a9d12615a51806111f\"><a href=\"\/?page_id=2723\">Mol\u00e9cules d&#8217;EMOLGINE<\/a><br><a href=\"\/?page_id=2567\">Mol\u00e9cules ICOA<\/a><\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-71d8710c2850ce774dc96923d739b6ae\">Etape 2 : conteneurisation de la solution <\/p>\n\n\n\n<p>L&#8217;id\u00e9e est de r\u00e9unir l&#8217;ensemble des \u00e9l\u00e9ments de aizf et d&#8217;ajouter tous les fichiers n\u00e9cessaires \u00e0 son fonctionnement. Plusieurs tentatives ont \u00e9t\u00e9 ex\u00e9cut\u00e9es avec entre autre anaconda3 mais dans ce cas on a eu un probl\u00e8me de chargement de contexte conda pour ex\u00e9cuter le pip n\u00e9cessaire <em><strong>&#8220;RUN conda activate aizynth-env &amp;&amp; python -m pip install aizynthfinder[all]&#8221;<\/strong><\/em> , erreur de la cr\u00e9ation d&#8217;image lors du chargement du contexte conda. Le syst\u00e8me nous indique qu&#8217;il faut ex\u00e9cuter au pr\u00e9alable conda init.  Du coup on s&#8217;est report\u00e9 sur miniconda en version 22.11.1 avec en natif un python 3.10 ce qui \u00e9vite le chargeent de l&#8217;environnement conda car on l&#8217;a en natif. <\/p>\n\n\n\n<p>Fichier Dockerfile <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM  continuumio\/miniconda3:22.11.1\nRUN addgroup --gid 1000 icoa\nRUN adduser --uid 1000 --gid 1000 --disabled-password --gecos \"\" icoa\nWORKDIR \/home\/icoa\nUSER icoa\nRUN git clone https:\/\/github.com\/MolecularAI\/aizynthfinder.git\nCOPY --chown=icoa:icoa config.yml  .\/\nCOPY --chown=icoa:icoa smiles.txt .\/\nCOPY --chown=icoa:icoa uspto_model.onnx .\/\nCOPY --chown=icoa:icoa uspto_templates.csv.gz .\/\nCOPY --chown=icoa:icoa zinc_stock_17_04_20.hdf5 .\/\nENV bashrc \/home\/icoa\/.bashrc\nRUN echo 'export PATH=\/home\/icoa\/.local\/bin:$PATH'&gt;&gt; ~\/.bashrc\nRUN python -m pip install aizynthfinder&#91;all]\n<\/code><\/pre>\n\n\n\n<p>Utilisation de l&#8217;image : <\/p>\n\n\n\n<p>#docker run -it icoa bash<br>Syntaxe de la commande aizynthcli : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>usage: aizynthcli &#91;-h] --smiles SMILES --config CONFIG &#91;--policy POLICY &#91;POLICY \u2026]] &#91;--filter FILTER &#91;FILTER \u2026]]\n&#91;--stocks STOCKS &#91;STOCKS \u2026]] &#91;--output OUTPUT] &#91;--log_to_file] &#91;--nproc NPROC] &#91;--cluster]\n&#91;--route_distance_model ROUTE_DISTANCE_MODEL] &#91;--post_processing POST_PROCESSING &#91;POST_PROCESSING \u2026]]\n&#91;--pre_processing PRE_PROCESSING] &#91;--checkpoint CHECKPOINT]\n<\/code><\/pre>\n\n\n\n<p>Exemple d&#8217;ex\u00e9cution dans le conteneur : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>icoa@599068b1cb84:~$ aizynthcli --config config.yml --smiles smiles.txt \nLoading template-based expansion policy model from uspto_model.onnx to full\nLoading templates from uspto_templates.csv.gz to full\nLoading stock from InMemoryInchiKeyQuery to zinc\nSelected as stock: zinc\nCompounds in stock: 17422831\nSelected as expansion policy: full\nDone with c1(F)cccc(F)c1S(=O)(=O)N(c2c(F)c(c3nc(CC(=O)NC)sc(c4ccnc(Nc5ccccc5)n4)3)ccc2) in 20.1 s and is not solved\nOutput saved to output.json.gz\n<\/code><\/pre>\n\n\n\n<p>Possibilit\u00e9 de d\u00e9marrer un Jupyter Notebook \u00e0 partir d&#8217;un conteneur via la commande suivante :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -it -p 8888:8888  icoa  .local\/bin\/jupyter notebook --ip='*' --port=8888 --allow-root<\/code><\/pre>\n\n\n\n<p>Il suffit de relever dans les logs du d\u00e9marrage du conteneur le token inscrit dans l&#8217;url suivante : <a href=\"http:\/\/127.0.0.1:8888\/?token=865bc85149cfc0274c6ff4f72fb9c2006f41bf547ddeef58\">http:\/\/127.0.0.1:8888\/?token=865bc85149cfc0274c6ff4f72fb9c2006f41bf547ddeef58<\/a> et de lancer un navigateur sur la machine ex\u00e9cutant le conteneur. Ce qui permet d&#8217;acc\u00e9der \u00e0 jupyter notebook. <\/p>\n\n\n\n<p>Reprendre la doc fournie par aizynthfinder <a href=\"https:\/\/molecularai.github.io\/aizynthfinder\/gui.html\">https:\/\/molecularai.github.io\/aizynthfinder\/gui.html<\/a> pour utiliser en mode graphique les fonctionnalit\u00e9s disponibles. Attention, lors de l&#8217;utilisation de l&#8217;interface le mode GUI ne fonctionne pas correctement. <\/p>\n\n\n\n<p>Production des images \u00e0 partir des r\u00e9sultats<\/p>\n\n\n\n<p>Script fournie par AiZF pour l&#8217;exploitation des r\u00e9sultats et la production des images <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nfrom aizynthfinder.reactiontree import ReactionTree\ndata = pd.read_json(\"output.json.gz\", orient=\"table\")\nall_trees = data.trees.values # This contains a list of all the trees for all the compounds\ntrees_for_first_target = all_trees&#91;0]\nfor itree, tree in enumerate(trees_for_first_target):\n     imagefile = f\"route{itree:03d}.png\"\n     ReactionTree.from_dict(tree).to_image().save(imagefile)<\/code><\/pre>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-461ed6f60cf77eda08c6ee3d82f2e571\">Usage en mode s\u00e9curis\u00e9 :<\/p>\n\n\n\n<p>Pour un usage en contexte s\u00e9curis\u00e9, nous conseillons de t\u00e9l\u00e9charger l&#8217;image docker fournie sur le site &#8230;. et d&#8217;ex\u00e9cuter un conteneur sur cette image pour un usage strictement local. <\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-57499b301c9736a2bb6110c96179584d\">Etape 3 : am\u00e9nagement de la solution avec un Web service sous FastAPI : 13\/01\/2026<\/p>\n\n\n\n<p>Monter un service web sous Python pour permettre des appels en passant le smiles et les param\u00e8tres pour obtenir les diff\u00e9rents r\u00e9sultats sous forme d&#8217;image. Pour ce faire nous installer l&#8217;environnement suivant :<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>R\u00e9pertoires ou fichiers<\/td><td><\/td><\/tr><tr><td>\/base<\/td><td>R\u00e9pertoire avec l&#8217;ensemble des fichiers mod\u00e8les et de data<\/td><\/tr><tr><td>\/aizynthfinder<\/td><td>R\u00e9pertoire avec l&#8217;ensemble des scripts du calcul de la r\u00e9trosynth\u00e8se<\/td><\/tr><tr><td>aizynthYS.py<\/td><td>les chemins d&#8217;acc\u00e8s aux diff\u00e9rents services <\/td><\/tr><tr><td>config.yml<\/td><td>Le fichier de configuration inquant la localisation des fichiers mod\u00e8le et data<\/td><\/tr><tr><td>\/database<\/td><td>le module de connexion et interrogation de la base de donn\u00e9es <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span><\/td><\/tr><tr><td>main.py<\/td><td>fichier de d\u00e9marrage<\/td><\/tr><tr><td>\/models<\/td><td>les mod\u00e8les utilis\u00e9s dans mes \u00e9changes avec le web service<\/td><\/tr><tr><td>\/tmp<\/td><td>R\u00e9pertoire de d\u00e9p\u00f4t des r\u00e9sultats<\/td><\/tr><tr><td>.env<\/td><td>Le fichier de d\u00e9claration des variables d&#8217;environnement base de donn\u00e9es et s\u00e9curit\u00e9<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Dans le r\u00e9pertoire base : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>le fichier mod\u00e8le onnx : uspto_model.onnx<\/li>\n\n\n\n<li>le fichier uspto_templates.csv.gz<\/li>\n\n\n\n<li>le fichier zinc_stock_17_04_20.hdf5<\/li>\n<\/ul>\n\n\n\n<p>Les adaptations effectu\u00e9es dans les scripts de base ne concerne que le fichier interfaces\/aizynthcli.py qui s&#8217;est transform\u00e9 de la mani\u00e8re suivante : la fonction main a \u00e9t\u00e9 \u00e9clat\u00e9e en deux parties une fonction load_scartek et une fonction main_scartek. Ceci permet de s\u00e9parer ces deux actions \u00e0 des moments diff\u00e9rents : le load_scartek sera ex\u00e9cut\u00e9 par le web service au d\u00e9marrage et le main_scartek va permettre d&#8217;ex\u00e9cuter le traitement de r\u00e9trosynth\u00e8se. Ce d\u00e9coupage permet de charger la base et le mod\u00e8le une seule  fois et de l&#8217;utiliser pour chaque \u00e9valuation de r\u00e9trosynth\u00e8se. <\/p>\n\n\n\n<p>Ce qui nous donne pour les deux m\u00e9thodes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># On adapte l'appel de cette fonction au contexte Web service\ndef load_scartek(Config: str) -&gt; None:\n    \"\"\"Entry point for the aizynthcli command modifie\"\"\"\n    global args, finder, post_processing,pre_processing\n    args.config=Config\n    print(\"chargement du load -- mod\u00e8le charg\u00e9\")\n    finder = AiZynthFinder(configfile=Config)\n    _select_stocks(finder, args)\n    post_processing = _load_postprocessing_jobs(args.post_processing)\n    pre_processing = _load_preprocessing_job(args.pre_processing)\n    finder.expansion_policy.select(args.policy or finder.expansion_policy.items&#91;0])\n    finder.filter_policy.select_all()\n<\/code><\/pre>\n\n\n\n<p>Et pour la deuxi\u00e8me fonction : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># On adapte l'appel de cette fonction au contexte Web service\ndef main_scartek(Smiles:str, Output: str) -&gt; None:\n    \"\"\"Entry point for the aizynthcli command modifie\"\"\"\n    global finder , post_processing,pre_processing\n    argsL=copy.copy(args)\n    argsL.smiles=Smiles\n    print(\"traitement\" + argsL.smiles+ \"  \" + Output)\n    params = &#91;\n        Smiles,\n        finder,\n        Output,\n        argsL.cluster,\n        argsL.route_distance_model,\n        post_processing,\n        pre_processing,\n        argsL.checkpoint,\n    ]\n    _process_multi_smiles(*params)\n<\/code><\/pre>\n\n\n\n<p>Int\u00e9gration de ces deux points d&#8217;entr\u00e9e dans notre dispositif de web service :<\/p>\n\n\n\n<p>Le main.py va nous permettre de charger les diff\u00e9rents modules d\u00e9di\u00e9s \u00e0 FastAPI, <span class='tooltipsall tooltipsincontent classtoolTips3'>MongoDB<\/span> et \u00e0 initialiser les acc\u00e8s base et le chargement du mod\u00e8le pour aizynthfinder. Ensuite on rajoute les diff\u00e9rents points d&#8217;entr\u00e9e de notre web service. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app = FastAPI()\n\napp.include_router(aizynthfinder_router)\n\nsettings=Settings()\n\n@app.on_event(\"startup\")\nasync def chargement_model():\n    load_scartek(\".\/config.yml\")\n    await settings.initialize_database()\n<\/code><\/pre>\n\n\n\n<p>D\u00e9finition des points d&#8217;entr\u00e9e : aizynthfinder_router pour d\u00e9clencher les diff\u00e9rents traitements. On a besoin de deux entr\u00e9es pour produire la r\u00e9trosynth\u00e8se et ensuite pour produire les images associ\u00e9es. Pour chaque fonction on v\u00e9rifiera au pr\u00e9alable si la r\u00e9trosynth\u00e8se a d\u00e9j\u00e0 \u00e9t\u00e9 effectu\u00e9e. Si c&#8217;est le cas on indiquera le code sp\u00e9cifique pour l&#8217;acc\u00e8s aux images. <\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>requirements.txt<\/summary>\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>absl-py==2.1.0\naiohappyeyeballs==2.4.4\naiohttp==3.11.11\naiosignal==1.3.2\nalabaster==1.0.0\nalembic==1.14.0\nannotated-doc==0.0.4\nannotated-types==0.7.0\nanyio==4.7.0\napted==1.0.3\nargon2-cffi==23.1.0\nargon2-cffi-bindings==21.2.0\narrow==1.3.0\nasttokens==3.0.0\nasync-lru==2.0.4\nasync-timeout==5.0.1\nattrs==24.3.0\nautopage==0.5.2\nbabel==2.16.0\nbcrypt==5.0.0\nbeanie==2.0.1\nbeautifulsoup4==4.12.3\nblack==24.10.0\nbleach==6.2.0\nblosc2==2.7.1\ncertifi==2024.12.14\ncffi==1.17.1\ncharset-normalizer==3.4.1\nclick==8.1.8\ncliff==4.8.0\ncmaes==0.11.1\ncmd2==2.5.8\ncoloredlogs==15.0.1\ncolorlog==6.9.0\ncomm==0.2.2\ncommonmark==0.9.1\ncontourpy==1.3.1\ncycler==0.12.1\ndebugpy==1.8.11\ndecorator==5.1.1\ndefusedxml==0.7.1\nDeprecated==1.2.15\ndnspython==2.8.0\ndocutils==0.21.2\necdsa==0.19.1\nentrypoints==0.4\nexceptiongroup==1.2.2\nexecuting==2.1.0\nfastapi==0.128.0\nfastjsonschema==2.21.1\nflake8==7.1.1\nflatbuffers==24.12.23\nfonttools==4.55.3\nfqdn==1.5.1\nfrozenlist==1.5.0\nfsspec==2024.12.0\ngreenlet==3.1.1\ngrpcio==1.68.1\nh11==0.14.0\nhttpcore==1.0.7\nhttpx==0.28.1\nhumanfriendly==10.0\nidna==3.10\nimagesize==1.4.1\nimportlib_resources==6.4.5\niniconfig==2.0.0\nipykernel==6.29.5\nipython==8.31.0\nipython-genutils==0.2.0\nipywidgets==7.8.5\nisoduration==20.11.0\njedi==0.19.2\nJinja2==3.1.5\njoblib==1.4.2\njson5==0.10.0\njsonpointer==3.0.0\njsonschema==4.23.0\njsonschema-specifications==2024.10.1\njupyter==1.1.1\njupyter-console==6.6.3\njupyter-events==0.11.0\njupyter-lsp==2.2.5\njupyter_client==7.4.9\njupyter_core==5.7.2\njupyter_server==2.15.0\njupyter_server_terminals==0.5.3\njupyterlab==4.3.4\njupyterlab_pygments==0.3.0\njupyterlab_server==2.27.3\njupyterlab_widgets==1.1.11\njupytext==1.16.6\nkiwisolver==1.4.8\nlazy-model==0.4.0\nlightning-utilities==0.11.9\nllvmlite==0.43.0\nMako==1.3.8\nMarkdown==3.7\nmarkdown-it-py==3.0.0\nMarkupSafe==3.0.2\nmatplotlib==3.10.0\nmatplotlib-inline==0.1.7\nmccabe==0.7.0\nmdit-py-plugins==0.4.2\nmdurl==0.1.2\nmistune==3.1.0\nmolbloom==2.2.1\nmotor==3.7.1\nmpmath==1.3.0\nmsgpack==1.1.0\nmultidict==6.1.0\nmypy==1.14.0\nmypy-extensions==1.0.0\nmyst-parser==4.0.0\nnbclassic==1.1.0\nnbclient==0.10.2\nnbconvert==7.16.4\nnbformat==5.10.4\nnbsphinx==0.9.6\nndindex==1.9.2\nnest-asyncio==1.6.0\nnetron==8.0.8\nnetworkx==2.8.8\nnotebook==6.5.7\nnotebook_shim==0.2.4\nnumba==0.60.0\nnumexpr==2.10.0\nnumpy==1.26.4\nnumpydoc==1.8.0\nnvidia-cublas-cu11==11.10.3.66\nnvidia-cuda-nvrtc-cu11==11.7.99\nnvidia-cuda-runtime-cu11==11.7.99\nnvidia-cudnn-cu11==8.5.0.96\nonnxruntime==1.23.2\noptuna==2.10.1\noverrides==7.7.0\npackaging==24.2\npandas==1.5.3\npandocfilters==1.5.1\nparetoset==1.2.4\nparso==0.8.4\npasslib==1.7.4\npathspec==0.12.1\npbr==6.1.0\npep8==1.7.1\npexpect==4.9.0\nPillow==9.5.0\nplatformdirs==4.3.6\npluggy==1.5.0\nprettytable==3.12.0\nprometheus_client==0.21.1\nprompt_toolkit==3.0.48\npropcache==0.2.1\nprotobuf==3.20.1\npsutil==6.1.1\nptyprocess==0.7.0\npure_eval==0.2.3\npy-cpuinfo==9.0.0\npyasn1==0.6.1\npycodestyle==2.12.1\npycparser==2.22\npydantic==2.10.4\npydantic-settings==2.12.0\npydantic_core==2.27.2\npyDeprecate==0.3.2\npyflakes==3.2.0\nPygments==2.18.0\npymongo==4.16.0\npyparsing==3.2.0\npyperclip==1.9.0\npytest==8.3.4\npython-dateutil==2.9.0.post0\npython-dotenv==1.2.1\npython-jose==3.5.0\npython-json-logger==3.2.1\npytorch-lightning==1.6.5.post0\npytorch-tree-lstm==0.1.3\npytz==2024.2\nPyYAML==6.0.2\npyzmq==26.2.0\nrdchiral==1.1.0\nrdkit==2022.9.5\nrecommonmark==0.7.1\nreferencing==0.35.1\nrequests==2.32.3\nrfc3339-validator==0.1.4\nrfc3986-validator==0.1.1\nrpds-py==0.22.3\nrsa==4.9.1\nscikit-learn==1.6.0\nscipy==1.14.1\nseaborn==0.13.2\nSend2Trash==1.8.3\nsix==1.17.0\nsniffio==1.3.1\nsnowballstemmer==2.2.0\nsoupsieve==2.6\n<span class='tooltipsall tooltipsincontent classtoolTips4'>Sphinx<\/span>==8.1.3\nsphinxcontrib-applehelp==2.0.0\nsphinxcontrib-devhelp==2.0.0\nsphinxcontrib-htmlhelp==2.1.0\nsphinxcontrib-jsmath==1.0.1\nsphinxcontrib-qthelp==2.0.0\nsphinxcontrib-serializinghtml==2.0.0\nSQLAlchemy==2.0.36\nstack-data==0.6.3\nstarlette==0.50.0\nstevedore==5.4.0\nsympy==1.13.3\ntables==3.10.1\ntabulate==0.9.0\ntensorboard==2.18.0\ntensorboard-data-server==0.7.2\nterminado==0.18.1\nthreadpoolctl==3.5.0\ntimeout-decorator==0.5.0\ntinycss2==1.4.0\ntomli==2.2.1\ntorch==1.13.1\ntorchmetrics==1.5.2\ntornado==6.4.2\ntqdm==4.67.1\ntraitlets==5.14.3\ntypes-python-dateutil==2.9.0.20241206\ntyping-inspection==0.4.2\ntyping_extensions==4.12.2\nuri-template==1.3.0\nurllib3==2.3.0\nuvicorn==0.40.0\nwcwidth==0.2.13\nwebcolors==24.11.1\nwebencodings==0.5.1\nwebsocket-client==1.8.0\nWerkzeug==3.1.3\nwidgetsnbextension==3.6.10\nwrapt==1.17.0\nyarl==1.18.3\n\n<\/code><\/pre>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Dockerfile<\/summary>\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM python:3.11\nWORKDIR \/app\nCOPY requirements.txt \/app\nRUN pip install --upgrade pip &amp;&amp; pip install -r \/app\/requirements.txt\nRUN pip install onnxruntime\nEXPOSE 8005\nCOPY .\/ \/app\nCMD &#91;\"python\", \"main.py\"]\n<\/code><\/pre>\n<\/details>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>docker-compose.yml<\/summary>\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: \"3\"\nservices:\n  api:\n    build: .\n    image: scartekaizf:latest\n    ports:\n      - \"8005:8005\"\n    env_file:\n      - .env.prod\n  database:\n    image: mongo\n    ports:\n      - \"27017\"\n    volumes:\n      - data:\/data\/db\nvolumes:\n  data:\n<\/code><\/pre>\n<\/details>\n\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-f8e14e1e30a4d4d4567eed95cdb422bf\">Etape 4 : d\u00e9veloppement d&#8217;une interface web d\u00e9di\u00e9e <\/p>\n\n\n\n<p>Habiller l&#8217;ensemble d&#8217;un frontal web pour permettre des manipulations simples des utilisateurs. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"466\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-38-21-1024x466.png\" alt=\"\" class=\"wp-image-11650\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-38-21-1024x466.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-38-21-300x137.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-38-21-768x350.png 768w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-38-21.png 1423w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>Et l&#8217;affichage des r\u00e9sultats apr\u00e8s la r\u00e9solution de la r\u00e9trosynth\u00e8se<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"542\" src=\"https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-43-09-1024x542.png\" alt=\"\" class=\"wp-image-11649\" srcset=\"https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-43-09-1024x542.png 1024w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-43-09-300x159.png 300w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-43-09-768x406.png 768w, https:\/\/spgoo.org\/wp-content\/uploads\/2026\/01\/Capture-du-2026-01-13-17-43-09.png 1412w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"has-pale-cyan-blue-color has-text-color has-link-color has-medium-font-size wp-elements-452e6e8640c52aa3c1f3b22faeeeeb12\">Etape 5 : Extensions possibles <\/p>\n\n\n\n<p>Plusieurs extensions dans ce type de service , la possibilit\u00e9  d&#8217;annoter les r\u00e9trosynth\u00e8se pour avoir une explication plus d\u00e9taill\u00e9e sur le proc\u00e9d\u00e9, la possibilit\u00e9 de compl\u00e9ter  les r\u00e9sultats par des compl\u00e9ments de LLM : de type Ollama ou autre mod\u00e8le. <\/p>\n\n\n\n<p>Un couplage avec Claude d&#8217;Anthropic devrait permettre de compl\u00e9ter les r\u00e9trosynth\u00e8ses, ce couplage peut \u00eatre r\u00e9alis\u00e9 au niveau du smile ou directement au niveau des r\u00e9sultats (images) pour d\u00e9crire le proc\u00e9d\u00e9 de r\u00e9trosynth\u00e8se.<\/p>\n\n\n\n<p>Appel du service Claude d&#8217;Anthropic <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const response = await fetch('https:\/\/api.anthropic.com\/v1\/messages', {\n      method: 'POST',\n      headers: {\n           'Content-Type': 'application\/json',\n           'x-api-key': apiKey,\n           'anthropic-version': '2023-06-01'\n      },\n      body: JSON.stringify({\n            model: 'claude-sonnet-4-20250514',\n            max_tokens: 1024,\n            messages: conversationHistory\n     })\n});<\/code><\/pre>\n<script type=\"text\/javascript\"> toolTips('.classtoolTips3','<a style=\"text-decoration: none;\" href=\"https:\/\/www.mongodb.com\/fr-fr\"><img style=\"width: 180px; height: 50px;\" src=\"\/wp-content\/uploads\/2025\/01\/mongodb-logo-rgb-scaled.jpg\" \/><\/a>'); <\/script><script type=\"text\/javascript\"> toolTips('.classtoolTips4','Create intelligent and beautiful documentation with ease <a href=\"https:\/\/www.sphinx-doc.org\/en\/master\/index.html\">url<\/a>'); <\/script>","protected":false},"excerpt":{"rendered":"<p>CDA Aizynthfinder Ressources SPGoO : Pascal Krezel, Yvan Stroppa (d\u00e9c 2024 &#8211; janv 2025) Mise en oeuvre d&#8217;un service autour de la solution de r\u00e9tro-synth\u00e8se AizynthFinder. Plusieurs \u00e9tapes dans cette mise en place. Etape 1 : Installation et v\u00e9rification : Fichiers de donn\u00e9es et mod\u00e8les : A partir des sources d\u00e9pos\u00e9es sur le github suivant, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2110","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/2110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2110"}],"version-history":[{"count":85,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/2110\/revisions"}],"predecessor-version":[{"id":11666,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/2110\/revisions\/11666"}],"wp:attachment":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}