{"id":16271263,"url":"https://github.com/bobazooba/wgpt","last_synced_at":"2025-10-05T04:31:05.090Z","repository":{"id":207217535,"uuid":"704863393","full_name":"bobazooba/wgpt","owner":"bobazooba","description":"This repository features an example of how to utilize the xllm library. Included is a solution for a common type of assessment given to LLM engineers","archived":false,"fork":false,"pushed_at":"2025-01-23T06:51:32.000Z","size":295,"stargazers_count":8,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-30T07:05:00.418Z","etag":null,"topics":["alpaca","cerebras","chatgpt","deep-learning","deep-neural-networks","deeplearning","falcon","gpt","language-model","large-language-models","llama2","llama2-7b","llm","mistral","mistralai","natural-language-processing","nlp","openai","vicuna","zephyr"],"latest_commit_sha":null,"homepage":"https://github.com/BobaZooba/xllm","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bobazooba.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2023-10-14T10:28:49.000Z","updated_at":"2025-01-23T06:51:43.000Z","dependencies_parsed_at":"2024-07-27T19:06:19.668Z","dependency_job_id":"1c6d0e45-b8ac-4e31-a53d-bf92cbe432ba","html_url":"https://github.com/bobazooba/wgpt","commit_stats":{"total_commits":5,"total_committers":2,"mean_commits":2.5,"dds":"0.19999999999999996","last_synced_commit":"07b3e4d42e93128b4964cbdfe981494a833bf526"},"previous_names":["bobazooba/wgpt"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bobazooba/wgpt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobazooba%2Fwgpt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobazooba%2Fwgpt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobazooba%2Fwgpt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobazooba%2Fwgpt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bobazooba","download_url":"https://codeload.github.com/bobazooba/wgpt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bobazooba%2Fwgpt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278410718,"owners_count":25982359,"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","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["alpaca","cerebras","chatgpt","deep-learning","deep-neural-networks","deeplearning","falcon","gpt","language-model","large-language-models","llama2","llama2-7b","llm","mistral","mistralai","natural-language-processing","nlp","openai","vicuna","zephyr"],"created_at":"2024-10-10T18:13:03.529Z","updated_at":"2025-10-05T04:31:04.719Z","avatar_url":"https://github.com/bobazooba.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WeatherGPT: Generate valid JSON from weather descriptions\n\nThis repository features an example of how to utilize the `xllm` library. Included is a solution for a common type of\nassessment given to LLM engineers. The work, which took 6-7 hours to complete, is representative of actual tasks in the field.\n\n[\u003cimg src=\"https://github.com/BobaZooba/xllm/blob/main/static/images/xllm-badge.png\" alt=\"Powered by X—LLM\" width=\"175\" height=\"32\"/\u003e](https://github.com/BobaZooba/xllm)\n\n# Task\n\nConvert weather description to valid JSON using LLM\n\n### Example\n\n**Description:** Today will be mostly sunny with temperatures reaching 25 degrees. There will be a strong wind blowing\nat 30 km/h. Humidity levels are unknown and there is no precipitation expected.\n\n**JSON**\n\n```json\n{\n  \"weather\": \"sunny\",\n  \"temperature\": 25,\n  \"wind_speed\": 30.0,\n  \"humidity\": null,\n  \"precipitation\": null,\n  \"visibility\": \"good\",\n  \"air_quality\": null,\n  \"real_feel_temperature\": null\n}\n```\n\n# Installation\n\nRun in terminal:\n\n```bash\npip install -e .\n```\n\n## Environment\n\nPython3.8+, CUDA 11.8\n\n**Suggested docker:** huggingface/transformers-pytorch-gpu:latest\n\nAll entry points at **Makefile**\n\n# Implementation\n\n- Generate data\n  - ChatGPT with few-shot variable examples\n- Train model\n  - QLoRA\n  - DeepSpeed Stage 2\n  - 4 bit quantization\n  - Gradient checkpointing\n  - Mistal AI 7B\n- Evaluate\n  - Output can be parsed\n  - ChatGPT labeling\n\n# Reproduce\n\n1. Install requirements\n\n```sh\nmake install\n```\n\n2. Make **.env** and fill it with your values (please take a look at _.env.template_)\n\n3. _[Optional]_ Generate data\n\n```sh\nmake generate-data\n```\n\nAlso example data is provided in _data_ folder\n\n4. Prepare data and model\n\n```sh\nmake prepare\n```\n\n5. Train the model\n\n```sh\nmake train\n```\n\nOr train with DeepSpeed (if you have multiple GPUs, please specify `CUDA_VISIBLE_DEVICES` to use only one)\n\n```sh\nmake train-deepspeed\n```\n\n6. Fuse LoRA weights\n\n```sh\nmake fuse\n```\n\n7. Evaluate\n\n```sh\nmake evaluate\n```\n\n# Data generation\n\n### Why generated?\n\n- ChatGPT was chosen for data collection because I couldn't find similar datasets and because this method scales to\n  other domains and many companies will need to do this in one way or another\n- Previously, NLP engineers suffered from the lack of datasets, but now they can be generated and this will serve as a\n  great starting point for problem-solving\n- The cost of compiling the initial dataset has decreased from thousands of dollars to a few bucks\n\n## Prompt\n\nPlease also check `wgpt/core/prompts.py`\n\n### Example\n\n```txt\nYour task is to create diverse examples where a free-form description of weather is translated into a JSON file format.\nEach description should be between 2 to 5 sentences long with as much diversity as possible. Feel free to omit some fields, add new information, or write in a variety of styles.\nThe JSON format requires the following fields: weather (str), temperature (int), wind_speed (float), humidity (float), precipitation (str), visibility (str), air_quality (str), and real_feel_temperature (int). If any value is unknown, use null.\nThe \"temperature\" and \"real_feel_temperature\" should be in degrees, wind_speed should be in kilometers per hour, and \"humidity\" is in percentage. The fields \"weather\", \"precipitation\", \"visibility\" should be single word descriptions.\nThe format of your answer should be: 1. Input: ...\nOutput: ...\n2. Input: ...\nOutput: ...\nExamples:\n1. Input: The skies are clear with a temperature of about 25 degrees. The wind is blowing gently at around 7kph. Visibility is high and the air is quite dry with a humidity around 30%. There's no precipitation. Feels like it's exactly 25 degrees. The air quality is very good today.\nOutput: {\"weather\": \"clear\", \"temperature\": 25, \"wind_speed\": 7.0, \"humidity\": 30.0, \"precipitation\": \"none\", \"visibility\": \"high\", \"air_quality\": \"good\", \"real_feel_temperature\": 25}\n2. Input: It's snowing outside and the temperature is -5 degrees. There's a strong wind blowing at 25kph. Visibility is very low because of the snow. Humidity is around 80%. Air quality is moderate today. The real feel is much lower at -10 degrees due to wind chill.\nOutput: {\"weather\": \"snow\", \"temperature\": -5, \"wind_speed\": 25.0, \"humidity\": 80.0, \"precipitation\": \"snow\", \"visibility\": \"low\", \"air_quality\": \"moderate\", \"real_feel_temperature\": -10}\n3. Input: Expect a cloudy evening with a temperature of about 18 degrees. There is a slight chance of light showers, and the wind is gentle at 5 km/h.\nOutput: {\"weather\": \"cloudy\", \"temperature\": 18, \"wind_speed\": 5.0, \"humidity\": null, \"precipitation\": \"light\", \"visibility\": \"good\", \"air_quality\": null, \"real_feel_temperature\": null}\nYou need to create a dataset where plain text weather descriptions are converted into valid JSON files. Provide {num_samples} diverse samples similar to the example given.\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eDetailed explanation\u003c/summary\u003e\n\n#### Task\n\n  ```txt\n  Your task is to create diverse examples where a free-form description of weather is translated into a JSON file format.\n  ```\n\n#### Description requirements\n\n  ```txt\n  Each description should be between 2 to 5 sentences long with as much diversity as possible. Feel free to omit some fields, add new information, or write in a variety of styles.\n  ```\n\n#### JSON and fields requirements\n\n  ```txt\n  The JSON format requires the following fields: weather (str), temperature (int), wind_speed (float), humidity (float), precipitation (str), visibility (str), air_quality (str), and real_feel_temperature (int). If any value is unknown, use null.\n\n  The \"temperature\" and \"real_feel_temperature\" should be in degrees, wind_speed should be in kilometers per hour, and \"humidity\" is in percentage. The fields \"weather\", \"precipitation\", \"visibility\" should be single word descriptions.\n```\n\n#### Format of response\n\n```txt\n  The format of your answer should be:\n  1. Input: ...\n  Output: ...\n  2. Input: ...\n  Output: ...\n  ```\n\n#### Few-shot examples\n\nRandomly selected from 3 to 5 of the pre-prepared. It is necessary to provide variety and explain the task.\n\n  ```txt\n  Examples:\n1. Input: The skies are clear with a temperature of about 25 degrees. The wind is blowing gently at around 7kph. Visibility is high and the air is quite dry with a humidity around 30%. There's no precipitation. Feels like it's exactly 25 degrees. The air quality is very good today.\nOutput: {\"weather\": \"clear\", \"temperature\": 25, \"wind_speed\": 7.0, \"humidity\": 30.0, \"precipitation\": \"none\", \"visibility\": \"high\", \"air_quality\": \"good\", \"real_feel_temperature\": 25}\n2. Input: It's snowing outside and the temperature is -5 degrees. There's a strong wind blowing at 25kph. Visibility is very low because of the snow. Humidity is around 80%. Air quality is moderate today. The real feel is much lower at -10 degrees due to wind chill.\nOutput: {\"weather\": \"snow\", \"temperature\": -5, \"wind_speed\": 25.0, \"humidity\": 80.0, \"precipitation\": \"snow\", \"visibility\": \"low\", \"air_quality\": \"moderate\", \"real_feel_temperature\": -10}\n3. Input: Expect a cloudy evening with a temperature of about 18 degrees. There is a slight chance of light showers, and the wind is gentle at 5 km/h.\nOutput: {\"weather\": \"cloudy\", \"temperature\": 18, \"wind_speed\": 5.0, \"humidity\": null, \"precipitation\": \"light\", \"visibility\": \"good\", \"air_quality\": null, \"real_feel_temperature\": null}\n  ```\n\n#### Direct call to action\n\nAlso, indicating the number of desired examples\n\n  ```txt\n  You need to create a dataset where plain text weather descriptions are converted into valid JSON files. Provide {num_samples} diverse samples similar to the example given.\n  ```\n\n\u003c/details\u003e\n\n### Example of output\n\n```txt\n1. Input: The sun is shining brightly with a temperature reaching a scorching 38 degrees. There is a moderate breeze blowing at a speed of 15kph. Visibility is clear with no obstructions. Humidity is quite low at around 20%. No precipitation is expected. The real feel temperature is similar to the actual temperature.\nOutput: {\"weather\": \"sunny\", \"temperature\": 38, \"wind_speed\": 15.0, \"humidity\": 20.0, \"precipitation\": \"none\", \"visibility\": \"clear\", \"air_quality\": null, \"real_feel_temperature\": 38}\n2. Input: It's a hot and humid day with a temperature of 32 degrees. There is no wind present and the air is quite heavy. Visibility is reduced due to haze. Humidity is extremely high at around 90%. No precipitation is predicted. The real feel temperature is slightly higher at 34 degrees.\nOutput: {\"weather\": null, \"temperature\": 32, \"wind_speed\": null, \"humidity\": 90.0, \"precipitation\": null, \"visibility\": \"reduced\", \"air_quality\": null, \"real_feel_temperature\": 34}\n3. Input: The weather today is cloudy with a temperature of 22 degrees. A light breeze is blowing at 10kph. Visibility is good and there is no precipitation expected. Humidity is moderate at around 50%. The real feel temperature is the same as the actual temperature.\nOutput: {\"weather\": \"cloudy\", \"temperature\": 22, \"wind_speed\": 10.0, \"humidity\": 50.0, \"precipitation\": \"none\", \"visibility\": \"good\", \"air_quality\": null, \"real_feel_temperature\": 22}\n4. Input: It's a gloomy day with overcast skies. The temperature is a chilly 8 degrees. Strong winds are howling at 40kph. Visibility is reduced due to fog. Humidity is high at 85%. Light rain is expected. The real feel temperature is lower at 5 degrees due to wind chill.\nOutput: {\"weather\": \"overcast\", \"temperature\": 8, \"wind_speed\": 40.0, \"humidity\": 85.0, \"precipitation\": \"rain\", \"visibility\": \"reduced\", \"air_quality\": null, \"real_feel_temperature\": 5}\n5. Input: Enjoy a beautiful spring day with clear blue skies and a temperature of 20 degrees. A gentle breeze is rustling the leaves at 12kph. Visibility is excellent with no obstructions. Humidity is moderate at 55%. No precipitation is expected. The real feel temperature matches the actual temperature.\nOutput: {\"weather\": \"clear\", \"temperature\": 20, \"wind_speed\": 12.0, \"humidity\": 55.0, \"precipitation\": \"none\", \"visibility\": \"excellent\", \"air_quality\": null, \"real_feel_temperature\": 20}\n```\n\n## Results of data generation\n\n- There were 5848 examples generated for training (including the validation set), which took about 10 minutes\n- The ChatGPT model was used because it is 30 times cheaper and much faster. In real projects, I would use ChatGPT,\n  GPT4, as well as open models, to obtain as diverse a dataset as possible\n- The examples turned out to be quite lively and met the requirements of the task\n\n# Training\n\n- Model: [Mistral-7B-v0.1](https://huggingface.co/mistralai/Mistral-7B-v0.1)\n- Boilerplate (QLoRA, DeepSpeed Stage 2, 4 bit quantization, Gradient\n  checkpointing): [xllm](https://github.com/BobaZooba/xllm)\n\n`xllm` is a user-friendly library that streamlines training optimization, so you can focus on enhancing your models and\ndata. Equipped with cutting-edge training techniques, `xllm` is engineered for efficiency by engineers who understand\nyour needs.\n\n[\u003cimg src=\"https://github.com/BobaZooba/xllm/blob/main/static/images/xllm-badge.png\" alt=\"Powered by X—LLM\" width=\"175\" height=\"32\"/\u003e](https://github.com/BobaZooba/xllm)\n\n### Methods\n\n- **QLoRA (and 4 bit bnb quantization)**. The preferred method of fine-tuning, as it usually ensures a higher quality\n  than full fine-tuning due to effective management of catastrophic forgetting. And of course, it optimizes the memory\n  utilized during training\n  - I use LoRA for all linear layers except lm_head and embeddings\n    - The original paper does not investigate which layers are better to apply. Please\n      check [AdaLoRA paper](https://arxiv.org/pdf/2303.10512.pdf)\n  - I also use a fairly high rank for low-rank optimization: 64 (alpha is 32)\n- **DeepSpeed Stage 2 (with CPU offloading)**. I'm using Deepspeed for training on multiple GPUs. Stage 2 was used\n  because there are observed issues with the use of Stage 3 and quantized models\n- **Gradient Checkpointing**. Very strong optimization of used memory at the expense of slowing down training\n\n### `xllm` details\n\nIn the xllm library, there are several important steps: prepare, train, fuse, quantize\n\n- **Prepare**. The data preprocessing and model download step has been separated to avoid doing it on each of the\n  processes in distributed learning mode\n- **Train**. Training the model and saving checkpoints. I save checkpoints in HuggingFace Hub. Since I am training\n  through LoRA, those weights are specifically saved.\n- **Fuse**. Fusing LoRA weights with the backbone model and push it to HF Hub\n- _[Optional]_ **Quantize**. GPTQ quantization of the model\n\n### Task details\n\nI only calculated the loss for the json part, didn't calculate it for the description\n\n\u003cimg src=\"https://github.com/BobaZooba/wgpt/blob/main/images/completion_scheme.jpg\" alt=\"Completion scheme\"/\u003e\n\n### Results of the training\n\n- [LoRA weights](https://huggingface.co/BobaZooba/WGPT-LoRA)\n- [Fused model](https://huggingface.co/BobaZooba/WGPT)\n- [W\u0026B link](https://api.wandb.ai/links/bobazooba/8v7pqflf)\n\n\u003cimg src=\"https://github.com/BobaZooba/wgpt/blob/main/images/loss_curve.jpg\" alt=\"Loss curve\"/\u003e\n\n# Evaluation\n\n## Metrics\n\n### Why no BLEU / ROUGE / etc?\n\nI have been evaluating generative models for several years and believe that currently using n-gram methods to evaluate\ngenerative models is an extremely poor practice. BertScore is also not a sufficiently good method. Currently, there are\nonly two good ways to evaluate generative models: human evaluation and emulation of human evaluation (GPT-like\ninstructional models and training of rankers/classifiers on human evaluations).\n\n### Output can be parsed\n\nSimple proxy metric: we try to parse the model's response. We calculate the percentage of responses that we were able to\nparse\n\n### ChatGPT labeling\n\nEmulation of human assessment. ChatGPT is given an instruction and the output of my model. ChatGPT must provide one of\nseveral responses: the correct answer, there are minor inaccuracies, incorrect answer. In real projects, I would use\nonly GPT-4, but it is too expensive.\n\n#### ChatGPT labeling instruction\n\n```txt\nYour task is to validate whether the model has correctly parsed the weather description into JSON. The model was given a free-form weather description in natural language. Its task was to transform this description into valid JSON. Your job: understand whether the model has correctly parsed what was stated in the text, whether it correctly filled in the fields, with the correct values.\nThe JSON format requires the following fields: weather (str), temperature (int), wind_speed (float), humidity (float), precipitation (str), visibility (str), air_quality (str), and real_feel_temperature (int). If any value is unknown, use null.\nThe \"temperature\" and \"real_feel_temperature\" should be in degrees, wind_speed should be in kilometers per hour, and \"humidity\" is in percentage. The fields \"weather\", \"precipitation\", \"visibility\" should be single word descriptions.\nWeather description: {weather_description}\nModel response: {model_response}\nGround truth: {ground_truth}\nYou need to consider whether the model has parsed the answer correctly and give your assessment. The rating options can only be: correct, minor inaccuracies, incorrect.\nFormat of your answer.\nReasoning: ...\nAssessment: ...\n```\n\n## Results\n\nOutput can be parsed: **100%**\n\n### ChatGPT labeling\n\n| Correct | Minor inaccuracies | Incorrect |\n|---------|--------------------|-----------|\n| 48%     | 51%                | 1%        |\n\n# Future works\n\n- Improve evaluation\n  - Need to add a method that compares the JSON response with the generated JSON. We know the types of fields. For\n    numeric fields, you should use MSE, and for text fields, you should use the proximity of text embeddings, having\n    previously selected the model\n- If the quality of the current model is satisfactory, it should be deployed into production (in a quantized version)\n  using TGI at least for a limited number of users.\n- It is crucial to gather real data from production to fine-tune the model. Then these data need to be labeled, train a\n  discriminator model (which would assess the quality of responses), filter the data and further train the model. For\n  this task, I wouldn't apply RL, only the ReST ([link](It is crucial to gather real data from production to fine-tune\n  the model. Then these data need to be labeled, train a discriminator model (which would assess the quality of\n  responses), filter the data and further train the model. For this task, I wouldn't apply RL, only the ReST (link)\n  method, which I would improve. Such actions on labeling and further training should be performed regularly. Ideally,\n  an infrastructure for constant retraining should be developed. The recommended frequency depends on the traffic\n  volumes. Usually, for manual re-learning the frequency is monthly, for automatic – weekly. Also, because we apply\n  labeling, we can track model improvements. This will be particularly useful when the labeling instruction is\n  stabilized. With the help of the discriminator we can adjust the hyperparameters for training and inference, for\n  example, generation parameters. Also, with the discriminator, we can immediately assess several hypotheses from the\n  generative model and deliver only the best one to the user. Currently, this method is not widely used due to the\n  significantly increasing load on the generative model, so I would focus on the further training of the generative\n  model using the discriminator.)) method, which I would improve. Such actions on labeling and further training should\n  be performed regularly. Ideally, an infrastructure for constant retraining should be developed. The recommended\n  frequency depends on the traffic volumes. Usually, for manual re-learning the frequency is monthly, for automatic –\n  weekly. Also, because we apply labeling, we can track model improvements. This will be particularly useful when the\n  labeling instruction is stabilized. With the help of the discriminator we can adjust the hyperparameters for training\n  and inference, for example, generation parameters. Also, with the discriminator, we can immediately assess several\n  hypotheses from the generative model and deliver only the best one to the user. Currently, this method is not widely\n  used due to the significantly increasing load on the generative model, so I would focus on the further training of the\n  generative model using the discriminator.\n- If the quality of the current model is not satisfactory, similar steps will need to be taken with synthetic data,\n  deploy it into production, and then perform the same steps with the data from production.\n\n# Useful materials\n\n- [X—LLM Repo](https://github.com/BobaZooba/xllm): main repo of the `xllm` library\n- [Quickstart](https://github.com/BobaZooba/xllm#quickstart-): basics of `xllm`\n- [Examples](https://github.com/BobaZooba/xllm/examples): minimal examples of using `xllm`\n- [Guide](https://github.com/BobaZooba/xllm/blob/main/GUIDE.md): here, we go into detail about everything the library\n  can\n  do\n- [Demo project](https://github.com/BobaZooba/xllm-demo): here's a minimal step-by-step example of how to use X—LLM and\n  fit it\n  into your own project\n- [WeatherGPT](https://github.com/BobaZooba/wgpt): this repository features an example of how to utilize the xllm\n  library. Included is a solution for a common type of assessment given to LLM engineers, who typically earn between\n  $120,000 to $140,000 annually\n- [Shurale](https://github.com/BobaZooba/shurale): project with the finetuned 7B Mistal model\n\n## Tale Quest\n\n`Tale Quest` is my personal project which was built using `xllm` and `Shurale`. It's an interactive text-based game\nin `Telegram` with dynamic AI characters, offering infinite scenarios\n\nYou will get into exciting journeys and complete fascinating quests. Chat\nwith `George Orwell`, `Tech Entrepreneur`, `Young Wizard`, `Noir Detective`, `Femme Fatale` and many more\n\nTry it now: [https://t.me/talequestbot](https://t.me/TaleQuestBot?start=Z2g)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobazooba%2Fwgpt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbobazooba%2Fwgpt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbobazooba%2Fwgpt/lists"}