├── .gitignore ├── LICENSE ├── README.md ├── setup.py └── src ├── __init__.py └── pygpt.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | .idea/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Pawan Osman 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ***:warning: __This repository is deprecated and no longer maintained!__*** 2 | if you have a question about it you can join our Discord server. 3 | 4 | ### For support join [[Discord](https://discord.pawan.krd)] 5 | 6 | # PyGPT - Unofficial API client for ChatGPT [[Discord](https://discord.pawan.krd)] 7 | ### Other versions [[NodeJS Version](https://github.com/PawanOsman/chatgpt-io)][[C# Version](https://github.com/PawanOsman/ChatGPT.Net)] 8 | [![PyPi Version](https://img.shields.io/pypi/v/PyGPT.svg?label=PyPi&color=3775A9&logo=PyPI)](https://pypi.org/project/PyGPT) 9 | [![PyPi Downloads](https://img.shields.io/pypi/dm/PyGPT.svg?label=Downloads&color=3775A9&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKoSURBVEiJ7ZZLTBNRFIb/edDS6UNKVQgZAkJTlJdACoZgGhKj0QSNwUVxIbrRhSaasCJh58atcaExkYXogoRISF2UxJVReYkWK6gTB9KK1bZjBQlMNcz0ujAlJe3QamSl/+7m3PP995w592aAbRaVy6bqanujycZeSa4TKlGXo2qvKIpStlw2FwOdjnG5zvFnS+uMAIDJoci3icHoLQB/xwAATDYWBSX5AADOwiZyzaNz3fin+m/wDxhojSlTW19xgaXz9ACgqIpr05WkQOWb6dMNDVUHAUBJrP+Y9S/cBpA2vpo3udHpeNx0sqiNrzExFEVQWm8Gq/tVsLysIPxeBgB8nFtVfZ7o2MspwZWJo9kiKSwf9Xujs9YSHfY4d2zAAYArYFHRbEEhr4ffK71VgsvHtDiMVmBlZUXRMeaRRd9qZ+0RmzXVAAASCsHA5XcLkWC8XQiFlrQ4W37kQCAQlhbXOwd7hVBCIZvg/lFpms6nnYFAILwVQ7OCpGKxWMRssIhRUT60r73QCACeawuSbyTWN/XkzYts+RtTVNfc9ojhOCtREsxaJHhRFMXxZMzvEz163V7H0/uf+mhC6KBv7cbMjDCUCrLb7a3GorKbFEurqiwvvX7+7PAmp5YO93yPQEhXv5c4yivdmU7jbK0acLY57maKOcor3V39XtIjENLS4Z5PqyApmmHA6jkuE2R6XOjW6ARYPcfRTHrH0wxsNU5wFfarDcXFl7RgmZRnMO0urG3ewiChqgCQZ7HCdX2YB8D/jkGqiKqoaQbxr1+mPowO8Tv3HzCAYcDtKoEcDQGEgCviEZc+g6hKVrj0aiL+fSk2mVynPhV0dVPLeZ3B2ApCkcoTZ4bnHw6cAoCy490Pgp57naBI1p+E9TV5bG5m8g4yvEvbop+ZL/JtWVlNhAAAAABJRU5ErkJggg==)](https://pypi.org/project/PyGPT) 10 | [![GitHub issues](https://img.shields.io/github/issues/PawanOsman/PyGPT?label=Issues&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPlSURBVEiJtVRrbBRVFP7mzt153Nnd7i67dLfvdt1uW7ZUaLtBIVBjYjQBLGI1YviBGjX4Q6iJBiiiJmpIlKSJkGhUiCYGY4yJ4QcmJqhQomgLFZIWY2iFYAiPwm7Z99y5/ugrtbt0S/Qkk8ycc77vO+eeMxf4n01eQK7mstmeViS5JSOs8wDM/7IQqUpnxw80tWYPNC3P1OjGTwCkYoBFdeDVtOdfqgxu7jMvsws8Jq91VXrO3Y6NJTjvnw9LiuB3LJaVXXV25ly6ZhzNa+IIOpjDS9WdAEqKKfCOVqmxg18tu99cHWTi9m9EJPuJWB1k4pvlK80aZhyaDz/fETWucHnesjHufOzF62gOA5QCLi/HmQEbSaYRuJBMfAfg6l1VX6sbvxyLdoj1bZqwzpFZz4aoLo5FO0SYGYN3Re5WlKd21DXe7LrHJ4aOEHH1OBGRel1EQrq4doKIoSNEdIW8oqcimA5r7JlCPIWGzHxUfafd7XLVtsURrgHODAsYRhCGPYjTQwLhGqC2LY5lDrvqkOn7AFjRApWqvvfN0JLy3pu/Y+e23ERHJRKANCDSk+9Az3YTvek/0O3xu9oN54fFCtTVGvaNf1kx23NbMnDaJ5xlPkChHJyn4HVN+OwMeHZzDqPGOHyy7XEAdfMKVGnGwT3BpsAPZBSbOq1pf8AH1Ncy5MwMvO6Z/CcflPEju4btHr/Waji/vaOAU5YfeXRxWeTT2DDe3Z2B9K/L4NTgZVjchKFPOgQgTIK3t8r4TL+IB5izsUJRNhYSUBYp2v6HfaUed2MMLQ1zz44SC5TOdMUzBBDAkhoCI5TCKsMgi6j6EQB1jkC5xvbsDjYF9t0axBuvZueyA2iuz6E5lJv+thIz/+nrWyh6lRFs8/g9raxk35R/KqO8ye7Y3+A23Es7r2BVu8gr4PdytEc4KkoBK03Ak3Q6pqsSMrCQGNVwMWFGRrKpQwDGJQCo0tjRTyLtD+1NnpKOHs6A5Nmt8QTQ+sTEqvcfTkFN2SCs2UOyBLDulRxei4ex49qlXwcS8aisUdqx1ud/eVi6bnT33EJlIG/xUGxA34CEMp+FrvsIBJ9bhSQBoSoJX5xOojpn91+ycidJKVU/2FRW7eVVN7CiJT/5FPjL97L4fJeAMAvf8tFGAl6dwDqHS66W1Y+pndKSk8kruEGAF7q1wgpCQMgmhMQB8FmhDSsp/vzbwtmRiQ0biwM/0zHYiOShKW6eULPq+q08yqSxfMSAyKQhEklA5B++/TzBvUKgYTIuhMDZbEpkrWSfBEDWZbkzoGjRfGCVEJtTokbh1vLbcCr+fYzzrxeKW7D9Az4tT6FlbcIZAAAAAElFTkSuQmCC)](https://github.com/PawanOsman/PyGPT/issues) 11 | [![GitHub forks](https://img.shields.io/github/forks/PawanOsman/PyGPT?label=Forks&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAQ7SURBVEiJtZVZaFxVGMf/d19mbnMzk5lskzShmSS0Seto0xgliEFwaWmTPlhFiFIKpSLik1CLKGgVfPKhIj4oVSiVUI1GQytYrKYWbYpQa0vTdJLQmjQzk7mzpJnc9VwfpgmTmEmi0P/LvZxv+Z3vfGcB7rOogv8NNMe9yHN8BAC9MEiI6xBiT9im+Q2AK/8XUMkL4oWqusYayeNlljuZhu4mY5Mzc7OZG5ah9wBI/CcAL0j99c2te/4eu56wDCMBCqTAhwUotTRQKav+gDJ+/c9x09DbAKTWXYYgSjfCLdtdnuc/KDYRhuH2ezeo8fDWHTYniEPrzZ1fa4qiCXFACClWuus41mfG/Nxb2WQsq5aVtzAMswcAFEXpDoVCd4LB4G0A4ZUBBeIFYZAXpVGGYXYtt1mW9XFqJj5eVl6tMix3FABkWe46fOTNiu6evT5VVfsA1K8GEDleioRbHmrgOL53OYATxQO2bValZqYzguTxAahYsFEUjfaHOx7w+/0HVgMsblvXXbKFwXHcIUUp+VCSPUImmZhT/UEfgEcLfSRJAsUwwmqAYqqgaPZ9uISpra0RLVP38qIksCzbsFYguzBzx7EXB3lBggu3A6BfBogNAI5tXkxr6QHFI7+hlqhBhmVBMVz5egAK7Zrl5O4EKnzMwfRczpfLTKNpW3v1bFr7yHXzR2L69njc0HO74/H4MEAN+QAGS2+ClQF1VeInn77dJHe1qwBQldMJDr4bdc5d1gyXlq17fq7rEhsAmZ+f/10QpSiA5rWSL1QQ6WpXKQT2AXwl5NhxfPEOzTz5yk1Zpyvh8/lBCMEvqQRtGvoTAEzHdpRMMgHiWBt1XV8TkJcVz3+JCYoCvnyvDk3dwy7nKTcF0UPUQAXnLQ2cKoidrwjVP5XV4rn1AdI/LTH4Slhc+LyVev5wVNCyWQAAt0IChrL5NQHXojkc64shpxP07vSja4cKAAjXSrh0ouVfQad/TeHkaQ2yRCGmeVZtNGvbLv/0q1FI/jBohsHPR8dxqGcOr79UvWLAkWO3cPJHE2LpRjiOjfTUCLZ35S/WQDAIjmFeqK4OdQOAZZl3KFX13Krf0lHTs/sZKF4v+r7+DlMjQxjpb4XALz2H2bsOWvddRe3mx/Bszy4kkhoGBs9AT0+js7Nzrv+rU1lRlBZ7YlnmNGuYFFWiqni88xEAwKU/LmNiRMo27LyYYFnKLAQYFhFpOVjW2FCvRLbll+7sufMYuzqZ+X7g2yvJZHIvlj1GrOOQVErTQoM/nIWieDEaHYeWzMwa80YzABtLJYlyauzayE3l/G/DSCQ1zM5mYZjm6Gw201mkDVy7JHunNm150A23trnektI4x4n7izWNE4TXNqhlicatbe6mzREiSvIkgNZi/gs7IMSyfC9N04pp6icA/FUs4J4ivCA8RxxHs237OIDYGv73T/8AEAmYFH31lroAAAAASUVORK5CYII=)](https://github.com/PawanOsman/PyGPT/network) 12 | [![GitHub stars](https://img.shields.io/github/stars/PawanOsman/PyGPT?label=Stars&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPYSURBVEiJrZZdaFtlGMf/7/lKs6StadIm/UhOk9jFFvuxrdt0tEJjM0Sdil6oFwqKeCG72Xbj5lgR2cVAmSCCMEGcMtCbga7Fbc0KOkGkDETXbf1YsmZt0jZJm+yctuck57xedKZp2qQB91yd9/n68Rz+z3sOoZSiHHM6Dxh5Q8VbWY1k6qyp70dHRzPl1HFldQfQUCcMH/DK+ySV0FtR0yEAr5ZTx5STJHoDPW5rZu/Z12LcuTejfJVBe6HR4/c9MkCTNfPVEX+C/+98xJ8UWuzZrx8JwOXt666spA37u7WcL9Aqo4Kj+5ubA63/G2Ctxqcn3pMtcBmBhoqc/5g/wYv1yrZTlAT4fP2v2Kpp1zN71DWH3QDYBABAoE2GWdD37e7se6NUD0IphdP5XA1ls50g1NfcyPQSoGMpnbV1+TT+y+Mpa5U5T8o6Be5IwKoOSWFwarBO+228QnnnWWnkg5ceXDj5bc30d8PmpK7TVCQSnCEub9/7Dit3tnevSXhc3MF5RSPcjVmIlhvgi4l4WVuDbGGRJI/4Kqd/dLFWCS3wn5P2jn7p2oVWk82S101LAis3Sk0OjEuArBUNyyqDp840rzA8h9nbU6sF4TK22yqUDAdv74BBoGPM3BJ98djpkPTnX/J6lJQuBgBY+KKhy2MmfDJkS84tsC8z96eGx6NRvevwQCh9fVQqH8AQgN8swl9umnDy57r4wiJ9MhIJzjAAMD0dnLof1zqOng4vjvyRXgOQMq4pgWw4Dv1jxqlLtfPxRdIeDv8aBfL2YPZu8F50Vmv/8My95GRYAVhrGYD1CcIJHh8P1can0xXtodBILDdofn4kEpyZmdPevngloYNvAARPaUB2XQyDN800IZHDscnL8/kpW2wysxxbUCh41/YAVc89pldYoqrs5m6FDl5Au89jZsE7AS1RNqDNocDtyAS2BYj1TH+L2wiY/QDvAUgROT7IbliXVocCnqU92wK0LHa1iAaAqwH0FGBoy8UUlUBaeaicuLqhzlObQUpmmgr7bdJiWqa2xvpKQJl4mFGLyVknBr5IL43d5VIsSxWLmToGDqpVPd71zzLHUFQbNd7t7nssFBpZ2hLQ0vK8wVxJGAIFWPoBs/MZfHZuRv99VI3H4vy74alrgwAgiv49J36yn7dXZncePxjndrvWrhqzkVKVEDuAHIAU/lV07uofO+Sv3qlpFFevS7K0rB+9c6v3G0oHdBRYU3P/0x575ryrJiM2WLK48rcpnpLgCYVGVosCRLHXojHC6yCQjazhx4mJIaWwcaG5vH3dlLJPcFS7lP96AOBfSCCA1HW3a3EAAAAASUVORK5CYII=)](https://github.com/PawanOsman/PyGPT/stargazers) 13 | [![GitHub license](https://img.shields.io/github/license/PawanOsman/PyGPT?label=License&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAsQAAALEBxi1JjQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAQrSURBVEiJpZVvbFNVGMZ/t/e2ZW2XDUZvhwLt1rUyYOA2FJNFiRsYjREGBlCmJgiOPzKDET4gBqaSoEGREOOiY5kRI2QxETUyAigxCskQmQaSwcKEjsJYN7uO/W3Xe48fll3ZGCvom5zkzXnu+/zuveec90gMD8scn78uApPtDrvGGCFJkmQdl2QzyYoZIbSBaPTImd/qnh2rxpLv9V0q8k8T39UeFd0DIuHojAkR7B0cS54riQL3jTRVhszzMrPOr3/4EW8w0mGIf9TXU1VZiaaN/jGqy0XZm9uRZRnVlW4CUoDrIwGWfG9WQ9ncgsxC/wNU150yxE8rKigsXsX4NOeogK8qP6Cp8QL+7Bl3/C1Knt//g97Xn3k62MzpYDNnWq7xfPZ0AJxOJ8e+/ZLX33qfg59/Qke4fVhx08VzpKSOv6M5gNKnmD01P9YaE86JThzJyQC8vWMHV5ubmTI5iXWrS+jr7xtW7EjejDklbWyAySSLjIzMUUVJkpjqdgOQPmnSbbomoCs+mPunz9CBjpHPmMbE30NkT88RgDRyfmgX0REOU11VmdCoaMETzH4wF4DAlctU7/uYQNNFVDlgnffQ/Zd6+uPHtLh+ob6hbSugGQBHcjKPF81PCHC7PUa+ecOLbFnlxbPIizs9B60rbDvf2L7o0InAwp7egVBjILLbAJjNZnLz8hMChqJi7y5m+2zMmuZi0ztHuNYSQdN0li9ws+mlHOnwyeC21FTbCQMQam3ljY1lCY1Xl65Fdbn4/ZcaDux5iqVrDrKy0EW+z4MuBNv2nUVNs/H9nvkpT756tNYAqC4X+w/U3NXbd0YiIFno6okhBgbI9w2eBZMksXmZm61fNFCQOwmrRQ4ZgPa2NvZ+9GFC82eKF+PxZCDLErJJIq7pw3RNEyiyCUWR0AUWAzAhLY2Vr5QmBKiqixst1+nu7sVqUUidkMzxsyHm56nEBnTK9//F2pI5hDujaJpmNwAmk4nxCY49gNVqxZvlo3jFRsreraZi50LKd//EwT3n0HWddUtnkZs9kcLS2vb6hrZ50oyZsxrr6v/0hVpb2VG+LSFg+YoSCh59bDBfVEjpYhWX087cmSp94RAn61uo/fWa+OZEYO3lYOdnBiCh8yhxozXE8oVF5KT3cjMG4Ug/CiJ2+sLf793sjpUDQklkMlY4VRWPewpblgi6++KkOsxUHb4SPX6m5WdAwC2tItLRQXVVJUIIw8But7Nm/Ya7gplMEop8e2szADa7nbz8Oej6v9vO7nAkNJYVCztrLnEjmqY3njsVmOqyOYH4kP6/1kATcL6xievBqwgtHl329IIMoAA4NARRYrGoFo/HUZT/thzuTC/uTC+vvfyCxGC7/vpWXenq6d4+Nzdn17ikJOu9GEuSJFmsNrusyIoQQotFo7WMuPAB/gHPaKaziaM8GAAAAABJRU5ErkJggg==)](https://github.com/PawanOsman/PyGPT) 14 | [![Discord server](https://img.shields.io/discord/1055397662976905229?label=Discord&color=5865F2&logo=discord&logoColor=white)](https://discord.pawan.krd) 15 | 16 | ## [Check the new Google Bard Chatbot!](https://github.com/PawanOsman/GoogleBard) 17 | 18 | ## Get Started 19 | # Install dependencies first 20 | ```bash 21 | pip install --upgrade PyGPT 22 | ``` 23 | 24 | ## Example 25 | 26 | ```python 27 | import asyncio 28 | from pygpt import PyGPT 29 | 30 | async def main(): 31 | chat_gpt = PyGPT('eyJhbGciOiJkaXIiLCJlbmMiOiJBMR0NN....') 32 | await chat_gpt.connect() 33 | await chat_gpt.wait_for_ready() 34 | answer = await chat_gpt.ask('What is the capital of France?') 35 | print(answer) 36 | await chat_gpt.disconnect() 37 | 38 | if __name__ == '__main__': 39 | asyncio.run(main()) 40 | ``` 41 | 42 | 43 | ### For multiple queries 44 | 45 | ```python 46 | import asyncio 47 | from pygpt import PyGPT 48 | 49 | async def main(): 50 | chat_gpt = PyGPT('eyJhbGciOiJkaXIiLCJlbmMiOiJBMR0NN....') 51 | await chat_gpt.connect() 52 | await chat_gpt.wait_for_ready() 53 | questions = ["how are you", "where do you live", "what do you do"] 54 | for question in questions: 55 | answer = await chat_gpt.ask(question) 56 | print(answer) 57 | await chat_gpt.disconnect() 58 | 59 | if name == 'main': 60 | asyncio.run(main()) 61 | ``` 62 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import find_packages 2 | from setuptools import setup 3 | 4 | setup( 5 | name="PyGPT", 6 | version="1.0.5", 7 | license="MIT License", 8 | author="Pawan Osman", 9 | author_email="contact@pawan.krd", 10 | description="Python implementation of Unofficial ChatGPT Client", 11 | packages=find_packages("src"), 12 | package_dir={"": "src"}, 13 | py_modules=["pygpt"], 14 | url="https://github.com/PawanOsman/PyGPT", 15 | install_requires=[ 16 | "asyncio", 17 | "python-socketio[asyncio_client]", 18 | ], 19 | long_description=open("README.md", encoding="utf-8").read(), 20 | long_description_content_type="text/markdown" 21 | ) 22 | -------------------------------------------------------------------------------- /src/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PawanOsman/PyGPT/529df662841971b981da99523dc3bb5188404221/src/__init__.py -------------------------------------------------------------------------------- /src/pygpt.py: -------------------------------------------------------------------------------- 1 | import os 2 | import time 3 | import uuid 4 | import json 5 | import base64 6 | import asyncio 7 | import socketio 8 | import datetime 9 | import threading 10 | 11 | 12 | class PyGPT: 13 | def __init__(self, session_token, timeout=120, bypass_node='https://gpt.pawan.krd', pro_account=False, 14 | name="default"): 15 | self.ready = False 16 | self.socket = socketio.AsyncClient() 17 | self.socket.on('connect', self.on_connect) 18 | self.socket.on('disconnect', self.on_disconnect) 19 | self.socket.on('serverMessage', print) 20 | self.session_token = session_token 21 | self.conversations = [] 22 | self.pro_account = pro_account 23 | self.expires = datetime.datetime.now() 24 | self.auth = None 25 | self.timeout = timeout 26 | self.bypass_node = bypass_node 27 | self.pause_token_checks = True 28 | self.filepath = f'{name}-PyGPT.json' 29 | self.load() 30 | asyncio.create_task(self.cleanup_conversations()) 31 | thread = threading.Thread(target=self.save_interval) 32 | thread.start() 33 | 34 | def save(self): 35 | data = { 36 | 'session_token': self.session_token, 37 | 'conversations': self.conversations, 38 | 'proAccount': self.pro_account, 39 | 'expires': self.expires.isoformat(), 40 | 'auth': self.auth, 41 | } 42 | for conversation in self.conversations: 43 | conversation['conversation_id'] = str(conversation['conversation_id']) 44 | conversation['parent_id'] = str(conversation['parent_id']) 45 | conversation['last_active'] = conversation['last_active'].isoformat() 46 | with open(self.filepath, 'w') as f: 47 | json.dump(data, f, indent=4) 48 | 49 | def load(self): 50 | if os.path.exists(self.filepath): 51 | with open(self.filepath, 'r') as f: 52 | data = json.load(f) 53 | self.session_token = data['session_token'] 54 | self.conversations = data['conversations'] 55 | self.pro_account = data['proAccount'] 56 | self.expires = datetime.datetime.fromisoformat(data['expires']) 57 | self.auth = data['auth'] 58 | time.sleep(1) 59 | self.pause_token_checks = False 60 | if self.auth: 61 | self.ready = True 62 | else: 63 | time.sleep(1) 64 | self.pause_token_checks = False 65 | 66 | def save_interval(self): 67 | while True: 68 | time.sleep(60) 69 | self.save() 70 | 71 | async def connect(self): 72 | await self.socket.connect(f'{self.bypass_node}/?client=python&version=1.0.5&versionCode=105') 73 | 74 | async def disconnect(self): 75 | await self.socket.disconnect() 76 | 77 | def on_connect(self): 78 | print('Connected to server') 79 | asyncio.create_task(self.check_tokens()) 80 | 81 | def on_disconnect(self): 82 | print('Disconnected from server') 83 | self.ready = False 84 | 85 | async def check_tokens(self): 86 | while True: 87 | if self.pause_token_checks: 88 | await asyncio.sleep(0.5) 89 | continue 90 | self.pause_token_checks = True 91 | now = datetime.datetime.utcnow() 92 | offset = datetime.timedelta(minutes=2) 93 | if self.expires < (now - offset) or not self.auth: 94 | print('Token expired, getting new token') 95 | await self.get_tokens() 96 | self.pause_token_checks = False 97 | await asyncio.sleep(0.5) 98 | 99 | async def cleanup_conversations(self): 100 | while True: 101 | await asyncio.sleep(60) 102 | now = datetime.datetime.now() 103 | self.conversations = [c for c in self.conversations if 104 | now - c['last_active'] < datetime.timedelta(minutes=2)] 105 | 106 | def add_conversation(self, conv_id): 107 | conversation = { 108 | 'id': conv_id, 109 | 'conversation_id': None, 110 | 'parent_id': uuid.uuid4(), 111 | 'last_active': datetime.datetime.now() 112 | } 113 | self.conversations.append(conversation) 114 | self.save() 115 | return conversation 116 | 117 | def get_conversation_by_id(self, conv_id): 118 | conversation = next((c for c in self.conversations if c['id'] == conv_id), None) 119 | if conversation is None: 120 | conversation = self.add_conversation(conv_id) 121 | else: 122 | conversation['last_active'] = datetime.datetime.now() 123 | return conversation 124 | 125 | async def wait_for_ready(self): 126 | while not self.ready: 127 | await asyncio.sleep(0.025) 128 | print('Ready!!') 129 | 130 | async def ask(self, prompt, conv_id='default'): 131 | if not self.auth or not self.validate_token(): 132 | print('Token expired, getting new token') 133 | await self.get_tokens() 134 | conversation = self.get_conversation_by_id(conv_id) 135 | 136 | eventName = 'askQuestion' if not self.pro_account else 'askQuestionPro' 137 | 138 | # Fix for timeout issue by Ulysses0817: https://github.com/Ulysses0817 139 | data = await self.socket.call(event=eventName, data={ 140 | 'prompt': prompt, 141 | 'parentId': str(conversation['parent_id']), 142 | 'conversationId': str(conversation['conversation_id']), 143 | 'auth': self.auth 144 | }, timeout=self.timeout) 145 | 146 | if 'error' in data: 147 | print(f'Error: {data["error"]}') 148 | conversation['parent_id'] = data['messageId'] 149 | conversation['conversation_id'] = data['conversationId'] 150 | return data['answer'] 151 | 152 | def validate_token(self): 153 | if not self.auth: 154 | return False 155 | parsed = json.loads(base64.b64decode(f'{self.auth.split(".")[1]}==').decode()) 156 | return datetime.datetime.now() <= datetime.datetime.fromtimestamp(parsed['exp']) 157 | 158 | async def get_tokens(self): 159 | print('Getting tokens...') 160 | await asyncio.sleep(1) 161 | # Fix for timeout issue by Ulysses0817: https://github.com/Ulysses0817 162 | data = await self.socket.call(event='getSession', data=self.session_token, timeout=self.timeout) 163 | 164 | if 'error' in data: 165 | print(f'Error getting session: {data["error"]}') 166 | else: 167 | self.auth = data['auth'] 168 | self.expires = datetime.datetime.strptime(data['expires'], '%Y-%m-%dT%H:%M:%S.%fZ') 169 | self.session_token = data['sessionToken'] 170 | self.ready = True 171 | self.save() --------------------------------------------------------------------------------