{ "info": { "author": null, "author_email": null, "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries" ], "description": "

\ud83d\udce6 agi-pack

\n

\nA Dockerfile builder for Machine Learning developers.\n

\n\n

\n\n \"PyPi\n\n\n \"PyPi\n\n\n \"PyPi\n\n\n

\n\n\ud83d\udce6 **`agi-pack`** allows you to define your Dockerfiles using a simple YAML format, and then generate images from them trivially using [Jinja2](https://jinja.palletsprojects.com/en/3.1.x/) templates and [Pydantic](https://docs.pydantic.dev/latest/)-based validation. It's a simple tool that aims to simplify the process of building Docker images for machine learning (ML).\n\n## Goals \ud83c\udfaf\n\n- \ud83d\ude07 **Simplicity**: Make it easy to define and build docker images for ML.\n- \ud83d\udce6 **Best-practices**: Bring best-practices to building docker images for ML -- good base images, multi-stage builds, minimal image sizes, etc.\n- \u26a1\ufe0f **Fast**: Make it lightning-fast to build and re-build docker images with out-of-the-box caching for apt, conda and pip packages.\n- \ud83e\udde9 **Modular, Re-usable, Composable**: Define `base`, `dev` and `prod` targets with multi-stage builds, and re-use them wherever possible.\n- \ud83d\udc69\u200d\ud83d\udcbb **Extensible**: Make the YAML / DSL easily hackable and extensible to support the ML ecosystem, as more libraries, drivers, HW vendors, come into the market.\n- \u2601\ufe0f **Vendor-agnostic**: `agi-pack` is not intended to be built for any specific vendor -- I need this tool for internal purposes, but I decided to build it in the open and keep it simple.\n\n## Installation \ud83d\udce6\n\n```bash\npip install agi-pack\n```\n\nFor shell completion, you can install them via:\n```bash\nagi-pack --install-completion \n```\n\nGo through the [examples](./examples) and the corresponding [examples/generated](./examples/generated) directory to see a few examples of what `agi-pack` can do. If you're interested in checking out a CUDA / CUDNN example, check out [examples/agibuild.base-cu118.yaml](./examples/agibuild.base-cu118.yaml).\n\n## Quickstart \ud83d\udee0\n\n1. Create a simple YAML configuration file called `agibuild.yaml`. You can use `agi-pack init` to generate a sample configuration file.\n\n ```bash\n agi-pack init\n ```\n\n2. Edit `agibuild.yaml` to define your custom system and python packages.\n\n ```yaml\n images:\n sklearn-base:\n base: debian:buster-slim\n system:\n - wget\n - build-essential\n python: \"3.8.10\"\n pip:\n - loguru\n - typer\n - scikit-learn\n ```\n\n Let's break this down:\n - `sklearn-base`: name of the target you want to build. Usually, these could be variants like `*-base`, `*-dev`, `*-prod`, `*-test` etc.\n - `base`: base image to build from.\n - `system`: system packages to install via `apt-get install`.\n - `python`: specific python version to install via `miniconda`.\n - `pip`: python packages to install via `pip install`.\n\n3. Generate the Dockerfile using `agi-pack generate`\n\n ```bash\n agi-pack generate -c agibuild.yaml\n ```\n\n You should see the following output:\n\n ```bash\n $ agi-pack generate -c agibuild.yaml\n \ud83d\udce6 sklearn-base\n \u2514\u2500\u2500 \ud83c\udf89 Successfully generated Dockerfile (target=sklearn-base, filename=Dockerfile).\n \u2514\u2500\u2500 `docker build -f Dockerfile --target sklearn-base .`\n ```\n\nThat's it! Here's the generated [`Dockerfile`](examples/generated/Dockerfile-quickstart) -- use it to run `docker build` and build the image directly.\n\n## Rationale \ud83e\udd14\n\nDocker has become the standard for building and managing isolated environments for ML. However, any one who has gone down this rabbit-hole knows how broken ML development is, especially when you need to experiment and re-configure your environments constantly. Production is another nightmare -- large docker images (`10GB+`), bloated docker images with model weights that are `~5-10GB` in size, 10+ minute long docker build times, sloppy package management to name just a few.\n\n**What makes Dockerfiles painful?** If you've ever tried to roll your own Dockerfiles with all the best-practices while fully understanding their internals, you'll still find yourself building, and re-building, and re-building these images across a whole host of use-cases. Having to build Dockerfile(s) for `dev`, `prod`, and `test` all turn out to be a nightmare when you add the complexity of hardware targets (CPUs, GPUs, TPUs etc), drivers, python, virtual environments, build and runtime dependencies.\n\n**agi-pack** aims to simplify this by allowing developers to define Dockerfiles in a concise YAML format and then generate them based on your environment needs (i.e. python version, system packages, conda/pip dependencies, GPU drivers etc).\n\nFor example, you should be able to easily configure your `dev` environment for local development, and have a separate `prod` environment where you'll only need the runtime dependencies avoiding any bloat.\n\n`agi-pack` hopes to also standardize the base images, so that we can really build on top of giants.\n\n## More Complex Example \ud83d\udcda\n\nNow imagine you want to build a more complex image that has multiple stages, and you want to build a `base` image that has all the basic dependencies, and a `dev` image that has additional build-time dependencies.\n\n```yaml\nimages:\n base-cpu:\n name: agi\n base: debian:buster-slim\n system:\n - wget\n python: \"3.8.10\"\n pip:\n - scikit-learn\n run:\n - echo \"Hello, world!\"\n\n dev-cpu:\n base: base-cpu\n system:\n - build-essential\n```\n\nOnce you've defined this `agibuild.yaml`, running `agi-pack generate` will generate the following output:\n\n```bash\n$ agi-pack generate -c agibuild.yaml\n\ud83d\udce6 base-cpu\n\u2514\u2500\u2500 \ud83c\udf89 Successfully generated Dockerfile (target=base-cpu, filename=Dockerfile).\n \u2514\u2500\u2500 `docker build -f Dockerfile --target base-cpu .`\n\ud83d\udce6 dev-cpu\n\u2514\u2500\u2500 \ud83c\udf89 Successfully generated Dockerfile (target=dev-cpu, filename=Dockerfile).\n \u2514\u2500\u2500 `docker build -f Dockerfile --target dev-cpu .`\n```\n\nAs you can see, `agi-pack` will generate a **single** Dockerfile for each of the targets defined in the YAML file. You can then build the individual images from the same Dockerfile using docker targets: `docker build -f Dockerfile --target .` where `` is the name of the image target you want to build.\n\nHere's the corresponding [`Dockerfile`](./examples/generated/Dockerfile-multistage) that was generated.\n\n\n## Why the name? \ud83e\udd37\u200d\u2642\ufe0f\n`agi-pack` is very much intended to be tongue-in-cheek -- we are soon going to be living in a world full of quasi-AGI agents orchestrated via ML containers. At the very least, `agi-pack` should provide the building blocks for us to build a more modular, re-usable, and distribution-friendly container format for \"AGI\".\n\n## Inspiration and Attribution \ud83c\udf1f\n\n> **TL;DR** `agi-pack` was inspired by a combination of [Replicate's `cog`](https://github.com/replicate/cog), [Baseten's `truss`](https://github.com/basetenlabs/truss/), [skaffold](https://skaffold.dev/), and [Docker Compose Services](https://docs.docker.com/compose/compose-file/05-services/). I wanted a standalone project without any added cruft/dependencies of vendors and services.\n\n\ud83d\udce6 **agi-pack** is simply a weekend project I hacked together, that started with a conversation with [ChatGPT / GPT-4](#chatgpt-prompt).\n\n### ChatGPT Prompt\n---\n\n> **Prompt:** I'm building a Dockerfile generator and builder to simplify machine learning infrastructure. I'd like for the Dockerfile to be dynamically generated (using Jinja templates) with the following parametrizations:\n\n```yaml\n# Sample YAML file\nimages:\n base-gpu:\n base: nvidia/cuda:11.8.0-base-ubuntu22.04\n system:\n - gnupg2\n - build-essential\n - git\n python: \"3.8.10\"\n pip:\n - torch==2.0.1\n```\n> I'd like for this yaml file to generate a Dockerfile via `agi-pack generate -c .yaml`. You are an expert in Docker and Python programming, how would I implement this builder in Python. Use Jinja2 templating and miniconda python environments wherever possible. I'd like an elegant and concise implementation that I can share on PyPI.\n\n## Contributing \ud83e\udd1d\n\nContributions are welcome! Please read the [CONTRIBUTING](CONTRIBUTING.md) guide for more information.\n\n## License \ud83d\udcc4\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "dynamic": null, "home_page": null, "keywords": null, "license": "MIT License Copyright (c) 2023 Sudeep Pillai Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ", "maintainer": null, "maintainer_email": null, "name": "agi-pack", "package_url": "https://pypi.org/project/agi-pack/", "platform": null, "project_url": "https://pypi.org/project/agi-pack/", "project_urls": { "Documentation": "https://spillai.github.io/agi-pack/", "Homepage": "https://spillai.github.io/agi-pack/", "Source Code": "https://github.com/spillai/agi-pack" }, "provides_extra": null, "release_url": "https://pypi.org/project/agi-pack/0.3.0/", "requires_dist": [ "jinja2", "pydantic>=2.5", "pyyaml", "typer[all]", "pre-commit; extra == \"dev\"", "pytest; extra == \"dev\"", "build; extra == \"dev\"" ], "requires_python": ">=3.7", "summary": "Dockerfile generator for AGI -- nothing more, nothing less.", "version": "0.3.0", "yanked": false, "yanked_reason": null }, "last_serial": 23050828, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "blake2b_256": "83c1b3d1bf8cfcf4aa826f59474217cf3c698fff428827d0f81c91b73313d35b", "md5": "e586741ac3a0e0bc569a027ee29cfc8f", "sha256": "b3ddfffb62e0365a8d5e66c235c50e7def8fdfb0e85a31a8ea5d3dd30c631443" }, "downloads": -1, "filename": "agi_pack-0.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e586741ac3a0e0bc569a027ee29cfc8f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7.10", "size": 13487, "upload_time": "2023-10-09T00:59:43", "upload_time_iso_8601": "2023-10-09T00:59:43.928936Z", "url": "https://files.pythonhosted.org/packages/83/c1/b3d1bf8cfcf4aa826f59474217cf3c698fff428827d0f81c91b73313d35b/agi_pack-0.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.0": [ { "comment_text": "", "digests": { "blake2b_256": "25788ca1110a27b455716d28660248c8592f0108ba76232632cffe6760a114cc", "md5": "ed40fc14b039117845b1f838723fe001", "sha256": "0cad8f6743f5837be70a3a74af985c37a9384d43ef7fd52dec7051b833cb5801" }, "downloads": -1, "filename": "agi_pack-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ed40fc14b039117845b1f838723fe001", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7.10", "size": 13843, "upload_time": "2023-10-09T01:28:08", "upload_time_iso_8601": "2023-10-09T01:28:08.898378Z", "url": "https://files.pythonhosted.org/packages/25/78/8ca1110a27b455716d28660248c8592f0108ba76232632cffe6760a114cc/agi_pack-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "blake2b_256": "ed75686bd30d7ab435178134e71d2a4334f79249f355319eea674f9dfb116626", "md5": "39f1808a5ec9e56440e7ba1bd0454246", "sha256": "1a92880c7d56e091a3c020b4b876012fa43b45f40b244921524aae8301e29e3a" }, "downloads": -1, "filename": "agi_pack-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "39f1808a5ec9e56440e7ba1bd0454246", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 13840, "upload_time": "2023-10-09T04:13:21", "upload_time_iso_8601": "2023-10-09T04:13:21.626156Z", "url": "https://files.pythonhosted.org/packages/ed/75/686bd30d7ab435178134e71d2a4334f79249f355319eea674f9dfb116626/agi_pack-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.10": [ { "comment_text": "", "digests": { "blake2b_256": "a01c2c7986fc0aa03db81969a2d2fddad3c1154f759b11d5dfe13606b8ed2f61", "md5": "d7ed78b0574dbea86f1ab329c17fcc43", "sha256": "9b51c814cb750e5c1001b676cad125bd1558c7d4c5a34683a91d113c851df8ae" }, "downloads": -1, "filename": "agi_pack-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "d7ed78b0574dbea86f1ab329c17fcc43", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16207, "upload_time": "2023-10-18T00:36:57", "upload_time_iso_8601": "2023-10-18T00:36:57.292918Z", "url": "https://files.pythonhosted.org/packages/a0/1c/2c7986fc0aa03db81969a2d2fddad3c1154f759b11d5dfe13606b8ed2f61/agi_pack-0.1.10-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.11": [ { "comment_text": "", "digests": { "blake2b_256": "8d886add098bc9e8e3793e2de0cbc3a3468302b29f9273d0dff5e51c2bd56508", "md5": "9d8f45dfc51eeb95a2e3956a3ef81b67", "sha256": "269aef3dc0aec9c5bb195c95d4b1b255bc3a74e5aa7b320ca0d7287871f7ac43" }, "downloads": -1, "filename": "agi_pack-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "9d8f45dfc51eeb95a2e3956a3ef81b67", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16208, "upload_time": "2023-10-18T00:53:04", "upload_time_iso_8601": "2023-10-18T00:53:04.551471Z", "url": "https://files.pythonhosted.org/packages/8d/88/6add098bc9e8e3793e2de0cbc3a3468302b29f9273d0dff5e51c2bd56508/agi_pack-0.1.11-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.12": [ { "comment_text": "", "digests": { "blake2b_256": "b849646eb6511662c4ead5ab44fc8215a8abeed979c7595775fc18bf19b95f24", "md5": "62290de4ea5ac24126888fb77654e95b", "sha256": "65e4f4760bf7755532fa58c4b4cc05d599d158c2b10f236298b5db7ffafa2e38" }, "downloads": -1, "filename": "agi_pack-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "62290de4ea5ac24126888fb77654e95b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16194, "upload_time": "2023-10-21T06:58:42", "upload_time_iso_8601": "2023-10-21T06:58:42.567857Z", "url": "https://files.pythonhosted.org/packages/b8/49/646eb6511662c4ead5ab44fc8215a8abeed979c7595775fc18bf19b95f24/agi_pack-0.1.12-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.13": [ { "comment_text": "", "digests": { "blake2b_256": "d43df48196abf67bb1f976b48580e615d901f1330d7733b154c9f3b14d194d37", "md5": "b7c2fe47d527a376b17d235bc9ffcd4d", "sha256": "23033d702f39cb202bbab3ee14e983267906d85107474863f8f3c7526358e01d" }, "downloads": -1, "filename": "agi_pack-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "b7c2fe47d527a376b17d235bc9ffcd4d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16382, "upload_time": "2023-10-21T20:58:19", "upload_time_iso_8601": "2023-10-21T20:58:19.133301Z", "url": "https://files.pythonhosted.org/packages/d4/3d/f48196abf67bb1f976b48580e615d901f1330d7733b154c9f3b14d194d37/agi_pack-0.1.13-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.14": [ { "comment_text": "", "digests": { "blake2b_256": "1bf2f10ab09c743c15644b057b05635dba252ce1e50ddbe8382d133f44f858bd", "md5": "73bc78b0189e6e8ee0ba954a16ef7157", "sha256": "57fbadb210f8128d8d5df39b57e31e506d9ae31b2ba7058ca6d9a4c8fce96113" }, "downloads": -1, "filename": "agi_pack-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "73bc78b0189e6e8ee0ba954a16ef7157", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16486, "upload_time": "2023-10-22T17:12:51", "upload_time_iso_8601": "2023-10-22T17:12:51.654970Z", "url": "https://files.pythonhosted.org/packages/1b/f2/f10ab09c743c15644b057b05635dba252ce1e50ddbe8382d133f44f858bd/agi_pack-0.1.14-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.15": [ { "comment_text": "", "digests": { "blake2b_256": "110d9cc8e7f441dae21ff1161ebece41872f87708b034c7ab8de398cdd6cb13e", "md5": "d95602ac6607fa0410d7cc7e18d3559c", "sha256": "75488683f7c514b049f7e90ea4163ac93d4ce034570e71ca3ecb2c848b22fd3d" }, "downloads": -1, "filename": "agi_pack-0.1.15-py3-none-any.whl", "has_sig": false, "md5_digest": "d95602ac6607fa0410d7cc7e18d3559c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16591, "upload_time": "2023-10-22T17:46:58", "upload_time_iso_8601": "2023-10-22T17:46:58.729037Z", "url": "https://files.pythonhosted.org/packages/11/0d/9cc8e7f441dae21ff1161ebece41872f87708b034c7ab8de398cdd6cb13e/agi_pack-0.1.15-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.16": [ { "comment_text": "", "digests": { "blake2b_256": "260822b2d38bb82d72e4e7f794fe51dbad00585d45ec0efdeb49928694661059", "md5": "92d9b8122c8fcf15e93812ce280f609b", "sha256": "225c570f96add4317b818c5b13c8b6005a97f4b8496a79edffd6c30239f6a598" }, "downloads": -1, "filename": "agi_pack-0.1.16-py3-none-any.whl", "has_sig": false, "md5_digest": "92d9b8122c8fcf15e93812ce280f609b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17183, "upload_time": "2023-10-23T06:08:48", "upload_time_iso_8601": "2023-10-23T06:08:48.263356Z", "url": "https://files.pythonhosted.org/packages/26/08/22b2d38bb82d72e4e7f794fe51dbad00585d45ec0efdeb49928694661059/agi_pack-0.1.16-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.17": [ { "comment_text": "", "digests": { "blake2b_256": "b203e52f76fc9da6bfdebd206bbe30a768115045407eb32bf02214174e61f9f0", "md5": "284877c743d6460747319afa6a52df74", "sha256": "3072db5c78b22d0658429b9e1a8236e9471201c4434425c9a296d17512c1a51c" }, "downloads": -1, "filename": "agi_pack-0.1.17-py3-none-any.whl", "has_sig": false, "md5_digest": "284877c743d6460747319afa6a52df74", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17494, "upload_time": "2023-10-23T17:58:00", "upload_time_iso_8601": "2023-10-23T17:58:00.521996Z", "url": "https://files.pythonhosted.org/packages/b2/03/e52f76fc9da6bfdebd206bbe30a768115045407eb32bf02214174e61f9f0/agi_pack-0.1.17-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.18": [ { "comment_text": "", "digests": { "blake2b_256": "247093dccbc13f8e720552dbcb4f3df11f4cbfa7b52cca8cff1bbe1a19c71e2a", "md5": "4f168bc631f5e5c2956bdcc5473c35ce", "sha256": "705ddd2577892d9240919022c028ffadca501e71181907052ee590a8d9326ffb" }, "downloads": -1, "filename": "agi_pack-0.1.18-py3-none-any.whl", "has_sig": false, "md5_digest": "4f168bc631f5e5c2956bdcc5473c35ce", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17525, "upload_time": "2023-10-23T18:15:50", "upload_time_iso_8601": "2023-10-23T18:15:50.443670Z", "url": "https://files.pythonhosted.org/packages/24/70/93dccbc13f8e720552dbcb4f3df11f4cbfa7b52cca8cff1bbe1a19c71e2a/agi_pack-0.1.18-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.19": [ { "comment_text": "", "digests": { "blake2b_256": "1fd7e5cfe340b1169e47b83a12dc7a9e077c7668b07930f89f094ce676a2ba4c", "md5": "087dfb88f38a3b4cd0b7636f09a88d25", "sha256": "c899f817cc35f3f820bb4e693e947e7b6f5401ef04d68b0362adfd350fc72b98" }, "downloads": -1, "filename": "agi_pack-0.1.19-py3-none-any.whl", "has_sig": false, "md5_digest": "087dfb88f38a3b4cd0b7636f09a88d25", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17377, "upload_time": "2023-10-25T22:16:12", "upload_time_iso_8601": "2023-10-25T22:16:12.532289Z", "url": "https://files.pythonhosted.org/packages/1f/d7/e5cfe340b1169e47b83a12dc7a9e077c7668b07930f89f094ce676a2ba4c/agi_pack-0.1.19-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "blake2b_256": "14fd4ee67abb0c6366d709e3b73bdd9cc493151c52da981dff9efcaddb53d9df", "md5": "251690f4188b31005463481b6a945cf7", "sha256": "f4a21f2494d0fb77e1eec696b62d53882441620a9a8e126c44ada845d6bb8fe8" }, "downloads": -1, "filename": "agi_pack-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "251690f4188b31005463481b6a945cf7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 13844, "upload_time": "2023-10-09T04:27:36", "upload_time_iso_8601": "2023-10-09T04:27:36.880658Z", "url": "https://files.pythonhosted.org/packages/14/fd/4ee67abb0c6366d709e3b73bdd9cc493151c52da981dff9efcaddb53d9df/agi_pack-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "blake2b_256": "4ecea533781949f9b6177e0e999e77129c7262575d9398e116650aab590144ad", "md5": "138e6320d68fb98136f08b2c40adcf0a", "sha256": "ec74a1216b28ff32461bab21df0db74271e41473ce3be3d2e13e59c40a1381fb" }, "downloads": -1, "filename": "agi_pack-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "138e6320d68fb98136f08b2c40adcf0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 14185, "upload_time": "2023-10-09T14:52:59", "upload_time_iso_8601": "2023-10-09T14:52:59.455513Z", "url": "https://files.pythonhosted.org/packages/4e/ce/a533781949f9b6177e0e999e77129c7262575d9398e116650aab590144ad/agi_pack-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "blake2b_256": "be9a7d2eb15e8af59b67b3bcc845a6c0b2397d45205694e3e56132b95ba12e2c", "md5": "4c22d3adfc2dc9ae9e47adce4e8b4d73", "sha256": "f347b50faa0125f020d2a9b858577c2e1e5dfd1813173c530204f70acc5d8bcf" }, "downloads": -1, "filename": "agi_pack-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "4c22d3adfc2dc9ae9e47adce4e8b4d73", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 14639, "upload_time": "2023-10-09T16:59:42", "upload_time_iso_8601": "2023-10-09T16:59:42.881448Z", "url": "https://files.pythonhosted.org/packages/be/9a/7d2eb15e8af59b67b3bcc845a6c0b2397d45205694e3e56132b95ba12e2c/agi_pack-0.1.4-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "blake2b_256": "0efe4f624b3cd7a1ba29bd4f52c12db2b9f72b95b5f75aaf6788b9e708608f38", "md5": "b3053d71670dceae53dc26b8872ffd14", "sha256": "c3b3823689399723845f0d1f594f8f18f8c33a490e0ef4cfca56dd8913b37168" }, "downloads": -1, "filename": "agi_pack-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "b3053d71670dceae53dc26b8872ffd14", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 15069, "upload_time": "2023-10-09T22:36:10", "upload_time_iso_8601": "2023-10-09T22:36:10.502013Z", "url": "https://files.pythonhosted.org/packages/0e/fe/4f624b3cd7a1ba29bd4f52c12db2b9f72b95b5f75aaf6788b9e708608f38/agi_pack-0.1.5-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.6": [ { "comment_text": "", "digests": { "blake2b_256": "e1b9d385e2320f923228f4bb988aa77b27cc3549ccddf653230c5f70585da099", "md5": "e130b5fc937e73e0537edbc3e9387bcc", "sha256": "d0070e24f3a12add94bce62bf9b5dcea3f8c7bc221b8a3ef15eaa8e78e21824e" }, "downloads": -1, "filename": "agi_pack-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "e130b5fc937e73e0537edbc3e9387bcc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 15849, "upload_time": "2023-10-10T05:02:21", "upload_time_iso_8601": "2023-10-10T05:02:21.365598Z", "url": "https://files.pythonhosted.org/packages/e1/b9/d385e2320f923228f4bb988aa77b27cc3549ccddf653230c5f70585da099/agi_pack-0.1.6-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.7": [ { "comment_text": "", "digests": { "blake2b_256": "b1563c77800cfa4b9488e1aa638f6076d31374a77f6309751318b7b2ecc35705", "md5": "91728edd80c50dae2c5b4739c541bc98", "sha256": "108ff3068a5241c7fba2d7be32c9a077669876ec94e1cdccd57c5dd9cf06c9fe" }, "downloads": -1, "filename": "agi_pack-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "91728edd80c50dae2c5b4739c541bc98", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 15918, "upload_time": "2023-10-10T06:40:07", "upload_time_iso_8601": "2023-10-10T06:40:07.180762Z", "url": "https://files.pythonhosted.org/packages/b1/56/3c77800cfa4b9488e1aa638f6076d31374a77f6309751318b7b2ecc35705/agi_pack-0.1.7-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.8": [ { "comment_text": "", "digests": { "blake2b_256": "a3e432183798cb49c8340e592e0feab8550e1038f237a548b7c7cfbf3eefebb5", "md5": "2cb3053d9135e522a788c4d93f436f3b", "sha256": "2f826e33c8532020150fc44a57867a5aa4c60bd588507968ed3f8ceca7659f15" }, "downloads": -1, "filename": "agi_pack-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "2cb3053d9135e522a788c4d93f436f3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16147, "upload_time": "2023-10-17T21:08:48", "upload_time_iso_8601": "2023-10-17T21:08:48.410977Z", "url": "https://files.pythonhosted.org/packages/a3/e4/32183798cb49c8340e592e0feab8550e1038f237a548b7c7cfbf3eefebb5/agi_pack-0.1.8-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "blake2b_256": "05808f268c716ac642651673ae05c322b76ed816ccb68dea31fe81072e364e64", "md5": "a05f9856eb817449c14d985942723ba5", "sha256": "82d3a272a193230adb598ceeca3b68e49fb15a20d884277ebeeac01d03319e75" }, "downloads": -1, "filename": "agi_pack-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "a05f9856eb817449c14d985942723ba5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 16165, "upload_time": "2023-10-17T23:57:06", "upload_time_iso_8601": "2023-10-17T23:57:06.891347Z", "url": "https://files.pythonhosted.org/packages/05/80/8f268c716ac642651673ae05c322b76ed816ccb68dea31fe81072e364e64/agi_pack-0.1.9-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "blake2b_256": "a5661f34333186377325e56698bc5351ed3979ccc5143b581d2236cb4f51823e", "md5": "aa819a6de7932ebc5de9caa40534e156", "sha256": "6a53671297b918db061eb4830b1f3fe99bae5ab16246df94fd5e6eb7c23718bb" }, "downloads": -1, "filename": "agi_pack-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "aa819a6de7932ebc5de9caa40534e156", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17273, "upload_time": "2024-01-23T02:38:52", "upload_time_iso_8601": "2024-01-23T02:38:52.863632Z", "url": "https://files.pythonhosted.org/packages/a5/66/1f34333186377325e56698bc5351ed3979ccc5143b581d2236cb4f51823e/agi_pack-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "blake2b_256": "7470963312b8aee2ec1be783fa646fc9bef47de628f390963da4458a3ff8f8ac", "md5": "e887dc6fe6c02ebe5850b783cb3043a1", "sha256": "b0b8938c83eef31358ebe831fe7b2661f322ee01ab41b22c52f42b4b656ec007" }, "downloads": -1, "filename": "agi_pack-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e887dc6fe6c02ebe5850b783cb3043a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17270, "upload_time": "2024-05-03T20:12:16", "upload_time_iso_8601": "2024-05-03T20:12:16.993842Z", "url": "https://files.pythonhosted.org/packages/74/70/963312b8aee2ec1be783fa646fc9bef47de628f390963da4458a3ff8f8ac/agi_pack-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "blake2b_256": "7470963312b8aee2ec1be783fa646fc9bef47de628f390963da4458a3ff8f8ac", "md5": "e887dc6fe6c02ebe5850b783cb3043a1", "sha256": "b0b8938c83eef31358ebe831fe7b2661f322ee01ab41b22c52f42b4b656ec007" }, "downloads": -1, "filename": "agi_pack-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e887dc6fe6c02ebe5850b783cb3043a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 17270, "upload_time": "2024-05-03T20:12:16", "upload_time_iso_8601": "2024-05-03T20:12:16.993842Z", "url": "https://files.pythonhosted.org/packages/74/70/963312b8aee2ec1be783fa646fc9bef47de628f390963da4458a3ff8f8ac/agi_pack-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }