{ "info": { "author": "Deep AI, Inc", "author_email": "admin@deepai.org", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7" ], "description": "# ai_integration\n[![PyPI version](https://badge.fury.io/py/ai-integration.svg)](https://badge.fury.io/py/ai-integration)\nAI Model Integration for Python 2.7/3\n\n# Purpose\n### Expose your AI model under a standard interface so that you can run the model under a variety of usage modes and hosting platforms - all working seamlessly, automatically, with no code changes.\n### Designed to be as simple as possible to integrate.\n\n### Create a standard \"ai_integration Docker Container Format\" for interoperability.\n\n\n![Diagram showing integration modes](https://yuml.me/diagram/plain;dir:RL/class/[Your%20Model]%20->%20[AI%20Integration],%20[AI%20Integration]<-[Many%20more%20coming!],%20[AI%20Integration]<-[DeepAI%20Platform],%20[AI%20Integration]<-[Pickle],%20[AI%20Integration]<-[JSON],%20[AI%20Integration]<-[HTTP%20API],%20[AI%20Integration]<-[Command%20Line].jpg)\n\n## Table of Contents\n\n- [Purpose](#purpose)\n- [Built-In Usage Modes](#built-in-usage-modes)\n- [Example Models](#example-models)\n- [Contribution & Sponsors](#contribution--sponsors)\n- [How to call the integration library from your code](#how-to-call-the-integration-library-from-your-code)\n * [Simplest Usage Example](#simplest-usage-example)\n- [Docker Container Format Requirements](#docker-container-format-requirements)\n- [Inputs Dicts](#inputs-dicts)\n- [Result Dicts](#result-dicts)\n- [Error Handling](#error-handling)\n- [Inputs Schema](#inputs-schema)\n + [Schema Data Types](#schema-data-types)\n + [Schema Examples](#schema-examples)\n * [Single Image](#single-image)\n * [Multi-Image](#multi-image)\n * [Text](#text)\n- [Creating Usage Modes](#creating-usage-modes)\n- [Older Integration Mode](#older-integration-mode)\n - This documents the older way to use this library, identified by wrapping your model as a python function.\n\n# Built-In Usage Modes\nThere are several built-in modes for testing:\n\n* Command Line using argparse (command_line)\n* HTTP Web UI / multipart POST API using Flask (http)\n* Pipe inputs dict as JSON (test_inputs_dict_json)\n* Pipe inputs dict as pickle (test_inputs_pickled_dict)\n* Pipe single image for models that take a single input named image (test_single_image)\n* Test single image models with a built-in solid gray image (test_model_integration)\n\n# Example Models\n* [Tensorflow AdaIN Style Transfer](https://github.com/deepai-org/tf-adain-style-transfer)\n* [Sentiment Analysis](https://github.com/deepai-org/sentiment-analysis)\n* [Deep Dream](https://github.com/deepai-org/deepdream)\n* [Open NSFW](https://github.com/deepai-org/open_nsfw)\n* [Super Resolution](https://github.com/deepai-org/tf-super-resolution)\n* [GPT-2 Text Generator](https://github.com/deepai-org/GPT2)\n* [StyleGAN Face Generator](https://github.com/deepai-org/face-generator)\n\n# Contribution & Sponsors\n\n`ai_integration` is a community project developed under the free Apache 2.0 license. We welcome any new modes, integrations, bugfixes, and your ideas.\n\nWe have several company sponsors:\n\n* [DeepAI](https://deepai.org/)\n* [ZeroSix.ai](https://www.zerosix.ai/)\n* [panini.ai](https://www.panini.ai/)\n\nIf you're interested in becoming a sponsor, send an email to ai-integration@deepai.org \n\n# How to call the integration library from your code\n\n(An older version of this library required the user to expose their model as an inference function, but this caused pain in users and is no longer needed.)\n\nRun a \"while True:\" loop in your code and call \"get_next_input\" to get inputs.\n\nPass an inputs_schema (see full docs below) to \"get_next_input\".\n\nSee the specification below for \"Inputs Dicts\"\n\n\"get_next_input\" needs to be called using a \"with\" block as demonstrated below.\n\nThen process the data. Format the result or error as described under \"Results Dicts\"\n\nThen send the result (or error back) with \"send_result\".\n\n## Simplest Usage Example\n\nThis example takes an image and returns a constant string without even looking at the input. It is a very bad AI algorithm for sure!\n\n```python\nimport ai_integration\n\nwhile True:\n with ai_integration.get_next_input(inputs_schema={\"image\": {\"type\": \"image\"}}) as inputs_dict:\n # If an exception happens in this 'with' block, it will be sent back to the ai_integration library\n result_data = {\n \"content-type\": 'text/plain',\n \"data\": \"Fake output\",\n \"success\": True\n }\n ai_integration.send_result(result_data)\n\n\n```\n\n# Docker Container Format Requirements:\n\n#### This library is intended to allow the creation of standardized docker containers. This is the standard:\n\n1. Use the ai_integration library\n\n2. You install this library with pip (or pip3)\n\n3. ENTRYPOINT is used to set your python code as the entry point into the container.\n\n4. No command line arguments will be passed to your python entrypoint. (Unless using the command line interface mode)\n\n5. Do not use argparse in your program as this will conflict with command line mode.\n\nTo test your finished container's integration, run:\n * nvidia-docker run --rm -it -e MODE=test_model_integration YOUR_DOCKER_IMAGE_NAME\n * use docker instead of nvidia-docker if you aren't using NVIDIA...\n * You should see a bunch of happy messages. Any sad messages or exceptions indicate an error.\n * It will try inference a few times. If you don't see this happening, something is not integrated right.\n\n\n# Inputs Dicts\n\ninputs_dict is a regular python dictionary.\n\n- Keys are input names (typically image, or style, content)\n- Values are the data itself. Either byte array of JPEG data (for images) or text string.\n- Any model options are also passed here and may be strings or numbers. Best to accept either strings/numbers in your model.\n\n\n\n# Result Dicts\n\nContent-type, a MIME type, inspired by HTTP, helps to inform the type of the \"data\" field\n\nsuccess is a boolean.\n\n\"error\" should be the error message if success is False.\n\n\n```python\n{\n 'content-type': 'application/json', # or image/jpeg\n 'data': \"{JSON data or image data as byte buffer}\",\n 'success': True,\n 'error': 'the error message (only if failed)'\n} \n```\n\n# Error Handling\n\nIf there's an error that you can catch:\n- set content-type to text/plain\n- set success to False\n- set data to None\n- set error to the best description of the error (perhaps the output of traceback.format_exc())\n\n# Inputs Schema\n\nAn inputs schema is a simple python dict {} that documents the inputs required by your inference function.\n\nNot every integration mode looks at the inputs schema - think of it as a hint for telling the mode what data it needs to provide your function.\n\nAll mentioned inputs are assumed required by default.\n\nThe keys are names, the values specify properties of the input.\n\n### Schema Data Types\n- image\n- text\n- Suggest other types to add to the specification!\n\n### Schema Examples\n\n##### Single Image\nBy convention, name your input \"image\" if you accept a single image input\n```python\n{\n \"image\": {\n \"type\": \"image\"\n }\n}\n```\n\n##### Multi-Image\nFor example, imagine a style transfer model that needs two input images.\n```python\n{\n \"style\": {\n \"type\": \"image\"\n },\n \"content\": {\n \"type\": \"image\"\n }, \n}\n```\n\n##### Text\n```python\n{\n \"sentence\": {\n \"type\": \"text\"\n }\n}\n```\n\n# Creating Usage Modes\n\nA mode is a function that lives in a file in the modes folder of this library.\n\n\nTo create a new mode:\n\n1. Add a python file in this folder\n2. Add a python function to your file that takes two args:\n\n def http(inference_function=None, inputs_schema=None):\n3. Attach a hint to your function\n4. At the end of the file, declare the modes from your file (each python file could export multiple modes), for example:\n```python\nMODULE_MODES = {\n 'http': http\n}\n\n```\n\nYour mode will be called with the inference function and inference schema, the rest is up to you!\n\nThe sky is the limit, you can integrate with pretty much anything.\n\nSee existing modes for examples.\n\n\n\n# Older Integration Mode\n\n#### This documents the older way to use this library, identified by wrapping your model as a python function.\n\n### Entrypoint Shims\n\nYour docker entrypoint should be a simple python file (so small we call it a shim)\n* imports start_loop from this library\n* passes your inference function to it\n* passes your inputs schema to it\n\nThe library handles everything else.\n\n\n\n### Example Shim\nIf your inference function matches the specification, this would be the only code you have to write.\n\nAssume that you put your model in a file called pretend_model.\n```python\nfrom ai_integration.public_interface import start_loop\n\nfrom pretend_model import initialize_model, infer\n\ninitialize_model()\n\nstart_loop(inference_function=infer, inputs_schema={\n \"image\": {\n \"type\": \"image\"\n }\n} )\n\n```\ninference_function should never intentionally throw exceptions.\n- If an error occurs, set success to false and set the error field.\n- If your inference function throws an Exception, the library will assume it is a bad issue and restart the script, so that the framework, CUDA, and everything else can reinitialize.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/deepai-org/ai_integration", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "ai-integration", "package_url": "https://pypi.org/project/ai-integration/", "platform": "", "project_url": "https://pypi.org/project/ai-integration/", "project_urls": { "Homepage": "https://github.com/deepai-org/ai_integration" }, "release_url": "https://pypi.org/project/ai-integration/1.0.15/", "requires_dist": [ "Pillow", "Flask" ], "requires_python": "", "summary": "AI Model Integration for python", "version": "1.0.15" }, "last_serial": 5864892, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "d78eac3bee041aaf84285e1b325af103", "sha256": "3a86823a5ded12cc6429cd8838d4eca479d729e9ca1144f63b841f341ce7e918" }, "downloads": -1, "filename": "ai_integration-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "d78eac3bee041aaf84285e1b325af103", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 13224, "upload_time": "2019-03-15T07:29:33", "url": "https://files.pythonhosted.org/packages/87/0e/458448229e2cdf32336b33cbb869311829448fb84de224fb9bcdbf418ddd/ai_integration-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d0a4c4a00f765cf7c7f93b811eb95322", "sha256": "3aa3b3ff11bce94bcd5ea7284b7eea531b474a60f04044c8c3b8650980cae062" }, "downloads": -1, "filename": "ai_integration-1.0.0.tar.gz", "has_sig": false, "md5_digest": "d0a4c4a00f765cf7c7f93b811eb95322", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7034, "upload_time": "2019-03-15T07:29:35", "url": "https://files.pythonhosted.org/packages/88/78/4811355f83f1d08a8a87475ff512f2d468f71dbd8883a2b5a24bcf4b9078/ai_integration-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "efda6fb905dc21013e857fa9f2c96d3e", "sha256": "fd00010c7386c306cfc9e59704872b6333cb7baacba7b017d197f64733fa9b1b" }, "downloads": -1, "filename": "ai_integration-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "efda6fb905dc21013e857fa9f2c96d3e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 13208, "upload_time": "2019-03-15T07:50:35", "url": "https://files.pythonhosted.org/packages/1e/46/aac9f1ad78987d8ec3ed74cb2b666c5622ffec4adc51a0baae3cae9943c3/ai_integration-1.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6df9ab7da7519615ca39707433b4b92", "sha256": "e14ef94130b0ba21e288923d15f3ddede19433de7baa2627fe73670ea91fab8f" }, "downloads": -1, "filename": "ai_integration-1.0.1.tar.gz", "has_sig": false, "md5_digest": "b6df9ab7da7519615ca39707433b4b92", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7024, "upload_time": "2019-03-15T07:50:37", "url": "https://files.pythonhosted.org/packages/6b/f2/c6482fc2261364953504f32fe053318c5ffd488cfe314d7c21549c270b75/ai_integration-1.0.1.tar.gz" } ], "1.0.10": [ { "comment_text": "", "digests": { "md5": "0427a3918cdedb10cdafb0d66ca1a191", "sha256": "2cde93ebae490b68f6ef6a5725a9ea2221567d44f7750c637b3ef92e63f708f6" }, "downloads": -1, "filename": "ai_integration-1.0.10-py2-none-any.whl", "has_sig": false, "md5_digest": "0427a3918cdedb10cdafb0d66ca1a191", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156142, "upload_time": "2019-07-12T22:38:40", "url": "https://files.pythonhosted.org/packages/25/b2/e3f8b70d5fe84548c7ee1b4144e37e4a0047401b672b0a156329c41a5743/ai_integration-1.0.10-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8bd37f05855113f1714ba4aee3cb1f57", "sha256": "c50ae149e63c272cb688a4fcdef7aabdd1c8eb00ac7ee092945b405aed0599b9" }, "downloads": -1, "filename": "ai_integration-1.0.10.tar.gz", "has_sig": false, "md5_digest": "8bd37f05855113f1714ba4aee3cb1f57", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152185, "upload_time": "2019-07-12T22:38:41", "url": "https://files.pythonhosted.org/packages/49/0d/8fa1605891a807736867dade92c94d8de1cc036f73f4d2abc1cba5a1c10f/ai_integration-1.0.10.tar.gz" } ], "1.0.11": [ { "comment_text": "", "digests": { "md5": "e728283b574057240e2e755d17e281da", "sha256": "caedc587a2c17e5afe46d34dab1bb7de6c5184645268108df353aa1e7743b6f8" }, "downloads": -1, "filename": "ai_integration-1.0.11-py2-none-any.whl", "has_sig": false, "md5_digest": "e728283b574057240e2e755d17e281da", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156333, "upload_time": "2019-07-14T22:35:57", "url": "https://files.pythonhosted.org/packages/68/09/991203b7bb53e2db28be6af7d74cfc87188214d4cf1ac98df17a1890b07f/ai_integration-1.0.11-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8fa33da5ac0803fa4b916984c379db83", "sha256": "63522d885609e420a80c84df17ca6b07da8f4eccab1bf2c959f9a6ab799dbc6c" }, "downloads": -1, "filename": "ai_integration-1.0.11.tar.gz", "has_sig": false, "md5_digest": "8fa33da5ac0803fa4b916984c379db83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152372, "upload_time": "2019-07-14T22:35:59", "url": "https://files.pythonhosted.org/packages/4a/3e/0dcb617db670bb661bc57cb6afaaa1add5375590c996953b4fa272cf7297/ai_integration-1.0.11.tar.gz" } ], "1.0.12": [ { "comment_text": "", "digests": { "md5": "985d9bc106662b896d479873c3206f35", "sha256": "433a34bea0fe678aa4c4d5e6d2dd2d1eeceb0b3d676da1dc2e6933781ce8bc92" }, "downloads": -1, "filename": "ai_integration-1.0.12-py2-none-any.whl", "has_sig": false, "md5_digest": "985d9bc106662b896d479873c3206f35", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156375, "upload_time": "2019-08-06T04:29:03", "url": "https://files.pythonhosted.org/packages/29/4e/d71bbbc6b27f4c6342d76c70d20bff3a8fc9204e1f114a520f8daffff5de/ai_integration-1.0.12-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b4c5bd52a39e091a31564738853df3f8", "sha256": "95e4201e497f4dbb1de7fff8b34bfba1bdc621a2a95cec9f0ef214af24f77a73" }, "downloads": -1, "filename": "ai_integration-1.0.12.tar.gz", "has_sig": false, "md5_digest": "b4c5bd52a39e091a31564738853df3f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152410, "upload_time": "2019-08-06T04:29:07", "url": "https://files.pythonhosted.org/packages/4b/31/d1f1778a263f2a5a1c5826dc8544acb318f1842c84c5c7b13c03dff727ba/ai_integration-1.0.12.tar.gz" } ], "1.0.13": [ { "comment_text": "", "digests": { "md5": "dc4ad311f98c39e068436109884b3e80", "sha256": "3772604e663c38cc65ef2aa0fd1c373636189d8ab15d45870d7a749f02514789" }, "downloads": -1, "filename": "ai_integration-1.0.13-py2-none-any.whl", "has_sig": false, "md5_digest": "dc4ad311f98c39e068436109884b3e80", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156398, "upload_time": "2019-08-06T04:39:58", "url": "https://files.pythonhosted.org/packages/0e/62/e6b3ed8f52bec410b23fcade44d07c994fc3f3b1393178c7a2fc0e656b18/ai_integration-1.0.13-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "10ba6cc9dd1d7bf3fd6f50b2be3e668d", "sha256": "82df1525e475a0faeb72a783bcfb562ca8834686f3918a71b9f2985baf671be1" }, "downloads": -1, "filename": "ai_integration-1.0.13.tar.gz", "has_sig": false, "md5_digest": "10ba6cc9dd1d7bf3fd6f50b2be3e668d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152439, "upload_time": "2019-08-06T04:40:01", "url": "https://files.pythonhosted.org/packages/ee/d5/641475261d8813c352f00c9e73863fde18790708d84649512b2e05e19365/ai_integration-1.0.13.tar.gz" } ], "1.0.14": [ { "comment_text": "", "digests": { "md5": "f61d7fd438875bef79d2a1f78e2e73f5", "sha256": "e9321d8b7a11cc136f9e9229cfb33158f612d67987a4fa7e826a55727bcdac94" }, "downloads": -1, "filename": "ai_integration-1.0.14-py2-none-any.whl", "has_sig": false, "md5_digest": "f61d7fd438875bef79d2a1f78e2e73f5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156403, "upload_time": "2019-08-06T04:53:36", "url": "https://files.pythonhosted.org/packages/35/03/0470c725cadc0300855298ca1301e822951f15206e80e5f0c9591376670a/ai_integration-1.0.14-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6bf47ce04b577d19c72532a3c0b08707", "sha256": "050536d113ff221bfac70965ec7484fa444613fb9e281dc15ec578bd0f9ecd30" }, "downloads": -1, "filename": "ai_integration-1.0.14.tar.gz", "has_sig": false, "md5_digest": "6bf47ce04b577d19c72532a3c0b08707", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152437, "upload_time": "2019-08-06T04:53:45", "url": "https://files.pythonhosted.org/packages/0b/b3/397d431fccebbcfa8d21e8a67c5f37b92843bd835b9aa92d8ae60589980e/ai_integration-1.0.14.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "1c5ecf10ab8d03b422de2b6e2c68aad3", "sha256": "2bef555d217ab0703a1d8004a887929f883ea50426a7291aa882393ed24400bf" }, "downloads": -1, "filename": "ai_integration-1.0.15-py2-none-any.whl", "has_sig": false, "md5_digest": "1c5ecf10ab8d03b422de2b6e2c68aad3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156899, "upload_time": "2019-09-21T02:31:33", "url": "https://files.pythonhosted.org/packages/4c/7f/3064103a3d80bba2dd267d476cdcf3e90fe32ed6464721df00c90d0853a3/ai_integration-1.0.15-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b93aed0bb05d42e4fdf64de607ece5ae", "sha256": "54eba7643fba7024f48068f26b7ff1bcc8cfb663218a2b7ece95ab3bde4d0674" }, "downloads": -1, "filename": "ai_integration-1.0.15.tar.gz", "has_sig": false, "md5_digest": "b93aed0bb05d42e4fdf64de607ece5ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152922, "upload_time": "2019-09-21T02:31:35", "url": "https://files.pythonhosted.org/packages/c2/26/3d656d74c690286705e1745c750733404bfc0be1c7e7148e0d4212842285/ai_integration-1.0.15.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "218a95f178390a0a9e38c3ada924aba0", "sha256": "d1ff5d0fd5959b358c887d10514ecce1994a0d90f1f6bc63ca604e901c9bb4f1" }, "downloads": -1, "filename": "ai_integration-1.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "218a95f178390a0a9e38c3ada924aba0", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 13698, "upload_time": "2019-03-29T01:16:32", "url": "https://files.pythonhosted.org/packages/32/f1/4c9830be6cde5a80a471b42ae0bf6fb5ad7108321920c70f6b9f9cb86dc9/ai_integration-1.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7e6ef5b45f9a1a5fff379ed585d063a", "sha256": "777ec05ef9e14e375fa57b8919f1278978d27a43edd82c8eb7a8d3f30ed430b9" }, "downloads": -1, "filename": "ai_integration-1.0.2.tar.gz", "has_sig": false, "md5_digest": "e7e6ef5b45f9a1a5fff379ed585d063a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7656, "upload_time": "2019-03-29T01:16:35", "url": "https://files.pythonhosted.org/packages/f0/82/0da6fe03417b95c5cf1cad442e080af595d1607ec2fa7bfba9cd04386f06/ai_integration-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "8833657562ce00d9e1da64959ee33ae8", "sha256": "e7ef369c8b091661a1b9e980d94985cb42e50ff240d87dac34b09a398271e131" }, "downloads": -1, "filename": "ai_integration-1.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "8833657562ce00d9e1da64959ee33ae8", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 13672, "upload_time": "2019-03-29T01:53:27", "url": "https://files.pythonhosted.org/packages/9f/0b/fdc817c04edc242a1b34a787d9dcebba5feca2f7cbd5a60191198fd20c13/ai_integration-1.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72b50d6e8ffd5c838c561ec5a5c78edc", "sha256": "d0b957293ff3f8ad2fbfcf74d01ccd7ce4e680e90d4fc1137cc8c14822e23414" }, "downloads": -1, "filename": "ai_integration-1.0.3.tar.gz", "has_sig": false, "md5_digest": "72b50d6e8ffd5c838c561ec5a5c78edc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7636, "upload_time": "2019-03-29T01:53:29", "url": "https://files.pythonhosted.org/packages/d0/e9/4e588e77318497e8870029ceedf7b52c242b5deb3e7212782dbd04cab2de/ai_integration-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "238a45e7635afb756f0843fb71a72abe", "sha256": "f390b12eab6ee4a3c15a5518e4ab76644e874e8f1f2d1e5eb44fea3d60fa5bb9" }, "downloads": -1, "filename": "ai_integration-1.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "238a45e7635afb756f0843fb71a72abe", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15778, "upload_time": "2019-04-05T11:21:42", "url": "https://files.pythonhosted.org/packages/cc/0b/7e40361b29e4a5ffe983b219bd807013c79f604b38887c76be4ce80eedcf/ai_integration-1.0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3758158f7d0120f98ea1980562d55f38", "sha256": "ae0b9424235e070e79eff4183e06d01ffffa6a47cd15c9cb19a5ac685ea930f9" }, "downloads": -1, "filename": "ai_integration-1.0.4.tar.gz", "has_sig": false, "md5_digest": "3758158f7d0120f98ea1980562d55f38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12291, "upload_time": "2019-04-05T11:21:44", "url": "https://files.pythonhosted.org/packages/fd/cf/80101f005e427b5275c224ba95230abd72b47f65b0b31d566c4bfb42700d/ai_integration-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "f6534aeaee495c757b62855d723d5f7d", "sha256": "b415a901785acbe5ed07c2a8756be14f3d613b34c28358949ae2d4dbdddafac1" }, "downloads": -1, "filename": "ai_integration-1.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "f6534aeaee495c757b62855d723d5f7d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15777, "upload_time": "2019-04-05T11:45:33", "url": "https://files.pythonhosted.org/packages/cd/34/93fe02bddf5f27c0682023fd8b37d117ceb36e96580c106baeb8815bbf2b/ai_integration-1.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90fe793e4e76606c1ff6d643d3d88e30", "sha256": "1a271f7eb941470eb47e060598a60b57b7d5986262e978b80491d6d767c56c71" }, "downloads": -1, "filename": "ai_integration-1.0.5.tar.gz", "has_sig": false, "md5_digest": "90fe793e4e76606c1ff6d643d3d88e30", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12291, "upload_time": "2019-04-05T11:45:34", "url": "https://files.pythonhosted.org/packages/c8/51/6e017d334ee129c5bec1314c2801aef60daf696cbac7ea0214ffba92ed9c/ai_integration-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "16b0efcf4d5d69b5a7f400471fd01541", "sha256": "f4502d8c0317764b5ad87e30f6ca4305845ce5c119a48578f8348c734def329c" }, "downloads": -1, "filename": "ai_integration-1.0.6-py2-none-any.whl", "has_sig": false, "md5_digest": "16b0efcf4d5d69b5a7f400471fd01541", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15839, "upload_time": "2019-04-06T00:54:17", "url": "https://files.pythonhosted.org/packages/7b/d0/cd05563d319def1703bd73b53c75629e388f3625bd3882b52cc17d9cc1de/ai_integration-1.0.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "95ac37509b78dc82ed8d240de3bc7a70", "sha256": "8bfb20e20bf5f5bf012d6e39f96bf0b003c8eb267da45e84e34bb34759ac8bfd" }, "downloads": -1, "filename": "ai_integration-1.0.6.tar.gz", "has_sig": false, "md5_digest": "95ac37509b78dc82ed8d240de3bc7a70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12371, "upload_time": "2019-04-06T00:54:19", "url": "https://files.pythonhosted.org/packages/81/b3/3766128a2d666ea9ad03a00e414ebd334bebf43c4010b7f9d4326d826751/ai_integration-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "55ba1c0efbc90c238d9b3dcc7c18f515", "sha256": "2ba1612b6a0649c880c1c94c0a9218ebb26b74f1e7d911366db57054192badef" }, "downloads": -1, "filename": "ai_integration-1.0.7-py2-none-any.whl", "has_sig": false, "md5_digest": "55ba1c0efbc90c238d9b3dcc7c18f515", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 16294, "upload_time": "2019-06-12T03:30:17", "url": "https://files.pythonhosted.org/packages/a1/88/b68b00300d6a449f7fea11500933a3513a9551038fd7e8af9d687883654d/ai_integration-1.0.7-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "917f766a6b62b420d659e1290fc9609b", "sha256": "dd9092d9e9ccf1ad8f2ca0ec9bfabe134847b71ebe152bdf742b20953bc7fe4d" }, "downloads": -1, "filename": "ai_integration-1.0.7.tar.gz", "has_sig": false, "md5_digest": "917f766a6b62b420d659e1290fc9609b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12778, "upload_time": "2019-06-12T03:30:19", "url": "https://files.pythonhosted.org/packages/c6/f2/d22e8246a067c8d1593ef32f9c63b6ded58c6bcf86b3eb4d7650dd9531c4/ai_integration-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "78ec3edb4b0449baf23135d8645f168b", "sha256": "98f13e519e2e8b8bbbd4692d119c9763752f0764c54391b3ef4d24d5793890b1" }, "downloads": -1, "filename": "ai_integration-1.0.8-py2-none-any.whl", "has_sig": false, "md5_digest": "78ec3edb4b0449baf23135d8645f168b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 17501, "upload_time": "2019-07-10T00:47:40", "url": "https://files.pythonhosted.org/packages/e2/4c/136025bef99d3a9aa559f79edadf1f10a80912dc65748f2f85c2d1142bb6/ai_integration-1.0.8-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8cd7d794bf60326e4ac311a0072b24b4", "sha256": "46713c28853b499e474c9a2b6c8148e88d81320e3e2aaf56bff00f6544cc6b13" }, "downloads": -1, "filename": "ai_integration-1.0.8.tar.gz", "has_sig": false, "md5_digest": "8cd7d794bf60326e4ac311a0072b24b4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14645, "upload_time": "2019-07-10T00:47:42", "url": "https://files.pythonhosted.org/packages/48/68/2429d7c8bb307fc0d45f8bd2c091285e8c1488bd843b6a694d1c3b786e37/ai_integration-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "6e1b28a9df349563a9943421d59966ca", "sha256": "b5c1c2ff4324019da021830152482451af0d2da89290d3b097f6f9c9fb4539e3" }, "downloads": -1, "filename": "ai_integration-1.0.9-py2-none-any.whl", "has_sig": false, "md5_digest": "6e1b28a9df349563a9943421d59966ca", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 155880, "upload_time": "2019-07-12T08:41:00", "url": "https://files.pythonhosted.org/packages/cb/a2/dd3db9ffbb35143669d7a50c774f690d10c99146c973c909f92bb5b47360/ai_integration-1.0.9-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3cd40ce64c56466e6ae77f7dff1b28cf", "sha256": "a75e89dd633097c90d9a0da273386adcda1b0bc01583bfbe3ac05b58a08c86fb" }, "downloads": -1, "filename": "ai_integration-1.0.9.tar.gz", "has_sig": false, "md5_digest": "3cd40ce64c56466e6ae77f7dff1b28cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 151957, "upload_time": "2019-07-12T08:41:02", "url": "https://files.pythonhosted.org/packages/90/0c/db49e80d071682c64fd8fb983d4d00826f384e2c9faf18efb5b838dbadac/ai_integration-1.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1c5ecf10ab8d03b422de2b6e2c68aad3", "sha256": "2bef555d217ab0703a1d8004a887929f883ea50426a7291aa882393ed24400bf" }, "downloads": -1, "filename": "ai_integration-1.0.15-py2-none-any.whl", "has_sig": false, "md5_digest": "1c5ecf10ab8d03b422de2b6e2c68aad3", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 156899, "upload_time": "2019-09-21T02:31:33", "url": "https://files.pythonhosted.org/packages/4c/7f/3064103a3d80bba2dd267d476cdcf3e90fe32ed6464721df00c90d0853a3/ai_integration-1.0.15-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b93aed0bb05d42e4fdf64de607ece5ae", "sha256": "54eba7643fba7024f48068f26b7ff1bcc8cfb663218a2b7ece95ab3bde4d0674" }, "downloads": -1, "filename": "ai_integration-1.0.15.tar.gz", "has_sig": false, "md5_digest": "b93aed0bb05d42e4fdf64de607ece5ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 152922, "upload_time": "2019-09-21T02:31:35", "url": "https://files.pythonhosted.org/packages/c2/26/3d656d74c690286705e1745c750733404bfc0be1c7e7148e0d4212842285/ai_integration-1.0.15.tar.gz" } ] }