{"id":25613099,"url":"https://github.com/modular-ml/wrapyfi","last_synced_at":"2026-02-25T19:31:50.753Z","repository":{"id":43189022,"uuid":"316002983","full_name":"modular-ml/wrapyfi","owner":"modular-ml","description":"Robotics MOM and RPC middleware wrapper with deep-learning framework integration","archived":false,"fork":false,"pushed_at":"2026-01-18T01:00:46.000Z","size":52041,"stargazers_count":80,"open_issues_count":5,"forks_count":5,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-01-27T08:23:55.744Z","etag":null,"topics":["0mq","distributed-computing","flask-socketio","middleware","mqtt","p2p","parallel-computing","python","robotics","ros","ros-galactic","ros-humble","ros-noetic","ros2","socketio","websocket","wrapper","yarp","zenoh","zeromq"],"latest_commit_sha":null,"homepage":"https://wrapyfi.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/modular-ml.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-11-25T17:01:35.000Z","updated_at":"2026-01-09T21:57:14.000Z","dependencies_parsed_at":"2023-12-20T13:25:40.951Z","dependency_job_id":"d0ca4417-8408-4c70-834f-df158c8d5956","html_url":"https://github.com/modular-ml/wrapyfi","commit_stats":{"total_commits":569,"total_committers":7,"mean_commits":81.28571428571429,"dds":0.6906854130052724,"last_synced_commit":"cd9dfe3cb20546d9d03c31f6d560ae1fc9451d14"},"previous_names":["modular-ml/wrapyfi","fabawi/wrapyfi"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/modular-ml/wrapyfi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modular-ml%2Fwrapyfi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modular-ml%2Fwrapyfi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modular-ml%2Fwrapyfi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modular-ml%2Fwrapyfi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/modular-ml","download_url":"https://codeload.github.com/modular-ml/wrapyfi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/modular-ml%2Fwrapyfi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29836226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T19:08:47.527Z","status":"ssl_error","status_checked_at":"2026-02-25T18:59:04.705Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["0mq","distributed-computing","flask-socketio","middleware","mqtt","p2p","parallel-computing","python","robotics","ros","ros-galactic","ros-humble","ros-noetic","ros2","socketio","websocket","wrapper","yarp","zenoh","zeromq"],"created_at":"2025-02-22T01:22:33.373Z","updated_at":"2026-02-25T19:31:50.736Z","avatar_url":"https://github.com/modular-ml.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"460\" height=\"300\" src=\"https://raw.githubusercontent.com/fabawi/wrapyfi/main/assets/wrapyfi.png\"\u003e\n\u003c/p\u003e\n\n\n\u003chl/\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n[![webpage](https://custom-icon-badges.demolab.com/badge/Page-blue.svg?logo=globe\u0026logoColor=white)](https://www.inf.uni-hamburg.de/en/inst/ab/wtm/research/software.html#wrapyfi \"webpage link\")\n[![paper](https://custom-icon-badges.demolab.com/badge/Paper-blue.svg?logo=paper_sheet\u0026logoColor=white)](https://www2.informatik.uni-hamburg.de/wtm/publications/2024/AAFW24/Abawi_HRI24.pdf \"paper link\")\n[![researchgate](https://custom-icon-badges.demolab.com/badge/ResearchGate-white.svg?logo=researchgate)](https://www.researchgate.net/publication/376582189_Wrapyfi_A_Python_Wrapper_for_Integrating_Robots_Sensors_and_Applications_across_Multiple_Middleware \"researchgate link\")\n[![paperswithcode](https://custom-icon-badges.demolab.com/badge/Papers%20With%20Code-white.svg?logo=paperwithcode)](https://cs.paperswithcode.com/paper/wrapyfi-a-wrapper-for-message-oriented-and \"paperswithcode link\")\n[![modularml](https://custom-icon-badges.demolab.com/badge/Modular%20ML-white.svg?logo=modularml)](https://modular.ml/#wrap \"modularml link\")\n[![arXiv](https://custom-icon-badges.demolab.com/badge/arXiv:2302.09648-lightyellow.svg?logo=arxiv-logomark-small)](https://arxiv.org/abs/2302.09648 \"arXiv link\")\n[![doi](https://custom-icon-badges.demolab.com/badge/10.1145/3610977.3637471-lightyellow.svg?logo=doi_logo)](https://doi.org/10.1145/3610977.3637471 \"doi link\")\n\n\n[![codecov](https://codecov.io/github/modular-ml/wrapyfi/graph/badge.svg?token=5SD1A6ENKE)](https://codecov.io/github/modular-ml/wrapyfi)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://black.readthedocs.io/ \"code style link\")\n[![PyPI - Implementation](https://img.shields.io/pypi/implementation/wrapyfi)](https://pypi.org/project/wrapyfi/ \"implementation\")\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/wrapyfi)](https://pypi.org/project/wrapyfi/ \"python version\")\n\n[![PyPI version](https://badge.fury.io/py/wrapyfi.svg)](https://badge.fury.io/py/wrapyfi)\n[![PyPI total downloads](https://img.shields.io/pepy/dt/wrapyfi)](https://www.pepy.tech/projects/wrapyfi)\n[![Docker Hub Pulls](https://img.shields.io/docker/pulls/modularml/wrapyfi.svg)](https://hub.docker.com/repository/docker/modularml/wrapyfi)\n\n\n[![License](https://custom-icon-badges.demolab.com/github/license/denvercoder1/custom-icon-badges?logo=law\u0026logoColor=white)](https://github.com/fabawi/wrapyfi/blob/main/LICENSE \"license MIT\")\n[![FOSSA status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fmodular-ml%2Fwrapyfi.svg?type=shield\u0026issueType=license)](https://app.fossa.com/projects/git%2Bgithub.com%2Fmodular-ml%2Fwrapyfi?ref=badge_shield\u0026issueType=license)\n[![Documentation status](https://readthedocs.org/projects/wrapyfi/badge/?version=latest)](https://wrapyfi.readthedocs.io/en/latest/?badge=latest)\n\n\u003c/div\u003e\n\nWrapyfi is a middleware communication wrapper for transmitting data across nodes, without \naltering the operation pipeline of your Python scripts. Wrapyfi introduces\na number of helper functions to make middleware integration possible without the need to learn an entire framework, just to parallelize your processes on \nmultiple machines. \nWrapyfi supports [YARP](https://www.yarp.it/yarp_swig.html), [ROS](http://wiki.ros.org/rospy), [ROS 2](https://docs.ros2.org/foxy/api/rclpy/index.html), [ZeroMQ](http://zeromq.org/), [Websocket](https://socket.io/), [Zenoh](https://zenoh.io/) and [MQTT](https://mqtt.org).\n\n\n# Attribution\n\nPlease refer to the following [paper](https://www2.informatik.uni-hamburg.de/wtm/publications/2024/AAFW24/Abawi_HRI24.pdf) when citing Wrapyfi in academic work:\n\n```\n@inproceedings{abawi2024wrapyfi,\n  title = {Wrapyfi: A Python Wrapper for Integrating Robots, Sensors, and Applications across Multiple Middleware},\n  author = {Abawi, Fares and Allgeuer, Philipp and Fu, Di and Wermter, Stefan},\n  booktitle = {Proceedings of the ACM/IEEE International Conference on Human-Robot Interaction (HRI '24)},\n  year = {2024},\n  organization = {ACM},\n  isbn = {79-8-4007-0322-5},\n  doi = {10.1145/3610977.3637471},\n  url = {https://github.com/fabawi/wrapyfi}\n}\n```\n\n# Getting Started\n\nBefore using Wrapyfi, YARP, ROS, ZeroMQ, Websocket, Zenoh, or MQTT must be installed.\n\n* **YARP**: Follow the [YARP installation guide](https://github.com/fabawi/wrapyfi/tree/main/wrapyfi_extensions/yarp/README.md?rank=0).\u003c!-- [YARP installation guide](docs/yarp_install_lnk.md). --\u003e\nThe `yarpserver` server must be running before running any YARP-based scripts. Note that the iCub package is not needed for Wrapyfi to work and does not have to be installed if you do not intend to use the iCub robot. \n\n* **ROS**: For installing ROS, follow the ROS installation guide [\\[Ubuntu\\]](http://wiki.ros.org/noetic/Installation/Ubuntu)[\\[Windows\\]](https://wiki.ros.org/noetic/Installation/Windows). \nWe recommend installing ROS on Conda using the [RoboStack](https://github.com/RoboStack/ros-noetic) environment. The `roscore` server must be running before running any ROS-based scripts. Additionally, the \n[Wrapyfi ROS interfaces](https://github.com/modular-ml/wrapyfi_ros_interfaces/blob/master/README.md?rank=0) must be\nbuilt to support messages needed for audio transmission [![ROS Package Index](https://img.shields.io/ros/v/noetic/wrapyfi_ros_interfaces)](https://index.ros.org/r/wrapyfi_ros_interfaces/#noetic)\n\n* **ROS 2**: For installing ROS 2, follow the ROS 2 installation guide [\\[Ubuntu\\]](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html)[\\[Windows\\]](https://docs.ros.org/en/humble/Installation/Windows-Install-Binary.html). \nWe recommend installing ROS 2 on Conda using the [RoboStack](https://github.com/RoboStack/ros-humble) environment. Additionally, the \n[Wrapyfi ROS 2 interfaces](https://github.com/modular-ml/wrapyfi_ros2_interfaces/blob/master/README.md?rank=0) \nmust be built to support messages and services needed for audio transmission and the REQ/REP pattern [![ROS Package Index](https://img.shields.io/ros/v/humble/wrapyfi_ros2_interfaces)](https://index.ros.org/p/wrapyfi_ros2_interfaces/#humble)\n\n* **ZeroMQ**: ZeroMQ can be installed using pip: `pip install pyzmq`. \nThe XPUB/XSUB and XREQ/XREP patterns followed in our ZeroMQ implementation requires a proxy broker. A broker is spawned by default as a daemon process.\nTo avoid automatic spawning, pass the argument `start_proxy_broker=False` to the method register decorator. \nA standalone broker can be found [here](https://github.com/fabawi/wrapyfi/tree/main/wrapyfi/standalone/zeromq_proxy_broker.py)\n\n* **Websocket**: Websocket can be installed using pip: `pip install python-socketio`. \nThe PUB/SUB pattern followed in our Websocket implementation requires a socket server. We recommend setting the server \nto run using [Flask-SocketIO](https://flask-socketio.readthedocs.io/en/latest/) which can be installed with `pip install flask-socketio`.\nNote that the server must be running and also scripted to forward messages to the listening from the publishing client as demonstrated in the example found \n[here](https://github.com/fabawi/wrapyfi/tree/main/wrapyfi/examples/websockets/websocket_server.py)\n\n* **Zenoh**: Zenoh can be installed using pip: `pip install eclipse-zenoh`. It is recommended to use the `WRAPYFI_ZENOH_MODE` environment variable to set the mode to `peer` (default) for running in peer-to-peer mode. \nThe PUB/SUB pattern followed in our Zenoh implementation requires a router. To install the Zenoh router, follow the instructions found [here](https://github.com/eclipse-zenoh/zenoh/?tab=readme-ov-file#how-to-install-it). \nThe `zenohd` router must be running before executing any Zenoh-based Wrapyfi scripts with the environment variable `WRAPYFI_ZENOH_MODE=client`. *NOTE*: The `zenohd --rest-http-port 8082` command must be executed with an arbitrary (non-conflicting) port to avoid collision with other services occupying the default port (8000).\n\n* **MQTT**: MQTT can be installed using pip: `pip install paho-mqtt`.\nThe PUB/SUB pattern followed in our MQTT implementation requires a broker. The default broker used by Wrapyfi [broker.emqx.io](https://broker.emqx.io). However, \nthis broker is not recommended for production use or for transmitting video/audio as it is a public online broker and requires an internet connection (not secure and suffers high latency). We recommend setting up a local broker\nusing [Mosquitto](https://mosquitto.org/download/). A Dockerized version can be found [here](https://github.com/sukesh-ak/setup-mosquitto-with-docker). The broker must be running, and the `WRAPYFI_MQTT_BROKER_ADDRESS` as well as `WRAPYFI_MQTT_BROKER_PORT` environment variables must be set to the \nbroker's address and port, respectively. When setting up a local broker with a username and password, they can be passed through the Wrapyfi method decorator as follows:\n\n```python\n@MiddlewareCommunicator.register(\"NativeObject\", \"mqtt\",\n                                 \"HelloWorld\", \n                                 \"/hello/my_message\", \n                                 carrier=\"\", should_wait=True,\n                                 mqtt_kwargs=dict(username=\"username\", password=\"password\"))\ndef send_message(self):\n    ...\n```\n\n\n#### Compatibility\n* Operating System\n  - [x] Ubuntu \u003e= 18.04 (Not tested with earlier versions of Ubuntu or other Linux distributions)\n  - [x] Windows \u003e= 10 [*beta support*]: \n    * Multiprocessing is disabled. ZeroMQ brokers spawn as threads only\n    * Not tested with YARP and ROS 2\n    * ROS only tested within mamba/micromamba environment installed using [RoboStack](https://github.com/RoboStack/ros-noetic)\n    * ROS and ROS 2 interfaces not tested \n    * Installation instructions across Wrapyfi guides and tutorials are not guaranteed to be compatible with Windows 11\n  - [ ] MacOS 10.14 Mojave [![planned](https://custom-icon-badges.demolab.com/badge/planned%20for%20Wrapyfi%20v1.0-%23C2E0C6.svg?logo=hourglass\u0026logoColor=white)](https://github.com/modular-ml/wrapyfi/issues/99 \"planned link\")\n* Python \u003e= 3.6\n* OpenCV \u003e= 4.2\n* NumPy \u003e= 1.19\n\n\n* YARP \u003e= v3.3.2 \n* ROS Noetic Ninjemys\n* ROS 2 Humble Hawksbill **|** Galactic Geochelone **|** Foxy Fitzroy \n* PyZMQ 16.0, 17.1 and 19.0\n* Python-SocketIO \u003e= 5.0.4\n* Eclipse-Zenoh \u003e= 1.0.0\n* Paho-MQTT \u003e= 2.0 *(Hard-coded to v2 in Wrapyfi and not compatible with v1)*\n\n\n## Installation\n\nYou can install Wrapyfi with **pip** or from source.\n\n### Pip\n\nTo install all the necessary components for the majority of common uses of Wrapyfi (e.g., NativeObject, Image, Audio, etc.) using **pip**, this process installs both Wrapyfi and its dependencies, like NumPy and OpenCV (`opencv-contrib-python`, `opencv-headless`, and `opencv-python` are supported), that are essential for various workloads, along with ZeroMQ being the default middleware. This option is the best for users running Wrapyfi out of the box in a newly created environment (without any middleware installed beforehand), installing `numpy`, `opencv-contrib-python`, and `pyzmq`:\n\n```\npip install wrapyfi[all]\n```\n\n*Note that most plugins require additional dependencies and should be installed separately.*\n \nor when installing Wrapyfi on a *server* (headless) including `numpy`, `opencv-python-headless`, and `pyzmq`:\n\n```\npip install wrapyfi[headless]\n```\n\nOther middleware such as ROS are environment-specific and require dependencies that cannot be installed using pip. \nWrapyfi **could** and should be used within such environments with minimal requirements to avoid conflicts with existing NumPy and OpenCV packages:\n\n```\npip install wrapyfi\n```\n\n### Source (Pip)\n\nClone this repository:\n\n```\ngit clone --recursive https://github.com/fabawi/wrapyfi.git\ncd wrapyfi\n```\n\nYou can choose to install minimal dependencies including `numpy`, `opencv-contrib-python`, and `pyzmq`, for running a basic Wrapyfi script:\n\n```\npip install .[all]\n```\n\nor when installing Wrapyfi on a *server* (headless) including `numpy`, `opencv-python-headless`, and `pyzmq`:\n\n```\npip install .[headless]\n```\n\nor when installing Wrapyfi to work with websockets (headless) including `numpy`, `opencv-python-headless`, and `python-socketio`:\n\n```\npip install .[headless_websockets]\n```\n\nor when installing Wrapyfi to work with Zenoh (headless) including `numpy`, `opencv-python-headless`, and `eclipse-zenoh`:\n\n```\npip install .[headless_zenoh]\n```\n\nor when installing Wrapyfi to work with MQTT (headless) including `numpy`, `opencv-python-headless`, and `paho-mqtt`:\n\n```\npip install .[headless_mqtt]\n```\n\nor install Wrapyfi *without* NumPy, OpenCV, ZeroMQ, Websocket, Zenoh, and MQTT:\n\n```\npip install .\n```\n\n### Docker\n\nWrapyfi Docker images can be pulled/installed directly from the [modularml/wrapyfi](https://hub.docker.com/repository/docker/modularml/wrapyfi) repository on the Docker Hub. Dockerfiles for all supported environments can be built as well by following the [Wrapyfi Docker instructions](https://github.com/fabawi/wrapyfi/tree/main/dockerfiles/README.md?rank=0).\n\n\n## Usage\n\nWrapyfi supports two patterns of communication: \n* **Publisher-Subscriber** (PUB/SUB): A publisher sends data to a subscriber accepting arguments and executing methods on the publisher's end.\ne.g., with YARP\n\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003e Without Wrapyfi \u003c/th\u003e\n\u003cth\u003e With Wrapyfi \u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\u003csub style=\"white-space: pre-wrap;\"\u003e\n\n```python\n# Just your usual Python class\n\n\nclass HelloWorld(object):\n    \n    \n    \n    \n    def send_message(self):\n        msg = input(\"Type your message: \")\n        obj = {\"message\": msg}\n        return obj,\n\n\nhello_world = HelloWorld()\n\n\n\n    \n\nwhile True:\n    my_message, = hello_world.send_message()\n    print(my_message)\n```\n    \n\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd\u003e\n\u003csub style=\"white-space: pre-wrap;\"\u003e\n\n```python\nfrom wrapyfi.connect.wrapper import MiddlewareCommunicator\n\n\nclass HelloWorld(MiddlewareCommunicator):\n    @MiddlewareCommunicator.register(\"NativeObject\", \"yarp\",\n                                     \"HelloWorld\", \n                                     \"/hello/my_message\", \n                                     carrier=\"\", should_wait=True)\n    def send_message(self):\n        msg = input(\"Type your message: \")\n        obj = {\"message\": msg}\n        return obj,\n\n\nhello_world = HelloWorld()\n\nLISTEN = True\nmode = \"listen\" if LISTEN else \"publish\"\nhello_world.activate_communication(hello_world.send_message, mode=mode)\n\nwhile True:\n    my_message, = hello_world.send_message()\n    print(my_message)\n```\n    \n\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nRun `yarpserver` from the command line. Now execute the Python script above (with Wrapyfi) twice, setting one instance to `LISTEN = False` and another to `LISTEN = True`. You can now type and return a message on the publisher's terminal and preview it within the listener's\n\n\n* **Request-Reply** (REQ/REP): A requester sends a request to a responder, which responds to the request in a synchronous manner.\ne.g., with ROS\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth\u003e Without Wrapyfi \u003c/th\u003e\n\u003cth\u003e With Wrapyfi \u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\u003csub style=\"white-space: pre-wrap;\"\u003e\n\n```python\n# Just your usual Python class\n\n\nclass HelloWorld(object):\n    \n    \n    \n    \n    def send_message(self, a, b):\n        msg = input(\"Type your message: \")\n        obj = {\"message\": msg, \n               \"a\": a, \"b\": b, \"sum\": a + b}\n        return obj,\n\n\nhello_world = HelloWorld()\n\n\n\n    \n\nwhile True:\n    my_message, = hello_world.send_message(a=1, \n                                           b=2)\n    print(my_message)\n```\n    \n\u003c/sub\u003e\n\u003c/td\u003e\n\u003ctd\u003e\n\u003csub style=\"white-space: pre-wrap;\"\u003e\n\n```python\nfrom wrapyfi.connect.wrapper import MiddlewareCommunicator\n\n\nclass HelloWorld(MiddlewareCommunicator):\n    @MiddlewareCommunicator.register(\"NativeObject\", \"ros\",\n                                     \"HelloWorld\", \n                                     \"/hello/my_message\", \n                                     carrier=\"\", should_wait=True)\n    def send_message(self, a, b):\n        msg = input(\"Type your message: \")\n        obj = {\"message\": msg, \n               \"a\": a, \"b\": b, \"sum\": a + b}\n        return obj,\n\n\nhello_world = HelloWorld()\n\nLISTEN = True\nmode = \"request\" if LISTEN else \"reply\"\nhello_world.activate_communication(hello_world.send_message, mode=mode)\n\nwhile True:\n    my_message, = hello_world.send_message(a=1 if LISTEN else None, \n                                           b=2 if LISTEN else None)\n    print(my_message)\n```\n    \n\u003c/sub\u003e\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n\n\n\nRun `roscore` from the command line. Now execute the Python script above (with Wrapyfi) twice, setting one instance to `LISTEN = False` and another to `LISTEN = True`. You can now type and return a message on server's terminal and preview it within the client's. \nNote that the server's command line will not show the message until the client's command line has been used to send a request. The arguments are passed from the client to the server and the server's response is passed back to the client.\n\nFor more examples of usage, refer to the [user guide](docs/usage.md). Run scripts in the [examples directory](https://github.com/fabawi/wrapyfi/tree/main/examples) for trying out Wrapyfi. \n\n# Supported Formats\n\n## Serializers\n- [x] **JSON**\n- [ ] **msgpack**\n- [ ] **protobuf**\n\n## Data Structures\n\nSupported Objects by the `NativeObject` type include:\n\n- [x] [**NumPy Array | Generic**](https://numpy.org/doc/1.23/)\n- [x] [**PyTorch Tensor**](https://pytorch.org/docs/stable/index.html)\n- [x] [**TensorFlow 2 Tensor**](https://www.tensorflow.org/api_docs/python/tf)\n- [x] [**JAX Tensor**](https://jax.readthedocs.io/en/latest/)\n- [x] [**Trax Array**](https://trax-ml.readthedocs.io/en/latest/)\n- [x] [**MXNet Tensor**](https://mxnet.apache.org/versions/1.9.1/api/python.html)\n- [x] [**PaddlePaddle Tensor**](https://www.paddlepaddle.org.cn/documentation/docs/en/guides/index_en.html) [![limitation](https://custom-icon-badges.demolab.com/badge/version%20\u003c%202.6.0-red.svg?logo=dependency\u0026logoColor=white)](https://github.com/PaddlePaddle/Paddle/issues/62967 \"issue link\")\n- [x] [**pandas DataFrame | Series**](https://pandas.pydata.org/docs/)\n- [x] [**Pillow Image**](https://pillow.readthedocs.io/en/stable/reference/Image.html)\n- [x] [**PyArrow Array**](https://arrow.apache.org/docs/python/index.html)\n- [x] [**CuPy Array**](https://docs.cupy.dev/en/stable/index.html)\n- [x] [**Xarray DataArray | Dataset**](http://xarray.pydata.org/en/stable/)\n- [x] [**Dask Array | DataFrame**](https://www.dask.org/get-started)\n- [x] [**Zarr Array | Group**](https://zarr.readthedocs.io/en/stable/)\n- [x] [**Pint Quantity**](https://pint.readthedocs.io/en/stable/)\n- [ ] [**Gmpy 2 MPZ**](https://gmpy2.readthedocs.io/en/latest/) [![planned](https://custom-icon-badges.demolab.com/badge/planned%20for%20Wrapyfi%20v1.0-%23C2E0C6.svg?logo=hourglass\u0026logoColor=white)](https://github.com/modular-ml/wrapyfi/issues/99 \"planned link\")\n- [ ] [**MLX Tensor**](https://ml-explore.github.io/mlx/build/html/index.html) [![planned](https://custom-icon-badges.demolab.com/badge/planned%20for%20Wrapyfi%20v1.0-%23C2E0C6.svg?logo=hourglass\u0026logoColor=white)](https://github.com/modular-ml/wrapyfi/issues/99 \"planned link\")\n\n\n## Image\n\nSupported Objects by the `Image` type include:\n\n- [x] **NumPy Array** [*supports many libraries including [scikit-image](https://scikit-image.org/), [imageio](https://imageio.readthedocs.io/en/stable/), [Open CV](https://opencv.org/), [imutils](https://github.com/PyImageSearch/imutils), [matplotlib.image](https://matplotlib.org/stable/api/image_api.html), and [Mahotas](https://mahotas.readthedocs.io/en/latest/)*]\n\n\n## Sound \n\nSupported Objects by the `AudioChunk` type include:\n\n- [x] Tuple(**NumPy Array**, int) [*supports the [sounddevice](https://python-sounddevice.readthedocs.io/en/0.4.5/) format*]\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodular-ml%2Fwrapyfi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmodular-ml%2Fwrapyfi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmodular-ml%2Fwrapyfi/lists"}