cmpnd 0.53.0__tar.gz → 0.55.0__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 (384) hide show
  1. {cmpnd-0.53.0 → cmpnd-0.55.0}/AGENTS.md +13 -3
  2. {cmpnd-0.53.0 → cmpnd-0.55.0}/PKG-INFO +78 -82
  3. {cmpnd-0.53.0 → cmpnd-0.55.0}/README.md +77 -81
  4. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/__init__.py +46 -28
  5. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_gepa_patch.py +3 -3
  6. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/__init__.py +3 -3
  7. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/admin.py +172 -3
  8. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/optimizations.py +35 -1
  9. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/top.py +19 -8
  10. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/shell.py +11 -8
  11. cmpnd-0.55.0/cmpnd/client.py +862 -0
  12. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/deployment.py +23 -59
  13. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/deployment_runs.py +19 -13
  14. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/execution.py +36 -82
  15. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/lm_configuration.py +1 -1
  16. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimization.py +56 -225
  17. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/tracker.py +1 -1
  18. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/packaging.py +5 -4
  19. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/cli.md +59 -6
  20. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/client.md +44 -12
  21. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/custom-proposer.md +8 -6
  22. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/sdk-instrumentation.md +34 -28
  23. {cmpnd-0.53.0 → cmpnd-0.55.0}/examples/generalizing_proposer.py +9 -7
  24. {cmpnd-0.53.0 → cmpnd-0.55.0}/pyproject.toml +1 -1
  25. cmpnd-0.55.0/scripts/selfhost_compat.py +127 -0
  26. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/committee_task.py +10 -9
  27. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/helpers.py +12 -2
  28. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_deploy_execute.py +22 -22
  29. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_deploy_pandas.py +7 -9
  30. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_deploy_programs.py +11 -12
  31. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_failures.py +9 -15
  32. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_loop.py +15 -18
  33. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_server_owned_completion.py +5 -4
  34. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_valsets_cli.py +5 -5
  35. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/conftest.py +2 -2
  36. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +9 -7
  37. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/hosted_optimize_probe.py +7 -7
  38. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_cli_deploy_smoketest.py +1 -1
  39. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_logs_renders_traces.py +4 -4
  40. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_provider.py +7 -7
  41. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_reliability.py +1 -1
  42. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_deploy_programs.py +4 -4
  43. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_loop.py +15 -14
  44. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_loop_wasm.py +17 -15
  45. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_stress.py +12 -10
  46. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_real_provider_twins.py +4 -4
  47. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_rlm_wasm.py +10 -12
  48. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_metric_contract.py +26 -15
  49. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_named_models.py +2 -0
  50. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_optimize.py +7 -1
  51. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_admin.py +135 -0
  52. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_optimizations.py +35 -0
  53. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_shell.py +44 -6
  54. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_top.py +9 -4
  55. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_client.py +11 -11
  56. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_client_program_names.py +7 -7
  57. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deploy.py +34 -30
  58. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deploy_mcp_tool_references.py +4 -2
  59. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deploy_program_id.py +39 -36
  60. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deployment_runs.py +54 -43
  61. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_execute.py +73 -37
  62. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_execute_run_identity.py +13 -11
  63. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_lm_configuration.py +6 -1
  64. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_mcp_tools.py +1 -1
  65. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize.py +168 -53
  66. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_budget.py +27 -19
  67. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_proposer.py +7 -4
  68. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging_mcp_tools.py +2 -2
  69. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_id_deprecation.py +19 -53
  70. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_names_in_deploy.py +101 -27
  71. cmpnd-0.55.0/tests/test_replaced_names.py +87 -0
  72. {cmpnd-0.53.0 → cmpnd-0.55.0}/uv.lock +1 -1
  73. cmpnd-0.53.0/cmpnd/client.py +0 -410
  74. {cmpnd-0.53.0 → cmpnd-0.55.0}/.gitignore +0 -0
  75. {cmpnd-0.53.0 → cmpnd-0.55.0}/CLAUDE.md +0 -0
  76. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_assessments.py +0 -0
  77. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_authored_import.py +0 -0
  78. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_deployments.py +0 -0
  79. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_exporter_pool.py +0 -0
  80. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_http.py +0 -0
  81. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_program_patch.py +0 -0
  82. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_rlm_patch.py +0 -0
  83. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_runtime_tools.py +0 -0
  84. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_timespec.py +0 -0
  85. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_traces.py +0 -0
  86. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_valsets.py +0 -0
  87. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/authored.py +0 -0
  88. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/callback.py +0 -0
  89. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/api_client.py +0 -0
  90. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/__init__.py +0 -0
  91. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/assessments.py +0 -0
  92. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/auth.py +0 -0
  93. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/datasets.py +0 -0
  94. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/deployments.py +0 -0
  95. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/evals.py +0 -0
  96. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/login.py +0 -0
  97. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/org.py +0 -0
  98. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/programs.py +0 -0
  99. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
  100. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/signatures.py +0 -0
  101. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/tool_servers.py +0 -0
  102. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/traces.py +0 -0
  103. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/valsets.py +0 -0
  104. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/credentials.py +0 -0
  105. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/deprecation.py +0 -0
  106. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/pagination.py +0 -0
  107. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/trace_render.py +0 -0
  108. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/tree_help.py +0 -0
  109. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/verbs.py +0 -0
  110. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/configuration.py +0 -0
  111. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/context.py +0 -0
  112. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/dataset_sync.py +0 -0
  113. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/datasets.py +0 -0
  114. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/decorators.py +0 -0
  115. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/deployment_metadata.py +0 -0
  116. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/eval_handler.py +0 -0
  117. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/exporter.py +0 -0
  118. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/exporter_http.py +0 -0
  119. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/helpers.py +0 -0
  120. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/identity.py +0 -0
  121. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/imaging.py +0 -0
  122. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/__init__.py +0 -0
  123. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/decode.py +0 -0
  124. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/encode.py +0 -0
  125. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/hash.py +0 -0
  126. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/program.py +0 -0
  127. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/reflection.py +0 -0
  128. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/types.py +0 -0
  129. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/xxh64.py +0 -0
  130. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/mcp_servers.py +0 -0
  131. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/models.py +0 -0
  132. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/named_programs.py +0 -0
  133. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/__init__.py +0 -0
  134. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/gepa.py +0 -0
  135. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/gepa_callback.py +0 -0
  136. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/resume.py +0 -0
  137. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/programs.py +0 -0
  138. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/references.py +0 -0
  139. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/retry.py +0 -0
  140. {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/traces.py +0 -0
  141. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/2026-04-02-code-review.md +0 -0
  142. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
  143. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
  144. {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/reading-traces.md +0 -0
  145. {cmpnd-0.53.0 → cmpnd-0.55.0}/examples/local_ollama.py +0 -0
  146. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/LINEAGE.md +0 -0
  147. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/README.md +0 -0
  148. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/__init__.py +0 -0
  149. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/bodies.py +0 -0
  150. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/client_floor.py +0 -0
  151. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
  152. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/program_names.py +0 -0
  153. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/protocols.py +0 -0
  154. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/py.typed +0 -0
  155. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/request_log.py +0 -0
  156. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/retry.py +0 -0
  157. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
  158. {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/pyproject.toml +0 -0
  159. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/audit-sdist.sh +0 -0
  160. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/capture_review_run.py +0 -0
  161. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/check-pip-install.sh +0 -0
  162. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/check_release_artifacts.py +0 -0
  163. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/fixtures/review_run.json.gz +0 -0
  164. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/gepa_resume_bug.py +0 -0
  165. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/release-stress.sh +0 -0
  166. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/require_version_bump.py +0 -0
  167. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/seed_review_run.py +0 -0
  168. {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/test-in-linux.sh +0 -0
  169. {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/__init__.pyi +0 -0
  170. {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/primitives/__init__.pyi +0 -0
  171. {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/primitives/prediction.pyi +0 -0
  172. {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/utils/__init__.pyi +0 -0
  173. {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/utils/callback.pyi +0 -0
  174. {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/utils/dummies.pyi +0 -0
  175. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/__init__.py +0 -0
  176. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_deployment_signature_helpers.py +0 -0
  177. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_exporter_helpers.py +0 -0
  178. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_fake_clock.py +0 -0
  179. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_identity_helpers.py +0 -0
  180. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_resolve_refs.py +0 -0
  181. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_traced_run.py +0 -0
  182. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/conftest.py +0 -0
  183. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/__init__.py +0 -0
  184. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/conftest.py +0 -0
  185. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
  186. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
  187. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/fake_lm.py +0 -0
  188. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/target_capabilities.py +0 -0
  189. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_assessments_cli.py +0 -0
  190. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_capture_prompts.py +0 -0
  191. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_composite_module.py +0 -0
  192. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
  193. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_edge_cases.py +0 -0
  194. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_example_hash.py +0 -0
  195. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_gepa_optimization.py +0 -0
  196. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_interpreter_spans.py +0 -0
  197. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_lm_accuracy.py +0 -0
  198. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_module_tracing.py +0 -0
  199. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimization_lineage.py +0 -0
  200. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
  201. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_review_committee.py +0 -0
  202. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_parallel_export.py +0 -0
  203. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_project_attribution.py +0 -0
  204. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_react_tool_spans.py +0 -0
  205. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_save_load.py +0 -0
  206. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_trace_structure.py +0 -0
  207. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_traces_read.py +0 -0
  208. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_user_attribution.py +0 -0
  209. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/01_predict_qa.json +0 -0
  210. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
  211. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
  212. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
  213. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
  214. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
  215. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
  216. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/08_opaque_module.json +0 -0
  217. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
  218. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/10_react.json +0 -0
  219. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/11_refine.json +0 -0
  220. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/12_retrieve.json +0 -0
  221. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/13_knn.json +0 -0
  222. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/14_parallel.json +0 -0
  223. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/README.md +0 -0
  224. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/ingest_conformance.py +0 -0
  225. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/__init__.py +0 -0
  226. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/authored_optimize/judge.py +0 -0
  227. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
  228. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/optimization_run_probe.py +0 -0
  229. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_optimization_run.py +0 -0
  230. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_optimizing_progress.py +0 -0
  231. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_unhappy_path.py +0 -0
  232. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/__init__.py +0 -0
  233. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/__main__.py +0 -0
  234. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/drain.py +0 -0
  235. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/ingest.py +0 -0
  236. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/latency_transport.py +0 -0
  237. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/rlm_shape.py +0 -0
  238. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/rlm_size_report.py +0 -0
  239. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/sweep.py +0 -0
  240. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/test_rlm_shape.py +0 -0
  241. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/test_rlm_size_report.py +0 -0
  242. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/__init__.py +0 -0
  243. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/conftest.py +0 -0
  244. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/seed_parity.py +0 -0
  245. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_auth.py +0 -0
  246. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_datasets.py +0 -0
  247. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_deployments.py +0 -0
  248. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_evals.py +0 -0
  249. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_health.py +0 -0
  250. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_modules.py +0 -0
  251. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_optimizations.py +0 -0
  252. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_programs.py +0 -0
  253. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_signatures.py +0 -0
  254. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_trace_streaming.py +0 -0
  255. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_traces.py +0 -0
  256. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/span_reference_fixture.py +0 -0
  257. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/__init__.py +0 -0
  258. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_readiness.py +0 -0
  259. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_result.py +0 -0
  260. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/mint_bedrock_token.py +0 -0
  261. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_multi_client_stress.py +0 -0
  262. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_client_committee.py +0 -0
  263. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_provider_roles.py +0 -0
  264. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_readiness.py +0 -0
  265. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_reliability.py +0 -0
  266. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_reliability_classify.py +0 -0
  267. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_trace_search.py +0 -0
  268. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_adapter_reentrancy.py +0 -0
  269. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_assessments_api.py +0 -0
  270. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored.py +0 -0
  271. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_bundle_collisions.py +0 -0
  272. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_callback.py +0 -0
  273. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_candidate_lineage.py +0 -0
  274. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/__init__.py +0 -0
  275. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/conftest.py +0 -0
  276. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_api_client.py +0 -0
  277. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_assessments.py +0 -0
  278. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_auth.py +0 -0
  279. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_credentials.py +0 -0
  280. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_datasets.py +0 -0
  281. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_deployment_runs.py +0 -0
  282. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_deployments.py +0 -0
  283. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_evals.py +0 -0
  284. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_login.py +0 -0
  285. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_main.py +0 -0
  286. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_org.py +0 -0
  287. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_pagination.py +0 -0
  288. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_parity.py +0 -0
  289. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_programs.py +0 -0
  290. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_provider_credentials.py +0 -0
  291. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_schema_sample.py +0 -0
  292. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_signatures.py +0 -0
  293. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_tool_servers.py +0 -0
  294. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_traces.py +0 -0
  295. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_traces_search_wire.py +0 -0
  296. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_tree_help.py +0 -0
  297. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_valsets.py +0 -0
  298. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_client_floor.py +0 -0
  299. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/__init__.py +0 -0
  300. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/conftest.py +0 -0
  301. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/test_edge_cases.py +0 -0
  302. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/test_hash_consistency.py +0 -0
  303. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/test_type_conversion.py +0 -0
  304. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cmp551_grouping_identity.py +0 -0
  305. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_configuration.py +0 -0
  306. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_context.py +0 -0
  307. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_context_propagation.py +0 -0
  308. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_dataset_polling.py +0 -0
  309. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_dataset_sync.py +0 -0
  310. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_datasets.py +0 -0
  311. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_decision_client_spans.py +0 -0
  312. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_decorators.py +0 -0
  313. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deployment_metadata.py +0 -0
  314. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deployments_read.py +0 -0
  315. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval.py +0 -0
  316. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval_example_attribution.py +0 -0
  317. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval_start.py +0 -0
  318. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval_trace_grouping.py +0 -0
  319. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exception_paths.py +0 -0
  320. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter.py +0 -0
  321. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter_program_names.py +0 -0
  322. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter_queue.py +0 -0
  323. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter_real.py +0 -0
  324. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_fake_lm.py +0 -0
  325. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_callback.py +0 -0
  326. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_integration.py +0 -0
  327. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_output_normalization.py +0 -0
  328. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_resume.py +0 -0
  329. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_identity.py +0 -0
  330. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_imaging.py +0 -0
  331. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_import_weight.py +0 -0
  332. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ingest_conformance.py +0 -0
  333. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ingest_second_producer.py +0 -0
  334. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_integration.py +0 -0
  335. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_interpreter_callback.py +0 -0
  336. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ir_encoder_properties.py +0 -0
  337. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ir_golden_vectors.py +0 -0
  338. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ir_roundtrip.py +0 -0
  339. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_lm15_native_calls.py +0 -0
  340. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_lm_usage_shapes.py +0 -0
  341. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_models.py +0 -0
  342. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_multi_client_stress_readiness.py +0 -0
  343. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimization_progress.py +0 -0
  344. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimization_start.py +0 -0
  345. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_lift.py +0 -0
  346. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_lms.py +0 -0
  347. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_reflection_lm.py +0 -0
  348. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_terminal_failure.py +0 -0
  349. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging.py +0 -0
  350. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging_callable_source.py +0 -0
  351. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging_program_source.py +0 -0
  352. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_poll_until.py +0 -0
  353. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_identity.py +0 -0
  354. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_lineage_persist.py +0 -0
  355. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_programs_create.py +0 -0
  356. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_project_payload.py +0 -0
  357. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_real_provider_twins_readiness.py +0 -0
  358. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_reflector_properties.py +0 -0
  359. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_reflector_smoke.py +0 -0
  360. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_release_stress_script.py +0 -0
  361. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_repro_reactv2_bugs.py +0 -0
  362. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_require_version_bump.py +0 -0
  363. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_retry.py +0 -0
  364. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_reversible_failures.py +0 -0
  365. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_rlm_patch.py +0 -0
  366. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_run_attribution_paths.py +0 -0
  367. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_runtime_tools.py +0 -0
  368. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_schemas.py +0 -0
  369. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_seed_review_run.py +0 -0
  370. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_signature_inputs.py +0 -0
  371. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_span_references.py +0 -0
  372. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_span_sent_once.py +0 -0
  373. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_system_one.py +0 -0
  374. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_context_concurrency.py +0 -0
  375. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_fact_wire_contract.py +0 -0
  376. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_facts.py +0 -0
  377. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_render.py +0 -0
  378. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_traces_read.py +0 -0
  379. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_tracked_gepa.py +0 -0
  380. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_tracker_enrich.py +0 -0
  381. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_truncation.py +0 -0
  382. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_upload_auth_headers.py +0 -0
  383. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_valsets_api.py +0 -0
  384. {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_xxh64.py +0 -0
@@ -95,6 +95,13 @@ knowing:
95
95
  `include`, so `basedpyright cmpnd` skips `tests/e2e` and `tests/stress` and
96
96
  passes changes CI rejects.
97
97
 
98
+ **This tree's SDK and CLI run against each live self-host release.**
99
+ `scripts/selfhost_compat.py` deploys and runs a program through
100
+ `cmpnd.Client` and through `cmpnd deploy --run` against the serve that
101
+ `CMPND_ENDPOINT` names. The advisory `sdk-selfhost-compat` job in `ci-sdk.yml`
102
+ runs it on every SDK pull request, once per self-host app. A failure there
103
+ means a self-hosted install would break on the next SDK release.
104
+
98
105
  **Never run pytest processes in parallel.** Do not use `pytest-xdist`, and do
99
106
  not start a run while another is in the background. DSPy uses a lot of memory
100
107
  on import, and parallel runs crash the machine.
@@ -145,12 +152,15 @@ Before you touch either `pyproject.toml`:
145
152
 
146
153
  - `ingest/cmpnd_ingest/exporter_http.py`: the ingest transport (`cmpnd.exporter_http`)
147
154
  - `ingest/cmpnd_ingest/retry.py`: the client half of the retryable-error contract (`cmpnd.retry`)
155
+ - `ingest/cmpnd_ingest/client_floor.py`: warns once when serve's `X-Cmpnd-Minimum-Client-Version` header names a floor above the installed release
156
+ - `ingest/cmpnd_ingest/program_names.py`: keeps the program ids serve gave for the program names a process declared
148
157
  - `cmpnd/identity.py`: hash computations (xxhash, SHA256). See the `cmpnd-hash-handling` skill.
149
158
  - `cmpnd/ir/`: the structural program-identity IR (algebra, encoder, hash, reflector)
150
159
  - `cmpnd/callback.py`: DSPy instrumentation and signature extraction
151
160
  - `cmpnd/optimizers/tracker.py`: optimization tracking
152
161
  - `cmpnd/packaging.py`: builds the source ZIP that deploy uploads
153
- - `cmpnd/deployment.py`: `deploy()` packages the module, creates the deployment
162
+ - `cmpnd/deployment.py`: `deploy_program()`, which `cmpnd.Client.deploy_program`
163
+ calls, packages the module, creates the deployment
154
164
  on serve, PUTs the bundle to the upload slot serve returns, and polls the
155
165
  parser
156
166
 
@@ -195,8 +205,8 @@ its `add_parser` call in `top.register()`, and add the entity method or the
195
205
  When you touch a handler:
196
206
 
197
207
  - **Write user-facing hints with the `_hint_*` helpers** in
198
- `cli/commands/top.py` (`_hint_ps`, `_hint_run`, `_hint_status`,
199
- `_hint_inspect`, `_hint_traces_list`). They check `_SHELL_MODE` and emit
208
+ `cli/commands/top.py` (`_hint_ps`, `_hint_run`, `_hint_program_name`,
209
+ `_hint_status`, `_hint_inspect`, `_hint_traces_list`). They check `_SHELL_MODE` and emit
200
210
  `deps.d_xxx.run({...})` in the shell or `cmpnd run d_xxx '{...}'` outside
201
211
  it. Never hardcode a `cmpnd <verb>` string in handler output.
202
212
  - **Add a shell entity** by subclassing `Entity` in `cli/shell.py`. Add a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cmpnd
3
- Version: 0.53.0
3
+ Version: 0.55.0
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>
@@ -52,7 +52,8 @@ Description-Content-Type: text/markdown
52
52
  # cmpnd
53
53
 
54
54
  The `cmpnd` package traces DSPy programs and deploys and optimizes them on the
55
- cmpnd platform. One call turns on tracing, and one more deploys a program.
55
+ cmpnd platform. One call turns on tracing, and a client deploys, runs and
56
+ optimizes named programs.
56
57
 
57
58
  ## Installation
58
59
 
@@ -135,7 +136,7 @@ gepa = dspy.GEPA(metric=metric, reflection_lm=dspy.LM("openai/gpt-6-luna"), auto
135
136
  with cmpnd.Client(api_key="ck_xxx", project_tags="my-project") as sdk:
136
137
  # the trace will go to the program "question-answerer"
137
138
  result = sdk.run_program(qa1, question="What is DSPy?")
138
- qa2 = sdk.run_optimization(gepa, qa1, trainset=train, valset=val)
139
+ qa2 = sdk.optimize_program(qa1, gepa, trainset=train, valset=val)
139
140
  ```
140
141
 
141
142
  A client is active from construction. The `with` form flushes the client's
@@ -163,38 +164,41 @@ qa3 = cmpnd.Program(
163
164
  - A program name starts with an ASCII letter or digit, then has letters,
164
165
  digits, `.`, `_` or `-`, at most 64 characters. It does not start with `p_`.
165
166
  A bad name raises `ValueError`. Declaring a program makes no network call.
166
- - `run_optimization` returns a copy of the program that holds the optimized
167
- module. The copy keeps the program name and the LM.
167
+ - `optimize_program` runs the optimizer in your process and returns a copy of
168
+ the program that holds the optimized module. The copy keeps the program name
169
+ and the LM.
168
170
  - Calling a `cmpnd.Program` directly while `auto_instrument()` is on raises a
169
171
  `TypeError` that points to `cmpnd.Client`.
170
172
 
171
173
  ## Deployed programs
172
174
 
173
175
  Every deployment belongs to a program, and each program has a program name.
174
- Give a DSPy module a program name with `cmpnd.Program`, then deploy it for
175
- server-side execution:
176
+ Give a DSPy module a program name with `cmpnd.Program`, then deploy it through a
177
+ client for server-side execution:
176
178
 
177
179
  ```python
178
180
  import cmpnd
179
181
  import dspy
180
182
 
181
- cmpnd.configure(api_key="ck_xxx")
183
+ sdk = cmpnd.Client(api_key="ck_xxx")
182
184
 
183
185
  qa4 = cmpnd.Program(
184
186
  "question-answerer", module=dspy.Predict("question -> answer"), lm=dspy.LM("openai/gpt-6-luna")
185
187
  )
186
- deployed = cmpnd.deploy(qa4)
188
+ deployed = sdk.deploy_program(qa4)
187
189
 
188
- result = deployed(question="What is DSPy?") # runs server-side
190
+ result = sdk.run_deployment(deployed, question="What is DSPy?") # runs server-side
189
191
  print(result.answer)
190
192
  ```
191
193
 
192
- `deploy()` packages the module's source, sends it to the platform and waits
193
- until the platform has read it. It then returns a `DeployedProgram`. Call the program to execute it
194
- server-side. `str(deployed)` and `deployed.deployment_id` return the
195
- deployment ID. `deployed.artifact_metadata` holds the typed artifact record
196
- when the platform has inspected it. An unknown interface leaves `input_fields`
197
- and `output_fields` as `None`. A known interface with no fields returns empty
194
+ `deploy_program()` packages the module's source, sends it to the platform and
195
+ waits until the platform has read it. It then returns a `DeployedProgram`.
196
+ `run_deployment()` runs it server-side on the client's account, and also takes
197
+ a deployment ID. A `DeployedProgram` is not callable, because a run needs a
198
+ client. `str(deployed)` and `deployed.deployment_id` return the deployment ID.
199
+ `deployed.artifact_metadata` holds the typed artifact record when the platform
200
+ has inspected it. An unknown interface leaves `input_fields` and
201
+ `output_fields` as `None`. A known interface with no fields returns empty
198
202
  lists.
199
203
 
200
204
  The platform makes the program the first time your organization uses the
@@ -204,7 +208,7 @@ program, and so do the traces of a client that runs it.
204
208
  ### Options
205
209
 
206
210
  ```python
207
- cmpnd.deploy(
211
+ sdk.deploy_program(
208
212
  program, # required: a cmpnd.Program
209
213
  metric=None, # optional: a metric callable, packaged for optimization
210
214
  timeout=300, # optional: seconds to wait for the deployment to be ready
@@ -218,23 +222,25 @@ cmpnd.deploy(
218
222
  signature and types.
219
223
  2. The platform reads the program, the model string and the sampling settings
220
224
  from that source.
221
- 3. `deploy()` returns the `DeployedProgram` when the deployment is ready.
225
+ 3. `deploy_program()` returns the `DeployedProgram` when the deployment is
226
+ ready.
222
227
 
223
228
  ## Optimization on the platform
224
229
 
225
- `cmpnd.optimize()` optimizes a program through the platform. Like `deploy()`,
226
- it returns a `DeployedProgram` that you call directly, and the program's
227
- `score` is the best score found.
230
+ `optimize_deployment()` optimizes a deployment through the platform. It returns
231
+ the best deployment as a `DeployedProgram`, whose `score` is the best score
232
+ found. Deploy the program first:
228
233
 
229
234
  ```python
230
235
  import cmpnd
231
236
  import dspy
232
237
 
233
- cmpnd.configure(api_key="ck_xxx")
238
+ sdk = cmpnd.Client(api_key="ck_xxx")
234
239
 
235
240
  program = cmpnd.Program(
236
241
  "haiku", module=dspy.ChainOfThought("topic -> haiku"), lm=dspy.LM("openai/gpt-6-luna")
237
242
  )
243
+ deployed = sdk.deploy_program(program)
238
244
 
239
245
  # GEPA needs a five-argument feedback metric that returns dspy.Prediction(score=, feedback=)
240
246
  def metric(example, pred, trace=None, pred_name=None, pred_trace=None):
@@ -243,8 +249,8 @@ def metric(example, pred, trace=None, pred_name=None, pred_trace=None):
243
249
  score=float(ok), feedback=None if ok else "Don't name the season."
244
250
  )
245
251
 
246
- best = cmpnd.optimize(
247
- program,
252
+ best = sdk.optimize_deployment(
253
+ deployed,
248
254
  optimizer="gepa",
249
255
  trainset=train,
250
256
  valset=val,
@@ -254,9 +260,13 @@ best = cmpnd.optimize(
254
260
  )
255
261
 
256
262
  print(best.score)
257
- print(best(topic="late autumn").haiku)
263
+ print(sdk.run_deployment(best, topic="late autumn").haiku)
258
264
  ```
259
265
 
266
+ `optimize_deployment()` also takes the ID of a ready deployment. The
267
+ optimization belongs to the deployment's program, and the program's model comes
268
+ from the deployment.
269
+
260
270
  `reflection_lm` is the model that proposes each new instruction. The search is
261
271
  only as good as this model, so it is usually a strong model and not the one
262
272
  being optimized. A `dspy.LM` passes its sampling settings to the provider. A
@@ -273,9 +283,10 @@ positional arguments, because such a run would report success and learn
273
283
  nothing. A `*args` metric cannot be checked, and the SDK accepts it with a
274
284
  warning.
275
285
 
276
- `gepa` is the only optimizer the platform runs. `optimize()` raises
277
- `ValueError` for the retired `bootstrap_fewshot` and `random_search` before
278
- any network call, and the platform answers them with a 404 that names gepa.
286
+ `gepa` is the default and the only optimizer the platform runs.
287
+ `optimize_deployment()` raises `ValueError` for the retired `bootstrap_fewshot`
288
+ and `random_search` before any network call, and the platform answers them with
289
+ a 404 that names gepa.
279
290
 
280
291
  ### A metric with its own model
281
292
 
@@ -296,8 +307,8 @@ def faithfulness(gold, pred, trace, pred_name, pred_trace, lms=None):
296
307
  return dspy.Prediction(score=verdict.score, feedback=verdict.feedback)
297
308
 
298
309
 
299
- best = cmpnd.optimize(
300
- program, optimizer="gepa", trainset=train, valset=val, metric=faithfulness,
310
+ best = sdk.optimize_deployment(
311
+ deployed, optimizer="gepa", trainset=train, valset=val, metric=faithfulness,
301
312
  reflection_lm=dspy.LM("openai/gpt-6-luna"),
302
313
  lms={"critic": dspy.LM("openai/gpt-6-luna")},
303
314
  max_metric_calls=300,
@@ -319,28 +330,16 @@ The `lms` parameter does not change the arity check. Five or more positional
319
330
  arguments make a feedback metric, and a metric without `lms` never receives
320
331
  it.
321
332
 
322
- ### Reusing a deployment
323
-
324
- Pass the `deployment_id` of a ready deployment to skip the initial deploy:
325
-
326
- ```python
327
- best = cmpnd.optimize(program, optimizer="gepa",
328
- trainset=train, valset=val, metric=metric,
329
- reflection_lm="openai/gpt-6-luna", auto="light",
330
- deployment_id=deployed.deployment_id)
331
- ```
332
-
333
333
  ### Options
334
334
 
335
335
  ```python
336
- cmpnd.optimize(
337
- program, # required: the DSPy module to optimize
338
- optimizer="gepa", # required: the only optimizer the platform runs
336
+ sdk.optimize_deployment(
337
+ deployed, # required: a DeployedProgram or a deployment ID
338
+ optimizer="gepa", # optional: the only optimizer the platform runs
339
339
  trainset=train, # required: training examples
340
340
  valset=val, # required: validation examples
341
341
  metric=metric, # required: the metric, arity-checked
342
342
  config=None, # optional: optimizer config, allow-listed by the platform
343
- deployment_id=None, # optional: a ready deployment to start from
344
343
  reflection_lm=None, # required: a dspy.LM or a bare model name
345
344
  lms=None, # optional: name -> dspy.LM, the run's named models
346
345
  max_metric_calls=None, # budget: the metric-call ceiling for one step
@@ -358,7 +357,7 @@ Pass exactly one budget: `max_metric_calls`, `auto` or
358
357
  `config["max_full_evals"]`. The SDK raises before any network call when the
359
358
  budget is missing.
360
359
 
361
- `optimize()` raises `cmpnd.OptimizeError` when the platform answers a step's
360
+ `optimize_deployment()` raises `cmpnd.OptimizeError` when the platform answers a step's
362
361
  initiation with a 4xx, such as a 409 for missing data or a metric mismatch. It
363
362
  raises `cmpnd.OptimizeFailed` when a step reaches `failed`.
364
363
 
@@ -373,7 +372,7 @@ usage: cmpnd [-h] [--version] [--api-key API_KEY] [--endpoint ENDPOINT]
373
372
  {auth,login,logout,org,credentials,tool-servers,optimizations,programs,signatures,traces,evals,datasets,deployments,ps,status,logs,inspect,schema,sample,run,deploy,optimize}
374
373
  ...
375
374
 
376
- CMPND platform CLI — deploy, invoke, and inspect DSPy programs.
375
+ CMPND platform CLI — deploy, run, and inspect DSPy programs.
377
376
 
378
377
  options:
379
378
  -h, --help show this help message and exit
@@ -442,8 +441,7 @@ def run_pipeline(query: str):
442
441
 
443
442
  ### `cmpnd.configure()`
444
443
 
445
- Sets the global API key, endpoint and options that `auto_instrument()`,
446
- `deploy()`, `optimize()` and `execute()` use:
444
+ Sets the global API key, endpoint and options that `auto_instrument()` uses:
447
445
 
448
446
  ```python
449
447
  cmpnd.configure(
@@ -474,10 +472,17 @@ global config. Use it as a context manager or as a plain object.
474
472
 
475
473
  - `run_program(program, **inputs)` runs a `cmpnd.Program` and records its trace
476
474
  under the program name.
477
- - `run_optimization(optimizer, program, trainset=..., valset=...)` compiles a
478
- `cmpnd.Program` with a DSPy optimizer, records every rollout, and returns a
479
- copy of the program that holds the optimized module. For `dspy.GEPA`, it
480
- also records the optimization run.
475
+ - `optimize_program(program, optimizer, trainset=..., valset=...)` compiles a
476
+ `cmpnd.Program` with a DSPy optimizer in your process, records every
477
+ rollout, and returns a copy of the program that holds the optimized module.
478
+ For `dspy.GEPA`, it also records the optimization run.
479
+ - `deploy_program(program)` deploys a `cmpnd.Program` under its program name
480
+ and returns a `DeployedProgram`.
481
+ - `run_deployment(deployment, **inputs)` runs a deployment and returns a
482
+ `dspy.Prediction`. The section below describes it.
483
+ - `optimize_deployment(deployment, ...)` optimizes a deployment on the platform
484
+ and returns the best `DeployedProgram`, whose `.score` is the best score
485
+ found. It raises `cmpnd.OptimizeError` or `cmpnd.OptimizeFailed` on failure.
481
486
  - `list_traces(**filters)` and `get_trace(trace_id)` read traces with the
482
487
  client's credentials. They flush the client's traces first.
483
488
  - `close()` flushes the client's traces and closes the client. A closed
@@ -508,50 +513,41 @@ cmpnd.configure(api_key="ck_xxx")
508
513
  dspy.configure(callbacks=[cmpnd.CmpndCallback()])
509
514
  ```
510
515
 
511
- ### `cmpnd.deploy()`
512
-
513
- Deploys a `cmpnd.Program` under its program name and returns a callable
514
- `DeployedProgram`.
515
-
516
- ### `cmpnd.optimize()`
517
-
518
- Optimizes a program through the platform. It returns the best
519
- `DeployedProgram`, whose `.score` is the best score found. It raises
520
- `cmpnd.OptimizeError` or `cmpnd.OptimizeFailed` on failure.
521
-
522
- ### `cmpnd.execute()`
516
+ ### `cmpnd.Client.run_deployment()`
523
517
 
524
- Submits one durable run by `deployment_id`, waits for the result within the
525
- local timeout and returns a `dspy.Prediction`. A `DeployedProgram` call goes
526
- through this function. A fast result returns at once, and the SDK never
527
- submits one run twice.
518
+ Submits one durable run of a `DeployedProgram` or a deployment ID, waits for
519
+ the result within the local timeout and returns a `dspy.Prediction`. A fast
520
+ result returns at once, and the SDK never submits one run twice. A deployment
521
+ of another account answers 404.
528
522
 
529
523
  `timeout` is the whole submit-and-wait budget in seconds, 30 by default, or
530
- `None` for no local limit. `program_name` and `lm` select a module and model
531
- and travel beside the inputs. `metadata` and `tags` take `dict[str, str]`
532
- values that the platform applies to the run's root trace. Names the platform sets, such as
533
- `deployment_run_id` raise `TypeError` before anything is sent. The errors:
524
+ `None` for no local limit. `entrypoint` and `lm` select a module and model and
525
+ travel beside the inputs. `metadata` and `tags` take `dict[str, str]` values
526
+ that the platform applies to the run's root trace. Names the platform sets,
527
+ such as `deployment_run_id`, raise `TypeError` before anything is sent. The
528
+ errors:
534
529
 
535
530
  - A refused request raises `httpx.HTTPStatusError`.
536
531
  - A lost or failed submission reply raises `RunSubmissionUncertain`.
537
532
  - A spent budget raises `RunWaitTimeout`, which holds the run ID.
538
533
  - An answer that expired before it was read raises `RunResultExpired`.
539
534
 
540
- `cmpnd.deployment_run_id(result)` returns the run ID of a result, or of an
535
+ `sdk.deployment_run_id(result)` returns the run ID of a result, or of an
541
536
  exception when the platform had assigned a run.
542
537
 
543
- `cmpnd.submit_deployment_run(id, inputs)` returns the accepted handle without
544
- waiting. `cmpnd.list_deployment_runs()`, `get_deployment_run(id)`,
538
+ `sdk.submit_deployment_run(deployment, inputs)` returns the accepted handle
539
+ without waiting. `sdk.list_deployment_runs()`, `get_deployment_run(id)`,
545
540
  `get_deployment_run_result(id)` and `wait_deployment_run(id)` find, inspect and
546
- resume runs. `list_deployment_runs(deployment_id=...)` limits the list to one
547
- deployment. `RunSubmissionUncertain` names the list command to check before
548
- you send new work.
541
+ resume runs. `list_deployment_runs(deployment)` limits the list to one
542
+ deployment. `RunSubmissionUncertain` names the list command to check before you
543
+ send new work.
549
544
 
550
545
  ### `cmpnd.DeployedProgram`
551
546
 
552
- The callable program that `deploy()` and `optimize()` return. Call it with the
553
- deployed artifact's input fields. `str()` and `.deployment_id` return its ID.
554
- `.score` is its score when it came from `optimize()`, and `None` otherwise.
547
+ The deployment that `deploy_program()` and `optimize_deployment()` return. Run
548
+ it with `run_deployment()`. `str()` and `.deployment_id` return its ID.
549
+ `.score` is its score when it came from `optimize_deployment()`, and `None`
550
+ otherwise.
555
551
  `.deployment_signature` holds the typed deployment response, and
556
552
  `.artifact_metadata` holds its metadata when available.
557
553