From 5aeed7f0cc20ab14602e234b26999970ad4bdf49 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 26 May 2024 01:21:00 +0900 Subject: [PATCH 01/36] feat: git ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file From dc446df5cfb9a5ada29d7ab3f3754c087568250b Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 17:22:26 +0900 Subject: [PATCH 02/36] debug: --- .github/workflows/ci.yml | 21 ++ poetry.lock | 680 +++++++++++++++++++++++++++++++++++++++ pyproject.toml | 16 + run_gemini.py | 134 ++++++++ 4 files changed, 851 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 run_gemini.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5b58246 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,21 @@ +name: test +run-name: ${{ github.actor }} runs test +on: + pull_request: + types: [opened] +jobs: + check-bats-version: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install poetry + poetry install + - name: Run review + run: poetry run python run_gemini.py diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..92e5fd7 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,680 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "google-ai-generativelanguage" +version = "0.6.4" +description = "Google Ai Generativelanguage API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-ai-generativelanguage-0.6.4.tar.gz", hash = "sha256:1750848c12af96cb24ae1c3dd05e4bfe24867dc4577009ed03e1042d8421e874"}, + {file = "google_ai_generativelanguage-0.6.4-py3-none-any.whl", hash = "sha256:730e471aa549797118fb1c88421ba1957741433ada575cf5dd08d3aebf903ab1"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" + +[[package]] +name = "google-api-core" +version = "2.19.0" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, + {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-api-python-client" +version = "2.130.0" +description = "Google API Client Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-python-client-2.130.0.tar.gz", hash = "sha256:2bba3122b82a649c677b8a694b8e2bbf2a5fbf3420265caf3343bb88e2e9f0ae"}, + {file = "google_api_python_client-2.130.0-py2.py3-none-any.whl", hash = "sha256:7d45a28d738628715944a9c9d73e8696e7e03ac50b7de87f5e3035cefa94ed3a"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + +[[package]] +name = "google-auth" +version = "2.29.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = false +python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, +] + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-generativeai" +version = "0.5.4" +description = "Google Generative AI High level API client library and tools." +optional = false +python-versions = ">=3.9" +files = [ + {file = "google_generativeai-0.5.4-py3-none-any.whl", hash = "sha256:036d63ee35e7c8aedceda4f81c390a5102808af09ff3a6e57e27ed0be0708f3c"}, +] + +[package.dependencies] +google-ai-generativelanguage = "0.6.4" +google-api-core = "*" +google-api-python-client = "*" +google-auth = ">=2.15.0" +protobuf = "*" +pydantic = "*" +tqdm = "*" +typing-extensions = "*" + +[package.extras] +dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "pyyaml"] + +[[package]] +name = "googleapis-common-protos" +version = "1.63.0" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, + {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, +] + +[package.dependencies] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "grpcio" +version = "1.64.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "grpcio-1.64.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3b09c3d9de95461214a11d82cc0e6a46a6f4e1f91834b50782f932895215e5db"}, + {file = "grpcio-1.64.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:7e013428ab472892830287dd082b7d129f4d8afef49227a28223a77337555eaa"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:02cc9cc3f816d30f7993d0d408043b4a7d6a02346d251694d8ab1f78cc723e7e"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f5de082d936e0208ce8db9095821361dfa97af8767a6607ae71425ac8ace15c"}, + {file = "grpcio-1.64.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b7bf346391dffa182fba42506adf3a84f4a718a05e445b37824136047686a1"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2cbdfba18408389a1371f8c2af1659119e1831e5ed24c240cae9e27b4abc38d"}, + {file = "grpcio-1.64.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca4f15427d2df592e0c8f3d38847e25135e4092d7f70f02452c0e90d6a02d6d"}, + {file = "grpcio-1.64.0-cp310-cp310-win32.whl", hash = "sha256:7c1f5b2298244472bcda49b599be04579f26425af0fd80d3f2eb5fd8bc84d106"}, + {file = "grpcio-1.64.0-cp310-cp310-win_amd64.whl", hash = "sha256:73f84f9e5985a532e47880b3924867de16fa1aa513fff9b26106220c253c70c5"}, + {file = "grpcio-1.64.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2a18090371d138a57714ee9bffd6c9c9cb2e02ce42c681aac093ae1e7189ed21"}, + {file = "grpcio-1.64.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59c68df3a934a586c3473d15956d23a618b8f05b5e7a3a904d40300e9c69cbf0"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b52e1ec7185512103dd47d41cf34ea78e7a7361ba460187ddd2416b480e0938c"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d598b5d5e2c9115d7fb7e2cb5508d14286af506a75950762aa1372d60e41851"}, + {file = "grpcio-1.64.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01615bbcae6875eee8091e6b9414072f4e4b00d8b7e141f89635bdae7cf784e5"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0b2dfe6dcace264807d9123d483d4c43274e3f8c39f90ff51de538245d7a4145"}, + {file = "grpcio-1.64.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7f17572dc9acd5e6dfd3014d10c0b533e9f79cd9517fc10b0225746f4c24b58e"}, + {file = "grpcio-1.64.0-cp311-cp311-win32.whl", hash = "sha256:6ec5ed15b4ffe56e2c6bc76af45e6b591c9be0224b3fb090adfb205c9012367d"}, + {file = "grpcio-1.64.0-cp311-cp311-win_amd64.whl", hash = "sha256:597191370951b477b7a1441e1aaa5cacebeb46a3b0bd240ec3bb2f28298c7553"}, + {file = "grpcio-1.64.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:1ce4cd5a61d4532651079e7aae0fedf9a80e613eed895d5b9743e66b52d15812"}, + {file = "grpcio-1.64.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:650a8150a9b288f40d5b7c1d5400cc11724eae50bd1f501a66e1ea949173649b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8de0399b983f8676a7ccfdd45e5b2caec74a7e3cc576c6b1eecf3b3680deda5e"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8b43ba6a2a8f3103f103f97996cad507bcfd72359af6516363c48793d5a7b"}, + {file = "grpcio-1.64.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a54362f03d4dcfae63be455d0a7d4c1403673498b92c6bfe22157d935b57c7a9"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1f8ea18b928e539046bb5f9c124d717fbf00cc4b2d960ae0b8468562846f5aa1"}, + {file = "grpcio-1.64.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c56c91bd2923ddb6e7ed28ebb66d15633b03e0df22206f22dfcdde08047e0a48"}, + {file = "grpcio-1.64.0-cp312-cp312-win32.whl", hash = "sha256:874c741c8a66f0834f653a69e7e64b4e67fcd4a8d40296919b93bab2ccc780ba"}, + {file = "grpcio-1.64.0-cp312-cp312-win_amd64.whl", hash = "sha256:0da1d921f8e4bcee307aeef6c7095eb26e617c471f8cb1c454fd389c5c296d1e"}, + {file = "grpcio-1.64.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:c46fb6bfca17bfc49f011eb53416e61472fa96caa0979b4329176bdd38cbbf2a"}, + {file = "grpcio-1.64.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d2004e85cf5213995d09408501f82c8534700d2babeb81dfdba2a3bff0bb396"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6d5541eb460d73a07418524fb64dcfe0adfbcd32e2dac0f8f90ce5b9dd6c046c"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f279ad72dd7d64412e10f2443f9f34872a938c67387863c4cd2fb837f53e7d2"}, + {file = "grpcio-1.64.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85fda90b81da25993aa47fae66cae747b921f8f6777550895fb62375b776a231"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a053584079b793a54bece4a7d1d1b5c0645bdbee729215cd433703dc2532f72b"}, + {file = "grpcio-1.64.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:579dd9fb11bc73f0de061cab5f8b2def21480fd99eb3743ed041ad6a1913ee2f"}, + {file = "grpcio-1.64.0-cp38-cp38-win32.whl", hash = "sha256:23b6887bb21d77649d022fa1859e05853fdc2e60682fd86c3db652a555a282e0"}, + {file = "grpcio-1.64.0-cp38-cp38-win_amd64.whl", hash = "sha256:753cb58683ba0c545306f4e17dabf468d29cb6f6b11832e1e432160bb3f8403c"}, + {file = "grpcio-1.64.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:2186d76a7e383e1466e0ea2b0febc343ffeae13928c63c6ec6826533c2d69590"}, + {file = "grpcio-1.64.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0f30596cdcbed3c98024fb4f1d91745146385b3f9fd10c9f2270cbfe2ed7ed91"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:d9171f025a196f5bcfec7e8e7ffb7c3535f7d60aecd3503f9e250296c7cfc150"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf4c8daed18ae2be2f1fc7d613a76ee2a2e28fdf2412d5c128be23144d28283d"}, + {file = "grpcio-1.64.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3550493ac1d23198d46dc9c9b24b411cef613798dc31160c7138568ec26bc9b4"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3161a8f8bb38077a6470508c1a7301cd54301c53b8a34bb83e3c9764874ecabd"}, + {file = "grpcio-1.64.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e8fabe2cc57a369638ab1ad8e6043721014fdf9a13baa7c0e35995d3a4a7618"}, + {file = "grpcio-1.64.0-cp39-cp39-win32.whl", hash = "sha256:31890b24d47b62cc27da49a462efe3d02f3c120edb0e6c46dcc0025506acf004"}, + {file = "grpcio-1.64.0-cp39-cp39-win_amd64.whl", hash = "sha256:5a56797dea8c02e7d3a85dfea879f286175cf4d14fbd9ab3ef2477277b927baa"}, + {file = "grpcio-1.64.0.tar.gz", hash = "sha256:257baf07f53a571c215eebe9679c3058a313fd1d1f7c4eede5a8660108c52d9c"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.64.0)"] + +[[package]] +name = "grpcio-status" +version = "1.62.2" +description = "Status proto mapping for gRPC" +optional = false +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.62.2.tar.gz", hash = "sha256:62e1bfcb02025a1cd73732a2d33672d3e9d0df4d21c12c51e0bbcaf09bab742a"}, + {file = "grpcio_status-1.62.2-py3-none-any.whl", hash = "sha256:206ddf0eb36bc99b033f03b2c8e95d319f0044defae9b41ae21408e7e0cda48f"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.62.2" +protobuf = ">=4.21.6" + +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "proto-plus" +version = "1.23.0" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, + {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" + +[package.extras] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pydantic" +version = "2.7.1" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, + {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.2" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, + {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0680b1f1f11fda801397de52c36ce38ef1c1dc841a0927a94f226dea29c3ae3d"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95b9d5e72481d3780ba3442eac863eae92ae43a5f3adb5b4d0a1de89d42bb250"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fcf5cd9c4b655ad666ca332b9a081112cd7a58a8b5a6ca7a3104bc950f2038"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b5155ff768083cb1d62f3e143b49a8a3432e6789a3abee8acd005c3c7af1c74"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553ef617b6836fc7e4df130bb851e32fe357ce36336d897fd6646d6058d980af"}, + {file = "pydantic_core-2.18.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b89ed9eb7d616ef5714e5590e6cf7f23b02d0d539767d33561e3675d6f9e3857"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:75f7e9488238e920ab6204399ded280dc4c307d034f3924cd7f90a38b1829563"}, + {file = "pydantic_core-2.18.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ef26c9e94a8c04a1b2924149a9cb081836913818e55681722d7f29af88fe7b38"}, + {file = "pydantic_core-2.18.2-cp310-none-win32.whl", hash = "sha256:182245ff6b0039e82b6bb585ed55a64d7c81c560715d1bad0cbad6dfa07b4027"}, + {file = "pydantic_core-2.18.2-cp310-none-win_amd64.whl", hash = "sha256:e23ec367a948b6d812301afc1b13f8094ab7b2c280af66ef450efc357d2ae543"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:219da3f096d50a157f33645a1cf31c0ad1fe829a92181dd1311022f986e5fbe3"}, + {file = "pydantic_core-2.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cc1cfd88a64e012b74e94cd00bbe0f9c6df57049c97f02bb07d39e9c852e19a4"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05b7133a6e6aeb8df37d6f413f7705a37ab4031597f64ab56384c94d98fa0e90"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:224c421235f6102e8737032483f43c1a8cfb1d2f45740c44166219599358c2cd"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b14d82cdb934e99dda6d9d60dc84a24379820176cc4a0d123f88df319ae9c150"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2728b01246a3bba6de144f9e3115b532ee44bd6cf39795194fb75491824a1413"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470b94480bb5ee929f5acba6995251ada5e059a5ef3e0dfc63cca287283ebfa6"}, + {file = "pydantic_core-2.18.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:997abc4df705d1295a42f95b4eec4950a37ad8ae46d913caeee117b6b198811c"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75250dbc5290e3f1a0f4618db35e51a165186f9034eff158f3d490b3fed9f8a0"}, + {file = "pydantic_core-2.18.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4456f2dca97c425231d7315737d45239b2b51a50dc2b6f0c2bb181fce6207664"}, + {file = "pydantic_core-2.18.2-cp311-none-win32.whl", hash = "sha256:269322dcc3d8bdb69f054681edff86276b2ff972447863cf34c8b860f5188e2e"}, + {file = "pydantic_core-2.18.2-cp311-none-win_amd64.whl", hash = "sha256:800d60565aec896f25bc3cfa56d2277d52d5182af08162f7954f938c06dc4ee3"}, + {file = "pydantic_core-2.18.2-cp311-none-win_arm64.whl", hash = "sha256:1404c69d6a676245199767ba4f633cce5f4ad4181f9d0ccb0577e1f66cf4c46d"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:fb2bd7be70c0fe4dfd32c951bc813d9fe6ebcbfdd15a07527796c8204bd36242"}, + {file = "pydantic_core-2.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6132dd3bd52838acddca05a72aafb6eab6536aa145e923bb50f45e78b7251043"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d904828195733c183d20a54230c0df0eb46ec746ea1a666730787353e87182"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9bd70772c720142be1020eac55f8143a34ec9f82d75a8e7a07852023e46617f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8ed04b3582771764538f7ee7001b02e1170223cf9b75dff0bc698fadb00cf3"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6dac87ddb34aaec85f873d737e9d06a3555a1cc1a8e0c44b7f8d5daeb89d86f"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ca4ae5a27ad7a4ee5170aebce1574b375de390bc01284f87b18d43a3984df72"}, + {file = "pydantic_core-2.18.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:886eec03591b7cf058467a70a87733b35f44707bd86cf64a615584fd72488b7c"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ca7b0c1f1c983e064caa85f3792dd2fe3526b3505378874afa84baf662e12241"}, + {file = "pydantic_core-2.18.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b4356d3538c3649337df4074e81b85f0616b79731fe22dd11b99499b2ebbdf3"}, + {file = "pydantic_core-2.18.2-cp312-none-win32.whl", hash = "sha256:8b172601454f2d7701121bbec3425dd71efcb787a027edf49724c9cefc14c038"}, + {file = "pydantic_core-2.18.2-cp312-none-win_amd64.whl", hash = "sha256:b1bd7e47b1558ea872bd16c8502c414f9e90dcf12f1395129d7bb42a09a95438"}, + {file = "pydantic_core-2.18.2-cp312-none-win_arm64.whl", hash = "sha256:98758d627ff397e752bc339272c14c98199c613f922d4a384ddc07526c86a2ec"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9fdad8e35f278b2c3eb77cbdc5c0a49dada440657bf738d6905ce106dc1de439"}, + {file = "pydantic_core-2.18.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1d90c3265ae107f91a4f279f4d6f6f1d4907ac76c6868b27dc7fb33688cfb347"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390193c770399861d8df9670fb0d1874f330c79caaca4642332df7c682bf6b91"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82d5d4d78e4448683cb467897fe24e2b74bb7b973a541ea1dcfec1d3cbce39fb"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4774f3184d2ef3e14e8693194f661dea5a4d6ca4e3dc8e39786d33a94865cefd"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4d938ec0adf5167cb335acb25a4ee69a8107e4984f8fbd2e897021d9e4ca21b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0e8b1be28239fc64a88a8189d1df7fad8be8c1ae47fcc33e43d4be15f99cc70"}, + {file = "pydantic_core-2.18.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:868649da93e5a3d5eacc2b5b3b9235c98ccdbfd443832f31e075f54419e1b96b"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:78363590ef93d5d226ba21a90a03ea89a20738ee5b7da83d771d283fd8a56761"}, + {file = "pydantic_core-2.18.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:852e966fbd035a6468fc0a3496589b45e2208ec7ca95c26470a54daed82a0788"}, + {file = "pydantic_core-2.18.2-cp38-none-win32.whl", hash = "sha256:6a46e22a707e7ad4484ac9ee9f290f9d501df45954184e23fc29408dfad61350"}, + {file = "pydantic_core-2.18.2-cp38-none-win_amd64.whl", hash = "sha256:d91cb5ea8b11607cc757675051f61b3d93f15eca3cefb3e6c704a5d6e8440f4e"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ae0a8a797a5e56c053610fa7be147993fe50960fa43609ff2a9552b0e07013e8"}, + {file = "pydantic_core-2.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:042473b6280246b1dbf530559246f6842b56119c2926d1e52b631bdc46075f2a"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a388a77e629b9ec814c1b1e6b3b595fe521d2cdc625fcca26fbc2d44c816804"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25add29b8f3b233ae90ccef2d902d0ae0432eb0d45370fe315d1a5cf231004b"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f459a5ce8434614dfd39bbebf1041952ae01da6bed9855008cb33b875cb024c0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eff2de745698eb46eeb51193a9f41d67d834d50e424aef27df2fcdee1b153845"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8309f67285bdfe65c372ea3722b7a5642680f3dba538566340a9d36e920b5f0"}, + {file = "pydantic_core-2.18.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f93a8a2e3938ff656a7c1bc57193b1319960ac015b6e87d76c76bf14fe0244b4"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:22057013c8c1e272eb8d0eebc796701167d8377441ec894a8fed1af64a0bf399"}, + {file = "pydantic_core-2.18.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfeecd1ac6cc1fb2692c3d5110781c965aabd4ec5d32799773ca7b1456ac636b"}, + {file = "pydantic_core-2.18.2-cp39-none-win32.whl", hash = "sha256:0d69b4c2f6bb3e130dba60d34c0845ba31b69babdd3f78f7c0c8fae5021a253e"}, + {file = "pydantic_core-2.18.2-cp39-none-win_amd64.whl", hash = "sha256:d9319e499827271b09b4e411905b24a426b8fb69464dfa1696258f53a3334641"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a1874c6dd4113308bd0eb568418e6114b252afe44319ead2b4081e9b9521fe75"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:ccdd111c03bfd3666bd2472b674c6899550e09e9f298954cfc896ab92b5b0e6d"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e18609ceaa6eed63753037fc06ebb16041d17d28199ae5aba0052c51449650a9"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e5c584d357c4e2baf0ff7baf44f4994be121e16a2c88918a5817331fc7599d7"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43f0f463cf89ace478de71a318b1b4f05ebc456a9b9300d027b4b57c1a2064fb"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e1b395e58b10b73b07b7cf740d728dd4ff9365ac46c18751bf8b3d8cca8f625a"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0098300eebb1c837271d3d1a2cd2911e7c11b396eac9661655ee524a7f10587b"}, + {file = "pydantic_core-2.18.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:36789b70d613fbac0a25bb07ab3d9dba4d2e38af609c020cf4d888d165ee0bf3"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f9a801e7c8f1ef8718da265bba008fa121243dfe37c1cea17840b0944dfd72c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3a6515ebc6e69d85502b4951d89131ca4e036078ea35533bb76327f8424531ce"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20aca1e2298c56ececfd8ed159ae4dde2df0781988c97ef77d5c16ff4bd5b400"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:223ee893d77a310a0391dca6df00f70bbc2f36a71a895cecd9a0e762dc37b349"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2334ce8c673ee93a1d6a65bd90327588387ba073c17e61bf19b4fd97d688d63c"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:cbca948f2d14b09d20268cda7b0367723d79063f26c4ffc523af9042cad95592"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b3ef08e20ec49e02d5c6717a91bb5af9b20f1805583cb0adfe9ba2c6b505b5ae"}, + {file = "pydantic_core-2.18.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6fdc8627910eed0c01aed6a390a252fe3ea6d472ee70fdde56273f198938374"}, + {file = "pydantic_core-2.18.2.tar.gz", hash = "sha256:2e29d20810dfc3043ee13ac7d9e25105799817683348823f305ab3f349b9386e"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "requests" +version = "2.32.2" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, + {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "tqdm" +version = "4.66.4" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, + {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "typing-extensions" +version = "4.12.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.0-py3-none-any.whl", hash = "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594"}, + {file = "typing_extensions-4.12.0.tar.gz", hash = "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8"}, +] + +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.12" +content-hash = "dffcf9c81663368a1c673ceab81f9f97a026ae39df4a620c5cfa797baf23b646" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..53f71a5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[tool.poetry] +name = "auto-reviewer" +version = "0.1.0" +description = "" +authors = ["agis09"] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.12" +google-generativeai = "^0.5.4" +python-dotenv = "^1.0.1" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/run_gemini.py b/run_gemini.py new file mode 100644 index 0000000..511e2e6 --- /dev/null +++ b/run_gemini.py @@ -0,0 +1,134 @@ +import google.generativeai as genai +import os +from dotenv import load_dotenv + +load_dotenv(override=True) + +genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) +model = genai.GenerativeModel("gemini-1.5-flash-latest") + + +def start_chat(content): + chat = model.start_chat() + response = chat.send_message( + content=content + ) + return response + + +content=""" +You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. The review should state what needs to be corrected and why for the areas that need to be corrected. Then, please output the review results in the following json format +```json +{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”} +``` +Results of git diff: +``` +diff --git a/chat.py b/chat.py +index 9797aaa..1291909 100644 +--- a/chat.py ++++ b/chat.py +@@ -75,19 +75,4 @@ def download_image(url, timeout=10):: return + return response.content + + +-# determine the filename of the image +-def make_filename(base_dir, number, url): +- ext = os.path.splitext(url)[1] # get extension +- filename = number + ext # make filename by number with extension +-filename = fullpath = os.path.splitext(url)[1 +- fullpath = os.path.join(base_dir, filename) +- return fullpath +- fullpath = os.path.join(base_dir, filename) +-# save image +-# Save an image +-def save_image(filename, image):. +- with open(filename, “wb”) as fout: +- fout.write(image) +-# save_image(filename, image) +-def save_image(filename, image) + client.run(os.environ[“DISCORD_API_TOKEN”]) +``` +```chat.py +import google.generativeai as genai +import os +import discord +import requests +from PIL import Image +from io import BytesIO +from dotenv import load_dotenv + +load_dotenv(override=True) + +intents = discord.Intents.all() +client = discord.Client(intents=intents) + +genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) +model = genai.GenerativeModel("gemini-1.0-pro-vision-latest") + +chat = None + + +def init_chat(): + global chat + chat = model.start_chat() + response = chat.send_message( + content="You are a excellent chat bot. Please chat me in Japanese!" + ) + + +@client.event +async def on_ready(): + # init_chat() + print(f"{client.user.name} is online!") + + +@client.event +async def on_message(message): + print(f"Message received from {message.author}") + if message.author == client.user or not (str(client.user.id) in message.content): + return + + content = message.content.strip() + content = content.replace(f"<@{str(client.user.id)}> ", "") + print(f"content: {content}") + attachments = message.attachments + + if content == "reflesh": + init_chat() + await message.reply("refleshed chat !!!!") + + elif attachments: + print(attachments) + img_url = attachments[0].url + res = requests.get(img_url) + img = Image.open(BytesIO(res.content)) + response = model.generate_content([img, content]) + + await message.reply(response.text) + + else: + # response = chat.send_message(content=[img, content]) + print(response.text) + await message.reply(response.text) + + +def download_image(url, timeout=10): + response = requests.get(url, allow_redirects=False, timeout=timeout) + if response.status_code != 200: + e = Exception("HTTP status: " + response.status_code) + raise e + + content_type = response.headers["content-type"] + if "image" not in content_type: + e = Exception("Content-Type: " + content_type) + raise e + + return response.content + + +client.run(os.environ["DISCORD_API_TOKEN"]) +``` +No additional text is required. Only output the above json format. +""" +res=start_chat(content) +print(res.text) From e6175607d4fa25f9b65cc04e8e811bedd61be554 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 17:41:53 +0900 Subject: [PATCH 03/36] fix: --- run_gemini.py | 119 ++++---------------------------------------------- 1 file changed, 9 insertions(+), 110 deletions(-) diff --git a/run_gemini.py b/run_gemini.py index 511e2e6..c6de839 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -1,5 +1,6 @@ import google.generativeai as genai import os +import subprocess from dotenv import load_dotenv load_dotenv(override=True) @@ -10,125 +11,23 @@ def start_chat(content): chat = model.start_chat() - response = chat.send_message( - content=content - ) + response = chat.send_message(content=content) return response -content=""" +command = "git diff main..dev" +git_diff = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) + +content = f""" You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. The review should state what needs to be corrected and why for the areas that need to be corrected. Then, please output the review results in the following json format ```json -{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”} +{{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}} ``` Results of git diff: ``` -diff --git a/chat.py b/chat.py -index 9797aaa..1291909 100644 ---- a/chat.py -+++ b/chat.py -@@ -75,19 +75,4 @@ def download_image(url, timeout=10):: return - return response.content - - --# determine the filename of the image --def make_filename(base_dir, number, url): -- ext = os.path.splitext(url)[1] # get extension -- filename = number + ext # make filename by number with extension --filename = fullpath = os.path.splitext(url)[1 -- fullpath = os.path.join(base_dir, filename) -- return fullpath -- fullpath = os.path.join(base_dir, filename) --# save image --# Save an image --def save_image(filename, image):. -- with open(filename, “wb”) as fout: -- fout.write(image) --# save_image(filename, image) --def save_image(filename, image) - client.run(os.environ[“DISCORD_API_TOKEN”]) -``` -```chat.py -import google.generativeai as genai -import os -import discord -import requests -from PIL import Image -from io import BytesIO -from dotenv import load_dotenv - -load_dotenv(override=True) - -intents = discord.Intents.all() -client = discord.Client(intents=intents) - -genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) -model = genai.GenerativeModel("gemini-1.0-pro-vision-latest") - -chat = None - - -def init_chat(): - global chat - chat = model.start_chat() - response = chat.send_message( - content="You are a excellent chat bot. Please chat me in Japanese!" - ) - - -@client.event -async def on_ready(): - # init_chat() - print(f"{client.user.name} is online!") - - -@client.event -async def on_message(message): - print(f"Message received from {message.author}") - if message.author == client.user or not (str(client.user.id) in message.content): - return - - content = message.content.strip() - content = content.replace(f"<@{str(client.user.id)}> ", "") - print(f"content: {content}") - attachments = message.attachments - - if content == "reflesh": - init_chat() - await message.reply("refleshed chat !!!!") - - elif attachments: - print(attachments) - img_url = attachments[0].url - res = requests.get(img_url) - img = Image.open(BytesIO(res.content)) - response = model.generate_content([img, content]) - - await message.reply(response.text) - - else: - # response = chat.send_message(content=[img, content]) - print(response.text) - await message.reply(response.text) - - -def download_image(url, timeout=10): - response = requests.get(url, allow_redirects=False, timeout=timeout) - if response.status_code != 200: - e = Exception("HTTP status: " + response.status_code) - raise e - - content_type = response.headers["content-type"] - if "image" not in content_type: - e = Exception("Content-Type: " + content_type) - raise e - - return response.content - - -client.run(os.environ["DISCORD_API_TOKEN"]) +{git_diff.stdout} ``` No additional text is required. Only output the above json format. """ -res=start_chat(content) +res = start_chat(content) print(res.text) From 7b0b2cc09e812347eb2fa51b4d9c9ee828fd1e48 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 17:47:41 +0900 Subject: [PATCH 04/36] debug: --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b58246..eacfa6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: test run-name: ${{ github.actor }} runs test on: pull_request: - types: [opened] + types: [push] jobs: check-bats-version: runs-on: ubuntu-latest From a1722d0c6efb2375b476463087b66bac1144fb28 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 17:49:05 +0900 Subject: [PATCH 05/36] debug: --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eacfa6f..2fd93fe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,6 @@ name: test run-name: ${{ github.actor }} runs test -on: - pull_request: - types: [push] +on: [push] jobs: check-bats-version: runs-on: ubuntu-latest From 4480f6a38fbf5931a0dc24bc16ef3d007574b31d Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 17:53:57 +0900 Subject: [PATCH 06/36] fix: --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2fd93fe..cbd5134 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.11.x' + python-version: '3.12.x' - name: Install dependencies run: | python -m pip install --upgrade pip From 4a01924a33d88cac0a8f8798dfc515afffd87d1f Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 17:59:23 +0900 Subject: [PATCH 07/36] fix: --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cbd5134..1abd9bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,4 +16,6 @@ jobs: pip install poetry poetry install - name: Run review + env: + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} run: poetry run python run_gemini.py From d0ac707a5118000c7d41b44d1f63ace1fe3c7192 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 18:04:49 +0900 Subject: [PATCH 08/36] fix: --- run_gemini.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/run_gemini.py b/run_gemini.py index c6de839..19d4a56 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -15,13 +15,17 @@ def start_chat(content): return response +command = "git fetch origin main && git fetch origin dev" +subprocess.run(command, shell=True, check=True) command = "git diff main..dev" git_diff = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) content = f""" You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. The review should state what needs to be corrected and why for the areas that need to be corrected. Then, please output the review results in the following json format ```json -{{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}} +{{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}}, +{{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}}, +... ``` Results of git diff: ``` From ef6123afaf8ee9929d25687e1f235141c5cd9460 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 18:20:21 +0900 Subject: [PATCH 09/36] fix: --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1abd9bf..c893e24 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Set up a Git safe directory + run: git config --global --add safe.directory "${GITHUB_WORKSPACE}" + - uses: actions/setup-python@v4 - name: Set up Python - uses: actions/setup-python@v4 with: python-version: '3.12.x' - name: Install dependencies From 03167620a29918bd6d51ee826c81d43c6a2112f5 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 18:25:08 +0900 Subject: [PATCH 10/36] fix: --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c893e24..cb7fb15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,14 +5,13 @@ jobs: check-bats-version: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - name: Set up a Git safe directory run: git config --global --add safe.directory "${GITHUB_WORKSPACE}" + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 - name: Set up Python with: python-version: '3.12.x' - - name: Install dependencies run: | python -m pip install --upgrade pip pip install poetry From 9a828341926b9449465fedc3e6198894d742a186 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 18:27:04 +0900 Subject: [PATCH 11/36] fix: --- .github/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb7fb15..0bb3f97 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,17 +5,18 @@ jobs: check-bats-version: runs-on: ubuntu-latest steps: - - name: Set up a Git safe directory - run: git config --global --add safe.directory "${GITHUB_WORKSPACE}" - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 - name: Set up Python + uses: actions/setup-python@v4 with: python-version: '3.12.x' + - name: Install dependencies run: | python -m pip install --upgrade pip pip install poetry poetry install + - name: Set up a Git safe directory + run: git config --global --add safe.directory "${GITHUB_WORKSPACE}" - name: Run review env: GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} From 0104ac8417c254282cc492d0dd2b551d94c2c782 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 18:30:44 +0900 Subject: [PATCH 12/36] fix: --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0bb3f97..8dff8eb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: @@ -15,8 +17,6 @@ jobs: python -m pip install --upgrade pip pip install poetry poetry install - - name: Set up a Git safe directory - run: git config --global --add safe.directory "${GITHUB_WORKSPACE}" - name: Run review env: GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} From e10a08a212a1eee2f171b6a4058633b193d167b6 Mon Sep 17 00:00:00 2001 From: agis09 Date: Thu, 30 May 2024 18:42:57 +0900 Subject: [PATCH 13/36] fix: --- .github/workflows/ci.yml | 2 -- run_gemini.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8dff8eb..1abd9bf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: diff --git a/run_gemini.py b/run_gemini.py index 19d4a56..a334710 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -17,7 +17,7 @@ def start_chat(content): command = "git fetch origin main && git fetch origin dev" subprocess.run(command, shell=True, check=True) -command = "git diff main..dev" +command = "git diff origin/main..dev" git_diff = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) content = f""" From 7c05a27d32f40f685c42f5ee331e7133c4c8566b Mon Sep 17 00:00:00 2001 From: agis09 Date: Fri, 31 May 2024 00:45:32 +0900 Subject: [PATCH 14/36] debug: --- create_pr_comments.py | 81 +++++++++++++++++++++++++++++++++++++++++++ run_gemini.py | 65 ++++++++++++++++++++-------------- 2 files changed, 120 insertions(+), 26 deletions(-) create mode 100644 create_pr_comments.py diff --git a/create_pr_comments.py b/create_pr_comments.py new file mode 100644 index 0000000..228164e --- /dev/null +++ b/create_pr_comments.py @@ -0,0 +1,81 @@ +import requests +import json +import os +import logging +from dotenv import load_dotenv +from run_gemini import get_review + +logger = logging.getLogger(__name__) +logging.basicConfig(encoding="utf-8", level=logging.DEBUG) + +load_dotenv(override=True) + +github_api_token = os.environ["GITHUB_API_TOKEN"] + + +def create_pull_request_comment( + repository, pull_number, github_api_token, body, commit_id, path, line, side +): + + pr_url = f"https://api.github.com/repos/{repository}/pulls/{pull_number}/comments" + headers = { + "Accept": "application/json", + "Authorization": f"Bearer {github_api_token}", + "X-GitHub-Api-Version": "2022-11-28", + } + data = { + "body": body, + "commit_id": commit_id, + "path": path, + "line": int(line), + "side": side, + } + + response = requests.post(pr_url, headers=headers, json=data) + try: + response.raise_for_status() + except: + logger.exception(response) + + return response.json() + + +def parse_comments(text): + comments = [] + lines = text.splitlines() + for line in lines: + if line[0] == "{" and line[-1] == "}": + try: + comment = json.loads(line) + if not all(key in comment for key in ["body", "path", "line", "side"]): + raise ValueError("Invalid format: Required key does not exist.") + comments.append(comment) + except json.JSONDecodeError: + raise ValueError(f"Invalid format: {line}") + return comments + + +if __name__ == "__main__": + raw_review = get_review("dev", "main") + review_comments = parse_comments(raw_review) + + repository = "agis09/auto-reviewer" # TODO: get from ci envs + pull_number = "2" # TODO: get from ci envs + commit_id = "e10a08a212a1eee2f171b6a4058633b193d167b6" # TODO: get from ci envs + + for comment in review_comments: + + try: + comment_data = create_pull_request_comment( + repository, + pull_number, + github_api_token, + comment["body"], + commit_id, + comment["path"], + comment["line"], + comment["side"], + ) + logger.info(comment_data) + except: + logger.exception(comment) diff --git a/run_gemini.py b/run_gemini.py index a334710..fb03bd7 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -6,32 +6,45 @@ load_dotenv(override=True) genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) -model = genai.GenerativeModel("gemini-1.5-flash-latest") +safety_settings = [ + {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, +] +model = genai.GenerativeModel( + "gemini-1.5-flash-latest", safety_settings=safety_settings +) -def start_chat(content): +def get_review(commit_branch="dev", main_branch="main"): + command = "git fetch origin main && git fetch origin dev" + subprocess.run(command, shell=True, check=True) + command = f"git diff origin/{main_branch}..{commit_branch}" + git_diff = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) + + content = f""" + You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. + - The review should state what needs to be corrected and why for the areas that need to be corrected. + - Output the review results in the following jsonl (json line) format. + - Do not use "null" in each value + - Do not use ASCII codes, use only 'utf-8'. + ```json + {{“body”:“review comments”,“path”:“target filename”,“line”:“target line number (int)”,“side”:“whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}} + {{“body”:“review comments”,“path”:“target filename”,“line”:“target line number (int)”,“side”:“whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}} + ... + ``` + Results of git diff: + ``` + {git_diff.stdout} + ``` + No additional text is required. Only output the above json format. + """ chat = model.start_chat() - response = chat.send_message(content=content) - return response - - -command = "git fetch origin main && git fetch origin dev" -subprocess.run(command, shell=True, check=True) -command = "git diff origin/main..dev" -git_diff = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) - -content = f""" -You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. The review should state what needs to be corrected and why for the areas that need to be corrected. Then, please output the review results in the following json format -```json -{{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}}, -{{“body”: “review comments”, “path”: “target filename”, “line”: “target line number”, “side”: “whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}}, -... -``` -Results of git diff: -``` -{git_diff.stdout} -``` -No additional text is required. Only output the above json format. -""" -res = start_chat(content) -print(res.text) + res = chat.send_message(content=content) + + return res.text + + +if __name__ == "__main__": + get_review() From 67a409cce80a66a9357688b577eb47c2d6b0e144 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 15:24:05 +0900 Subject: [PATCH 15/36] debug: --- .github/workflows/ci.yml | 7 ++++++- create_pr_comments.py | 19 +++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1abd9bf..fe21aa1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,8 @@ name: test run-name: ${{ github.actor }} runs test -on: [push] +on: + pull_request: + types: [opened] jobs: check-bats-version: runs-on: ubuntu-latest @@ -18,4 +20,7 @@ jobs: - name: Run review env: GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + COMMIT_ID: ${{ github.event.pull_request.head.sha }} + SOURCE_REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} run: poetry run python run_gemini.py diff --git a/create_pr_comments.py b/create_pr_comments.py index 228164e..6c1fb14 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -10,14 +10,12 @@ load_dotenv(override=True) -github_api_token = os.environ["GITHUB_API_TOKEN"] - def create_pull_request_comment( - repository, pull_number, github_api_token, body, commit_id, path, line, side + repository, pair_number, github_api_token, body, commit_id, path, line, side ): - pr_url = f"https://api.github.com/repos/{repository}/pulls/{pull_number}/comments" + pr_url = f"https://api.github.com/repos/{repository}/pulls/{pair_number}/comments" headers = { "Accept": "application/json", "Authorization": f"Bearer {github_api_token}", @@ -56,19 +54,20 @@ def parse_comments(text): if __name__ == "__main__": + github_api_token = os.environ["GITHUB_API_TOKEN"] + pr_number = os.environ["PULL_REQUEST_NUMBER"] + commit_id = os.environ["COMMIT_ID"] + source_repository = os.environ["SOURCE_REPO_NAME"] + raw_review = get_review("dev", "main") review_comments = parse_comments(raw_review) - repository = "agis09/auto-reviewer" # TODO: get from ci envs - pull_number = "2" # TODO: get from ci envs - commit_id = "e10a08a212a1eee2f171b6a4058633b193d167b6" # TODO: get from ci envs - for comment in review_comments: try: comment_data = create_pull_request_comment( - repository, - pull_number, + source_repository, + pr_number, github_api_token, comment["body"], commit_id, From 96af70e054f04c0603b51dd060453d018af6bdbb Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 15:56:37 +0900 Subject: [PATCH 16/36] debug: --- create_pr_comments.py | 8 +++++--- run_gemini.py | 13 ++++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index 6c1fb14..c6b9825 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -57,16 +57,18 @@ def parse_comments(text): github_api_token = os.environ["GITHUB_API_TOKEN"] pr_number = os.environ["PULL_REQUEST_NUMBER"] commit_id = os.environ["COMMIT_ID"] - source_repository = os.environ["SOURCE_REPO_NAME"] + pr_repository = os.environ["PR_REPO_NAME"] + pr_branch_name = os.environ["PR_BRANCH_NAME"] + base_branch_name = os.environ["BASE_BRNACH_NAME"] - raw_review = get_review("dev", "main") + raw_review = get_review(pr_branch_name, f"origin/{base_branch_name}", logger) review_comments = parse_comments(raw_review) for comment in review_comments: try: comment_data = create_pull_request_comment( - source_repository, + pr_repository, pr_number, github_api_token, comment["body"], diff --git a/run_gemini.py b/run_gemini.py index fb03bd7..fe7a00a 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -17,11 +17,18 @@ ) -def get_review(commit_branch="dev", main_branch="main"): +def get_review(commit_branch, main_branch, logger): command = "git fetch origin main && git fetch origin dev" subprocess.run(command, shell=True, check=True) - command = f"git diff origin/{main_branch}..{commit_branch}" - git_diff = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) + command = f"git diff {main_branch}..{commit_branch}" + git_diff = subprocess.run( + command, + shell=True, + stdout=subprocess.PIPE, + stderr="subprocess.PIPE", + check=True, + ) + logger.error(f"stderr:{git_diff.stderr}") content = f""" You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. From 6789d786afae377b3fbe1bd2f07f7168e97343a8 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 15:59:23 +0900 Subject: [PATCH 17/36] fix: --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe21aa1..6ca4544 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,5 +22,7 @@ jobs: GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} COMMIT_ID: ${{ github.event.pull_request.head.sha }} - SOURCE_REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} - run: poetry run python run_gemini.py + PR_REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} + PR_BRANCH_NAME: ${{ github.event.pull_request.head.ref }} + BASE_BRANCH_NAME: ${{ github.event.pull_request.base.ref }} + run: poetry run python create_pr_comments.py From 16d26a73524fcc290336b49e7cfe54cdf85045c8 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:19:02 +0900 Subject: [PATCH 18/36] fix: --- create_pr_comments.py | 5 ++++- run_gemini.py | 26 ++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index c6b9825..359868e 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -60,8 +60,11 @@ def parse_comments(text): pr_repository = os.environ["PR_REPO_NAME"] pr_branch_name = os.environ["PR_BRANCH_NAME"] base_branch_name = os.environ["BASE_BRNACH_NAME"] + google_api_key = os.environ["GOOGLE_API_KEY"] - raw_review = get_review(pr_branch_name, f"origin/{base_branch_name}", logger) + raw_review = get_review( + google_api_key, pr_branch_name, f"origin/{base_branch_name}", logger + ) review_comments = parse_comments(raw_review) for comment in review_comments: diff --git a/run_gemini.py b/run_gemini.py index fe7a00a..ac895b9 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -3,21 +3,8 @@ import subprocess from dotenv import load_dotenv -load_dotenv(override=True) -genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) -safety_settings = [ - {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, - {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, - {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, - {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, -] -model = genai.GenerativeModel( - "gemini-1.5-flash-latest", safety_settings=safety_settings -) - - -def get_review(commit_branch, main_branch, logger): +def get_review(api_key, commit_branch, main_branch, logger): command = "git fetch origin main && git fetch origin dev" subprocess.run(command, shell=True, check=True) command = f"git diff {main_branch}..{commit_branch}" @@ -30,6 +17,17 @@ def get_review(commit_branch, main_branch, logger): ) logger.error(f"stderr:{git_diff.stderr}") + genai.configure(api_key=api_key) + safety_settings = [ + {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE"}, + ] + model = genai.GenerativeModel( + "gemini-1.5-flash-latest", safety_settings=safety_settings + ) + content = f""" You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. - The review should state what needs to be corrected and why for the areas that need to be corrected. From a1d66c5421edbe4afa71d59b4b6c4d14d4eca5f3 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:23:29 +0900 Subject: [PATCH 19/36] fix: --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6ca4544..3027926 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,7 @@ jobs: poetry install - name: Run review env: + GITHUB_API_TOKEN: ${{ secrets.GITHUB_API_TOKEN }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} COMMIT_ID: ${{ github.event.pull_request.head.sha }} From 0be6709eb72357c7cd18b53cbd272aabfe27c0fd Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:25:19 +0900 Subject: [PATCH 20/36] fix: --- create_pr_comments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index 359868e..fbc1a5e 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -59,7 +59,7 @@ def parse_comments(text): commit_id = os.environ["COMMIT_ID"] pr_repository = os.environ["PR_REPO_NAME"] pr_branch_name = os.environ["PR_BRANCH_NAME"] - base_branch_name = os.environ["BASE_BRNACH_NAME"] + base_branch_name = os.environ["BASE_BRANCH_NAME"] google_api_key = os.environ["GOOGLE_API_KEY"] raw_review = get_review( From 341cb80f762006d7e4505b6ce15597eae60bbfcb Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:30:24 +0900 Subject: [PATCH 21/36] fix: --- run_gemini.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_gemini.py b/run_gemini.py index ac895b9..fea4ff7 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -15,7 +15,7 @@ def get_review(api_key, commit_branch, main_branch, logger): stderr="subprocess.PIPE", check=True, ) - logger.error(f"stderr:{git_diff.stderr}") + logger.error(f"stderr:{git_diff.stderr.decode('utf-8')}") genai.configure(api_key=api_key) safety_settings = [ From bb9f554591184f34cee069248ca8abcaa69ee4be Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:36:27 +0900 Subject: [PATCH 22/36] fix: --- run_gemini.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_gemini.py b/run_gemini.py index fea4ff7..a602228 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -12,10 +12,10 @@ def get_review(api_key, commit_branch, main_branch, logger): command, shell=True, stdout=subprocess.PIPE, - stderr="subprocess.PIPE", + stderr=subprocess.PIPE, check=True, ) - logger.error(f"stderr:{git_diff.stderr.decode('utf-8')}") + logger.error(f"stderr:{git_diff.stderr}") genai.configure(api_key=api_key) safety_settings = [ From cd67b91010713374b284cc37ec830c8acf744ce6 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:58:39 +0900 Subject: [PATCH 23/36] fix: --- create_pr_comments.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index fbc1a5e..77036c4 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -12,10 +12,10 @@ def create_pull_request_comment( - repository, pair_number, github_api_token, body, commit_id, path, line, side + repository, pull_number, github_api_token, body, commit_id, path, line, side ): - pr_url = f"https://api.github.com/repos/{repository}/pulls/{pair_number}/comments" + pr_url = f"https://api.github.com/repos/{repository}/pulls/{pull_number}/comments" headers = { "Accept": "application/json", "Authorization": f"Bearer {github_api_token}", From dd5ceca0da0c3a79293c61843878b2d034915b59 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:58:47 +0900 Subject: [PATCH 24/36] debug: --- run_gemini.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/run_gemini.py b/run_gemini.py index a602228..e574ede 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -7,6 +7,8 @@ def get_review(api_key, commit_branch, main_branch, logger): command = "git fetch origin main && git fetch origin dev" subprocess.run(command, shell=True, check=True) + debug = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) + logger.info(debug) command = f"git diff {main_branch}..{commit_branch}" git_diff = subprocess.run( command, From b23350fde77aaccf803b152499f2d34fbc634fba Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 16:59:03 +0900 Subject: [PATCH 25/36] debug: --- run_gemini.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_gemini.py b/run_gemini.py index e574ede..7870fed 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -7,7 +7,7 @@ def get_review(api_key, commit_branch, main_branch, logger): command = "git fetch origin main && git fetch origin dev" subprocess.run(command, shell=True, check=True) - debug = subprocess.run(command, shell=True, stdout=subprocess.PIPE, check=True) + debug = subprocess.run("git branch", shell=True, stdout=subprocess.PIPE, check=True) logger.info(debug) command = f"git diff {main_branch}..{commit_branch}" git_diff = subprocess.run( From 7562bddc6033aa4b24310256676786c5206cc6c2 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:00:47 +0900 Subject: [PATCH 26/36] debug: --- run_gemini.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_gemini.py b/run_gemini.py index 7870fed..77fc316 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -8,7 +8,7 @@ def get_review(api_key, commit_branch, main_branch, logger): command = "git fetch origin main && git fetch origin dev" subprocess.run(command, shell=True, check=True) debug = subprocess.run("git branch", shell=True, stdout=subprocess.PIPE, check=True) - logger.info(debug) + logger.info(debug.stdout) command = f"git diff {main_branch}..{commit_branch}" git_diff = subprocess.run( command, From 7b265a6d675a67d7718cfc3dfedb6118bbc7f24a Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:01:19 +0900 Subject: [PATCH 27/36] debug: --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3027926..a0093aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: From 80fc58797299ec30644f09893cc566bf08850c35 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:07:35 +0900 Subject: [PATCH 28/36] fix: --- run_gemini.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/run_gemini.py b/run_gemini.py index 77fc316..3b7be16 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -5,13 +5,11 @@ def get_review(api_key, commit_branch, main_branch, logger): - command = "git fetch origin main && git fetch origin dev" - subprocess.run(command, shell=True, check=True) - debug = subprocess.run("git branch", shell=True, stdout=subprocess.PIPE, check=True) - logger.info(debug.stdout) - command = f"git diff {main_branch}..{commit_branch}" + subprocess.run( + f"git checkout {commit_branch}", shell=True, stdout=subprocess.PIPE, check=True + ) git_diff = subprocess.run( - command, + f"git diff {main_branch}..{commit_branch}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, From 2655f6175033399c51b24ca58edf3ce0bce06b38 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:10:10 +0900 Subject: [PATCH 29/36] debug: --- create_pr_comments.py | 2 +- run_gemini.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index 77036c4..ec4a5a7 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -63,7 +63,7 @@ def parse_comments(text): google_api_key = os.environ["GOOGLE_API_KEY"] raw_review = get_review( - google_api_key, pr_branch_name, f"origin/{base_branch_name}", logger + google_api_key, pr_branch_name, f"{base_branch_name}", logger ) review_comments = parse_comments(raw_review) diff --git a/run_gemini.py b/run_gemini.py index 3b7be16..74efd2c 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -6,7 +6,9 @@ def get_review(api_key, commit_branch, main_branch, logger): subprocess.run( - f"git checkout {commit_branch}", shell=True, stdout=subprocess.PIPE, check=True + f"git fetch origin {main_branch} && git fetch origin {commit_branch} && git checkout {commit_branch}", + shell=True, + check=True, ) git_diff = subprocess.run( f"git diff {main_branch}..{commit_branch}", From 71552dc06081a23374e2c3c03d0625cc8e375554 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:12:17 +0900 Subject: [PATCH 30/36] fix: --- run_gemini.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_gemini.py b/run_gemini.py index 74efd2c..08590ab 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -11,7 +11,7 @@ def get_review(api_key, commit_branch, main_branch, logger): check=True, ) git_diff = subprocess.run( - f"git diff {main_branch}..{commit_branch}", + f"git diff origin/{main_branch}..origin/{commit_branch}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, From 74ea348f22bf4c193aa1848128e41ffed903cef2 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:19:06 +0900 Subject: [PATCH 31/36] debug: --- create_pr_comments.py | 2 ++ run_gemini.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index ec4a5a7..5ebca91 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -29,6 +29,8 @@ def create_pull_request_comment( "side": side, } + logger.debug(data) + response = requests.post(pr_url, headers=headers, json=data) try: response.raise_for_status() diff --git a/run_gemini.py b/run_gemini.py index 08590ab..943eb2f 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -17,7 +17,8 @@ def get_review(api_key, commit_branch, main_branch, logger): stderr=subprocess.PIPE, check=True, ) - logger.error(f"stderr:{git_diff.stderr}") + if git_diff.stderr is not None: + logger.error(f"stderr:{git_diff.stderr}") genai.configure(api_key=api_key) safety_settings = [ From e535c4a771b4c5bd14482f7953f6a4c77d7602a6 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:24:44 +0900 Subject: [PATCH 32/36] fix: --- create_pr_comments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index 5ebca91..d2b5103 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -56,7 +56,7 @@ def parse_comments(text): if __name__ == "__main__": - github_api_token = os.environ["GITHUB_API_TOKEN"] + git_api_token = os.environ["GIT_API_TOKEN"] pr_number = os.environ["PULL_REQUEST_NUMBER"] commit_id = os.environ["COMMIT_ID"] pr_repository = os.environ["PR_REPO_NAME"] From 4c405b934e6e4ec2489abb95972d0343941a657d Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:31:14 +0900 Subject: [PATCH 33/36] fix: --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a0093aa..dbb5d67 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: @@ -21,7 +19,7 @@ jobs: poetry install - name: Run review env: - GITHUB_API_TOKEN: ${{ secrets.GITHUB_API_TOKEN }} + GIT_API_TOKEN: ${{ secrets.GIT_API_TOKEN }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} COMMIT_ID: ${{ github.event.pull_request.head.sha }} From f20d967d7fd97c078feb460b406c85f0abe6c706 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 17:36:30 +0900 Subject: [PATCH 34/36] fix: --- create_pr_comments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create_pr_comments.py b/create_pr_comments.py index d2b5103..e2bcc4c 100644 --- a/create_pr_comments.py +++ b/create_pr_comments.py @@ -75,7 +75,7 @@ def parse_comments(text): comment_data = create_pull_request_comment( pr_repository, pr_number, - github_api_token, + git_api_token, comment["body"], commit_id, comment["path"], From 6f4caa49b7aa876f691c45f85fff918210ae16af Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 23:06:20 +0900 Subject: [PATCH 35/36] fix: --- run_gemini.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/run_gemini.py b/run_gemini.py index 943eb2f..9229fc5 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -1,6 +1,7 @@ import google.generativeai as genai import os import subprocess +import logging from dotenv import load_dotenv @@ -17,7 +18,7 @@ def get_review(api_key, commit_branch, main_branch, logger): stderr=subprocess.PIPE, check=True, ) - if git_diff.stderr is not None: + if git_diff.stderr != b"": logger.error(f"stderr:{git_diff.stderr}") genai.configure(api_key=api_key) @@ -32,7 +33,7 @@ def get_review(api_key, commit_branch, main_branch, logger): ) content = f""" - You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results and changed source code. + You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results. - The review should state what needs to be corrected and why for the areas that need to be corrected. - Output the review results in the following jsonl (json line) format. - Do not use "null" in each value @@ -55,4 +56,9 @@ def get_review(api_key, commit_branch, main_branch, logger): if __name__ == "__main__": - get_review() + load_dotenv(override=True) + google_api_key = os.environ["GOOGLE_API_KEY"] + logger = logging.getLogger(__name__) + logging.basicConfig(encoding="utf-8", level=logging.DEBUG) + res = get_review(google_api_key, "dev", "main", logger) + logger.debug(res) From 573b0c9a13f43d9de511bb42a23f3ae0bff18467 Mon Sep 17 00:00:00 2001 From: agis09 Date: Sun, 2 Jun 2024 23:25:21 +0900 Subject: [PATCH 36/36] fix: --- run_gemini.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/run_gemini.py b/run_gemini.py index 9229fc5..4f0a653 100644 --- a/run_gemini.py +++ b/run_gemini.py @@ -33,21 +33,24 @@ def get_review(api_key, commit_branch, main_branch, logger): ) content = f""" - You are a great software engineer. Please review my code based on the following `git diff main..HEAD` results. - - The review should state what needs to be corrected and why for the areas that need to be corrected. - - Output the review results in the following jsonl (json line) format. - - Do not use "null" in each value - - Do not use ASCII codes, use only 'utf-8'. + You are a highly skilled software engineer. Please review the provided code diff based on the following `git diff main..HEAD` results. + - Your review should identify areas that need correction, explaining what needs to be changed and why. + - Include the following in your review: + - **Interpretation:** How you understand the code. + - **Reasoning:** Why the code is inappropriate or problematic. + - **Suggestions:** Examples of how the code should be corrected. + - Output your review results in the following JSONL (JSON Lines) format. Ensure each value is non-null and uses UTF-8 encoding: + ```json {{“body”:“review comments”,“path”:“target filename”,“line”:“target line number (int)”,“side”:“whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}} {{“body”:“review comments”,“path”:“target filename”,“line”:“target line number (int)”,“side”:“whether comments are for deletions or additions (LEFT for comments on deleted sources, RIGHT for comments on added sources)”}} ... ``` - Results of git diff: + Code diff: ``` {git_diff.stdout} ``` - No additional text is required. Only output the above json format. + Please provide your review in the specified JSONL format. No additional text is required. """ chat = model.start_chat() res = chat.send_message(content=content)