rzo1 commented on code in PR #465:
URL: https://github.com/apache/opennlp-sandbox/pull/465#discussion_r3221226668


##########
opennlp-grpc/examples/python-client/sentdetect_example.py:
##########
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import grpc
+import opennlp_pb2
+import opennlp_pb2_grpc
+
+
+def run():
+    # Create gRPC channel
+    channel = grpc.insecure_channel("localhost:7071")

Review Comment:
   `main.py` uses `with grpc.insecure_channel(...) as channel:` — please match 
that idiom so the channel is closed deterministically when `run()` exits or 
raises.



##########
opennlp-grpc/examples/python-client/sentdetect_example.py:
##########
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import grpc
+import opennlp_pb2
+import opennlp_pb2_grpc
+
+
+def run():
+    # Create gRPC channel
+    channel = grpc.insecure_channel("localhost:7071")
+    stub = opennlp_pb2_grpc.SentenceDetectorServiceStub(channel)
+
+    print("Connecting to OpenNLP gRPC server...")
+
+    # Discover available models
+    response = stub.GetAvailableModels(opennlp_pb2.Empty())
+    models = list(response.models)
+
+    if not models:
+        print("No models available on server.")
+        return
+
+    model = models[0]

Review Comment:
   Worth a one-line comment here, e.g. `# pick the first registered 
sentence-detector model` — `GetAvailableModels` may return multiple, and 
blindly using `[0]` is a choice readers should see explained.



##########
opennlp-grpc/examples/python-client/sentdetect_example.py:
##########
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import grpc
+import opennlp_pb2
+import opennlp_pb2_grpc
+
+
+def run():
+    # Create gRPC channel
+    channel = grpc.insecure_channel("localhost:7071")
+    stub = opennlp_pb2_grpc.SentenceDetectorServiceStub(channel)
+
+    print("Connecting to OpenNLP gRPC server...")
+
+    # Discover available models
+    response = stub.GetAvailableModels(opennlp_pb2.Empty())
+    models = list(response.models)

Review Comment:
   No `try/except grpc.RpcError` around `GetAvailableModels`. If the server is 
unreachable, this throws a raw traceback — directly contradicting the PR 
description's claim of clearer feedback for unreachable-server cases. Compare 
with `main.py:30-49` which wraps each call. Same issue on line 50 for 
`stub.sentDetect(request)`.



##########
opennlp-grpc/examples/python-client/sentdetect_example.py:
##########
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import grpc
+import opennlp_pb2
+import opennlp_pb2_grpc
+
+
+def run():
+    # Create gRPC channel
+    channel = grpc.insecure_channel("localhost:7071")
+    stub = opennlp_pb2_grpc.SentenceDetectorServiceStub(channel)
+
+    print("Connecting to OpenNLP gRPC server...")
+
+    # Discover available models
+    response = stub.GetAvailableModels(opennlp_pb2.Empty())
+    models = list(response.models)
+
+    if not models:
+        print("No models available on server.")
+        return
+
+    model = models[0]
+    print(f"Using model: {model.name} ({model.hash})")
+
+    # Input text
+    text = "The Apache OpenNLP project is great. It is now connected to 
Python!"
+
+    # Create request
+    request = opennlp_pb2.SentDetectRequest(
+        sentence=text,
+        model_hash=model.hash
+    )
+
+    # Call service
+    result = stub.sentDetect(request)
+
+    print("\nSentence Detection Result:")
+    for i, sentence in enumerate(result.values, 1):
+        print(f"{i}. {sentence}")
+
+
+if __name__ == "__main__":
+    run()

Review Comment:
   Missing newline at end of file.



##########
opennlp-grpc/examples/python-client/pyproject.toml:
##########
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+[project]
+name = "opennlp-python-examples"
+version = "0.1.0"
+requires-python = ">=3.10"
+
+dependencies = [
+  "grpcio>=1.60.0",
+  "grpcio-tools>=1.60.0"
+]

Review Comment:
   Missing newline at end of file. Also consider adding `description = "..."` 
and `license = "Apache-2.0"` fields — conventional for an ASF example project.



##########
opennlp-grpc/examples/README.md:
##########
@@ -1,3 +1,20 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+ 

Review Comment:
   This line is a single space — trailing whitespace on an otherwise blank 
line. Please strip.



##########
opennlp-grpc/examples/python-client/README.md:
##########
@@ -6,4 +24,26 @@ This client was generated using the gRPC tools and the schema 
provided in the op
 python3 -m pip install grpcio-tools
 mkdir python
 python3 -m grpc_tools.protoc -I. --python_out=python --grpc_python_out=python 
opennlp.proto
-```
\ No newline at end of file
+```
+
+## Running examples with uv
+
+Install dependencies:
+
+```bash
+uv sync
+```
+
+Run POS tagging:
+
+```bash
+uv run python main.py
+```
+
+Run sentence detection:
+
+```bash
+uv run python sentdetect_example.py
+```
+
+(Generated gRPC stubs can be regenerated using the existing 
`grpc_tools.protoc` workflow above.)

Review Comment:
   The pre-existing `python3 -m pip install grpcio-tools` block (lines 23-27) 
and this new `uv sync` section overlap. Suggest restructuring as:
   
   - **Setup:** `uv sync`
   - **Run examples:** `uv run python main.py` / `uv run python 
sentdetect_example.py`
   - **Regenerating stubs:** `uv run python -m grpc_tools.protoc ...` (the note 
on line 49 should also use `uv run`, not bare `python3`, once `uv` is the 
documented workflow)



##########
opennlp-grpc/examples/python-client/README.md:
##########
@@ -1,3 +1,21 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+ 

Review Comment:
   Trailing whitespace on an otherwise blank line — please strip.



