{"id":34032467,"url":"https://github.com/crillab/pyxai","last_synced_at":"2026-05-22T10:01:52.610Z","repository":{"id":68183200,"uuid":"543047795","full_name":"crillab/pyxai","owner":"crillab","description":"PyXAI (Python eXplainable AI) is a Python library (version 3.6 or later) allowing to bring formal explanations suited to (regression or classification) tree-based ML models (Decision Trees, Random Forests, Boosted Trees, ...).","archived":false,"fork":false,"pushed_at":"2026-03-11T09:02:20.000Z","size":77943,"stargazers_count":39,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-28T00:58:04.832Z","etag":null,"topics":["boosted-trees","classification","decision-tree","python","random-forest","regression","xai"],"latest_commit_sha":null,"homepage":"https://www.cril.univ-artois.fr/pyxai","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crillab.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-09-29T10:01:18.000Z","updated_at":"2026-03-13T17:35:24.000Z","dependencies_parsed_at":"2026-03-11T11:11:06.840Z","dependency_job_id":null,"html_url":"https://github.com/crillab/pyxai","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/crillab/pyxai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crillab%2Fpyxai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crillab%2Fpyxai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crillab%2Fpyxai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crillab%2Fpyxai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crillab","download_url":"https://codeload.github.com/crillab/pyxai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crillab%2Fpyxai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["boosted-trees","classification","decision-tree","python","random-forest","regression","xai"],"created_at":"2025-12-13T18:49:01.162Z","updated_at":"2026-05-22T10:01:52.596Z","avatar_url":"https://github.com/crillab.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"http://www.cril.univ-artois.fr/pyxai/assets/figures/logo.png\" alt=\"pyxai\" width=\"300\"/\u003e\n\u003c/div\u003e\n\n# PyXAI - Python eXplainable AI\n\n[![Unit tests Linux](https://github.com/crillab/pyxai/actions/workflows/tests_linux.yml/badge.svg)](https://github.com/crillab/pyxai/actions/workflows/tests_linux.yml)\n[![MacOS tests](https://github.com/crillab/pyxai/actions/workflows/test_osx.yml/badge.svg)](https://github.com/crillab/pyxai/actions/workflows/test_osx.yml)\n[![Wheel builder Linux](https://github.com/crillab/pyxai/actions/workflows/build_wheels_linux.yml/badge.svg)](https://github.com/crillab/pyxai/actions/workflows/build_wheels_linux.yml)\n[![Wheel builder macOS](https://github.com/crillab/pyxai/actions/workflows/build_wheels_macos.yml/badge.svg)](https://github.com/crillab/pyxai/actions/workflows/build_wheels_macos.yml)\n[![PyPI version](https://img.shields.io/pypi/v/pyxai)](https://pypi.org/project/pyxai/)\n[![Python](https://img.shields.io/badge/python-3.11%20|%203.12%20|%203.13-blue)](https://pypi.org/project/pyxai/)\n\n- Documentation: [http://www.cril.univ-artois.fr/pyxai/](http://www.cril.univ-artois.fr/pyxai/)\n- Git: [https://github.com/crillab/pyxai](https://github.com/crillab/pyxai)\n- Pypi: [https://pypi.org/project/pyxai/](https://pypi.org/project/pyxai/)\n- Installation: [http://www.cril.univ-artois.fr/pyxai/documentation/installation/](http://www.cril.univ-artois.fr/pyxai/documentation/installation/)\n- API Reference: [https://www.cril.univ-artois.fr/pyxai/documentation/api/](https://www.cril.univ-artois.fr/pyxai/documentation/api/)\n- Release Notes: [https://www.cril.univ-artois.fr/pyxai/documentation/releases/](https://www.cril.univ-artois.fr/pyxai/documentation/releases/)\n- About \"Uncovering Bugs in Formal Explainers: A Case Study with PyXAI. CoRR abs/2511.03169 (2025)\": [https://www.cril.univ-artois.fr/pyxai/about-arxiv-2511.03169/](https://www.cril.univ-artois.fr/pyxai/about-arxiv-2511.03169/)\n\n\u003ch3\u003eWhat is PyXAI?\u003c/h3\u003e\n\u003cp align=\"justify\"\u003e\n\u003cb\u003ePyXAI (Python eXplainable AI)\u003c/b\u003e is a \u003ca href=\"https://www.python.org/\"\u003ePython\u003c/a\u003e library (version 3.6 or later) that brings formal explanations suited to \u003cb\u003e(regression or classification) tree-based ML models\u003c/b\u003e (Decision Trees, Random Forests, Boosted Trees, ...). PyXAI generates explanations that are \u003cb\u003epost-hoc and local\u003c/b\u003e. In contrast to many popular approaches to XAI (SHAP, LIME, ...), PyXAI generates explanations that are also \u003cb\u003ecorrect\u003c/b\u003e. Being correct (aka sound or faithful) indicates that the explanations that are provided actually \u003cb\u003ereflect the exact behaviour of the model by guaranteeing certain properties\u003c/b\u003e about the explanations generated. They can be of several types:  \n\u003c/p\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\u003cb\u003eAbductive explanations\u003c/b\u003e for an instance $X$ are intended to explain why $X$ has been classified in the way it has been classified by the ML model (thus, addressing the \"Why?\" question). In the regression case, abductive explanations for $X$ are intended to explain why the regression value of $X$ belongs to a given interval.\u003c/li\u003e\n  \u003cli\u003e\u003cb\u003eContrastive explanations\u003c/b\u003e for $X$ are intended to explain why $X$ has not been classified by the ML model as the user expected it (thus, addressing the \"Why not?\" question).\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cp align=\"justify\"\u003e\nPyXAI also includes algorithms for \u003cb\u003ecorrecting tree-based models\u003c/b\u003e when their predictions conflict with pieces of user knowledge. This more tricky facet of XAI is seldom offered by existing XAI systems. When some domain knowledge is available and a prediction (or an explanation) contradicts it, the model must be corrected. \u003cb\u003eRectification\u003c/b\u003e is a principled approach for such a correction operation.\n\u003c/p\u003e\n\n\u003e **About the release 2.0.0:**\n\u003e This release includes a new **API Reference** section on the website, fully rewritten docstrings, several **renamed parameters and imports**, compatibility with the **latest XGBoost versions**, and internal refactoring.\n\u003e See the full [release notes](http://www.cril.univ-artois.fr/pyxai/documentation/releases/) for details.\n\n\u003e **About the release 1.1.1:**\n\u003e This release is related to the paper *\"Uncovering Bugs in Formal Explainers: A Case Study with PyXAI. CoRR abs/2511.03169 (2025)\"*.\n\u003e You can find our [explanations about this paper](https://www.cril.univ-artois.fr/pyxai/about-arxiv-2511.03169/).\n\n\u003e \u003cb\u003eNew features in version 1.1.0:\u003c/b\u003e\n\u003e \u003cul\u003e\n\u003e   \u003cli\u003eRectification for DT (Decision Tree) and RF (Random Forest) models dedicated to binary classification.\u003c/li\u003e\n\u003e   \u003cli\u003eVisualization displayed in a notebook or on screen, and now also for time series problems.\u003c/li\u003e \n\u003e   \u003cli\u003eEnhanced compatibility with Mac OS and Windows.\u003c/li\u003e\n\u003e \u003c/ul\u003e \n\n\u003e \u003cb\u003eNew features in version 1.0.0:\u003c/b\u003e\n\u003e \u003cul\u003e\n\u003e   \u003cli\u003eRegression for Boosted Trees with XGBoost or LightGBM.\u003c/li\u003e\n\u003e   \u003cli\u003eAdding Theories (knowledge about the dataset).\u003c/li\u003e\n\u003e   \u003cli\u003eEasier model import (automatic detection of model types).\u003c/li\u003e\n\u003e   \u003cli\u003ePyXAI's Graphical User Interface (GUI): displaying, loading and saving explanations.\u003c/li\u003e\n\u003e   \u003cli\u003eSupports multiple image formats for image datasets.\u003c/li\u003e\n\u003e   \u003cli\u003eSupports data pre-processing (tools for preparing and cleaning a dataset).\u003c/li\u003e\n\u003e   \u003cli\u003eUnit tests with the unittest module.\u003c/li\u003e\n\u003e \u003c/ul\u003e \n\n\u003cfigure\u003e\n  \u003cimg src=\"http://www.cril.univ-artois.fr/pyxai/assets/figures/base.png\" alt=\"pyxai\" width=\"600\"/\u003e\n  \u003cfigcaption\u003eUser interaction with PyXAI.\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cfigure\u003e\n  \u003cimg src=\"http://www.cril.univ-artois.fr/pyxai/assets/figures/GUI.png\" alt=\"pyxai\" width=\"580\"/\u003e\n  \u003cfigcaption\u003ePyXAI's Graphical User Interface (GUI) for visualizing explanations.\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003cfigure\u003e\n  \u003cimg src=\"http://www.cril.univ-artois.fr/pyxai/assets/figures/timeserie.png\" alt=\"pyxai\" /\u003e\n  \u003cfigcaption\u003eVisualization in a notebook of an explanation for an instance from a time series problem.\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003ch3\u003eWhat is the difference between PyXAI and other methods?\u003c/h3\u003e\n\u003cp align=\"justify\"\u003e\n\nThe most popular approaches (SHAP, LIME, ...) to XAI \u003cb\u003eare model-agnostic, but they do not offer any guarantees\u003c/b\u003e of rigor. \nA number of works by \u003ca href=\"https://arxiv.org/pdf/2307.07514.pdf\"\u003eMarques-Silva and Huang\u003c/a\u003e, \u003ca href=\"https://www.ijcai.org/proceedings/2020/726\"\u003eIgnatiev\u003c/a\u003e have highlighted several misconceptions about such approaches to XAI. Correctness is paramount when dealing with high-risk or sensitive applications, which is the type of applications that are targeted by PyXAI. When the correctness property is not satisfied, one can find \"counterexamples\" for the explanations that are generated, i.e., pairs of instances sharing an explanation but leading to distinct predictions. Contrastingly, \u003cb\u003ePyXAI algorithms rely on logic-based, model-precise\u003c/b\u003e approaches for computing explanations. Although formal explainability has a number of drawbacks, particularly in terms of the computational complexity of logical reasoning needed to derive explanations, \u003cb\u003esteady progress has been made since its inception\u003c/b\u003e. \n\u003c/p\u003e\n\n\u003ch3\u003eWhich models can be explained with PyXAI?\u003c/h3\u003e\n\u003cp align=\"justify\"\u003e\nModels are the resulting objects of an experimental ML protocol through a chosen \u003cb\u003ecross-validation method\u003c/b\u003e (for example, the result of a training phase on a classifier). Importantly, in PyXAI, there is a complete separation between the learning phase and the explaining phase: \u003cb\u003eyou produce/load/save models, and you find explanations for some instances given such models\u003c/b\u003e. Currently, with PyXAI, you can use methods to find explanations suited to different \u003cb\u003eML models for classification or regression tasks\u003c/b\u003e:\n\u003c/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Decision_tree_learning\"\u003eDecision Tree\u003c/a\u003e (DT)\u003c/li\u003e \n  \u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Random_forest\"\u003eRandom Forest\u003c/a\u003e (RF)\u003c/li\u003e\n  \u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Gradient_boosting\"\u003eBoosted Tree (Gradient boosting)\u003c/a\u003e (BT)\u003c/li\u003e\n\u003c/ul\u003e \n\u003cp align=\"justify\"\u003e\nIn addition to finding explanations, PyXAI also provides methods that perform operations (production, saving, loading) on models and instances. Currently, these methods are available for three \u003cb\u003eML libraries\u003c/b\u003e:\n\u003c/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\u003ca href=\"https://scikit-learn.org/stable/\"\u003eScikit-learn\u003c/a\u003e: a machine learning software library\u003c/li\u003e \n  \u003cli\u003e\u003ca href=\"https://xgboost.readthedocs.io/en/stable/\"\u003eXGBoost\u003c/a\u003e: an optimized distributed gradient boosting library\u003c/li\u003e\n  \u003cli\u003e\u003ca href=\"https://lightgbm.readthedocs.io/en/stable/\"\u003eLightGBM\u003c/a\u003e: a gradient boosting framework that uses tree-based learning algorithms\u003c/li\u003e\n\u003c/ul\u003e \n\u003cp align=\"justify\"\u003e\nIt is also possible to leverage PyXAI to find explanations suited to models learned using other libraries.\n\u003c/p\u003e\n\n\u003ch3\u003eWhat does this website offer?\u003c/h3\u003e\n\u003cp align=\"justify\"\u003e\nIn this website, you can find everything you need to know about PyXAI, with more than 10 \u003ca href=\"https://jupyter.org/\"\u003eJupyter\u003c/a\u003e Notebooks, including:\n\u003c/p\u003e\n\u003cul\u003e\n \u003cli\u003eThe \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/installation/\"\u003einstallation guide\u003c/a\u003e and the \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/quickstart/\"\u003equick start\u003c/a\u003e page\u003c/li\u003e\n\n  \u003cli\u003eAbout models:\u003c/li\u003e\n  \u003cul\u003e\n  \u003cli\u003eHow to \u003cb\u003eprepare and clean a dataset\u003c/b\u003e using the PyXAI \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/preprocessing_data/\"\u003epreprocessor\u003c/a\u003e object?\u003c/li\u003e\n  \u003cli\u003eHow to \u003cb\u003eimport a model\u003c/b\u003e, whatever its format? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/learning/importing_models/\"\u003eImporting Models\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eHow to \u003cb\u003egenerate a model using a ML cross-validation method\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/learning/from_ml_libraries/\"\u003eGenerating Models\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eHow to \u003cb\u003ebuild a model from trees directly built by the user\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/learning/builder/\"\u003eBuilding Models\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eHow to \u003cb\u003esave and load models\u003c/b\u003e with the PyXAI learning module? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/learning/saving_loading_models/\"\u003eSaving/Loading Models\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\n\u003cli\u003eAbout explanations:\u003c/li\u003e\n  \u003cul\u003e\n  \u003cli\u003eThe \u003cb\u003econcepts used by the PyXAI explainer module\u003c/b\u003e: \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/explainer/concepts/\"\u003eConcepts\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003e\u003cb\u003eTheories gathering pieces of knowledge about the dataset.\u003c/b\u003e PyXAI offers the possibility of encoding a theory when calculating explanations in order to avoid the computation of impossible explanations: \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/explainer/theories/\"\u003eTheories\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eThe PyXAI library offers the possibility to process user preferences (\u003cb\u003eprefer some explanations to others or exclude some features\u003c/b\u003e): \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/explainer/preferences/\"\u003ePreferences\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eHow to set a \u003cb\u003etime limit\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/explainer/time_limit/\"\u003eTime Limit\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eHow to \u003cb\u003ecompute explanations for classification tasks\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/classification/\"\u003eExplaining Classification\u003c/a\u003e\u003c/li\u003e\n  \u003cli\u003eHow to \u003cb\u003ecompute explanations for regression tasks\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/regression/\"\u003eExplaining Regression\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\n  \u003cli\u003eAbout rectification:\u003c/li\u003e\n  \u003cul\u003e\n    \u003cli\u003eHow to \u003cb\u003erectify a DT model\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/rectification/decision_tree/\"\u003eRectification for Decision Tree\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003eHow to \u003cb\u003erectify a RF model\u003c/b\u003e? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/rectification/random_forest/\"\u003eRectification for Random Forest\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\n \u003cli\u003eAbout visualization:\u003c/li\u003e\n  \u003cul\u003e\n    \u003cli\u003eHow to generate images to represent explanations (\u003cb\u003ein a notebook or save them in png format\u003c/b\u003e)? \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/visualisation/without_gui/\"\u003eVisualization of Explanations (Without GUI)\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003eHow to use the \u003cb\u003ePyXAI Graphical User Interface (GUI)\u003c/b\u003e for \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/visualisation/with_gui/\"\u003evisualizing explanations\u003c/a\u003e?\u003c/li\u003e\n  \u003c/ul\u003e\n\n  \u003cli\u003eAbout the API Reference:\u003c/li\u003e\n  \u003cul\u003e\n    \u003cli\u003eThe full \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/api/\"\u003eAPI Reference\u003c/a\u003e with all modules, classes, and methods.\u003c/li\u003e\n  \u003c/ul\u003e\n\n\u003c/ul\u003e\n\n\u003ch3\u003eHow to use PyXAI?\u003c/h3\u003e\n\u003cp align=\"justify\"\u003e\nHere is an example (it comes from the \u003ca href=\"https://www.cril.univ-artois.fr/pyxai/documentation/quickstart/\"\u003eQuick Start page\u003c/a\u003e):\n\u003c/p\u003e\n\u003ch4 class=\"example\"\u003ePyXAI in action\u003c/h4\u003e\n\n```python\nfrom pyxai import Learning, Explaining\n\nlearner = Learning.Scikitlearn(\"tests/iris.csv\", problem_type=Learning.CLASSIFICATION)\nmodel = learner.evaluate(splitting_method=Learning.HOLD_OUT, model_type=Learning.DT)\ninstance, prediction = learner.get_instances(model, n=1, is_correct=True, predictions=[0])\n\nexplainer = Explaining.initialize(model, instance)\nprint(\"instance:\", instance)\nprint(\"binary representation:\", explainer.binary_representation)\n\nsufficient_reason = explainer.sufficient_reason(n=1)\nprint(\"sufficient_reason:\", sufficient_reason)\nprint(\"to_features:\", explainer.to_features(sufficient_reason))\n\ninstance, prediction = learner.get_instances(model, n=1, is_correct=False)\nexplainer.set_instance(instance)\ncontrastive_reason = explainer.contrastive_reason()\nprint(\"contrastive reason\", contrastive_reason)\nprint(\"to_features:\", explainer.to_features(contrastive_reason, contrastive=True))\n\nexplainer.visualisation.screen(instance, contrastive_reason, contrastive=True)\n```\n\n\u003cimg src=\"https://www.cril.univ-artois.fr/pyxai/assets/figures/pyxaiGUI.png\" alt=\"pyxai\" /\u003e\n\n\u003cp\u003eAs illustrated by this example, with a few lines of code, PyXAI allows you to train a model, extract instances, and get explanations about the classifications made.\u003c/p\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.cril.univ-artois.fr\"\u003e\u003cimg width=\"140px\" src=\"https://www.cril.univ-artois.fr/pyxai/assets/figures/cril.png\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.cnrs.fr/\"\u003e\u003cimg width=\"80px\" style=\"width: 80px;\" src=\"https://www.cril.univ-artois.fr/pyxai/assets/figures/cnrs.png\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.confiance.ai/\"\u003e\u003cimg width=\"140px\" style=\"width: 120px;\" src=\"https://www.cril.univ-artois.fr/pyxai/assets/figures/confianceai.jpg\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.hautsdefrance.fr/\"\u003e\u003cimg width=\"120px\" style=\"width: 80px;\" src=\"https://www.cril.univ-artois.fr/pyxai/assets/figures/logo_HDF.svg\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.univ-artois.fr\"\u003e\u003cimg width=\"120px\" src=\"https://www.cril.univ-artois.fr/pyxai/assets/figures/artois.png\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrillab%2Fpyxai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrillab%2Fpyxai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrillab%2Fpyxai/lists"}