cmpnd 0.4.2__tar.gz → 0.4.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. {cmpnd-0.4.2 → cmpnd-0.4.3}/PKG-INFO +1 -1
  2. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/callback.py +18 -0
  3. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/models.py +5 -0
  4. {cmpnd-0.4.2 → cmpnd-0.4.3}/pyproject.toml +1 -1
  5. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_callback.py +64 -0
  6. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_models.py +10 -0
  7. {cmpnd-0.4.2 → cmpnd-0.4.3}/uv.lock +62 -62
  8. {cmpnd-0.4.2 → cmpnd-0.4.3}/.gitignore +0 -0
  9. {cmpnd-0.4.2 → cmpnd-0.4.3}/CLAUDE.md +0 -0
  10. {cmpnd-0.4.2 → cmpnd-0.4.3}/README.md +0 -0
  11. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/__init__.py +0 -0
  12. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/_gepa_patch.py +0 -0
  13. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/_program_patch.py +0 -0
  14. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/_rlm_patch.py +0 -0
  15. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/__init__.py +0 -0
  16. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/api_client.py +0 -0
  17. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/__init__.py +0 -0
  18. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/admin.py +0 -0
  19. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/auth.py +0 -0
  20. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/datasets.py +0 -0
  21. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/deployments.py +0 -0
  22. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/evals.py +0 -0
  23. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/login.py +0 -0
  24. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/optimizations.py +0 -0
  25. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/org.py +0 -0
  26. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/programs.py +0 -0
  27. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/top.py +0 -0
  28. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/commands/traces.py +0 -0
  29. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/credentials.py +0 -0
  30. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/shell.py +0 -0
  31. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/cli/verbs.py +0 -0
  32. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/configuration.py +0 -0
  33. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/context.py +0 -0
  34. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/dataset_sync.py +0 -0
  35. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/datasets.py +0 -0
  36. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/decorators.py +0 -0
  37. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/deployment.py +0 -0
  38. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/eval_handler.py +0 -0
  39. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/execution.py +0 -0
  40. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/exporter.py +0 -0
  41. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/helpers.py +0 -0
  42. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/identity.py +0 -0
  43. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/__init__.py +0 -0
  44. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/decode.py +0 -0
  45. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/encode.py +0 -0
  46. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/hash.py +0 -0
  47. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/program.py +0 -0
  48. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/reflection.py +0 -0
  49. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/ir/types.py +0 -0
  50. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/optimization.py +0 -0
  51. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/optimizers/__init__.py +0 -0
  52. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/optimizers/gepa.py +0 -0
  53. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/optimizers/gepa_callback.py +0 -0
  54. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/optimizers/resume.py +0 -0
  55. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/optimizers/tracker.py +0 -0
  56. {cmpnd-0.4.2 → cmpnd-0.4.3}/cmpnd/packaging.py +0 -0
  57. {cmpnd-0.4.2 → cmpnd-0.4.3}/docs/2026-04-02-code-review.md +0 -0
  58. {cmpnd-0.4.2 → cmpnd-0.4.3}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
  59. {cmpnd-0.4.2 → cmpnd-0.4.3}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
  60. {cmpnd-0.4.2 → cmpnd-0.4.3}/docs/sdk-instrumentation.md +0 -0
  61. {cmpnd-0.4.2 → cmpnd-0.4.3}/examples/local_ollama.py +0 -0
  62. {cmpnd-0.4.2 → cmpnd-0.4.3}/scripts/capture_review_run.py +0 -0
  63. {cmpnd-0.4.2 → cmpnd-0.4.3}/scripts/fixtures/review_run.json.gz +0 -0
  64. {cmpnd-0.4.2 → cmpnd-0.4.3}/scripts/gepa_resume_bug.py +0 -0
  65. {cmpnd-0.4.2 → cmpnd-0.4.3}/scripts/seed_review_run.py +0 -0
  66. {cmpnd-0.4.2 → cmpnd-0.4.3}/stubs/dspy/__init__.pyi +0 -0
  67. {cmpnd-0.4.2 → cmpnd-0.4.3}/stubs/dspy/primitives/__init__.pyi +0 -0
  68. {cmpnd-0.4.2 → cmpnd-0.4.3}/stubs/dspy/primitives/prediction.pyi +0 -0
  69. {cmpnd-0.4.2 → cmpnd-0.4.3}/stubs/dspy/utils/__init__.pyi +0 -0
  70. {cmpnd-0.4.2 → cmpnd-0.4.3}/stubs/dspy/utils/callback.pyi +0 -0
  71. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/__init__.py +0 -0
  72. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/_exporter_helpers.py +0 -0
  73. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/_identity_helpers.py +0 -0
  74. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/__init__.py +0 -0
  75. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/committee_task.py +0 -0
  76. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/conftest.py +0 -0
  77. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/data/committee_train.ndjson.gz +0 -0
  78. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/data/committee_val.ndjson.gz +0 -0
  79. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/fake_lm.py +0 -0
  80. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/helpers.py +0 -0
  81. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_capture_prompts.py +0 -0
  82. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_composite_module.py +0 -0
  83. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_dataset_auto_creation.py +0 -0
  84. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_deploy_execute.py +0 -0
  85. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_deploy_programs.py +0 -0
  86. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_edge_cases.py +0 -0
  87. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_example_hash.py +0 -0
  88. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_gepa_optimization.py +0 -0
  89. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_lm_accuracy.py +0 -0
  90. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_module_tracing.py +0 -0
  91. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_optimization_lineage.py +0 -0
  92. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_optimization_metric_identity.py +0 -0
  93. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_optimize_failures.py +0 -0
  94. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_optimize_loop.py +0 -0
  95. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_optimize_review_committee.py +0 -0
  96. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_optimize_server_owned_completion.py +0 -0
  97. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_parallel_export.py +0 -0
  98. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_project_attribution.py +0 -0
  99. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_react_tool_spans.py +0 -0
  100. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_save_load.py +0 -0
  101. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_trace_structure.py +0 -0
  102. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/e2e/test_user_attribution.py +0 -0
  103. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/01_predict_qa.json +0 -0
  104. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
  105. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
  106. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/04_predict_richer_types.json +0 -0
  107. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
  108. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/06_multichaincomparison.json +0 -0
  109. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/07_program_of_thought.json +0 -0
  110. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/08_opaque_module.json +0 -0
  111. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
  112. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/10_react.json +0 -0
  113. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/11_refine.json +0 -0
  114. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/12_retrieve.json +0 -0
  115. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/13_knn.json +0 -0
  116. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/14_parallel.json +0 -0
  117. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/identity_vectors/README.md +0 -0
  118. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/integration/__init__.py +0 -0
  119. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/integration/conftest.py +0 -0
  120. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/integration/test_cli_deploy_smoketest.py +0 -0
  121. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/integration/test_logs_renders_traces.py +0 -0
  122. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/integration/test_optimizing_progress.py +0 -0
  123. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/integration/test_unhappy_path.py +0 -0
  124. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/__init__.py +0 -0
  125. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/conftest.py +0 -0
  126. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/seed_parity.py +0 -0
  127. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_auth.py +0 -0
  128. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_datasets.py +0 -0
  129. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_deployments.py +0 -0
  130. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_evals.py +0 -0
  131. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_health.py +0 -0
  132. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_modules.py +0 -0
  133. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_optimizations.py +0 -0
  134. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_programs.py +0 -0
  135. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_signatures.py +0 -0
  136. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_trace_streaming.py +0 -0
  137. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/parity/test_traces.py +0 -0
  138. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/__init__.py +0 -0
  139. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/_reliability.py +0 -0
  140. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_deploy_programs.py +0 -0
  141. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_multi_client_stress.py +0 -0
  142. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_optimize_client_committee.py +0 -0
  143. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_optimize_loop.py +0 -0
  144. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_optimize_stress.py +0 -0
  145. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_real_provider_twins.py +0 -0
  146. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/stress/test_reliability.py +0 -0
  147. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/__init__.py +0 -0
  148. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/conftest.py +0 -0
  149. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_admin.py +0 -0
  150. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_api_client.py +0 -0
  151. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_auth.py +0 -0
  152. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_credentials.py +0 -0
  153. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_datasets.py +0 -0
  154. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_deployments.py +0 -0
  155. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_evals.py +0 -0
  156. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_login.py +0 -0
  157. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_main.py +0 -0
  158. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_optimizations.py +0 -0
  159. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_org.py +0 -0
  160. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_parity.py +0 -0
  161. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_programs.py +0 -0
  162. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_shell.py +0 -0
  163. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_top.py +0 -0
  164. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_cli/test_traces.py +0 -0
  165. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_clustering/__init__.py +0 -0
  166. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_clustering/conftest.py +0 -0
  167. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_clustering/test_edge_cases.py +0 -0
  168. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_clustering/test_hash_consistency.py +0 -0
  169. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_clustering/test_type_conversion.py +0 -0
  170. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_configuration.py +0 -0
  171. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_context.py +0 -0
  172. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_context_propagation.py +0 -0
  173. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_dataset_polling.py +0 -0
  174. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_dataset_sync.py +0 -0
  175. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_datasets.py +0 -0
  176. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_decorators.py +0 -0
  177. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_deploy.py +0 -0
  178. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_eval.py +0 -0
  179. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_eval_start.py +0 -0
  180. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_exception_paths.py +0 -0
  181. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_execute.py +0 -0
  182. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_exporter.py +0 -0
  183. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_exporter_real.py +0 -0
  184. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_fake_lm.py +0 -0
  185. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_gepa_callback.py +0 -0
  186. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_gepa_integration.py +0 -0
  187. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_gepa_resume.py +0 -0
  188. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_identity.py +0 -0
  189. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_integration.py +0 -0
  190. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_ir_encoder_properties.py +0 -0
  191. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_ir_golden_vectors.py +0 -0
  192. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_ir_roundtrip.py +0 -0
  193. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_optimization_start.py +0 -0
  194. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_optimize.py +0 -0
  195. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_optimize_lift.py +0 -0
  196. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_optimize_terminal_failure.py +0 -0
  197. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_packaging.py +0 -0
  198. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_packaging_callable_source.py +0 -0
  199. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_packaging_program_source.py +0 -0
  200. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_program_lineage_persist.py +0 -0
  201. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_project_payload.py +0 -0
  202. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_reflector_properties.py +0 -0
  203. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_reflector_smoke.py +0 -0
  204. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_repro_reactv2_bugs.py +0 -0
  205. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_rlm_patch.py +0 -0
  206. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_schemas.py +0 -0
  207. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_seed_review_run.py +0 -0
  208. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_stats_export.py +0 -0
  209. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_tracked_gepa.py +0 -0
  210. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_tracker_enrich.py +0 -0
  211. {cmpnd-0.4.2 → cmpnd-0.4.3}/tests/test_truncation.py +0 -0
  212. {cmpnd-0.4.2 → cmpnd-0.4.3}/todo.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cmpnd
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: DSPy observability and deployment SDK for cmpnd
5
5
  Project-URL: Homepage, https://cmpnd.ai
