{"id":13451123,"url":"https://github.com/marella/ctransformers","last_synced_at":"2025-05-14T14:08:27.086Z","repository":{"id":165340319,"uuid":"640683234","full_name":"marella/ctransformers","owner":"marella","description":"Python bindings for the Transformer models implemented in C/C++ using GGML library.","archived":false,"fork":false,"pushed_at":"2024-01-28T07:37:48.000Z","size":65463,"stargazers_count":1864,"open_issues_count":112,"forks_count":141,"subscribers_count":17,"default_branch":"main","last_synced_at":"2025-05-13T10:58:25.508Z","etag":null,"topics":["ai","ctransformers","llm","transformers"],"latest_commit_sha":null,"homepage":"","language":"C","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/marella.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}},"created_at":"2023-05-14T22:06:24.000Z","updated_at":"2025-05-12T13:45:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"e90e9643-291b-4187-90a0-c46d8b68a5f4","html_url":"https://github.com/marella/ctransformers","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marella%2Fctransformers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marella%2Fctransformers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marella%2Fctransformers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marella%2Fctransformers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marella","download_url":"https://codeload.github.com/marella/ctransformers/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254159783,"owners_count":22024564,"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":["ai","ctransformers","llm","transformers"],"created_at":"2024-07-31T07:00:48.504Z","updated_at":"2025-05-14T14:08:27.063Z","avatar_url":"https://github.com/marella.png","language":"C","funding_links":[],"categories":["C","Inference Engine"],"sub_categories":[],"readme":"# [CTransformers](https://github.com/marella/ctransformers) [![PyPI](https://img.shields.io/pypi/v/ctransformers)](https://pypi.org/project/ctransformers/) [![tests](https://github.com/marella/ctransformers/actions/workflows/tests.yml/badge.svg)](https://github.com/marella/ctransformers/actions/workflows/tests.yml) [![build](https://github.com/marella/ctransformers/actions/workflows/build.yml/badge.svg)](https://github.com/marella/ctransformers/actions/workflows/build.yml)\n\nPython bindings for the Transformer models implemented in C/C++ using [GGML](https://github.com/ggerganov/ggml) library.\n\n\u003e Also see [ChatDocs](https://github.com/marella/chatdocs)\n\n- [Supported Models](#supported-models)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [🤗 Transformers](#transformers)\n  - [LangChain](#langchain)\n  - [GPU](#gpu)\n  - [GPTQ](#gptq)\n- [Documentation](#documentation)\n- [License](#license)\n\n## Supported Models\n\n| Models              | Model Type    | CUDA | Metal |\n| :------------------ | ------------- | :--: | :---: |\n| GPT-2               | `gpt2`        |      |       |\n| GPT-J, GPT4All-J    | `gptj`        |      |       |\n| GPT-NeoX, StableLM  | `gpt_neox`    |      |       |\n| Falcon              | `falcon`      |  ✅  |       |\n| LLaMA, LLaMA 2      | `llama`       |  ✅  |  ✅   |\n| MPT                 | `mpt`         |  ✅  |       |\n| StarCoder, StarChat | `gpt_bigcode` |  ✅  |       |\n| Dolly V2            | `dolly-v2`    |      |       |\n| Replit              | `replit`      |      |       |\n\n## Installation\n\n```sh\npip install ctransformers\n```\n\n## Usage\n\nIt provides a unified interface for all models:\n\n```py\nfrom ctransformers import AutoModelForCausalLM\n\nllm = AutoModelForCausalLM.from_pretrained(\"/path/to/ggml-model.bin\", model_type=\"gpt2\")\n\nprint(llm(\"AI is going to\"))\n```\n\n[Run in Google Colab](https://colab.research.google.com/drive/1GMhYMUAv_TyZkpfvUI1NirM8-9mCXQyL)\n\nTo stream the output, set `stream=True`:\n\n```py\nfor text in llm(\"AI is going to\", stream=True):\n    print(text, end=\"\", flush=True)\n```\n\nYou can load models from Hugging Face Hub directly:\n\n```py\nllm = AutoModelForCausalLM.from_pretrained(\"marella/gpt-2-ggml\")\n```\n\nIf a model repo has multiple model files (`.bin` or `.gguf` files), specify a model file using:\n\n```py\nllm = AutoModelForCausalLM.from_pretrained(\"marella/gpt-2-ggml\", model_file=\"ggml-model.bin\")\n```\n\n\u003ca id=\"transformers\"\u003e\u003c/a\u003e\n\n### 🤗 Transformers\n\n\u003e **Note:** This is an experimental feature and may change in the future.\n\nTo use it with 🤗 Transformers, create model and tokenizer using:\n\n```py\nfrom ctransformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel = AutoModelForCausalLM.from_pretrained(\"marella/gpt-2-ggml\", hf=True)\ntokenizer = AutoTokenizer.from_pretrained(model)\n```\n\n[Run in Google Colab](https://colab.research.google.com/drive/1FVSLfTJ2iBbQ1oU2Rqz0MkpJbaB_5Got)\n\nYou can use 🤗 Transformers text generation pipeline:\n\n```py\nfrom transformers import pipeline\n\npipe = pipeline(\"text-generation\", model=model, tokenizer=tokenizer)\nprint(pipe(\"AI is going to\", max_new_tokens=256))\n```\n\nYou can use 🤗 Transformers generation [parameters](https://huggingface.co/docs/transformers/main/en/main_classes/text_generation#transformers.GenerationConfig):\n\n```py\npipe(\"AI is going to\", max_new_tokens=256, do_sample=True, temperature=0.8, repetition_penalty=1.1)\n```\n\nYou can use 🤗 Transformers tokenizers:\n\n```py\nfrom ctransformers import AutoModelForCausalLM\nfrom transformers import AutoTokenizer\n\nmodel = AutoModelForCausalLM.from_pretrained(\"marella/gpt-2-ggml\", hf=True)  # Load model from GGML model repo.\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2\")  # Load tokenizer from original model repo.\n```\n\n### LangChain\n\nIt is integrated into LangChain. See [LangChain docs](https://python.langchain.com/docs/ecosystem/integrations/ctransformers).\n\n### GPU\n\nTo run some of the model layers on GPU, set the `gpu_layers` parameter:\n\n```py\nllm = AutoModelForCausalLM.from_pretrained(\"TheBloke/Llama-2-7B-GGML\", gpu_layers=50)\n```\n\n[Run in Google Colab](https://colab.research.google.com/drive/1Ihn7iPCYiqlTotpkqa1tOhUIpJBrJ1Tp)\n\n#### CUDA\n\nInstall CUDA libraries using:\n\n```sh\npip install ctransformers[cuda]\n```\n\n#### ROCm\n\nTo enable ROCm support, install the `ctransformers` package using:\n\n```sh\nCT_HIPBLAS=1 pip install ctransformers --no-binary ctransformers\n```\n\n#### Metal\n\nTo enable Metal support, install the `ctransformers` package using:\n\n```sh\nCT_METAL=1 pip install ctransformers --no-binary ctransformers\n```\n\n### GPTQ\n\n\u003e **Note:** This is an experimental feature and only LLaMA models are supported using [ExLlama](https://github.com/turboderp/exllama).\n\nInstall additional dependencies using:\n\n```sh\npip install ctransformers[gptq]\n```\n\nLoad a GPTQ model using:\n\n```py\nllm = AutoModelForCausalLM.from_pretrained(\"TheBloke/Llama-2-7B-GPTQ\")\n```\n\n[Run in Google Colab](https://colab.research.google.com/drive/1SzHslJ4CiycMOgrppqecj4VYCWFnyrN0)\n\n\u003e If model name or path doesn't contain the word `gptq` then specify `model_type=\"gptq\"`.\n\nIt can also be used with LangChain. Low-level APIs are not fully supported.\n\n## Documentation\n\n\u003c!-- API_DOCS --\u003e\n\n### Config\n\n| Parameter            | Type        | Description                                                     | Default |\n| :------------------- | :---------- | :-------------------------------------------------------------- | :------ |\n| `top_k`              | `int`       | The top-k value to use for sampling.                            | `40`    |\n| `top_p`              | `float`     | The top-p value to use for sampling.                            | `0.95`  |\n| `temperature`        | `float`     | The temperature to use for sampling.                            | `0.8`   |\n| `repetition_penalty` | `float`     | The repetition penalty to use for sampling.                     | `1.1`   |\n| `last_n_tokens`      | `int`       | The number of last tokens to use for repetition penalty.        | `64`    |\n| `seed`               | `int`       | The seed value to use for sampling tokens.                      | `-1`    |\n| `max_new_tokens`     | `int`       | The maximum number of new tokens to generate.                   | `256`   |\n| `stop`               | `List[str]` | A list of sequences to stop generation when encountered.        | `None`  |\n| `stream`             | `bool`      | Whether to stream the generated text.                           | `False` |\n| `reset`              | `bool`      | Whether to reset the model state before generating text.        | `True`  |\n| `batch_size`         | `int`       | The batch size to use for evaluating tokens in a single prompt. | `8`     |\n| `threads`            | `int`       | The number of threads to use for evaluating tokens.             | `-1`    |\n| `context_length`     | `int`       | The maximum context length to use.                              | `-1`    |\n| `gpu_layers`         | `int`       | The number of layers to run on GPU.                             | `0`     |\n\n\u003e **Note:** Currently only LLaMA, MPT and Falcon models support the `context_length` parameter.\n\n### \u003ckbd\u003eclass\u003c/kbd\u003e `AutoModelForCausalLM`\n\n---\n\n#### \u003ckbd\u003eclassmethod\u003c/kbd\u003e `AutoModelForCausalLM.from_pretrained`\n\n```python\nfrom_pretrained(\n    model_path_or_repo_id: str,\n    model_type: Optional[str] = None,\n    model_file: Optional[str] = None,\n    config: Optional[ctransformers.hub.AutoConfig] = None,\n    lib: Optional[str] = None,\n    local_files_only: bool = False,\n    revision: Optional[str] = None,\n    hf: bool = False,\n    **kwargs\n) → LLM\n```\n\nLoads the language model from a local file or remote repo.\n\n**Args:**\n\n- \u003cb\u003e`model_path_or_repo_id`\u003c/b\u003e: The path to a model file or directory or the name of a Hugging Face Hub model repo.\n- \u003cb\u003e`model_type`\u003c/b\u003e: The model type.\n- \u003cb\u003e`model_file`\u003c/b\u003e: The name of the model file in repo or directory.\n- \u003cb\u003e`config`\u003c/b\u003e: `AutoConfig` object.\n- \u003cb\u003e`lib`\u003c/b\u003e: The path to a shared library or one of `avx2`, `avx`, `basic`.\n- \u003cb\u003e`local_files_only`\u003c/b\u003e: Whether or not to only look at local files (i.e., do not try to download the model).\n- \u003cb\u003e`revision`\u003c/b\u003e: The specific model version to use. It can be a branch name, a tag name, or a commit id.\n- \u003cb\u003e`hf`\u003c/b\u003e: Whether to create a Hugging Face Transformers model.\n\n**Returns:**\n`LLM` object.\n\n### \u003ckbd\u003eclass\u003c/kbd\u003e `LLM`\n\n### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.__init__`\n\n```python\n__init__(\n    model_path: str,\n    model_type: Optional[str] = None,\n    config: Optional[ctransformers.llm.Config] = None,\n    lib: Optional[str] = None\n)\n```\n\nLoads the language model from a local file.\n\n**Args:**\n\n- \u003cb\u003e`model_path`\u003c/b\u003e: The path to a model file.\n- \u003cb\u003e`model_type`\u003c/b\u003e: The model type.\n- \u003cb\u003e`config`\u003c/b\u003e: `Config` object.\n- \u003cb\u003e`lib`\u003c/b\u003e: The path to a shared library or one of `avx2`, `avx`, `basic`.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.bos_token_id\n\nThe beginning-of-sequence token.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.config\n\nThe config object.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.context_length\n\nThe context length of model.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.embeddings\n\nThe input embeddings.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.eos_token_id\n\nThe end-of-sequence token.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.logits\n\nThe unnormalized log probabilities.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.model_path\n\nThe path to the model file.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.model_type\n\nThe model type.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.pad_token_id\n\nThe padding token.\n\n---\n\n##### \u003ckbd\u003eproperty\u003c/kbd\u003e LLM.vocab_size\n\nThe number of tokens in vocabulary.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.detokenize`\n\n```python\ndetokenize(tokens: Sequence[int], decode: bool = True) → Union[str, bytes]\n```\n\nConverts a list of tokens to text.\n\n**Args:**\n\n- \u003cb\u003e`tokens`\u003c/b\u003e: The list of tokens.\n- \u003cb\u003e`decode`\u003c/b\u003e: Whether to decode the text as UTF-8 string.\n\n**Returns:**\nThe combined text of all tokens.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.embed`\n\n```python\nembed(\n    input: Union[str, Sequence[int]],\n    batch_size: Optional[int] = None,\n    threads: Optional[int] = None\n) → List[float]\n```\n\nComputes embeddings for a text or list of tokens.\n\n\u003e **Note:** Currently only LLaMA and Falcon models support embeddings.\n\n**Args:**\n\n- \u003cb\u003e`input`\u003c/b\u003e: The input text or list of tokens to get embeddings for.\n- \u003cb\u003e`batch_size`\u003c/b\u003e: The batch size to use for evaluating tokens in a single prompt. Default: `8`\n- \u003cb\u003e`threads`\u003c/b\u003e: The number of threads to use for evaluating tokens. Default: `-1`\n\n**Returns:**\nThe input embeddings.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.eval`\n\n```python\neval(\n    tokens: Sequence[int],\n    batch_size: Optional[int] = None,\n    threads: Optional[int] = None\n) → None\n```\n\nEvaluates a list of tokens.\n\n**Args:**\n\n- \u003cb\u003e`tokens`\u003c/b\u003e: The list of tokens to evaluate.\n- \u003cb\u003e`batch_size`\u003c/b\u003e: The batch size to use for evaluating tokens in a single prompt. Default: `8`\n- \u003cb\u003e`threads`\u003c/b\u003e: The number of threads to use for evaluating tokens. Default: `-1`\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.generate`\n\n```python\ngenerate(\n    tokens: Sequence[int],\n    top_k: Optional[int] = None,\n    top_p: Optional[float] = None,\n    temperature: Optional[float] = None,\n    repetition_penalty: Optional[float] = None,\n    last_n_tokens: Optional[int] = None,\n    seed: Optional[int] = None,\n    batch_size: Optional[int] = None,\n    threads: Optional[int] = None,\n    reset: Optional[bool] = None\n) → Generator[int, NoneType, NoneType]\n```\n\nGenerates new tokens from a list of tokens.\n\n**Args:**\n\n- \u003cb\u003e`tokens`\u003c/b\u003e: The list of tokens to generate tokens from.\n- \u003cb\u003e`top_k`\u003c/b\u003e: The top-k value to use for sampling. Default: `40`\n- \u003cb\u003e`top_p`\u003c/b\u003e: The top-p value to use for sampling. Default: `0.95`\n- \u003cb\u003e`temperature`\u003c/b\u003e: The temperature to use for sampling. Default: `0.8`\n- \u003cb\u003e`repetition_penalty`\u003c/b\u003e: The repetition penalty to use for sampling. Default: `1.1`\n- \u003cb\u003e`last_n_tokens`\u003c/b\u003e: The number of last tokens to use for repetition penalty. Default: `64`\n- \u003cb\u003e`seed`\u003c/b\u003e: The seed value to use for sampling tokens. Default: `-1`\n- \u003cb\u003e`batch_size`\u003c/b\u003e: The batch size to use for evaluating tokens in a single prompt. Default: `8`\n- \u003cb\u003e`threads`\u003c/b\u003e: The number of threads to use for evaluating tokens. Default: `-1`\n- \u003cb\u003e`reset`\u003c/b\u003e: Whether to reset the model state before generating text. Default: `True`\n\n**Returns:**\nThe generated tokens.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.is_eos_token`\n\n```python\nis_eos_token(token: int) → bool\n```\n\nChecks if a token is an end-of-sequence token.\n\n**Args:**\n\n- \u003cb\u003e`token`\u003c/b\u003e: The token to check.\n\n**Returns:**\n`True` if the token is an end-of-sequence token else `False`.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.prepare_inputs_for_generation`\n\n```python\nprepare_inputs_for_generation(\n    tokens: Sequence[int],\n    reset: Optional[bool] = None\n) → Sequence[int]\n```\n\nRemoves input tokens that are evaluated in the past and updates the LLM context.\n\n**Args:**\n\n- \u003cb\u003e`tokens`\u003c/b\u003e: The list of input tokens.\n- \u003cb\u003e`reset`\u003c/b\u003e: Whether to reset the model state before generating text. Default: `True`\n\n**Returns:**\nThe list of tokens to evaluate.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.reset`\n\n```python\nreset() → None\n```\n\nDeprecated since 0.2.27.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.sample`\n\n```python\nsample(\n    top_k: Optional[int] = None,\n    top_p: Optional[float] = None,\n    temperature: Optional[float] = None,\n    repetition_penalty: Optional[float] = None,\n    last_n_tokens: Optional[int] = None,\n    seed: Optional[int] = None\n) → int\n```\n\nSamples a token from the model.\n\n**Args:**\n\n- \u003cb\u003e`top_k`\u003c/b\u003e: The top-k value to use for sampling. Default: `40`\n- \u003cb\u003e`top_p`\u003c/b\u003e: The top-p value to use for sampling. Default: `0.95`\n- \u003cb\u003e`temperature`\u003c/b\u003e: The temperature to use for sampling. Default: `0.8`\n- \u003cb\u003e`repetition_penalty`\u003c/b\u003e: The repetition penalty to use for sampling. Default: `1.1`\n- \u003cb\u003e`last_n_tokens`\u003c/b\u003e: The number of last tokens to use for repetition penalty. Default: `64`\n- \u003cb\u003e`seed`\u003c/b\u003e: The seed value to use for sampling tokens. Default: `-1`\n\n**Returns:**\nThe sampled token.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.tokenize`\n\n```python\ntokenize(text: str, add_bos_token: Optional[bool] = None) → List[int]\n```\n\nConverts a text into list of tokens.\n\n**Args:**\n\n- \u003cb\u003e`text`\u003c/b\u003e: The text to tokenize.\n- \u003cb\u003e`add_bos_token`\u003c/b\u003e: Whether to add the beginning-of-sequence token.\n\n**Returns:**\nThe list of tokens.\n\n---\n\n#### \u003ckbd\u003emethod\u003c/kbd\u003e `LLM.__call__`\n\n```python\n__call__(\n    prompt: str,\n    max_new_tokens: Optional[int] = None,\n    top_k: Optional[int] = None,\n    top_p: Optional[float] = None,\n    temperature: Optional[float] = None,\n    repetition_penalty: Optional[float] = None,\n    last_n_tokens: Optional[int] = None,\n    seed: Optional[int] = None,\n    batch_size: Optional[int] = None,\n    threads: Optional[int] = None,\n    stop: Optional[Sequence[str]] = None,\n    stream: Optional[bool] = None,\n    reset: Optional[bool] = None\n) → Union[str, Generator[str, NoneType, NoneType]]\n```\n\nGenerates text from a prompt.\n\n**Args:**\n\n- \u003cb\u003e`prompt`\u003c/b\u003e: The prompt to generate text from.\n- \u003cb\u003e`max_new_tokens`\u003c/b\u003e: The maximum number of new tokens to generate. Default: `256`\n- \u003cb\u003e`top_k`\u003c/b\u003e: The top-k value to use for sampling. Default: `40`\n- \u003cb\u003e`top_p`\u003c/b\u003e: The top-p value to use for sampling. Default: `0.95`\n- \u003cb\u003e`temperature`\u003c/b\u003e: The temperature to use for sampling. Default: `0.8`\n- \u003cb\u003e`repetition_penalty`\u003c/b\u003e: The repetition penalty to use for sampling. Default: `1.1`\n- \u003cb\u003e`last_n_tokens`\u003c/b\u003e: The number of last tokens to use for repetition penalty. Default: `64`\n- \u003cb\u003e`seed`\u003c/b\u003e: The seed value to use for sampling tokens. Default: `-1`\n- \u003cb\u003e`batch_size`\u003c/b\u003e: The batch size to use for evaluating tokens in a single prompt. Default: `8`\n- \u003cb\u003e`threads`\u003c/b\u003e: The number of threads to use for evaluating tokens. Default: `-1`\n- \u003cb\u003e`stop`\u003c/b\u003e: A list of sequences to stop generation when encountered. Default: `None`\n- \u003cb\u003e`stream`\u003c/b\u003e: Whether to stream the generated text. Default: `False`\n- \u003cb\u003e`reset`\u003c/b\u003e: Whether to reset the model state before generating text. Default: `True`\n\n**Returns:**\nThe generated text.\n\n\u003c!-- API_DOCS --\u003e\n\n## License\n\n[MIT](https://github.com/marella/ctransformers/blob/main/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarella%2Fctransformers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarella%2Fctransformers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarella%2Fctransformers/lists"}