{"id":16778689,"url":"https://github.com/binary-husky/hmp2g","last_synced_at":"2025-07-30T17:12:38.306Z","repository":{"id":37362442,"uuid":"438679191","full_name":"binary-husky/hmp2g","owner":"binary-husky","description":"Multiagent Reinforcement Learning Research Project","archived":false,"fork":false,"pushed_at":"2024-10-17T08:24:58.000Z","size":147490,"stargazers_count":193,"open_issues_count":10,"forks_count":36,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-28T08:07:31.870Z","etag":null,"topics":["machine-learning","reinforcement-learning-algorithms","simulation"],"latest_commit_sha":null,"homepage":"","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/binary-husky.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2021-12-15T15:29:06.000Z","updated_at":"2025-03-25T14:30:23.000Z","dependencies_parsed_at":"2024-10-19T08:25:23.196Z","dependency_job_id":null,"html_url":"https://github.com/binary-husky/hmp2g","commit_stats":{"total_commits":532,"total_committers":5,"mean_commits":106.4,"dds":0.09398496240601506,"last_synced_commit":"d4eb3b5fe1e7652c50942b4abdee09ce3caf49be"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binary-husky%2Fhmp2g","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binary-husky%2Fhmp2g/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binary-husky%2Fhmp2g/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/binary-husky%2Fhmp2g/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/binary-husky","download_url":"https://codeload.github.com/binary-husky/hmp2g/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247149500,"owners_count":20891954,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["machine-learning","reinforcement-learning-algorithms","simulation"],"created_at":"2024-10-13T07:28:27.382Z","updated_at":"2025-04-04T09:06:58.597Z","avatar_url":"https://github.com/binary-husky.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# HMAP：Hybrid Multi-Agent Playground\n[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/binary-husky/hmp2g/issues)\n[![Docker Pulls](https://img.shields.io/docker/pulls/fuqingxu/hmp.svg?maxAge=2592000)](https://registry.hub.docker.com/r/fuqingxu/hmp)\n## Introduction\nThe Hybrid Multi-Agent Playground (HMAP) is an experimental framework designed for Reinforcement Learning (RL) researchers.\nUnlike any other framework which only isolates the TASKs from the framework, \nHMP also separates the ALGORITHMs from the framework to achieve excellent compatibility.\n\nAny algorithm, from the most straightforward script-AI to sophisticated RL learner,\nis abstracted into a module inside ./ALGORITHM/*.\n\nWe also put effect to interface all kinds of multi-agent environments,\nincluding gym, SMAC, air combat, et.al. These can be found in \n./MISSION/*.\n\nOther frameworks, such as pymarl2, mappo, can interface with HMP as well.\nThe entire HMP can disguise as an RL environment in pymarl2.\nWe make it happen by building a particular ALGORITHM module, which\nruns pymarl2 in a subprocess. This work is ongoing. Currently, HMP can link to a modified version of pymarl2. The source code of these third-party frameworks are located in ./THIRDPARTY/*.\n\n**Please ```star``` the root Github project. Your encouragement is extremely important to us as researchers: ```https://github.com/binary-husky/hmp2g```**\n\nArchived code used in our AAAI papers: ```https://github.com/binary-husky/hmp2g/tree/aaai-conc```.\n\n\n## Content\n\n1. [Introduction](#introduction)\n\n1. [Demo](#demo)\n1. [Structure of HMP](#structure-of-hmp)\n1. [Visualization of HMP](#vhmap-visualization-of-hmp)\n1. [Dependency](#dependency)\n1. [Quick Start](#quick-start)\n1. [How to Add a New Environment in HMP](#how-to-add-a-new-environment-in-hmp)\n1. [Execution Pool](#execution-pool)\n1. [Project Roadmap](#project-roadmap)\n1. [Other READMES](#other-readmes)\n1. [Papers Supported by HMP](#papers-supported-by-hmp)\n\n\n\n\n\n\n## Demo\nThis resp is frequently updating.\n```sh\n# to clone this resp\ngit clone https://github.com/binary-husky/hmp2g.git\n```\nIf any unexpected problem is encountered, \nplease clean the temp files by running\n ```sh\n # update code version\n git checkout master --force \u0026\u0026 git pull --force \u0026\u0026 git clean -xfd\n ```\n If you'd like to use pymarl2 algorithm, please download submodules first:\n ```\n # download submodules\n git submodule update --init\n git submodule foreach -q --recursive 'branch=\"$(git config -f $toplevel/.gitmodules submodule.$name.branch)\"; git switch $branch'\n ```\n\nIf the problem does not go away, do not hesitate to [contact us](#contact-us) or send an issue!\n\n### 1. Unreal-Engine-Based Simulation\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"DOCS/examples/uhmap/uhmp_demo.gif\" width=\"300\" \u003e\n\u003c/div\u003e\n\n\n``` sh\ngit pull \u0026\u0026 python main.py -c RESULT/uhmap_hete10vs10/render_result.jsonc\n```\nTo visualize:\n- (Option 1) Run trained model on Windows, switch ```\"render\": false``` option to ```true```.\n- (Option 2) Link to a headless simulation remotely. Download Windows client [UHMP.exe](./DOCS/use_unreal_hmap.md), run it with ```./UHMP.exe -OpenLevel=Ip:Port``` (Port is random, see program terminal output).\n\n\nRedirection to another MARL project: Building high efficient multiagent environment with Unreal Engine! Please refer to resp ```https://github.com/binary-husky/unreal-hmp```.\n\n\n\n### 2. DCA: Decentralized Collective assault\n#### Web Demo of DCA (AAAI Paper Version)\n\n```\nhttp://cloud.fuqingxu.top:11601/\n```\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"RESULT/test-50+50/test50.gif\" width=\"300\" \u003e\n\u003c/div\u003e\n\n\n```\ngit pull \u0026\u0026 python main.py -c RESULT/test-50+50/test-50+50.jsonc --skip\ngit pull \u0026\u0026 python main.py -c RESULT/test-100+100/test-100+100.jsonc --skip\n```\n\n#### (Improved Version, more Difficult than AAAI Paper Version)\n\n```\ngit pull \u0026\u0026 python main.py -c RESULT/50RL-55opp/test-50RL-55opp.jsonc\n(Also see https://www.bilibili.com/video/BV1vF411M7N9/)\n```\n\n### 3. Anti-Invasion Interception\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"RESULT/test-aii515/aii.jpg\" width=\"300\" \u003e\n\u003c/div\u003e\n\n```\ngit pull \u0026\u0026 python main.py -c RESULT/test-aii515/test-aii515.jsonc --skip \n```\n\n### 4. Hazardous Cargo Transport\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"RESULT/test-cargo50/cargo50.jpg\" width=\"300\" \u003e\n\u003c/div\u003e\n\n```\ngit pull \u0026\u0026 python main.py -c RESULT/test-cargo50/test-cargo50.jsonc --skip\n```\n\n\n\n\n\n## Structure of HMP\n### 1. HMP's General Framework Structure\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"VISUALIZE/md_imgs/simple_framework.jpg\" width=\"500\" \u003e\n\u003c/div\u003e\n\n### 2. HMP's Config System (How to experiment)\nHMP aims to optimize the parameter control experience as a framework for researchers. \nOne configuration file is all that is needed for the config insertion.\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"VISUALIZE/md_imgs/HMP_CONF.svg\" width=\"500\" \u003e\n\u003c/div\u003e\n\n### \u003c1\u003e How to Config:\nWe discard the command line method to control parameters; instead, the commented-JSON (JSONC) is used for experiment configuration. To run an experiment, just type:\n```\npython main.py --cfg Json_Experiment_Config_File.jsonc\n```\n### \u003c2\u003e How to Add and Override A Parameter:\nParameters assigned and overridden in the JSON file are NOT passed via init functions layer by layer as other frameworks usually do; instead, at the start of the ```main.py```, a special program defined in ```UTIL/config_args.py``` will directly INJECT the overridden parameters to the desired location.\n\nWe give an example to demonstrate how simple it is to add new parameters. \nSuppose we want to introduce HP into DCA, then an initial HP, let say ```HP_MAX``` need to be defined as a parameter.\nThen:\n- Open ```MISSION/collective_assault/collective_assault_parallel_run.py```. (You can create new file if you wish so.)\n- (Step1, Define It !) In ```ScenarioConfig``` class add a new line writing ```HP_MAX=100```. (You can create another class if you wish so.)\n- (Step2, Use It !) Anywhere you want to use the ```HP_MAX```, first ```from xxx.collective_assault_parallel_run import ScenarioConfig```,\nthen use the parameter by ```init_hp_of_some_agent = ScenarioConfig.HP_MAX```.\n- (Step3, Change It !) To override the default value ```HP_MAX=100``` in JSON (e.g., in ```./example_dca.jsonc```), \nyou just need to add a line in the field ```\"MISSION.dca.collective_assault_parallel_run.py-\u003eScenarioConfig\"```,\nfor example:\n```Jsonc\n{\n    ...... (other field)\n    \"MISSION.dca.collective_assault_parallel_run.py-\u003eScenarioConfig\": {\n        \"HP_MAX\": 222,  # \u003c------ add this!\n        \"random_jam_prob\": 0.05,    # (other config override in ScenarioConfig)\n        ......\n    },\n    ...... (other field)\n}\n```\n- You need not to worry about the format. You can write ```{\"HP_MAX\": 222}``` or  ```{\"HP_MAX\": \"222\"}```. If the value is a bool, you can write ```{\"Key1\":true,\"Key2\":false}``` or ```{\"Key1\":\"True\", \"Key2\":\"False\"}```. **Both are OK**.\n- Be aware, in Step2, ```HP_MAX=100``` defines ```HP_MAX``` as Int. If you want a float, please write ```HP_MAX=100.0```. Overriding an Int with float will trigger an assert error.\n- All Done! Say bye-bye to annoying args passing and kwargs passing!\n\n### \u003c3\u003e How to Deal with Parameter Dependency:\nOur framework can fully support complicated parameter dependency. \nSome parameters are sometimes just Chained together. \nChanging one of them can lead to the change of another. \nE.g., Let the number of parallel envs (```num_threads```) be 32, \nand we test the performance of every ```test_interval``` episode. We wish to have relate them with ```test_interval``` = 8*```num_threads```, \nmeaning that a test run is shot every 8 rounds of parallel env executions.\nThis function can be satisfied by defining a Chained var structure:\n``` python\nnum_threads = 32  # run N parallel envs,\n# define test interval\ntest_interval = 8*num_threads\n# define the Chains of test interval\ntest_interval_cv = ChainVar(lambda num_threads:8*num_threads, chained_with=['num_threads'])\n# all done! You need to do nothing else!\n```\nAfter this, you can expect the following override (JSON config override) behaviors:\n- Changing Neither in JSON, then both parameters use the default (```num_threads``` = 32, ```test_interval``` = 8*32)\n- Changing only ```num_threads``` in JSON, then ```test_interval``` is also forced to change according to ```test_interval=8*num_threads```.\n- Changing only ```test_interval``` in JSON, the Chain will not work, obey JSON override, nothing has higher priority than an explicit JSON override.\n- Changing both JSON, the Chain will not work, both obey JSON override, and nothing has higher priority than an explicit JSON override.\n\nFor details, please refer to ```config.py``` and ```UTIL/config_args.py```, \nit is straightforward to understand once you read an example of this.\n\n### \u003c4\u003e How to Recover Configuration's Auto Backup:\nWhen the experiment starts, the Json config override will be stored in ```RESULT/the-experiment-note-you-defined/experiment.json```.\nIf the experiment later produces surprising results,\nyou can consistently reproduce it again using this config backup.\n\n\n### 3. Task Runner\nTask Runner (```task_runner.py```) only has three lines of important code:\n``` python\n# line 1\nactions_list, self.info_runner = self.platform_controller.act(self.info_runner)\n# line 2: \nobs, reward, done, info = self.envs.step(actions_list)\n# line 3: \nself.info_runner = self.update_runner(done, obs, reward, info)\n```\n\n- ```self.platform_controller.act```: Get action, block information access between teams (LINK to ```ARGORITHM```), handle algorithm internal state loopback.\n\u003cimg src=\"VISUALIZE/md_imgs/multi_team.jpg\" width=\"700\" \u003e\n\n- ```self.envs.step```: Multi-thread environment step (LINK to ```MISSION```).\n- ```self.update_runner```: Prepare obs (for decision making) and reward (for driving RL algorithms) for the next step.\n\n\n### 4. The Time Sequence of HMP\nIn general, the HMP task runner can operate two ways:\n- (Deprecated due) self.align_episode = False: threads immediately restart at terminal state, threads do not wait for each other\n- self.align_episode = True: threads pause at terminal state, waiting until all threads terminate, then reset. Please refer to [Hmp Time Sequence](./VISUALIZE/md_imgs/hmp2g_timeline.svg). \n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"VISUALIZE/md_imgs/timeline.jpg\" width=\"700\" \u003e\n\u003c/div\u003e\n\n\n## VHMAP, Visualization of HMP\n[VHMAP](./VISUALIZE/README.md) is a visualization component of HMP. \n\n\n\nIt is unfortunate that \nall existing RL environments fail to provide a visual\ninterface satisfying the following useful features:\n\n- Allowing visualizing while training without slowing down the training server. \n- Using as few resources as possible.\n- Friendly to SSH users, faster than RDP and X server, which is notoriously slow.\n- No dependency, even an Android with a browser can access it.\n- Smooth, using the client's CPU and GPU to render instead of the server's.\n- Simple, no verbose lines about lights, buffering, refresh, and bla.bla.bla about which we researchers never care.\n\nVHMAP is just the answer, Features:\n- Python interface simplified to the max\n- Rendering on the client side, automatic frame insertion, and silky smooth frame rates\n- Few server-side dependencies\n- Very low server-side resource consumption\n- Based on ThreeJs, drag and drop support, mobile touch screen support\n- Support switching between perspective and projection views\n- Playback support\n- Use zlib to compress data streams, low network bandwidth requirement\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"VISUALIZE/md_imgs/动画9.gif\" width=\"450\" \u003e\n\u003c/div\u003e\n\nInterface functions, operation introduction.\n- Right mouse button to pan, left mouse button to rotate, scroll wheel to zoom\n- Support touch screen. If your laptop or phone has a touch screen\n- Rendering refresh rate is displayed in the upper left corner\n- play fps: how many keyframes per second (less than the rendering refresh rate, then insert frames; greater than the rendering refresh rate, then the excess is invalid)\n- pause: pause\n- next frame: pause and switch the next frame\n- previous frame: pause and switch the previous frame\n- loop to start: play all data, go back to the first frame\n- ppt step: play a frame at a very slow speed. Easy to record the screen, will be stuck for a few seconds after pressing\n- use orthcam: switch the perspective view (object near large and far small)/projection view (similar to what you would use in engineering drawing)\n- P.S. The first time you switch to the projection view, you need to use the mouse wheel to enlarge the screen\n\nMore details of VHMAP can be found in [VHMAP README](./VISUALIZE/README.md).\n\n\n\n##  Dependency\nWe use docker to solve dependency: [SetupDocker](./DOCS/setup_docker.md).\n\nPlease do not run on WindowsOS (low efficiency), \nbut if you have to, \nalso refer to the last part of [SetupDocker](./DOCS/setup_docker.md) for pip requirements list. \n\n\n\n## Quick Start\n\n### 1. Dependency\nWe use docker to solve dependency: \n[SetupDocker](./DOCS/setup_docker.md). \nThis project uses techniques such as shared memory for extreme training efficiency, \nas a cost, \nWindowsOS+GPU training is not well supported (using pipe IO for Windows compat).\n\nFor Windows (Not recommended, please do NOT run under Windows if possible), \nalso refer to the last part of [SetupDocker](./DOCS/setup_docker.md) for pip requirements list. \n\nPlease read [setup_docker.md](./DOCS/setup_docker.md) first, and then set up the container using:\n```bash\n$ docker run -itd   --name  hmp-$USER \\\n--net host \\\n--gpus all \\\n--shm-size=16G \\\nfuqingxu/hmp:latest\n\n# Now inside the HMP container\n$ su hmp # (switch the account Inside the HMP container, password: hmp)\n$ cd ~   # (go to home directory)\n```\n\n\n### 2. AAAI 2022\n### 2.1. All Default: Testing\n```\ngit pull \u0026\u0026 python main.py -c RESULT/test-50+50/test-50+50.jsonc --skip\ngit pull \u0026\u0026 python main.py -c RESULT/test-100+100/test-100+100.jsonc --skip\n```\nWhen the testing starts, open the revealed URL for ```monitoring```. The front end is done by JavaScript and ThreeJS.\n```\n--------------------------------\nJS visualizer online: http://172.18.116.150:aRandomPort\nJS visualizer online (localhost): http://localhost:aRandomPort\n--------------------------------\n```\n### 2.2. All Default: Training\n\n```\ngit pull \u0026\u0026 python main.py -c DOCS/examples/dca/example_dca.jsonc\ngit pull \u0026\u0026 python main.py -c DOCS/examples/dca/train_old_dca.jsonc\n```\n\n\n### 2.3. Change Settings\n\nLaunch with: \n```\npython main.py --cfg xx.json\n```\n\n### 3. IJCNN 2022\n### \n```\ngit pull \u0026\u0026 python main.py -c RESULT/test-aii515/test-aii515.jsonc --skip \ngit pull \u0026\u0026 python main.py -c RESULT/test-cargo50/test-cargo50.jsonc --skip\n```\n\n### 4. Others\n\n```\ngit pull \u0026\u0026 python main.py --cfg RESULT/adca-demo/test.json\ngit pull \u0026\u0026 python main.py --cfg RESULT/basic-ma-40-demo/test.json\n```\n\n\n\n## How to Add a New Environment in HMP\n\nPlease refer to [MISSION README](./MISSION/readme.md) for more details.\n\n\n- Make a new jsonc config file, using 'example.jsonc' as a template\n- mkdir in MISSION, e.g. ./MISSION/bvr_sim, copy src code of the environment inside it.\n- Open ```MISSION/env_router.py```, add the path of environment's init function in ```env_init_function_ref```, \nfor example:\n``` python\nenv_init_function_ref = {\n    \"bvr\": (\"MISSION.bvr_sim.init_env\", \"make_bvr_env\"),\n}   \n# bvr is the final name that HMP recognizes, \n# MISSION.bvr_sim.init_env is a py file, \n# ScenarioConfig is a class\n```\n- Open ```MISSION/env_router.py```, add the path of environment's configuration in ```import_path_ref```\n``` python\nimport_path_ref = {\n    \"bvr\": (\"MISSION.bvr_sim.init_env\", 'ScenarioConfig'),\n}   \n# bvr will be the final name that HMP recognizes, \n# MISSION.bvr_sim.init_env is a py file, \n# make_bvr_env is a function\n```\n- Write your own ScenarioConfig. (refer to ```MISSION.bvr_sim.init_env.ScenarioConfig```, as a template).\n- Write your own env init function. (refer to ```MISSION.bvr_sim.init_env.make_bvr_env```, as a template).\n\n## Execution Pool\nWe designed a parallel execution pool based on shared memory,\nthe most efficient inter-process communication method possible.\nThis parallel pool is only functional on Linux, \ntherefore, \nwhen running on Windows,\nwe will automatically switch to a backup pool using the pipe.\n\n- The efficient execution pool is defined in ```UTIL/shm_pool.pyx```\n- The windows-compatible execution pool is defined in ```UTIL/win_pool.py```\n\nBoth of them is initialized in ```main.py```, and they share the same APIs:\n```\nsmart_pool = SmartPool(...)\n```\n\nFurthermore, the pickle and the reverse-pickle process is slow for large NumPy arrays,\nwe solve this problem by copying raw NumPy memory directly to the shared memory area without pickle \nand significantly improve the data transfer efficiency.\n\nWhen dealing with a large number of parallel environments (100+),\nthe process coordination of OS can slow down even shared-memory communication.\n\nAs a compromise,\nwe design a ```folding``` mechanism to allow a single process to run ```N=fold``` parallel environments to relieve the burden of OS.\nWhen folding is disabled (default disabled), ```fold=1```.\n\nHowever, note that setting ```fold\u003e1``` will not accelerate the parallel FPS (and usually decrease the FPS) for a single experiment,\nbut it allows you to run more experiments simultaneously on the server.\n\n\n## Project Roadmap\nIf you are interested in something, you may continue to read:\n```\n    Handling parallel environment             --\u003e   task_runner.py \u0026 shm_env.py\n\n    The link between teams and diverse algorithms --\u003e   multi_team.py\n\n    Adding new env                            --\u003e   MISSION.env_router.py\n\n    Adding algorithm                          --\u003e   ALGORITHM.example_foundation.py\n\n    Configuring by writing py files           --\u003e   config.py\n\n    Configuring by JSONC                       --\u003e   xx.jsonc\n\n    colorful printing                         --\u003e   colorful.py\n\n    auto pip deployer                         --\u003e   pip_find_missing.py\n\n    efficient parallel execting               --\u003e   shm_pool.pyx\n\n    auto GPU selection                        --\u003e   auto_gpu.py\n\n    logging/plotting bridge            --\u003e   mcom.py \u0026 mcom_rec.py\n\n    experiment batch executor                 --\u003e   mprofile.py\n```\n\n\n\n## Other READMEs\nThis resp is frequently updating.\n\nFor more information on how to use HMP, please check out the README list below, most of other READMEs are located in ./DOCS/*.\n\nHow to change environments(missions): [MISSION README](./MISSION/readme.md)\n\nHow to solve dependency with Docker: [SetupDocker](./DOCS/setup_docker.md) \n\nHow to solve dependency without Docker: [SetupNODocker](./DOCS/setup_no_docker.md) \n\nHow to get Docker with unreal engine: [SetupUEDocker](./DOCS/setup_ue_docker.md)\n\nHow to use third-party framework(pymarl2): [UsePymarl2 ](./DOCS/use_pymarl2.md)\n\nHow to use Unreal-Engine-Based HMP: [UseUHMP](./DOCS/use_unreal_hmap.md)\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinary-husky%2Fhmp2g","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbinary-husky%2Fhmp2g","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinary-husky%2Fhmp2g/lists"}