6
6
  Author-email: cmpnd <hello@cmpnd.ai>
@@ -182,6 +182,10 @@ class _ModuleMixin(_CallbackBase):
182
182
  trace = self._create_trace(instance, inputs)
183
183
  context.set_current_trace(trace)
184
184
 
185
+ # Carry the root module's type so serve can classify the trace at
186
+ # start (CMP-537) — before any span lands — instead of inferring it
187
+ # from span shape later.
188
+ trace.root_span_type = span_type.value
185
189
  # RLM traces use streaming export; everything else batches
186
190
  if span_type == models.SpanType.RLM:
187
191
  trace.streaming = True
@@ -230,6 +234,20 @@ class _ModuleMixin(_CallbackBase):
230
234
  if rh_input is not None and hasattr(rh_input, "entries") and rh_input.entries:
231
235
  last_output = rh_input.entries[-1].output
232
236
  rlm_parent.repl_history[-1]["output"] = last_output
237
+ # Surface the previous turn's code output on THIS (turn N+1)
238
+ # span so a streaming reader can fill in turn N's notebook
239
+ # output mid-run, rather than waiting for the whole trajectory
240
+ # on the RLM parent span at finalize (CMP-537). The prior
241
+ # turn's span has already ended + been exported, so it rides
242
+ # here instead; the RLM's final turn (no successor) still
243
+ # resolves at finalize. Capped like an output field so a large
244
+ # stdout can't bloat the streamed span.
245
+ if last_output is not None:
246
+ prev = last_output if isinstance(last_output, str) else str(last_output)
247
+ cap = self._max_output_field_size
248
+ if len(prev) > cap:
249
+ prev = prev[:cap] + f"\n\n… (truncated, {len(prev)} chars total)"
250
+ span.attributes["rlm.prev_output"] = prev
233
251
 
