diff --git a/Cargo.lock b/Cargo.lock index 2e12dfb64..fec554755 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,13 +126,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -3139,7 +3139,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4688ddedf473e32662b9b067670129a8afb8c18e351482c70d62ba4a88171e8b" dependencies = [ "chrono", - "indexmap 2.13.0", "inventory", "libc", "num-complex", @@ -3302,7 +3301,7 @@ dependencies = [ "pyo3", "pyo3-async-runtimes", "qcs-dependencies-client", - "rigetti-pyo3 0.8.1", + "rigetti-pyo3", "serde", "serde_json", "thiserror 2.0.20", @@ -3364,7 +3363,7 @@ dependencies = [ "qcs-dependencies-client", "quil-rs", "regex", - "rigetti-pyo3 0.8.1", + "rigetti-pyo3", "rmp-serde", "rstest", "serde", @@ -3407,7 +3406,7 @@ dependencies = [ "pyo3-build-config", "pyo3-stub-gen", "qcs-dependencies-client", - "rigetti-pyo3 0.8.1", + "rigetti-pyo3", "serde", "serde_json", "shellexpand", @@ -3507,7 +3506,6 @@ version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab2279547bc521362a1ed413e1ad379de23d0efc4ae28f427a4184c8c390ee25" dependencies = [ - "anyhow", "approx", "derive-where", "derive_more", @@ -3519,16 +3517,11 @@ dependencies = [ "nom", "nom_locate", "num-complex", - "numpy", "once_cell", "optipy 0.1.4", "pastey", "petgraph 0.6.5", - "pyo3", - "pyo3-build-config", - "pyo3-stub-gen", "regex", - "rigetti-pyo3 0.7.1", "serde", "statrs", "strum", @@ -3929,20 +3922,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "rigetti-pyo3" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213e90a6c913d2826aa2b14c0a267c0bd784e586f108319066fdd42834abf325" -dependencies = [ - "indexmap 2.13.0", - "itertools 0.14.0", - "optipy 0.1.4", - "pastey", - "pyo3", - "pyo3-stub-gen", -] - [[package]] name = "rigetti-pyo3" version = "0.8.1" diff --git a/crates/lib/Cargo.toml b/crates/lib/Cargo.toml index 4d7195518..17ef9c588 100644 --- a/crates/lib/Cargo.toml +++ b/crates/lib/Cargo.toml @@ -36,13 +36,11 @@ python = [ "dep:rigetti-pyo3", "experimental", "tracing-opentelemetry", - "quil-rs/python", "qcs-api-client-common/python", ] stubs = [ "python", "dep:pyo3-stub-gen", - "quil-rs/stubs", "qcs-api-client-common/stubs", "pyo3-tracing-subscriber-build", "rigetti-pyo3/stubs", diff --git a/crates/lib/pyproject.toml b/crates/lib/pyproject.toml index d6b8418a3..10c5fc141 100644 --- a/crates/lib/pyproject.toml +++ b/crates/lib/pyproject.toml @@ -18,8 +18,7 @@ classifiers = [ "Operating System :: OS Independent", ] dependencies = [ - "quil>=0.37.1,<0.38.0", - "qcs-api-client-common>=0.19.0,<0.20.0", + "qcs-api-client-common>=0.19.0,<0.27.0", ] [dependency-groups] diff --git a/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi b/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi index 34b61bf2a..017fd6c93 100644 --- a/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi +++ b/crates/lib/python/qcs_sdk/_qcs_sdk/compiler/quilc/__init__.pyi @@ -5,9 +5,7 @@ import builtins import collections.abc from qcs_sdk import _qcs_sdk from qcs_sdk._qcs_sdk.qpu import isa -import quil._quil.program import typing -from quil._quil import program __all__ = [ "CompilationResult", @@ -46,9 +44,9 @@ class CompilationResult: Metadata about the compiled program """ @property - def program(self) -> program.Program: + def program(self) -> builtins.str: r""" - The compiled program + The compiled program, as a Quil string. """ @typing.final diff --git a/crates/lib/src/compiler/python.rs b/crates/lib/src/compiler/python.rs index 7596a755e..4b1df4c53 100644 --- a/crates/lib/src/compiler/python.rs +++ b/crates/lib/src/compiler/python.rs @@ -1,4 +1,5 @@ use qcs_api_client_openapi::models::InstructionSetArchitecture; +use quil_rs::quil::Quil; use rigetti_pyo3::{create_init_submodule, impl_repr, py_function_sync_async}; use std::convert::TryFrom; @@ -78,6 +79,18 @@ impl CompilerOpts { } } +#[cfg_attr(feature = "stubs", gen_stub_pymethods)] +#[pymethods] +impl CompilationResult { + /// The compiled program, as a Quil string. + #[getter] + fn program(&self) -> PyResult { + self.program + .to_quil() + .map_err(|err| errors::QuilcError::new_err(err.to_string())) + } +} + #[cfg_attr(feature = "stubs", gen_stub_pymethods)] #[pymethods] impl TargetDevice { diff --git a/crates/lib/src/compiler/quilc.rs b/crates/lib/src/compiler/quilc.rs index e3da87212..b9ac9d6c9 100644 --- a/crates/lib/src/compiler/quilc.rs +++ b/crates/lib/src/compiler/quilc.rs @@ -60,12 +60,12 @@ pub trait Client { /// The result of compiling a Quil program to native quil with `quilc` #[derive(Clone, Debug, PartialEq)] +#[cfg_attr(not(feature = "python"), optipy::strip_pyo3)] #[cfg_attr(feature = "stubs", gen_stub_pyclass)] #[cfg_attr( feature = "python", pyo3::pyclass( module = "qcs_sdk._qcs_sdk.compiler.quilc", - get_all, frozen, from_py_object ) @@ -74,6 +74,7 @@ pub struct CompilationResult { /// The compiled program pub program: Program, /// Metadata about the compiled program + #[pyo3(get)] pub native_quil_metadata: Option, } diff --git a/crates/lib/src/python/mod.rs b/crates/lib/src/python/mod.rs index 88ef27fbc..d49ded7c1 100644 --- a/crates/lib/src/python/mod.rs +++ b/crates/lib/src/python/mod.rs @@ -110,7 +110,7 @@ fn init_module(m: &Bound<'_, PyModule>) -> PyResult<()> { mod stubs { use pyo3_stub_gen::{ define_stub_info_gatherer, derive::gen_type_alias_from_python, exclude_from_all, - export_verbatim, module_doc, reexport_module_members, Result, StubInfo, + export_verbatim, reexport_module_members, Result, StubInfo, }; use std::path::Path; @@ -166,9 +166,7 @@ mod stubs { reexport_module_members!("qcs_sdk.qvm.api" from "qcs_sdk._qcs_sdk.qvm.api"); reexport_module_members!("qcs_sdk._qcs_sdk.client" from "qcs_api_client_common._qcs_api_client_common"; "configuration"); - reexport_module_members!("qcs_sdk._qcs_sdk.compiler.quilc" from "quil._quil"; "program"); exclude_from_all!("qcs_sdk._qcs_sdk.client", "configuration"); - exclude_from_all!("qcs_sdk._qcs_sdk.compiler.quilc", "program"); reexport_module_members!("qcs_sdk" from "qcs_sdk._qcs_sdk.client"; "QCSClient"); @@ -178,8 +176,6 @@ mod stubs { export_verbatim!("qcs_sdk._qcs_sdk", "_gather_diagnostics"); export_verbatim!("qcs_sdk._qcs_sdk", "__version__"); - module_doc!("quil._quil.validation", ""); - define_stub_info_gatherer!(internal_stub_info); /// Gather stub information to generate stub files. @@ -188,12 +184,11 @@ mod stubs { let mut stubs = StubInfo::from_pyproject_toml(manifest_dir.join("pyproject.toml"))?; // `pyo3_stub_gen` gathers declarations from every linked crate, so dependencies that - // define their own Python packages (`quil-rs` and `qcs-api-client-common`) contribute - // their modules here too. Generation rejects any non-empty module outside this - // package's module path, and writing files for them would shadow the real, installed - // packages, so drop them. The stubs refer to foreign types by their private paths - // (`quil._quil.program.Program`), since resolving the public alias needs the foreign - // module to still be present at generation time. + // define their own Python packages (`qcs-api-client-common`) contribute their modules + // here too. Generation rejects any non-empty module outside this package's module path, + // and writing files for them would shadow the real, installed packages, so drop them. + // The stubs refer to foreign types by their private paths, since resolving the public + // alias needs the foreign module to still be present at generation time. stubs .modules .retain(|name, _| name == "qcs_sdk" || name.starts_with("qcs_sdk.")); diff --git a/crates/lib/src/qpu/experimental/python.rs b/crates/lib/src/qpu/experimental/python.rs index d235e7b31..a583525bb 100644 --- a/crates/lib/src/qpu/experimental/python.rs +++ b/crates/lib/src/qpu/experimental/python.rs @@ -1,9 +1,9 @@ //! Python bindings for the experimental QPU module. -use quil_rs::quil::{Quil, ToQuilError}; +use quil_rs::quil::Quil; use rigetti_pyo3::create_init_submodule; -use crate::qpu::experimental::random::ChooseRandomRealSubRegions; +use crate::qpu::experimental::random::{ChooseRandomRealSubRegions, Error as RandomError}; create_init_submodule! { submodules: [ "random": random::init_submodule ], @@ -40,7 +40,7 @@ impl ChooseRandomRealSubRegions { /// ``` #[staticmethod] #[pyo3(name = "build_signature")] - fn py_build_signature() -> Result { - ChooseRandomRealSubRegions::build_signature().to_quil() + fn py_build_signature() -> Result { + Ok(ChooseRandomRealSubRegions::build_signature().to_quil()?) } } diff --git a/crates/lib/tests_py/compiler/test_quilc.py b/crates/lib/tests_py/compiler/test_quilc.py index f522f6ade..49e8a54d8 100644 --- a/crates/lib/tests_py/compiler/test_quilc.py +++ b/crates/lib/tests_py/compiler/test_quilc.py @@ -59,7 +59,7 @@ def test_compile_program( result = compile_program( bell_program, target_device, client=quilc_rpcq_client, options=CompilerOpts(protoquil=True) ) - assert result.program.to_quil() == snapshot + assert result.program == snapshot assert result.native_quil_metadata == snapshot diff --git a/crates/lib/tests_py/qpu/experimental/test_random.py b/crates/lib/tests_py/qpu/experimental/test_random.py index 25017f5b6..b751c7747 100644 --- a/crates/lib/tests_py/qpu/experimental/test_random.py +++ b/crates/lib/tests_py/qpu/experimental/test_random.py @@ -1,50 +1,10 @@ -from quil.program import Program -from quil.instructions import ( - Declaration, - Instruction, - Pragma, - Call, - CallArgument, - MemoryReference, - Vector, - ScalarType, - PragmaArgument, -) from qcs_sdk.qpu.experimental.random import ChooseRandomRealSubRegions -EXPECTED_QUIL = """ -PRAGMA EXTERN choose_random_real_sub_regions "(destination : mut REAL[], source : REAL[], sub_region_size : INTEGER, seed : mut INTEGER)" -DECLARE destination REAL[3] -DECLARE source REAL[12] -DECLARE seed INTEGER[1] -CALL choose_random_real_sub_regions destination source 3 seed[0] -""" - - def test_choose_random_real_subregions(): - """Test that `ChooseRandomRealSubRegions` is correctly added to a Quil progrram.""" - program = Program() - destination = Declaration("destination", Vector(ScalarType.REAL, 3), None) - program.add_instruction(Instruction.Declaration(destination)) - source = Declaration("source", Vector(ScalarType.REAL, 12), None) - program.add_instruction(Instruction.Declaration(source)) - seed = Declaration("seed", Vector(ScalarType.INTEGER, 1), None) - program.add_instruction(Instruction.Declaration(seed)) - pragma_extern = Pragma( - "EXTERN", - [PragmaArgument.Identifier(ChooseRandomRealSubRegions.NAME)], - ChooseRandomRealSubRegions.build_signature(), - ) - program.add_instruction(Instruction.Pragma(pragma_extern)) - call = Call( - ChooseRandomRealSubRegions.NAME, - [ - CallArgument.Identifier("destination"), - CallArgument.Identifier("source"), - CallArgument.Immediate(complex(3, 0)), - CallArgument.MemoryReference(MemoryReference("seed", 0)), - ], + """Test the name and signature used to declare `ChooseRandomRealSubRegions` in a Quil program.""" + assert ChooseRandomRealSubRegions.NAME == "choose_random_real_sub_regions" + assert ( + ChooseRandomRealSubRegions.build_signature() + == "(destination : mut REAL[], source : REAL[], sub_region_size : INTEGER, seed : mut INTEGER)" ) - program.add_instruction(Instruction.Call(call)) - assert program == Program.parse(EXPECTED_QUIL) diff --git a/crates/lib/uv.lock b/crates/lib/uv.lock index 432d3fc44..588aa1d5a 100644 --- a/crates/lib/uv.lock +++ b/crates/lib/uv.lock @@ -855,11 +855,10 @@ wheels = [ [[package]] name = "qcs-sdk-python" -version = "0.29.0rc1" +version = "0.29.0" source = { virtual = "." } dependencies = [ { name = "qcs-api-client-common" }, - { name = "quil" }, ] [package.dev-dependencies] @@ -882,10 +881,7 @@ dev = [ ] [package.metadata] -requires-dist = [ - { name = "qcs-api-client-common", specifier = ">=0.19.0,<0.20.0" }, - { name = "quil", specifier = ">=0.37.1,<0.38.0" }, -] +requires-dist = [{ name = "qcs-api-client-common", specifier = ">=0.19.0,<0.27.0" }] [package.metadata.requires-dev] dev = [ @@ -906,37 +902,6 @@ dev = [ { name = "syrupy", specifier = ">=4.0.0" }, ] -[[package]] -name = "quil" -version = "0.37.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bb/a8/632f13756ae9fe7431eb17390ae61eb99280421164fa29562aa4e891d4cf/quil-0.37.1.tar.gz", hash = "sha256:a86feea4f2a7fac4068ce37cc2c89948ac773fbdf2db86905a5d45d8ca7dd60b", size = 491319, upload-time = "2026-08-17T22:56:37.166Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/01/93a609c9a018b48200f1f50b975eedab9996343ff7e5d5d90f9dd718382c/quil-0.37.1-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:f814c9d349b9bc543dbfcbef0308b0af61043f6c33dd5f3789e843b1f0acb0a5", size = 3852264, upload-time = "2026-08-17T22:56:09.049Z" }, - { url = "https://files.pythonhosted.org/packages/15/58/1eb8d5419aade81bf80eee2173ed261c81cf80e8425f8f8ca93303fa2bf4/quil-0.37.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c250e9fc20a8b607d0e6fc5fcf9fbe5ac0182f7573a257a1b150de82e686148", size = 2040184, upload-time = "2026-08-17T22:56:10.794Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/1873c6cac23647cda83f2cbfdf4bca92be184a3312ae4d7e0ae34912977f/quil-0.37.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:331e4078eff3c1e5f1048126905c10cdb3997bd54544775d2f2a85b03642e523", size = 2236449, upload-time = "2026-08-17T22:56:12.064Z" }, - { url = "https://files.pythonhosted.org/packages/d3/1b/89ca4bb448790c565433f1df600615c9057b63e68e6784357c76f4cbe1c0/quil-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6414df52145be1960f7cc201b20fddd0d79076a1f082fd49580db2030a10e749", size = 2093368, upload-time = "2026-08-17T22:56:13.345Z" }, - { url = "https://files.pythonhosted.org/packages/cd/ea/e91f621fc191dab9ecc4734d1619c8f87a50323c91d3adb285f08ab74dd9/quil-0.37.1-cp310-cp310-win_amd64.whl", hash = "sha256:12a5e8272f8ca7b415f5e962605455731fafb71a9ee6786448104df1ac6757d1", size = 1947278, upload-time = "2026-08-17T22:56:14.561Z" }, - { url = "https://files.pythonhosted.org/packages/54/7c/92acf422785540ce26144ebba16f5537b1824f25f027975ffd746226935b/quil-0.37.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:d70c18b4c19e0b3a02fb053320912c9912bd45325e53e35aba829bc9585d3c9f", size = 3852406, upload-time = "2026-08-17T22:56:16.158Z" }, - { url = "https://files.pythonhosted.org/packages/3e/01/0d686ae2a211b1e76a247f686e95276d3afebac5d010f96b10ed938ce7a8/quil-0.37.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d35773c9b3b5588c42caa6b495b59197546bfafa5d8902847cc2d8ccbe12a53", size = 2039650, upload-time = "2026-08-17T22:56:17.438Z" }, - { url = "https://files.pythonhosted.org/packages/76/b5/3c6b082d8cb0c94a42d9436be0e3ca9dbb4939940b158483c5cafb0e487d/quil-0.37.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8569452d1337c6ec2198fd7fd41801cfcb40a9daf586b15a87b932c6f5d60b42", size = 2236365, upload-time = "2026-08-17T22:56:18.775Z" }, - { url = "https://files.pythonhosted.org/packages/85/76/235b9e72202a8d34a75bc29692c76c0098bee74b0c1418069282fc0acf5a/quil-0.37.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5794e713cb1285d034233c854124c1bdd5e17f85d6c6ef7413e0f288bcae4ed", size = 2092996, upload-time = "2026-08-17T22:56:20.587Z" }, - { url = "https://files.pythonhosted.org/packages/3e/2b/ffbaa779ee1be3fab5ca3bac324e19d3ca15d75570cd7e2b856ca47cc072/quil-0.37.1-cp311-cp311-win_amd64.whl", hash = "sha256:de000b97a80ec4a54a54ccdb4107cd0fd1d064ada98e57cea1046d2c1f8712d0", size = 1947526, upload-time = "2026-08-17T22:56:22.065Z" }, - { url = "https://files.pythonhosted.org/packages/d1/da/fef69b4182ac81944809226601f5996794cb21c9ebf5514a81f1f4284943/quil-0.37.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:09e305358c58c0adee7b8de824a2a83da7c6264c4d4f42d4fe8971a56d2139cc", size = 3885635, upload-time = "2026-08-17T22:56:23.363Z" }, - { url = "https://files.pythonhosted.org/packages/f3/fb/c94af6a6268d7ac03b44c5e23d00bf6740677537757486f426169fac38fe/quil-0.37.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dac96d2af093a28e147ecaf9ddf0e3bedff6ecf11933d75f727f42d80e20f000", size = 2033515, upload-time = "2026-08-17T22:56:24.603Z" }, - { url = "https://files.pythonhosted.org/packages/4c/29/91f7f932c5880c9c3f166f8bfb8ab66fbc11454d62aa5d829dc5be944033/quil-0.37.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:623bfa85d5d5edbf3329e0a335d53caf3891950ae4263a55628a71471f9adf6c", size = 2223674, upload-time = "2026-08-17T22:56:25.989Z" }, - { url = "https://files.pythonhosted.org/packages/30/cf/6067026ea21db0f96d70909e88969cc3e30124c80ca20faf99067ed7a5b1/quil-0.37.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e7db024b3e80cab3fb80452fe8e7ce21017268761d70f64db6391b31de7d4b9", size = 2087365, upload-time = "2026-08-17T22:56:27.235Z" }, - { url = "https://files.pythonhosted.org/packages/9f/b5/2ae0d601694dc557a1ec47df0a481478cc9059e8ff27f2d7450cad217d2d/quil-0.37.1-cp312-cp312-win_amd64.whl", hash = "sha256:d317a0be302fc584bf5661ccb8fac550dd7ea8b2766249a6ad33f53108b2a75f", size = 1939826, upload-time = "2026-08-17T22:56:28.731Z" }, - { url = "https://files.pythonhosted.org/packages/63/7a/465b89903bdad45d93a580821a50b95eee1c6fdeed0f444b57d16cbc5142/quil-0.37.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8dc6959047657f08f42fb18910517006d7dc1bc181e6693876aeeba1aaa0fbfa", size = 3889840, upload-time = "2026-08-17T22:56:30.033Z" }, - { url = "https://files.pythonhosted.org/packages/c9/84/6ec6c8b9ed03299e977d1c90ec6b5600b63735f95af12406e5f5f97aba69/quil-0.37.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7196cfaf6dcfd7455d7be2d9653ef52f2d7fb381b4b1b9a81558abe9adc5f4ac", size = 2034564, upload-time = "2026-08-17T22:56:31.488Z" }, - { url = "https://files.pythonhosted.org/packages/95/eb/0a62f303f84b39b809a1b2274fff40218403bd42c7c8286fadd5c57715db/quil-0.37.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40a65ebb2aa5c7263a9360be463a52d132b17923c73ecc4924cc75e89e24173a", size = 2224930, upload-time = "2026-08-17T22:56:32.809Z" }, - { url = "https://files.pythonhosted.org/packages/f8/17/b4265d8353909883be2b6ba4f5e9a738249b8d03a1ecb4935394fb7c6273/quil-0.37.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:731463db92d7a4ca8b89bab3a75e0726edb675d42539b26b2726fa936e435e88", size = 2089153, upload-time = "2026-08-17T22:56:34.196Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f5/c8fff3e52b345308a7b608538e0918b757e48d7f505ec2724913d1ed839b/quil-0.37.1-cp313-cp313-win_amd64.whl", hash = "sha256:67d2adc00a34b6d154eb26d47a8b6504d786b5dc181f2af12d9c650640760675", size = 1941421, upload-time = "2026-08-17T22:56:35.838Z" }, -] - [[package]] name = "rich" version = "14.2.0"