##########
opennlp-grpc/examples/python-client/uv.lock:
##########
@@ -0,0 +1,192 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+version = 1
+revision = 3
+requires-python = ">=3.10"
+
+[[package]]
+name = "grpcio"
+version = "1.80.0"
+source = { registry = "https://pypi.org/simple"; }
+dependencies = [
+    { name = "typing-extensions" },
+]
+sdist = { url = 
"https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz";,
 hash = 
"sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size 
= 12978905, upload-time = "2026-03-30T08:49:10.502Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/9d/cd/bb7b7e54084a344c03d68144450da7ddd5564e51a298ae1662de65f48e2d/grpcio-1.80.0-cp310-cp310-linux_armv7l.whl";,
 hash = 
"sha256:886457a7768e408cdce226ad1ca67d2958917d306523a0e21e1a2fdaa75c9c9c", size 
= 6050363, upload-time = "2026-03-30T08:46:20.894Z" },
+    { url = 
"https://files.pythonhosted.org/packages/16/02/1417f5c3460dea65f7a2e3c14e8b31e77f7ffb730e9bfadd89eda7a9f477/grpcio-1.80.0-cp310-cp310-macosx_11_0_universal2.whl";,
 hash = 
"sha256:7b641fc3f1dc647bfd80bd713addc68f6d145956f64677e56d9ebafc0bd72388", size 
= 12026037, upload-time = "2026-03-30T08:46:25.144Z" },
+    { url = 
"https://files.pythonhosted.org/packages/43/98/c910254eedf2cae368d78336a2de0678e66a7317d27c02522392f949b5c6/grpcio-1.80.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:33eb763f18f006dc7fee1e69831d38d23f5eccd15b2e0f92a13ee1d9242e5e02", size 
= 6602306, upload-time = "2026-03-30T08:46:27.593Z" },
+    { url = 
"https://files.pythonhosted.org/packages/7c/f8/88ca4e78c077b2b2113d95da1e1ab43efd43d723c9a0397d26529c2c1a56/grpcio-1.80.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:52d143637e3872633fc7dd7c3c6a1c84e396b359f3a72e215f8bf69fd82084fc", size 
= 7301535, upload-time = "2026-03-30T08:46:29.556Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f9/96/f28660fe2fe0f153288bf4a04e4910b7309d442395135c88ed4f5b3b8b40/grpcio-1.80.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:c51bf8ac4575af2e0678bccfb07e47321fc7acb5049b4482832c5c195e04e13a", size 
= 6808669, upload-time = "2026-03-30T08:46:31.984Z" },
+    { url = 
"https://files.pythonhosted.org/packages/47/eb/3f68a5e955779c00aeef23850e019c1c1d0e032d90633ba49c01ad5a96e0/grpcio-1.80.0-cp310-cp310-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:50a9871536d71c4fba24ee856abc03a87764570f0c457dd8db0b4018f379fed9", size 
= 7409489, upload-time = "2026-03-30T08:46:34.684Z" },
+    { url = 
"https://files.pythonhosted.org/packages/5b/a7/d2f681a4bfb881be40659a309771f3bdfbfdb1190619442816c3f0ffc079/grpcio-1.80.0-cp310-cp310-musllinux_1_2_i686.whl";,
 hash = 
"sha256:a72d84ad0514db063e21887fbacd1fd7acb4d494a564cae22227cd45c7fbf199", size 
= 8423167, upload-time = "2026-03-30T08:46:36.833Z" },
+    { url = 
"https://files.pythonhosted.org/packages/97/8a/29b4589c204959aa35ce5708400a05bba72181807c45c47b3ec000c39333/grpcio-1.80.0-cp310-cp310-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:f7691a6788ad9196872f95716df5bc643ebba13c97140b7a5ee5c8e75d1dea81", size 
= 7846761, upload-time = "2026-03-30T08:46:40.091Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6b/d2/ed143e097230ee121ac5848f6ff14372dba91289b10b536d54fb1b7cbae7/grpcio-1.80.0-cp310-cp310-win32.whl";,
 hash = 
"sha256:46c2390b59d67f84e882694d489f5b45707c657832d7934859ceb8c33f467069", size 
= 4156534, upload-time = "2026-03-30T08:46:42.026Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d5/c9/df8279bb49b29409995e95efa85b72973d62f8aeff89abee58c91f393710/grpcio-1.80.0-cp310-cp310-win_amd64.whl";,
 hash = 
"sha256:dc053420fc75749c961e2a4c906398d7c15725d36ccc04ae6d16093167223b58", size 
= 4889869, upload-time = "2026-03-30T08:46:44.219Z" },
+    { url = 
"https://files.pythonhosted.org/packages/5d/db/1d56e5f5823257b291962d6c0ce106146c6447f405b60b234c4f222a7cde/grpcio-1.80.0-cp311-cp311-linux_armv7l.whl";,
 hash = 
"sha256:dfab85db094068ff42e2a3563f60ab3dddcc9d6488a35abf0132daec13209c8a", size 
= 6055009, upload-time = "2026-03-30T08:46:46.265Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6e/18/c83f3cad64c5ca63bca7e91e5e46b0d026afc5af9d0a9972472ceba294b3/grpcio-1.80.0-cp311-cp311-macosx_11_0_universal2.whl";,
 hash = 
"sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060", size 
= 12035295, upload-time = "2026-03-30T08:46:49.099Z" },
+    { url = 
"https://files.pythonhosted.org/packages/0f/8e/e14966b435be2dda99fbe89db9525ea436edc79780431a1c2875a3582644/grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2", size 
= 6610297, upload-time = "2026-03-30T08:46:52.123Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cc/26/d5eb38f42ce0e3fdc8174ea4d52036ef8d58cc4426cb800f2610f625dd75/grpcio-1.80.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:3cb8130ba457d2aa09fa6b7c3ed6b6e4e6a2685fce63cb803d479576c4d80e21", size 
= 7300208, upload-time = "2026-03-30T08:46:54.859Z" },
+    { url = 
"https://files.pythonhosted.org/packages/25/51/bd267c989f85a17a5b3eea65a6feb4ff672af41ca614e5a0279cc0ea381c/grpcio-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab", size 
= 6813442, upload-time = "2026-03-30T08:46:57.056Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9e/d9/d80eef735b19e9169e30164bbf889b46f9df9127598a83d174eb13a48b26/grpcio-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1", size 
= 7414743, upload-time = "2026-03-30T08:46:59.682Z" },
+    { url = 
"https://files.pythonhosted.org/packages/de/f2/567f5bd5054398ed6b0509b9a30900376dcf2786bd936812098808b49d8d/grpcio-1.80.0-cp311-cp311-musllinux_1_2_i686.whl";,
 hash = 
"sha256:8502122a3cc1714038e39a0b071acb1207ca7844208d5ea0d091317555ee7106", size 
= 8426046, upload-time = "2026-03-30T08:47:02.474Z" },
+    { url = 
"https://files.pythonhosted.org/packages/62/29/73ef0141b4732ff5eacd68430ff2512a65c004696997f70476a83e548e7e/grpcio-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6", size 
= 7851641, upload-time = "2026-03-30T08:47:05.462Z" },
+    { url = 
"https://files.pythonhosted.org/packages/46/69/abbfa360eb229a8623bab5f5a4f8105e445bd38ce81a89514ba55d281ad0/grpcio-1.80.0-cp311-cp311-win32.whl";,
 hash = 
"sha256:51b4a7189b0bef2aa30adce3c78f09c83526cf3dddb24c6a96555e3b97340440", size 
= 4154368, upload-time = "2026-03-30T08:47:08.027Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6f/d4/ae92206d01183b08613e846076115f5ac5991bae358d2a749fa864da5699/grpcio-1.80.0-cp311-cp311-win_amd64.whl";,
 hash = 
"sha256:02e64bb0bb2da14d947a49e6f120a75e947250aebe65f9629b62bb1f5c14e6e9", size 
= 4894235, upload-time = "2026-03-30T08:47:10.839Z" },
+    { url = 
"https://files.pythonhosted.org/packages/5c/e8/a2b749265eb3415abc94f2e619bbd9e9707bebdda787e61c593004ec927a/grpcio-1.80.0-cp312-cp312-linux_armv7l.whl";,
 hash = 
"sha256:c624cc9f1008361014378c9d776de7182b11fe8b2e5a81bc69f23a295f2a1ad0", size 
= 6015616, upload-time = "2026-03-30T08:47:13.428Z" },
+    { url = 
"https://files.pythonhosted.org/packages/3e/97/b1282161a15d699d1e90c360df18d19165a045ce1c343c7f313f5e8a0b77/grpcio-1.80.0-cp312-cp312-macosx_11_0_universal2.whl";,
 hash = 
"sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2", size 
= 12014204, upload-time = "2026-03-30T08:47:15.873Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6e/5e/d319c6e997b50c155ac5a8cb12f5173d5b42677510e886d250d50264949d/grpcio-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de", size 
= 6563866, upload-time = "2026-03-30T08:47:18.588Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ae/f6/fdd975a2cb4d78eb67769a7b3b3830970bfa2e919f1decf724ae4445f42c/grpcio-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:0cb517eb1d0d0aaf1d87af7cc5b801d686557c1d88b2619f5e31fab3c2315921", size 
= 7273060, upload-time = "2026-03-30T08:47:21.113Z" },
+    { url = 
"https://files.pythonhosted.org/packages/db/f0/a3deb5feba60d9538a962913e37bd2e69a195f1c3376a3dd44fe0427e996/grpcio-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411", size 
= 6782121, upload-time = "2026-03-30T08:47:23.827Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ca/84/36c6dcfddc093e108141f757c407902a05085e0c328007cb090d56646cdf/grpcio-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd", size 
= 7383811, upload-time = "2026-03-30T08:47:26.517Z" },
+    { url = 
"https://files.pythonhosted.org/packages/7c/ef/f3a77e3dc5b471a0ec86c564c98d6adfa3510d38f8ee99010410858d591e/grpcio-1.80.0-cp312-cp312-musllinux_1_2_i686.whl";,
 hash = 
"sha256:256507e2f524092f1473071a05e65a5b10d84b82e3ff24c5b571513cfaa61e2f", size 
= 8393860, upload-time = "2026-03-30T08:47:29.439Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9b/8d/9d4d27ed7f33d109c50d6b5ce578a9914aa68edab75d65869a17e630a8d1/grpcio-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f", size 
= 7830132, upload-time = "2026-03-30T08:47:33.254Z" },
+    { url = 
"https://files.pythonhosted.org/packages/14/e4/9990b41c6d7a44e1e9dee8ac11d7a9802ba1378b40d77468a7761d1ad288/grpcio-1.80.0-cp312-cp312-win32.whl";,
 hash = 
"sha256:c71309cfce2f22be26aa4a847357c502db6c621f1a49825ae98aa0907595b193", size 
= 4140904, upload-time = "2026-03-30T08:47:35.319Z" },
+    { url = 
"https://files.pythonhosted.org/packages/2f/2c/296f6138caca1f4b92a31ace4ae1b87dab692fc16a7a3417af3bb3c805bf/grpcio-1.80.0-cp312-cp312-win_amd64.whl";,
 hash = 
"sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff", size 
= 4880944, upload-time = "2026-03-30T08:47:37.831Z" },
+    { url = 
"https://files.pythonhosted.org/packages/2f/3a/7c3c25789e3f069e581dc342e03613c5b1cb012c4e8c7d9d5cf960a75856/grpcio-1.80.0-cp313-cp313-linux_armv7l.whl";,
 hash = 
"sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad", size 
= 6017243, upload-time = "2026-03-30T08:47:40.075Z" },
+    { url = 
"https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl";,
 hash = 
"sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size 
= 12010840, upload-time = "2026-03-30T08:47:43.11Z" },
+    { url = 
"https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size 
= 6567644, upload-time = "2026-03-30T08:47:46.806Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ff/40/96e07ecb604a6a67ae6ab151e3e35b132875d98bc68ec65f3e5ab3e781d7/grpcio-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6", size 
= 7277830, upload-time = "2026-03-30T08:47:49.643Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size 
= 6783216, upload-time = "2026-03-30T08:47:52.817Z" },
+    { url = 
"https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size 
= 7385866, upload-time = "2026-03-30T08:47:55.687Z" },
+    { url = 
"https://files.pythonhosted.org/packages/47/45/55c507599c5520416de5eefecc927d6a0d7af55e91cfffb2e410607e5744/grpcio-1.80.0-cp313-cp313-musllinux_1_2_i686.whl";,
 hash = 
"sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7", size 
= 8391602, upload-time = "2026-03-30T08:47:58.303Z" },
+    { url = 
"https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size 
= 7826752, upload-time = "2026-03-30T08:48:01.311Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f9/1e/9d67992ba23371fd63d4527096eb8c6b76d74d52b500df992a3343fd7251/grpcio-1.80.0-cp313-cp313-win32.whl";,
 hash = 
"sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294", size 
= 4142310, upload-time = "2026-03-30T08:48:04.594Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cf/e6/283326a27da9e2c3038bc93eeea36fb118ce0b2d03922a9cda6688f53c5b/grpcio-1.80.0-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50", size 
= 4882833, upload-time = "2026-03-30T08:48:07.363Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c5/6d/e65307ce20f5a09244ba9e9d8476e99fb039de7154f37fb85f26978b59c3/grpcio-1.80.0-cp314-cp314-linux_armv7l.whl";,
 hash = 
"sha256:3d4147a97c8344d065d01bbf8b6acec2cf86fb0400d40696c8bdad34a64ffc0e", size 
= 6017376, upload-time = "2026-03-30T08:48:10.005Z" },
+    { url = 
"https://files.pythonhosted.org/packages/69/10/9cef5d9650c72625a699c549940f0abb3c4bfdb5ed45a5ce431f92f31806/grpcio-1.80.0-cp314-cp314-macosx_11_0_universal2.whl";,
 hash = 
"sha256:d8e11f167935b3eb089ac9038e1a063e6d7dbe995c0bb4a661e614583352e76f", size 
= 12018133, upload-time = "2026-03-30T08:48:12.927Z" },
+    { url = 
"https://files.pythonhosted.org/packages/04/82/983aabaad82ba26113caceeb9091706a0696b25da004fe3defb5b346e15b/grpcio-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:f14b618fc30de822681ee986cfdcc2d9327229dc4c98aed16896761cacd468b9", size 
= 6574748, upload-time = "2026-03-30T08:48:16.386Z" },
+    { url = 
"https://files.pythonhosted.org/packages/07/d7/031666ef155aa0bf399ed7e19439656c38bbd143779ae0861b038ce82abd/grpcio-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:4ed39fbdcf9b87370f6e8df4e39ca7b38b3e5e9d1b0013c7b6be9639d6578d14", size 
= 7277711, upload-time = "2026-03-30T08:48:19.627Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e8/43/f437a78f7f4f1d311804189e8f11fb311a01049b2e08557c1068d470cb2e/grpcio-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:2dcc70e9f0ba987526e8e8603a610fb4f460e42899e74e7a518bf3c68fe1bf05", size 
= 6785372, upload-time = "2026-03-30T08:48:22.373Z" },
+    { url = 
"https://files.pythonhosted.org/packages/93/3d/f6558e9c6296cb4227faa5c43c54a34c68d32654b829f53288313d16a86e/grpcio-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:448c884b668b868562b1bda833c5fce6272d26e1926ec46747cda05741d302c1", size 
= 7395268, upload-time = "2026-03-30T08:48:25.638Z" },
+    { url = 
"https://files.pythonhosted.org/packages/06/21/0fdd77e84720b08843c371a2efa6f2e19dbebf56adc72df73d891f5506f0/grpcio-1.80.0-cp314-cp314-musllinux_1_2_i686.whl";,
 hash = 
"sha256:a1dc80fe55685b4a543555e6eef975303b36c8db1023b1599b094b92aa77965f", size 
= 8392000, upload-time = "2026-03-30T08:48:28.974Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f5/68/67f4947ed55d2e69f2cc199ab9fd85e0a0034d813bbeef84df6d2ba4d4b7/grpcio-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:31b9ac4ad1aa28ffee5503821fafd09e4da0a261ce1c1281c6c8da0423c83b6e", size 
= 7828477, upload-time = "2026-03-30T08:48:32.054Z" },
+    { url = 
"https://files.pythonhosted.org/packages/44/b6/8d4096691b2e385e8271911a0de4f35f0a6c7d05aff7098e296c3de86939/grpcio-1.80.0-cp314-cp314-win32.whl";,
 hash = 
"sha256:367ce30ba67d05e0592470428f0ec1c31714cab9ef19b8f2e37be1f4c7d32fae", size 
= 4218563, upload-time = "2026-03-30T08:48:34.538Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e5/8c/bbe6baf2557262834f2070cf668515fa308b2d38a4bbf771f8f7872a7036/grpcio-1.80.0-cp314-cp314-win_amd64.whl";,
 hash = 
"sha256:3b01e1f5464c583d2f567b2e46ff0d516ef979978f72091fd81f5ab7fa6e2e7f", size 
= 5019457, upload-time = "2026-03-30T08:48:37.308Z" },
+]
+
+[[package]]
+name = "grpcio-tools"
+version = "1.80.0"
+source = { registry = "https://pypi.org/simple"; }
+dependencies = [
+    { name = "grpcio" },
+    { name = "protobuf" },
+    { name = "setuptools" },
+]
+sdist = { url = 
"https://files.pythonhosted.org/packages/94/c8/1223f29c84a143ae9a56c084fc96894de0ba84b6e8d60a26241abd81d278/grpcio_tools-1.80.0.tar.gz";,
 hash = 
"sha256:26052b19c6ce0dcf52d1024496aea3e2bdfa864159f06dc7b97b22d041a94b26", size 
= 6133212, upload-time = "2026-03-30T08:52:39.077Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/7a/54/1de67f5080da305a258758a8deb33f85666fa759f56785042a80b114a53f/grpcio_tools-1.80.0-cp310-cp310-linux_armv7l.whl";,
 hash = 
"sha256:727477b9afa4b53f5ec70cafb41c3965d893835e0d4ea9b542fe3d0d005602bf", size 
= 2549601, upload-time = "2026-03-30T08:50:09.498Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9a/b4/6d57ea199c5b880d182a2234aafa9a686f9c54c708ea7be75bd19d5aa825/grpcio_tools-1.80.0-cp310-cp310-macosx_11_0_universal2.whl";,
 hash = 
"sha256:85fe8d15f146c62cb76f38d963e256392d287442b9232717d30ae9e3bbda9bc3", size 
= 5712717, upload-time = "2026-03-30T08:50:15.028Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6a/1a/5505ee2277d368b409c796c78f22ea34a2a517b7d16755247efd663dc7af/grpcio_tools-1.80.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:95f0fffb5ca00519f3b602f938169b4dfa04b165e03258323965a9dfe8cc4d80", size 
= 2595941, upload-time = "2026-03-30T08:50:17.299Z" },
+    { url = 
"https://files.pythonhosted.org/packages/4e/39/7fc1d16d8b767805079d76365d73e82c88dfaf179034473dbc9fbccedb77/grpcio_tools-1.80.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:7a0106af212748823a6ebd8ffbd9043414216f47cae3835f3187de0a62c415d3", size 
= 2909304, upload-time = "2026-03-30T08:50:19.485Z" },
+    { url = 
"https://files.pythonhosted.org/packages/97/d8/276ee759755d8f34f2ca5e9d2debd1a59f29f66059fb790bc369f2236c26/grpcio_tools-1.80.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:31fd01a4038b5dfc4ec79504a17061344f670f851833411717fef66920f13cd7", size 
= 2660269, upload-time = "2026-03-30T08:50:21.266Z" },
+    { url = 
"https://files.pythonhosted.org/packages/51/04/a6bb47942ad52901d777a649324d3203cf19d487f1d446263637f7a5bf12/grpcio_tools-1.80.0-cp310-cp310-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:57da9e19607fac4a01c48ead333c0dd15d91ed38794dce1194eda308f73e2038", size 
= 3109798, upload-time = "2026-03-30T08:50:23.267Z" },
+    { url = 
"https://files.pythonhosted.org/packages/be/50/7ee69b2919916739787d725f205b878e8d1619dd30422b8278e324664669/grpcio_tools-1.80.0-cp310-cp310-musllinux_1_2_i686.whl";,
 hash = 
"sha256:90968f751851abb8b145593609800fa70c837e1c93ba0792c480b1c8d8bc29ef", size 
= 3658930, upload-time = "2026-03-30T08:50:25.458Z" },
+    { url = 
"https://files.pythonhosted.org/packages/92/61/6d50783092b0e8bbcb04152d5388bf50ecf3ea2f783d95288ff6c3bb00fa/grpcio_tools-1.80.0-cp310-cp310-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:b69dc5d6376ab43406304d1e2fc61ccf960b287d4325d77c3d45448c37a9d2da", size 
= 3326562, upload-time = "2026-03-30T08:50:27.809Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ea/58/d272ba549f6b1f0d8504f5fc4cd0a296f2c495a64d6e987fe871c4151557/grpcio_tools-1.80.0-cp310-cp310-win32.whl";,
 hash = 
"sha256:3e8dcfebe34cb54df095de3d5871a4562a85a29f26d0f8bb41ee2c3dcfb11c3c", size 
= 997620, upload-time = "2026-03-30T08:50:29.959Z" },
+    { url = 
"https://files.pythonhosted.org/packages/70/5f/9f45a9946a0298711c72ca48b2c1f46a7d0c207a44cd3e4bb59d04556ba3/grpcio_tools-1.80.0-cp310-cp310-win_amd64.whl";,
 hash = 
"sha256:fc622ed4ca400695f41c9eae3266276c6ba007e4c28164ce53b44e7ccc5e492b", size 
= 1162466, upload-time = "2026-03-30T08:50:32.242Z" },
+    { url = 
"https://files.pythonhosted.org/packages/8a/d7/225dc91e6cb4f8d4830f16a478a468e9c6f342dcdf8cacc3772cc1d1f607/grpcio_tools-1.80.0-cp311-cp311-linux_armv7l.whl";,
 hash = 
"sha256:1c43e5c768578fe0c6de3dbfaabe64af642951e1aa05c487cacedda63fa6c6c4", size 
= 2549937, upload-time = "2026-03-30T08:50:34.651Z" },
+    { url = 
"https://files.pythonhosted.org/packages/97/3d/a3684cb7677f3bea8db434eae02a9ce30135d7a268cd473b1bc8041c4722/grpcio_tools-1.80.0-cp311-cp311-macosx_11_0_universal2.whl";,
 hash = 
"sha256:a225348456575f3ac7851d8e23163195e76d2a905ee340cf73f33da62fba08aa", size 
= 5713099, upload-time = "2026-03-30T08:50:37.158Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b1/81/5665c697173ec346076358bfbfed0f7386825852494593ca14386478dfee/grpcio_tools-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:a9396f02820d3f51c368c2c9dee15c55c77636c91be48a4d5c702e98d6fe0fdc", size 
= 2595776, upload-time = "2026-03-30T08:50:39.087Z" },
+    { url = 
"https://files.pythonhosted.org/packages/03/4f/fb81384f08a8226fa079972ba88272ac6277581fc72e8ab234d74c7e065b/grpcio_tools-1.80.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:797c08460cae16b402326eac329aec720dccf45c9f9279b95a352792eb53cf0f", size 
= 2909144, upload-time = "2026-03-30T08:50:40.922Z" },
+    { url = 
"https://files.pythonhosted.org/packages/4d/9c/c957618f1c2a3195ecf5e83b03edcb364c2c1391f74183cb76e5763fa536/grpcio_tools-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:1872a867eb6217de19edb70a4ce4a374ced9d94293533dfd42fa649713f55bf4", size 
= 2660477, upload-time = "2026-03-30T08:50:42.766Z" },
+    { url = 
"https://files.pythonhosted.org/packages/42/c7/23913da184febfd4eaf04de256a26bc5ff0411a5feb753e2adcff10fa86a/grpcio_tools-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:db122ba5ee357e3bb14e8944d69bbebcbdae91d5eace29ed4df3edc53cbc6528", size 
= 3110164, upload-time = "2026-03-30T08:50:44.761Z" },
+    { url = 
"https://files.pythonhosted.org/packages/af/fa/b25ed85ebdb0396910eaa250b1346d75527d22fca586265416bd4330dcd5/grpcio_tools-1.80.0-cp311-cp311-musllinux_1_2_i686.whl";,
 hash = 
"sha256:ddefd48c227e6f4d640fe576fac5fb2c4a8898196f513604c8ec7671b3b3d421", size 
= 3658988, upload-time = "2026-03-30T08:50:47.546Z" },
+    { url = 
"https://files.pythonhosted.org/packages/60/85/2a55147cc9645e2ed777d1afcd2dc68cb34ba6f6c726bd4378ddb001a5ea/grpcio_tools-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:970ec058fa469dd6dae6ebc687501c5da670d95dead75f62f5b0933dce2c9794", size 
= 3326662, upload-time = "2026-03-30T08:50:49.59Z" },
+    { url = 
"https://files.pythonhosted.org/packages/68/ed/b05bee2a992e6f9bda81909692ea920d0896cfa05c5c9dd77ba03f2d22fb/grpcio_tools-1.80.0-cp311-cp311-win32.whl";,
 hash = 
"sha256:526b4402d47a0e9b31cd6087e42b7674784617916cc73c764e0bc35ed41b4ee5", size 
= 997969, upload-time = "2026-03-30T08:50:51.539Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b6/9a/cb50c8270e2f6285ff2761130ae257ac4e51789ded4b9d9710ce0381814d/grpcio_tools-1.80.0-cp311-cp311-win_amd64.whl";,
 hash = 
"sha256:ee101ecda7231770f6a5da1024a9a6ed587a7785f8fe23ab8283f4a1acb3ffe6", size 
= 1162742, upload-time = "2026-03-30T08:50:54.232Z" },
+    { url = 
"https://files.pythonhosted.org/packages/0c/b9/65929df8c9614792db900a8e45d4997fadbd1734c827da3f0eb1f2fe4866/grpcio_tools-1.80.0-cp312-cp312-linux_armv7l.whl";,
 hash = 
"sha256:d19d5a8244311947b96f749c417b32d144641c6953f1164824579e1f0a51d040", size 
= 2550856, upload-time = "2026-03-30T08:50:57.3Z" },
+    { url = 
"https://files.pythonhosted.org/packages/28/17/af1557544d68d1aeca9d9ea53ed16524022d521fec6ba334ab3530e9c1a6/grpcio_tools-1.80.0-cp312-cp312-macosx_11_0_universal2.whl";,
 hash = 
"sha256:fb599a3dc89ed1bb24489a2724b2f6dd4cddbbf0f7bdd69c073477bab0dc7554", size 
= 5710883, upload-time = "2026-03-30T08:51:00.077Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cc/48/aa9b4f7519ca972bc40d315d5c28f05ca28fa08de13d4e8b69f551b798ab/grpcio_tools-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:623ee31fc2ff7df9a987b4f3d139c30af17ce46a861ae0e25fb8c112daa32dd8", size 
= 2598004, upload-time = "2026-03-30T08:51:02.102Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b4/b8/b01371c119924b3beca1fe3f047b1bc2cdc66b3d37f0f3acc9d10c567a43/grpcio_tools-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:b46570a68378539ee2b75a5a43202561f8d753c832798b1047099e3c551cf5d6", size 
= 2909568, upload-time = "2026-03-30T08:51:04.159Z" },
+    { url = 
"https://files.pythonhosted.org/packages/4f/7c/1108f7bdb58475a7e701ec89b55eb494538b6e76acd211ba0d4cc5fd28e8/grpcio_tools-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:51caf99c28999e7e0f97e9cea190c1405b7681a57bb2e0631205accd92b43fa4", size 
= 2660938, upload-time = "2026-03-30T08:51:06.126Z" },
+    { url = 
"https://files.pythonhosted.org/packages/67/59/d1c0063d4cd3b85363c7044ff3e5159d6d5df96e2692a9a5312d9c8cb290/grpcio_tools-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:cdaa1c9aa8d3a87891a96700cadd29beec214711d6522818d207277f6452567c", size 
= 3113814, upload-time = "2026-03-30T08:51:08.834Z" },
+    { url = 
"https://files.pythonhosted.org/packages/76/21/18d34a4efe524c903cf66b0cfa5260d81f277b6ae668b647edf795df9ce5/grpcio_tools-1.80.0-cp312-cp312-musllinux_1_2_i686.whl";,
 hash = 
"sha256:3399b5fd7b59bcffd59c6b9975a969d9f37a3c87f3e3d63c3a09c147907acb0d", size 
= 3662793, upload-time = "2026-03-30T08:51:11.094Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f3/40/cf2d9295a6bd593244ea703858f8fc2efd315046ca3ef7c6f9ebc5b810fa/grpcio_tools-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:9c6abc08d3485b2aac99bb58afcd31dc6cd4316ce36cf263ff09cb6df15f287f", size 
= 3329149, upload-time = "2026-03-30T08:51:13.066Z" },
+    { url = 
"https://files.pythonhosted.org/packages/0d/1d/fc34b32167966df20d69429b71dfca83c48434b047a5ac4fd6cd91ca4eed/grpcio_tools-1.80.0-cp312-cp312-win32.whl";,
 hash = 
"sha256:18c51e07652ac7386fcdbd11866f8d55a795de073337c12447b5805575339f74", size 
= 997519, upload-time = "2026-03-30T08:51:14.87Z" },
+    { url = 
"https://files.pythonhosted.org/packages/91/98/6d6563cdf51085b75f8ec24605c6f2ce84197571878ca8ab4af949c6be2d/grpcio_tools-1.80.0-cp312-cp312-win_amd64.whl";,
 hash = 
"sha256:ac6fdd42d5bb18f0d903a067e2825be172deff70cf197164b6f65676cb506c9b", size 
= 1162407, upload-time = "2026-03-30T08:51:16.793Z" },
+    { url = 
"https://files.pythonhosted.org/packages/44/d9/f7887a4805939e9a85d03744b66fc02575dc1df3c3e8b4d9ec000ee7a33d/grpcio_tools-1.80.0-cp313-cp313-linux_armv7l.whl";,
 hash = 
"sha256:e7046837859bbfd10b01786056145480155c16b222c9e209215b68d3be13060e", size 
= 2550319, upload-time = "2026-03-30T08:51:19.117Z" },
+    { url = 
"https://files.pythonhosted.org/packages/57/5a/c8a05b32bd7203f1b9f4c0151090a2d6179d6c97692d32f2066dc29c67a6/grpcio_tools-1.80.0-cp313-cp313-macosx_11_0_universal2.whl";,
 hash = 
"sha256:a447f28958a8fe84ff0d9d3d9473868feb27ee4a9c9c805e66f5b670121cec59", size 
= 5709681, upload-time = "2026-03-30T08:51:21.991Z" },
+    { url = 
"https://files.pythonhosted.org/packages/82/6b/794350ed645c12c310008f97068f6a6fd927150b0d0d08aad1d909e880b1/grpcio_tools-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:75f00450e08fe648ad8a1eeb25bc52219679d54cdd02f04dfdddc747309d83f6", size 
= 2596820, upload-time = "2026-03-30T08:51:24.323Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f9/b2/b39e7b79f7c878135e0784a53cd7260ee77260c8c7f2c9e46bca8e05d017/grpcio_tools-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:3db830eaff1f2c2797328f2fa86c9dcdbd7d81af573a68db81e27afa2182a611", size 
= 2909193, upload-time = "2026-03-30T08:51:27.025Z" },
+    { url = 
"https://files.pythonhosted.org/packages/10/f3/abe089b058f87f9910c9a458409505cbeb0b3e1c2d993a79721d02ee6a32/grpcio_tools-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:7982b5fe42f012686b667dda12916884de95c4b1c65ff64371fb7232a1474b23", size 
= 2660197, upload-time = "2026-03-30T08:51:29.392Z" },
+    { url = 
"https://files.pythonhosted.org/packages/09/c3/3f7806ad8b731d8a89fe3c6ed496473abd1ef4c9c42c9e9a8836ce96e377/grpcio_tools-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:6451b3f4eb52d12c7f32d04bf8e0185f80521f3f088ad04b8d222b3a4819c71e", size 
= 3113144, upload-time = "2026-03-30T08:51:31.671Z" },
+    { url = 
"https://files.pythonhosted.org/packages/fe/f5/415ef205e0b7e75d2a2005df6120145c4f02fda28d7b3715b55d924fe1a4/grpcio_tools-1.80.0-cp313-cp313-musllinux_1_2_i686.whl";,
 hash = 
"sha256:258bc30654a9a2236be4ca8e2ad443e2ac6db7c8cc20454d34cce60265922726", size 
= 3661897, upload-time = "2026-03-30T08:51:34.849Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e3/d3/2ad54764c2a9547080dd8518f4a4dc7899c7e6e747a1b1de542ce6a12066/grpcio_tools-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:865a2b8e6334c838976ab02a322cbd55c863d2eaf3c1e1a0255883c63996772a", size 
= 3328786, upload-time = "2026-03-30T08:51:37.265Z" },
+    { url = 
"https://files.pythonhosted.org/packages/eb/63/23ab7db01f9630ab4f3742a2fc9fbff38b0cfc30c976114f913950664a75/grpcio_tools-1.80.0-cp313-cp313-win32.whl";,
 hash = 
"sha256:f760ac1722f33e774814c37b6aa0444143f612e85088ead7447a0e9cd306a1f1", size 
= 997087, upload-time = "2026-03-30T08:51:39.137Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9b/af/b1c1c4423fb49cb7c8e9d2c02196b038c44160b7028b425466743c6c81fa/grpcio_tools-1.80.0-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:7843b9ac6ff8ca508424d0dd968bd9a1a4559967e4a290f26be5bd6f04af2234", size 
= 1162167, upload-time = "2026-03-30T08:51:41.498Z" },
+    { url = 
"https://files.pythonhosted.org/packages/0e/44/7beeee2348f9f412804f5bf80b7d13b81d522bf926a338ae3da46b2213b7/grpcio_tools-1.80.0-cp314-cp314-linux_armv7l.whl";,
 hash = 
"sha256:12f950470449dbeec78317dbc090add7a00eb6ca812af7b0538ab7441e0a42c3", size 
= 2550303, upload-time = "2026-03-30T08:51:44.373Z" },
+    { url = 
"https://files.pythonhosted.org/packages/2d/aa/f77dd85409a1855f8c6319ffc69d81e8c3ffe122ee3a7136653e1991d8b6/grpcio_tools-1.80.0-cp314-cp314-macosx_11_0_universal2.whl";,
 hash = 
"sha256:d3f9a376a29c9adf62bb56f7ff5bc81eb4abeaf53d1e7dde5015564832901a51", size 
= 5709778, upload-time = "2026-03-30T08:51:47.112Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9c/7c/ab7af4883ebdfdc228b853de89fed409703955e8d47285b321a5794856bd/grpcio_tools-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl";,
 hash = 
"sha256:1ba1ffbf2cff71533615e2c5a138ed5569611eec9ae7f9c67b8898e127b54ac0", size 
= 2597928, upload-time = "2026-03-30T08:51:49.494Z" },
+    { url = 
"https://files.pythonhosted.org/packages/22/e8/4381a963d472e3ab6690ba067ed2b1f1abf8518b10f402678bd2dcb79a54/grpcio_tools-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl";,
 hash = 
"sha256:13f60f8d9397c514c6745a967d22b5c8c698347e88deebca1ff2e1b94555e450", size 
= 2909333, upload-time = "2026-03-30T08:51:52.124Z" },
+    { url = 
"https://files.pythonhosted.org/packages/94/cb/356b5fdf79dd99455b425fb16302fe60995554ceb721afbf3cf770a19208/grpcio_tools-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";,
 hash = 
"sha256:88d77bad5dd3cd5e6f952c4ecdd0ee33e0c02ecfc2e4b0cbee3391ac19e0a431", size 
= 2660217, upload-time = "2026-03-30T08:51:55.066Z" },
+    { url = 
"https://files.pythonhosted.org/packages/2b/d7/1752018cc2c36b2c5612051379e2e5f59f2dbe612de23e817d2f066a9487/grpcio_tools-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:017945c3e98a4ed1c4e21399781b4137fc08dfc1f802c8ace2e64ef52d32b142", size 
= 3113896, upload-time = "2026-03-30T08:51:57.3Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cc/17/695bbe454f70df35c03e22b48c5314683b913d3e6ed35ec90d065418c1ab/grpcio_tools-1.80.0-cp314-cp314-musllinux_1_2_i686.whl";,
 hash = 
"sha256:a33e265d4db803495007a6c623eafb0f6b9bb123ff4a0af89e44567dad809b88", size 
= 3661950, upload-time = "2026-03-30T08:51:59.867Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9c/d0/533d87629ec823c02c9169ee20228f734c264b209dcdf55268b5a14cde0a/grpcio_tools-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:6c129da370c5f85f569be2e545317dda786a60dd51d7deea29b03b0c05f6aac3", size 
= 3328755, upload-time = "2026-03-30T08:52:02.942Z" },
+    { url = 
"https://files.pythonhosted.org/packages/08/a1/504d7838770c73a9761e8a8ff4869dba1146b44f297ff0ac6641481942d3/grpcio_tools-1.80.0-cp314-cp314-win32.whl";,
 hash = 
"sha256:25742de5958ae4325249a37e724e7c0e5120f8e302a24a977ebd1737b48a5e97", size 
= 1019620, upload-time = "2026-03-30T08:52:05.342Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f3/75/8b7cd281c5cdfb4ca2c308f7e9b2799bab2be6e7a9e9212ea5a82e2aecd4/grpcio_tools-1.80.0-cp314-cp314-win_amd64.whl";,
 hash = 
"sha256:bbf8eeef78fda1966f732f79c1c802fadd5cfd203d845d2af4d314d18569069c", size 
= 1194210, upload-time = "2026-03-30T08:52:08.105Z" },
+]
+
+[[package]]
+name = "opennlp-python-examples"
+version = "0.1.0"
+source = { virtual = "." }
+dependencies = [
+    { name = "grpcio" },
+    { name = "grpcio-tools" },
+]
+
+[package.metadata]
+requires-dist = [
+    { name = "grpcio", specifier = ">=1.60.0" },
+    { name = "grpcio-tools", specifier = ">=1.60.0" },
+]
+
+[[package]]
+name = "protobuf"
+version = "6.33.6"
+source = { registry = "https://pypi.org/simple"; }
+sdist = { url = 
"https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz";,
 hash = 
"sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size 
= 444531, upload-time = "2026-03-18T19:05:00.988Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl";,
 hash = 
"sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size 
= 425739, upload-time = "2026-03-18T19:04:48.373Z" },
+    { url = 
"https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl";,
 hash = 
"sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size 
= 437089, upload-time = "2026-03-18T19:04:50.381Z" },
+    { url = 
"https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl";,
 hash = 
"sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size 
= 427737, upload-time = "2026-03-18T19:04:51.866Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl";,
 hash = 
"sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size 
= 324610, upload-time = "2026-03-18T19:04:53.096Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl";,
 hash = 
"sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size 
= 339381, upload-time = "2026-03-18T19:04:54.616Z" },
+    { url = 
"https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl";,
 hash = 
"sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size 
= 323436, upload-time = "2026-03-18T19:04:55.768Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl";,
 hash = 
"sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size 
= 170656, upload-time = "2026-03-18T19:04:59.826Z" },
+]
+
+[[package]]
+name = "setuptools"
+version = "82.0.1"
+source = { registry = "https://pypi.org/simple"; }
+sdist = { url = 
"https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz";,
 hash = 
"sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size 
= 1152316, upload-time = "2026-03-09T12:47:17.221Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl";,
 hash = 
"sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size 
= 1006223, upload-time = "2026-03-09T12:47:15.026Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple"; }
+sdist = { url = 
"https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz";,
 hash = 
"sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size 
= 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl";,
 hash = 
"sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size 
= 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]

Review Comment:
   Missing newline at end of file.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to