234
252
  # Push to context stack
235
253
  context.push_span(span)
@@ -387,6 +387,10 @@ class TraceBuilder:
387
387
 
388
388
  # Export routing: True = stream spans individually, False = batch at completion
389
389
  streaming: bool = False
390
+ # The root module's span type (e.g. "rlm"), sent in the /start payload so
391
+ # serve can classify a streaming trace the moment it starts — before any
392
+ # span has landed — rather than inferring it from span shape later (CMP-537).
393
+ root_span_type: str | None = None
390
394
  _batch_spans: list["SpanBuilder"] = field(default_factory=list)
391
395
 
392
396
  tags: dict[str, str] = field(default_factory=dict)
@@ -443,6 +447,7 @@ class TraceBuilder:
443
447
  "program_signature_hash": identity.format_signature_hash(self.program_signature_hash),
444
448
  "signature_summary": self.signature_summary,
445
449
  "component_signatures": self.component_signatures,
450
+ "root_span_type": self.root_span_type,
446
451
  "project": self.project_tags[0] if self.project_tags else None,
447
452
  "project_tags": self.project_tags if self.project_tags else [],
448
453
  }
@@ -5,7 +5,7 @@ name = "cmpnd"
5
5
  # it's new) — no git tags. Bump with `uv version --bump {minor,patch}` or by
6
6
  # hand. Runtime `cmpnd.__version__` reads installed metadata, so it tracks
7
7
  # this automatically. See docs/plans/2026-07-02-sdk-pypi-tag-free-publish.md.
8
- version = "0.4.2"
8
+ version = "0.4.3"
9
9
  description = "DSPy observability and deployment SDK for cmpnd"
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.10"
@@ -1372,6 +1372,70 @@ class TestReplHistory:
1372
1372
  assert "SUBMIT" in rlm_span.repl_history[1]["code"]
1373
1373
  assert "output" not in rlm_span.repl_history[1]
1374
1374
 
1375
+ def test_rlm_predict_carries_previous_turn_output(self):
1376
+ """Each RLM turn's PREDICT span carries the PRIOR turn's code output as
1377
+ the rlm.prev_output attribute, so a streaming reader can fill in the
1378
+ earlier notebook cells' output mid-run instead of waiting for the whole
1379
+ trajectory at finalize (CMP-537). The first turn has no predecessor, so
1380
+ it carries none; the final turn's output resolves at finalize."""
1381
+ from dspy.predict.rlm import REPLHistory
1382
+
1383
+ callback = self._make_callback()
1384
+ exported_spans = []
1385
+
1386
+ class MockExporter:
1387
+ def export_span(self, span):
1388
+ exported_spans.append(span)
1389
+
1390
+ def export_trace_start(self, trace):
1391
+ pass
1392
+
1393
+ def export_trace_finalize(self, trace):
1394
+ pass
1395
+
1396
+ def export_trace_stats(self, trace):
1397
+ pass
1398
+
1399
+ empty_history = REPLHistory()
1400
+ history_after_step0 = empty_history.append(
1401
+ reasoning="look at the data",
1402
+ code="print(context)",
1403
+ output="Sunny, 72F",
1404
+ )
1405
+
1406
+ with mock.patch("cmpnd.exporter.get_exporter", return_value=MockExporter()):
1407
+ callback.on_module_start(
1408
+ call_id="rlm_root",
1409
+ instance=self._make_mock_rlm(),
1410
+ inputs={"question": "What is the weather?"},
1411
+ )
1412
+ callback.on_module_start(
1413
+ call_id="predict_0",
1414
+ instance=self._make_mock_predict(),
1415
+ inputs={"repl_history": empty_history},
1416
+ )
1417
+ callback.on_module_end(
1418
+ call_id="predict_0",
1419
+ outputs=self._make_prediction({"reasoning": "look at the data", "code": "print(context)"}),
1420
+ )
1421
+ callback.on_module_start(
1422
+ call_id="predict_1",
1423
+ instance=self._make_mock_predict(),
1424
+ inputs={"repl_history": history_after_step0},
1425
+ )
1426
+ callback.on_module_end(
1427
+ call_id="predict_1",
1428
+ outputs=self._make_prediction({"reasoning": "submit now", "code": "SUBMIT('Sunny, 72F')"}),
1429
+ )
1430
+
1431
+ predict_spans = [s for s in exported_spans if s.span_type == SpanType.PREDICT]
1432
+ assert len(predict_spans) == 2
1433
+ turn0, turn1 = predict_spans[0], predict_spans[1]
1434
+ # Turn 0 has no predecessor → no prev_output.
1435
+ assert "rlm.prev_output" not in turn0.attributes
1436
+ # Turn 1 carries turn 0's code output.
1437
+ assert turn1.attributes.get("rlm.prev_output") == "Sunny, 72F"
1438
+
1375
1439
  def test_repl_history_empty_for_non_rlm_modules(self):
1376
1440
  """Non-RLM modules should not have repl_history populated."""
1377
1441
  callback = self._make_callback()
@@ -363,6 +363,16 @@ class TestTraceBuilder:
363
363
  assert "total_tokens" not in d
364
364
  assert "status" not in d
365
365
 
366
+ def test_to_start_dict_carries_root_span_type(self):
367
+ """The root module's span type rides the start payload so serve can
368
+ classify a streaming trace at start, before any span lands (CMP-537)."""
369
+ trace = TraceBuilder(trace_id=uuid4())
370
+ trace.start_time = datetime(2026, 7, 22, tzinfo=timezone.utc)
371
+ trace.root_span_type = "rlm"
372
+ assert trace.to_start_dict()["root_span_type"] == "rlm"
373
+ # Unset (an older/non-root builder) sends null, not a crash.
374
+ assert TraceBuilder(trace_id=uuid4()).to_start_dict()["root_span_type"] is None
375
+
366
376
  def test_to_finalize_dict(self):
367
377
  """to_finalize_dict includes timing, metrics, and previews only."""
368
378
  trace = TraceBuilder(trace_id=uuid4())
@@ -246,9 +246,9 @@ name = "boto3"
246
246
  version = "1.43.1"
247
247
  source = { registry = "https://pypi.org/simple" }
248
248
  dependencies = [
249
- { name = "botocore", marker = "python_full_version >= '3.11'" },
250
- { name = "jmespath", marker = "python_full_version >= '3.11'" },
251
- { name = "s3transfer", marker = "python_full_version >= '3.11'" },
249
+ { name = "botocore" },
250
+ { name = "jmespath" },
251
+ { name = "s3transfer" },
252
252
  ]
253
253
  sdist = { url = "https://files.pythonhosted.org/packages/98/36/028c12ed6ed85009a21b5472eb76c27f9b0341c6986f06f83475b40aaf51/boto3-1.43.1.tar.gz", hash = "sha256:9e4f85a7884797ff0f52c257094730ed228aaa07fa8134775ff8f86909cf4f2a", size = 113175, upload-time = "2026-04-30T20:27:04.569Z" }
254
254
  wheels = [
@@ -260,9 +260,9 @@ name = "botocore"
260
260
  version = "1.43.1"
261
261
  source = { registry = "https://pypi.org/simple" }
262
262
  dependencies = [
263
- { name = "jmespath", marker = "python_full_version >= '3.11'" },
264
- { name = "python-dateutil", marker = "python_full_version >= '3.11'" },
265
- { name = "urllib3", marker = "python_full_version >= '3.11'" },
263
+ { name = "jmespath" },
264
+ { name = "python-dateutil" },
265
+ { name = "urllib3" },
266
266
  ]
267
267
  sdist = { url = "https://files.pythonhosted.org/packages/03/b7/416ae6f1461d6fec3b3aaffc4759371319c71a21f7ab4c3106ee574fda8d/botocore-1.43.1.tar.gz", hash = "sha256:270d6357d662550fdb84973ec247e02bece0b6283d90bf37319c7753515336e4", size = 15296915, upload-time = "2026-04-30T20:26:50.962Z" }
268
268
  wheels = [
@@ -292,7 +292,7 @@ name = "cffi"
292
292
  version = "2.0.0"
293
293
  source = { registry = "https://pypi.org/simple" }
294
294
  dependencies = [
295
- { name = "pycparser", marker = "python_full_version >= '3.11' and implementation_name != 'PyPy'" },
295
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
296
296
  ]
297
297
  sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
298
298
  wheels = [
@@ -497,7 +497,7 @@ wheels = [
497
497
 
498
498
  [[package]]
499
499
  name = "cmpnd"
500
- version = "0.4.2"
500
+ version = "0.4.3"
501
501
  source = { editable = "." }
502
502
  dependencies = [
503
503
  { name = "dspy" },
@@ -553,16 +553,16 @@ name = "cmpnd-deploy"
553
553
  version = "0.1.0"
554
554
  source = { editable = "../deploy" }
555
555
  dependencies = [
556
- { name = "boto3", marker = "python_full_version >= '3.11'" },
557
- { name = "cloudpickle", marker = "python_full_version >= '3.11'" },
558
- { name = "cryptography", marker = "python_full_version >= '3.11'" },
559
- { name = "dspy", marker = "python_full_version >= '3.11'" },
560
- { name = "httpx", marker = "python_full_version >= '3.11'" },
561
- { name = "markdown-it-py", marker = "python_full_version >= '3.11'" },
562
- { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version >= '3.11'" },
563
- { name = "opentelemetry-sdk", marker = "python_full_version >= '3.11'" },
564
- { name = "pyyaml", marker = "python_full_version >= '3.11'" },
565
- { name = "requests", marker = "python_full_version >= '3.11'" },
556
+ { name = "boto3" },
557
+ { name = "cloudpickle" },
558
+ { name = "cryptography" },
559
+ { name = "dspy" },
560
+ { name = "httpx" },
561
+ { name = "markdown-it-py" },
562
+ { name = "opentelemetry-exporter-otlp-proto-http" },
563
+ { name = "opentelemetry-sdk" },
564
+ { name = "pyyaml" },
565
+ { name = "requests" },
566
566
  ]
567
567
 
568
568
  [package.metadata]
@@ -676,7 +676,7 @@ name = "cryptography"
676
676
  version = "49.0.0"
677
677
  source = { registry = "https://pypi.org/simple" }
678
678
  dependencies = [
679
- { name = "cffi", marker = "python_full_version >= '3.11' and platform_python_implementation != 'PyPy'" },
679
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
680
680
  ]
681
681
  sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" }
682
682
  wheels = [
@@ -789,7 +789,7 @@ name = "exceptiongroup"
789
789
  version = "1.3.1"
790
790
  source = { registry = "https://pypi.org/simple" }
791
791
  dependencies = [
792
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
792
+ { name = "typing-extensions" },
793
793
  ]
794
794
  sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
795
795
  wheels = [
@@ -1046,7 +1046,7 @@ name = "googleapis-common-protos"
1046
1046
  version = "1.75.0"
1047
1047
  source = { registry = "https://pypi.org/simple" }
1048
1048
  dependencies = [
1049
- { name = "protobuf", marker = "python_full_version >= '3.11'" },
1049
+ { name = "protobuf" },
1050
1050
  ]
1051
1051
  sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" }
1052
1052
  wheels = [
@@ -1236,17 +1236,17 @@ resolution-markers = [
1236
1236
  "python_full_version < '3.11'",
1237
1237
  ]
1238
1238
  dependencies = [
1239
- { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" },
1240
- { name = "decorator", marker = "python_full_version < '3.11'" },
1241
- { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
1242
- { name = "jedi", marker = "python_full_version < '3.11'" },
1243
- { name = "matplotlib-inline", marker = "python_full_version < '3.11'" },
1244
- { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" },
1245
- { name = "prompt-toolkit", marker = "python_full_version < '3.11'" },
1246
- { name = "pygments", marker = "python_full_version < '3.11'" },
1247
- { name = "stack-data", marker = "python_full_version < '3.11'" },
1248
- { name = "traitlets", marker = "python_full_version < '3.11'" },
1249
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
1239
+ { name = "colorama", marker = "sys_platform == 'win32'" },
1240
+ { name = "decorator" },
1241
+ { name = "exceptiongroup" },
1242
+ { name = "jedi" },
1243
+ { name = "matplotlib-inline" },
1244
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1245
+ { name = "prompt-toolkit" },
1246
+ { name = "pygments" },
1247
+ { name = "stack-data" },
1248
+ { name = "traitlets" },
1249
+ { name = "typing-extensions" },
1250
1250
  ]
1251
1251
  sdist = { url = "https://files.pythonhosted.org/packages/40/18/f8598d287006885e7136451fdea0755af4ebcbfe342836f24deefaed1164/ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624", size = 5513971, upload-time = "2026-03-27T10:02:13.94Z" }
1252
1252
  wheels = [
@@ -1262,18 +1262,18 @@ resolution-markers = [
1262
1262
  "python_full_version >= '3.11' and python_full_version < '3.15'",
1263
1263
  ]
1264
1264
  dependencies = [
1265
- { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" },
1266
- { name = "decorator", marker = "python_full_version >= '3.11'" },
1267
- { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" },
1268
- { name = "jedi", marker = "python_full_version >= '3.11'" },
1269
- { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" },
1270
- { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" },
1271
- { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" },
1272
- { name = "psutil", marker = "python_full_version >= '3.11'" },
1273
- { name = "pygments", marker = "python_full_version >= '3.11'" },
1274
- { name = "stack-data", marker = "python_full_version >= '3.11'" },
1275
- { name = "traitlets", marker = "python_full_version >= '3.11'" },
1276
- { name = "typing-extensions", marker = "python_full_version == '3.11.*'" },
1265
+ { name = "colorama", marker = "sys_platform == 'win32'" },
1266
+ { name = "decorator" },
1267
+ { name = "ipython-pygments-lexers" },
1268
+ { name = "jedi" },
1269
+ { name = "matplotlib-inline" },
1270
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
1271
+ { name = "prompt-toolkit" },
1272
+ { name = "psutil" },
1273
+ { name = "pygments" },
1274
+ { name = "stack-data" },
1275
+ { name = "traitlets" },
1276
+ { name = "typing-extensions", marker = "python_full_version < '3.12'" },
1277
1277
  ]
1278
1278
  sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/87cda5842cf5c31837c06ddb588e11c3c35d8ece89b7a0108c06b8c9b00a/ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967", size = 4430549, upload-time = "2026-04-24T12:24:55.221Z" }
1279
1279
  wheels = [
@@ -1285,7 +1285,7 @@ name = "ipython-pygments-lexers"
1285
1285
  version = "1.1.1"
1286
1286
  source = { registry = "https://pypi.org/simple" }
1287
1287
  dependencies = [
1288
- { name = "pygments", marker = "python_full_version >= '3.11'" },
1288
+ { name = "pygments" },
1289
1289
  ]
1290
1290
  sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" }
1291
1291
  wheels = [
@@ -1931,7 +1931,7 @@ name = "opentelemetry-api"
1931
1931
  version = "1.43.0"
1932
1932
  source = { registry = "https://pypi.org/simple" }
1933
1933
  dependencies = [
1934
- { name = "typing-extensions", marker = "python_full_version >= '3.11'" },
1934
+ { name = "typing-extensions" },
1935
1935
  ]
1936
1936
  sdist = { url = "https://files.pythonhosted.org/packages/ae/cc/e4c9584181f86494df0f6bdec1a4f3280c50db44704dc2a407e994fc87bb/opentelemetry_api-1.43.0.tar.gz", hash = "sha256:107d0d03857ea8fc7c5fcbbbd83f800c281f0d560553d61c1d675fccfd1761c1", size = 73476, upload-time = "2026-06-24T15:19:55.323Z" }
1937
1937
  wheels = [
@@ -1943,7 +1943,7 @@ name = "opentelemetry-exporter-otlp-proto-common"
1943
1943
  version = "1.43.0"
1944
1944
  source = { registry = "https://pypi.org/simple" }
1945
1945
  dependencies = [
1946
- { name = "opentelemetry-proto", marker = "python_full_version >= '3.11'" },
1946
+ { name = "opentelemetry-proto" },
1947
1947
  ]
1948
1948
  sdist = { url = "https://files.pythonhosted.org/packages/55/c1/e8098490ab15abf116dcaf9fa89ededcb35547c7d08d4b5a62f573dc1e63/opentelemetry_exporter_otlp_proto_common-1.43.0.tar.gz", hash = "sha256:c4e32ba6d6b13bdb2b8f6764c4fd28d00192826561aa04f6d14eedfce7ac076f", size = 20197, upload-time = "2026-06-24T15:20:00.247Z" }
1949
1949
  wheels = [
@@ -1955,13 +1955,13 @@ name = "opentelemetry-exporter-otlp-proto-http"
1955
1955
  version = "1.43.0"
1956
1956
  source = { registry = "https://pypi.org/simple" }
1957
1957
  dependencies = [
1958
- { name = "googleapis-common-protos", marker = "python_full_version >= '3.11'" },
1959
- { name = "opentelemetry-api", marker = "python_full_version >= '3.11'" },
1960
- { name = "opentelemetry-exporter-otlp-proto-common", marker = "python_full_version >= '3.11'" },
1961
- { name = "opentelemetry-proto", marker = "python_full_version >= '3.11'" },
1962
- { name = "opentelemetry-sdk", marker = "python_full_version >= '3.11'" },
1963
- { name = "requests", marker = "python_full_version >= '3.11'" },
1964
- { name = "typing-extensions", marker = "python_full_version >= '3.11'" },
1958
+ { name = "googleapis-common-protos" },
1959
+ { name = "opentelemetry-api" },
1960
+ { name = "opentelemetry-exporter-otlp-proto-common" },
1961
+ { name = "opentelemetry-proto" },
1962
+ { name = "opentelemetry-sdk" },
1963
+ { name = "requests" },
1964
+ { name = "typing-extensions" },
1965
1965
  ]
1966
1966
  sdist = { url = "https://files.pythonhosted.org/packages/fc/92/0b9f56412483a8891d4843890294796c9df8ab42417bd9bad8035d840cb3/opentelemetry_exporter_otlp_proto_http-1.43.0.tar.gz", hash = "sha256:fa8a42bb7d00ee5391f4c0b04d8e6a46c03caa437903296ab73a81dc11ba118f", size = 25406, upload-time = "2026-06-24T15:20:01.515Z" }
1967
1967
  wheels = [
@@ -1973,7 +1973,7 @@ name = "opentelemetry-proto"
1973
1973
  version = "1.43.0"
1974
1974
  source = { registry = "https://pypi.org/simple" }
1975
1975
  dependencies = [
1976
- { name = "protobuf", marker = "python_full_version >= '3.11'" },
1976
+ { name = "protobuf" },
1977
1977
  ]
1978
1978
  sdist = { url = "https://files.pythonhosted.org/packages/e0/b9/d357faefb40bda1d4799913e6af611171ff22a2dedcb93576bc92242d056/opentelemetry_proto-1.43.0.tar.gz", hash = "sha256:224778df17e1f3fafeaaa21d874236ca5f6ffc2f86e0899298ec7351aac27924", size = 46481, upload-time = "2026-06-24T15:20:07.625Z" }
1979
1979
  wheels = [
@@ -1985,9 +1985,9 @@ name = "opentelemetry-sdk"
1985
1985
  version = "1.43.0"
1986
1986
  source = { registry = "https://pypi.org/simple" }
1987
1987
  dependencies = [
1988
- { name = "opentelemetry-api", marker = "python_full_version >= '3.11'" },
1989
- { name = "opentelemetry-semantic-conventions", marker = "python_full_version >= '3.11'" },
1990
- { name = "typing-extensions", marker = "python_full_version >= '3.11'" },
1988
+ { name = "opentelemetry-api" },
1989
+ { name = "opentelemetry-semantic-conventions" },
1990
+ { name = "typing-extensions" },
1991
1991
  ]
1992
1992
  sdist = { url = "https://files.pythonhosted.org/packages/3e/eb/5041074274ac0956b03637cc039d434569112468e875eddfcc9a0674ce06/opentelemetry_sdk-1.43.0.tar.gz", hash = "sha256:d8187c81c162df9913e4003dd6485f7390d9a24fc17026ec7387b8b8218b08e9", size = 254744, upload-time = "2026-06-24T15:20:08.467Z" }
1993
1993
  wheels = [
@@ -1999,8 +1999,8 @@ name = "opentelemetry-semantic-conventions"
1999
1999
  version = "0.64b0"
2000
2000
  source = { registry = "https://pypi.org/simple" }
2001
2001
  dependencies = [
2002
- { name = "opentelemetry-api", marker = "python_full_version >= '3.11'" },
2003
- { name = "typing-extensions", marker = "python_full_version >= '3.11'" },
2002
+ { name = "opentelemetry-api" },
2003
+ { name = "typing-extensions" },
2004
2004
  ]
2005
2005
  sdist = { url = "https://files.pythonhosted.org/packages/5a/30/5f26df29509eccd86b99b481ac9ffa39da49ba9577cc69071c552ae30447/opentelemetry_semantic_conventions-0.64b0.tar.gz", hash = "sha256:72f76fb2d1582d9d033dd1fcd84532e961e6ff3d90d24ba6fabc72975a83864c", size = 148340, upload-time = "2026-06-24T15:20:09.267Z" }
2006
2006
  wheels = [
@@ -2526,7 +2526,7 @@ name = "python-dateutil"
2526
2526
  version = "2.9.0.post0"
2527
2527
  source = { registry = "https://pypi.org/simple" }
2528
2528
  dependencies = [
2529
- { name = "six", marker = "python_full_version >= '3.11'" },
2529
+ { name = "six" },
2530
2530
  ]
2531
2531
  sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
2532
2532
  wheels = [
@@ -2930,7 +2930,7 @@ name = "s3transfer"
2930
2930
  version = "0.17.0"
2931
2931
  source = { registry = "https://pypi.org/simple" }
2932
2932
  dependencies = [
2933
- { name = "botocore", marker = "python_full_version >= '3.11'" },
2933
+ { name = "botocore" },
2934
2934
  ]
2935
2935
  sdist = { url = "https://files.pythonhosted.org/packages/9b/ec/7c692cde9125b77e84b307354d4fb705f98b8ccad59a036d5957ca75bfc3/s3transfer-0.17.0.tar.gz", hash = "sha256:9edeb6d1c3c2f89d6050348548834ad8289610d886e5bf7b7207728bd43ce33a", size = 155337, upload-time = "2026-04-29T22:07:36.33Z" }
2936
2936
  wheels = [
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes