cmpnd 0.49.0__tar.gz → 0.50.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 (379) hide show
  1. {cmpnd-0.49.0 → cmpnd-0.50.0}/PKG-INFO +1 -1
  2. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_http.py +13 -11
  3. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/deployment.py +4 -4
  4. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/cli.md +9 -0
  5. {cmpnd-0.49.0 → cmpnd-0.50.0}/pyproject.toml +1 -1
  6. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_api_client.py +15 -0
  7. {cmpnd-0.49.0 → cmpnd-0.50.0}/uv.lock +1 -1
  8. {cmpnd-0.49.0 → cmpnd-0.50.0}/.gitignore +0 -0
  9. {cmpnd-0.49.0 → cmpnd-0.50.0}/AGENTS.md +0 -0
  10. {cmpnd-0.49.0 → cmpnd-0.50.0}/CLAUDE.md +0 -0
  11. {cmpnd-0.49.0 → cmpnd-0.50.0}/README.md +0 -0
  12. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/__init__.py +0 -0
  13. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_assessments.py +0 -0
  14. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_authored_import.py +0 -0
  15. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_deployments.py +0 -0
  16. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_exporter_pool.py +0 -0
  17. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_gepa_patch.py +0 -0
  18. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_program_patch.py +0 -0
  19. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_rlm_patch.py +0 -0
  20. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_runtime_tools.py +0 -0
  21. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_timespec.py +0 -0
  22. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_traces.py +0 -0
  23. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_valsets.py +0 -0
  24. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/authored.py +0 -0
  25. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/callback.py +0 -0
  26. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/__init__.py +0 -0
  27. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/api_client.py +0 -0
  28. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/__init__.py +0 -0
  29. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/admin.py +0 -0
  30. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/assessments.py +0 -0
  31. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/auth.py +0 -0
  32. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/datasets.py +0 -0
  33. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/deployments.py +0 -0
  34. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/evals.py +0 -0
  35. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/login.py +0 -0
  36. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/optimizations.py +0 -0
  37. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/org.py +0 -0
  38. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/programs.py +0 -0
  39. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
  40. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/signatures.py +0 -0
  41. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/tool_servers.py +0 -0
  42. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/top.py +0 -0
  43. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/traces.py +0 -0
  44. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/valsets.py +0 -0
  45. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/credentials.py +0 -0
  46. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/deprecation.py +0 -0
  47. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/pagination.py +0 -0
  48. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/shell.py +0 -0
  49. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/trace_render.py +0 -0
  50. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/tree_help.py +0 -0
  51. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/verbs.py +0 -0
  52. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/client.py +0 -0
  53. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/configuration.py +0 -0
  54. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/context.py +0 -0
  55. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/dataset_sync.py +0 -0
  56. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/datasets.py +0 -0
  57. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/decorators.py +0 -0
  58. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/deployment_metadata.py +0 -0
  59. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/deployment_runs.py +0 -0
  60. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/eval_handler.py +0 -0
  61. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/execution.py +0 -0
  62. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/exporter.py +0 -0
  63. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/exporter_http.py +0 -0
  64. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/helpers.py +0 -0
  65. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/identity.py +0 -0
  66. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/imaging.py +0 -0
  67. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/__init__.py +0 -0
  68. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/decode.py +0 -0
  69. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/encode.py +0 -0
  70. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/hash.py +0 -0
  71. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/program.py +0 -0
  72. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/reflection.py +0 -0
  73. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/types.py +0 -0
  74. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/xxh64.py +0 -0
  75. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/lm_configuration.py +0 -0
  76. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/mcp_servers.py +0 -0
  77. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/models.py +0 -0
  78. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/named_programs.py +0 -0
  79. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimization.py +0 -0
  80. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/__init__.py +0 -0
  81. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/gepa.py +0 -0
  82. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/gepa_callback.py +0 -0
  83. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/resume.py +0 -0
  84. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/tracker.py +0 -0
  85. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/packaging.py +0 -0
  86. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/programs.py +0 -0
  87. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/references.py +0 -0
  88. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/retry.py +0 -0
  89. {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/traces.py +0 -0
  90. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/2026-04-02-code-review.md +0 -0
  91. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/client.md +0 -0
  92. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/custom-proposer.md +0 -0
  93. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
  94. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
  95. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/reading-traces.md +0 -0
  96. {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/sdk-instrumentation.md +0 -0
  97. {cmpnd-0.49.0 → cmpnd-0.50.0}/examples/generalizing_proposer.py +0 -0
  98. {cmpnd-0.49.0 → cmpnd-0.50.0}/examples/local_ollama.py +0 -0
  99. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/LINEAGE.md +0 -0
  100. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/README.md +0 -0
  101. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/__init__.py +0 -0
  102. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/bodies.py +0 -0
  103. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/client_floor.py +0 -0
  104. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
  105. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/program_names.py +0 -0
  106. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/protocols.py +0 -0
  107. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/py.typed +0 -0
  108. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/request_log.py +0 -0
  109. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/retry.py +0 -0
  110. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
  111. {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/pyproject.toml +0 -0
  112. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/audit-sdist.sh +0 -0
  113. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/capture_review_run.py +0 -0
  114. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/check-pip-install.sh +0 -0
  115. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/check_release_artifacts.py +0 -0
  116. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/fixtures/review_run.json.gz +0 -0
  117. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/gepa_resume_bug.py +0 -0
  118. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/release-stress.sh +0 -0
  119. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/require_version_bump.py +0 -0
  120. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/seed_review_run.py +0 -0
  121. {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/test-in-linux.sh +0 -0
  122. {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/__init__.pyi +0 -0
  123. {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/primitives/__init__.pyi +0 -0
  124. {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/primitives/prediction.pyi +0 -0
  125. {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/utils/__init__.pyi +0 -0
  126. {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/utils/callback.pyi +0 -0
  127. {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/utils/dummies.pyi +0 -0
  128. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/__init__.py +0 -0
  129. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_deployment_signature_helpers.py +0 -0
  130. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_exporter_helpers.py +0 -0
  131. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_fake_clock.py +0 -0
  132. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_identity_helpers.py +0 -0
  133. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_resolve_refs.py +0 -0
  134. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_traced_run.py +0 -0
  135. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/conftest.py +0 -0
  136. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/__init__.py +0 -0
  137. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/committee_task.py +0 -0
  138. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/conftest.py +0 -0
  139. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
  140. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
  141. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/fake_lm.py +0 -0
  142. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/helpers.py +0 -0
  143. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/target_capabilities.py +0 -0
  144. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_assessments_cli.py +0 -0
  145. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_capture_prompts.py +0 -0
  146. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_composite_module.py +0 -0
  147. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
  148. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_deploy_execute.py +0 -0
  149. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_deploy_pandas.py +0 -0
  150. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_deploy_programs.py +0 -0
  151. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_edge_cases.py +0 -0
  152. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_example_hash.py +0 -0
  153. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_gepa_optimization.py +0 -0
  154. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_interpreter_spans.py +0 -0
  155. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_lm_accuracy.py +0 -0
  156. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_module_tracing.py +0 -0
  157. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimization_lineage.py +0 -0
  158. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
  159. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_failures.py +0 -0
  160. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_loop.py +0 -0
  161. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_review_committee.py +0 -0
  162. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_server_owned_completion.py +0 -0
  163. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_parallel_export.py +0 -0
  164. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_project_attribution.py +0 -0
  165. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_react_tool_spans.py +0 -0
  166. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_save_load.py +0 -0
  167. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_trace_structure.py +0 -0
  168. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_traces_read.py +0 -0
  169. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_user_attribution.py +0 -0
  170. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_valsets_cli.py +0 -0
  171. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/01_predict_qa.json +0 -0
  172. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
  173. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
  174. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
  175. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
  176. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
  177. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
  178. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/08_opaque_module.json +0 -0
  179. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
  180. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/10_react.json +0 -0
  181. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/11_refine.json +0 -0
  182. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/12_retrieve.json +0 -0
  183. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/13_knn.json +0 -0
  184. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/14_parallel.json +0 -0
  185. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/README.md +0 -0
  186. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/ingest_conformance.py +0 -0
  187. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/__init__.py +0 -0
  188. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/authored_optimize/judge.py +0 -0
  189. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
  190. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/conftest.py +0 -0
  191. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +0 -0
  192. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/hosted_optimize_probe.py +0 -0
  193. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/optimization_run_probe.py +0 -0
  194. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_cli_deploy_smoketest.py +0 -0
  195. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_logs_renders_traces.py +0 -0
  196. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_optimization_run.py +0 -0
  197. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_optimizing_progress.py +0 -0
  198. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_unhappy_path.py +0 -0
  199. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/__init__.py +0 -0
  200. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/__main__.py +0 -0
  201. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/drain.py +0 -0
  202. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/ingest.py +0 -0
  203. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/latency_transport.py +0 -0
  204. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/rlm_shape.py +0 -0
  205. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/rlm_size_report.py +0 -0
  206. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/sweep.py +0 -0
  207. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/test_rlm_shape.py +0 -0
  208. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/test_rlm_size_report.py +0 -0
  209. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/__init__.py +0 -0
  210. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/conftest.py +0 -0
  211. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/seed_parity.py +0 -0
  212. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_auth.py +0 -0
  213. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_datasets.py +0 -0
  214. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_deployments.py +0 -0
  215. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_evals.py +0 -0
  216. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_health.py +0 -0
  217. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_modules.py +0 -0
  218. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_optimizations.py +0 -0
  219. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_programs.py +0 -0
  220. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_signatures.py +0 -0
  221. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_trace_streaming.py +0 -0
  222. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_traces.py +0 -0
  223. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/span_reference_fixture.py +0 -0
  224. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/__init__.py +0 -0
  225. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_provider.py +0 -0
  226. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_readiness.py +0 -0
  227. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_reliability.py +0 -0
  228. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_result.py +0 -0
  229. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/mint_bedrock_token.py +0 -0
  230. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_deploy_programs.py +0 -0
  231. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_multi_client_stress.py +0 -0
  232. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_client_committee.py +0 -0
  233. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_loop.py +0 -0
  234. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_loop_wasm.py +0 -0
  235. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_stress.py +0 -0
  236. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_provider_roles.py +0 -0
  237. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_readiness.py +0 -0
  238. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_real_provider_twins.py +0 -0
  239. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_reliability.py +0 -0
  240. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_reliability_classify.py +0 -0
  241. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_rlm_wasm.py +0 -0
  242. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_trace_search.py +0 -0
  243. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_adapter_reentrancy.py +0 -0
  244. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_assessments_api.py +0 -0
  245. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored.py +0 -0
  246. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_bundle_collisions.py +0 -0
  247. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_metric_contract.py +0 -0
  248. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_named_models.py +0 -0
  249. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_optimize.py +0 -0
  250. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_callback.py +0 -0
  251. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_candidate_lineage.py +0 -0
  252. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/__init__.py +0 -0
  253. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/conftest.py +0 -0
  254. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_admin.py +0 -0
  255. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_assessments.py +0 -0
  256. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_auth.py +0 -0
  257. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_credentials.py +0 -0
  258. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_datasets.py +0 -0
  259. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_deployment_runs.py +0 -0
  260. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_deployments.py +0 -0
  261. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_evals.py +0 -0
  262. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_login.py +0 -0
  263. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_main.py +0 -0
  264. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_optimizations.py +0 -0
  265. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_org.py +0 -0
  266. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_pagination.py +0 -0
  267. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_parity.py +0 -0
  268. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_programs.py +0 -0
  269. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_provider_credentials.py +0 -0
  270. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_schema_sample.py +0 -0
  271. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_shell.py +0 -0
  272. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_signatures.py +0 -0
  273. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_tool_servers.py +0 -0
  274. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_top.py +0 -0
  275. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_traces.py +0 -0
  276. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_traces_search_wire.py +0 -0
  277. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_tree_help.py +0 -0
  278. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_valsets.py +0 -0
  279. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_client.py +0 -0
  280. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_client_floor.py +0 -0
  281. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_client_program_names.py +0 -0
  282. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/__init__.py +0 -0
  283. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/conftest.py +0 -0
  284. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/test_edge_cases.py +0 -0
  285. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/test_hash_consistency.py +0 -0
  286. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/test_type_conversion.py +0 -0
  287. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cmp551_grouping_identity.py +0 -0
  288. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_configuration.py +0 -0
  289. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_context.py +0 -0
  290. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_context_propagation.py +0 -0
  291. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_dataset_polling.py +0 -0
  292. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_dataset_sync.py +0 -0
  293. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_datasets.py +0 -0
  294. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_decision_client_spans.py +0 -0
  295. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_decorators.py +0 -0
  296. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deploy.py +0 -0
  297. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deploy_mcp_tool_references.py +0 -0
  298. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deploy_program_id.py +0 -0
  299. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deployment_metadata.py +0 -0
  300. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deployment_runs.py +0 -0
  301. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deployments_read.py +0 -0
  302. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval.py +0 -0
  303. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval_example_attribution.py +0 -0
  304. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval_start.py +0 -0
  305. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval_trace_grouping.py +0 -0
  306. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exception_paths.py +0 -0
  307. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_execute.py +0 -0
  308. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_execute_run_identity.py +0 -0
  309. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter.py +0 -0
  310. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter_program_names.py +0 -0
  311. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter_queue.py +0 -0
  312. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter_real.py +0 -0
  313. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_fake_lm.py +0 -0
  314. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_callback.py +0 -0
  315. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_integration.py +0 -0
  316. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_output_normalization.py +0 -0
  317. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_resume.py +0 -0
  318. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_identity.py +0 -0
  319. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_imaging.py +0 -0
  320. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_import_weight.py +0 -0
  321. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ingest_conformance.py +0 -0
  322. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ingest_second_producer.py +0 -0
  323. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_integration.py +0 -0
  324. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_interpreter_callback.py +0 -0
  325. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ir_encoder_properties.py +0 -0
  326. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ir_golden_vectors.py +0 -0
  327. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ir_roundtrip.py +0 -0
  328. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_lm15_native_calls.py +0 -0
  329. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_lm_configuration.py +0 -0
  330. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_lm_usage_shapes.py +0 -0
  331. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_mcp_tools.py +0 -0
  332. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_models.py +0 -0
  333. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_multi_client_stress_readiness.py +0 -0
  334. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimization_progress.py +0 -0
  335. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimization_start.py +0 -0
  336. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize.py +0 -0
  337. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_budget.py +0 -0
  338. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_lift.py +0 -0
  339. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_lms.py +0 -0
  340. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_proposer.py +0 -0
  341. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_reflection_lm.py +0 -0
  342. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_terminal_failure.py +0 -0
  343. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging.py +0 -0
  344. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging_callable_source.py +0 -0
  345. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging_mcp_tools.py +0 -0
  346. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging_program_source.py +0 -0
  347. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_poll_until.py +0 -0
  348. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_program_identity.py +0 -0
  349. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_program_lineage_persist.py +0 -0
  350. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_programs_create.py +0 -0
  351. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_project_payload.py +0 -0
  352. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_real_provider_twins_readiness.py +0 -0
  353. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_reflector_properties.py +0 -0
  354. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_reflector_smoke.py +0 -0
  355. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_release_stress_script.py +0 -0
  356. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_repro_reactv2_bugs.py +0 -0
  357. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_require_version_bump.py +0 -0
  358. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_retry.py +0 -0
  359. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_reversible_failures.py +0 -0
  360. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_rlm_patch.py +0 -0
  361. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_run_attribution_paths.py +0 -0
  362. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_runtime_tools.py +0 -0
  363. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_schemas.py +0 -0
  364. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_seed_review_run.py +0 -0
  365. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_signature_inputs.py +0 -0
  366. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_span_references.py +0 -0
  367. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_span_sent_once.py +0 -0
  368. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_system_one.py +0 -0
  369. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_context_concurrency.py +0 -0
  370. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_fact_wire_contract.py +0 -0
  371. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_facts.py +0 -0
  372. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_render.py +0 -0
  373. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_traces_read.py +0 -0
  374. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_tracked_gepa.py +0 -0
  375. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_tracker_enrich.py +0 -0
  376. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_truncation.py +0 -0
  377. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_upload_auth_headers.py +0 -0
  378. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_valsets_api.py +0 -0
  379. {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_xxh64.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cmpnd
3
- Version: 0.49.0
3
+ Version: 0.50.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>
@@ -234,23 +234,25 @@ class ApiClient:
234
234
  # which is the difference a user needs most and had the least of.
235
235
  raise error(server_detail(response) or "Resource not found.")
236
236
  if response.status_code >= 500:
237
- # 5xx usually means the server is up but blew up handling the
238
- # request — a database hiccup, an unhandled exception, etc.
239
- # Include the response body excerpt so the user has something
240
- # to act on. The actual exception lives in the operator's
241
- # server logs, which we can't reach from here.
237
+ # 5xx means the cmpnd platform failed to handle the request — a
238
+ # database hiccup, an unhandled exception, a hop between its own
239
+ # services. A failure at something the user runs (their tool
240
+ # server, their provider) answers 4xx with a sentence naming it,
241
+ # so this hint names the platform and nothing of theirs. The cause
242
+ # lives in the platform's logs, which we can't reach from here.
242
243
  body_excerpt = (response.text or "").strip()[:200]
243
244
  msg = f"Server error ({response.status_code}) for {method} {path}"
244
245
  if body_excerpt:
245
246
  msg += f": {body_excerpt}"
246
- msg += "\n If you operate this server, check its logs for the underlying exception."
247
+ msg += (
248
+ "\n The cmpnd platform failed to handle this request. If you run this cmpnd "
249
+ "instance yourself, its logs hold the cause."
250
+ )
247
251
  raise error(msg, exit_code=2)
248
252
  if response.status_code >= 400:
249
- try:
250
- detail = response.json()
251
- except Exception:
252
- detail = response.text
253
- raise error(f"Request failed ({response.status_code}): {detail}")
253
+ # The server's own sentence: a 4xx says what to change, and the
254
+ # JSON envelope around it is noise.
255
+ raise error(f"Request failed ({response.status_code}): {server_detail(response)}")
254
256
 
255
257
  if return_response:
256
258
  return response
@@ -92,8 +92,8 @@ def _raise_http_error(response: httpx.Response, action: str) -> None:
92
92
  """Convert an HTTP error response into an actionable RuntimeError.
93
93
 
94
94
  Replaces ``response.raise_for_status()`` so callers see a useful
95
- message instead of a raw httpx traceback. 5xx points the user at
96
- server logs and the local-dev preflight; 4xx surfaces the response
95
+ message instead of a raw httpx traceback. 5xx says the platform
96
+ failed and points a self-hosting operator at its logs; 4xx surfaces the response
97
97
  body so e.g. ``{"error": "Invalid 'since' timestamp"}`` round-trips
98
98
  to the terminal.
99
99
  """
@@ -105,8 +105,8 @@ def _raise_http_error(response: httpx.Response, action: str) -> None:
105
105
  if body:
106
106
  msg += f"\n Body: {body}"
107
107
  msg += (
108
- "\n The server reached, but errored handling the request. "
109
- "If you operate it, check its logs for the underlying exception."
108
+ "\n The cmpnd platform failed to handle this request. "
109
+ "If you run this cmpnd instance yourself, its logs hold the cause."
110
110
  )
111
111
  else:
112
112
  msg = f"Failed to {action}: HTTP {response.status_code}"
@@ -437,6 +437,15 @@ allow-list state and a one-line description. `--schemas` adds the reduced
437
437
  argument schema the platform enforces. Every command takes `--json` for the
438
438
  raw payload.
439
439
 
440
+ When the platform cannot list a server's tools because of the server itself,
441
+ `create` and `refresh` fail with a `424` that names the URL, the credential and
442
+ the cause. Examples are a name that does not resolve, a refused connection, or
443
+ a `401` from the server. The server stays registered, so run `cmpnd
444
+ tool-servers refresh <server_id>` once the cause is fixed. When you re-register
445
+ a server with a different `--credential` and the listing fails, the server keeps
446
+ its old credential, so repeat the `create` command instead. The `424` names the
447
+ command to run. A `5xx` means the platform itself failed.
448
+
440
449
  Deleting a server refuses new dispatches that name its tools and makes calls
441
450
  from runs in flight fail at once, because the credential goes with it. The
442
451
  confirmation prompt says so.
@@ -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.49.0"
8
+ version = "0.50.0"
9
9
  description = "DSPy observability and deployment SDK for cmpnd"
10
10
  readme = "README.md"
11
11
  requires-python = ">=3.11"
@@ -255,3 +255,18 @@ class TestApiClient:
255
255
  def test_404_with_no_body_still_says_something(self):
256
256
  err = self._answering(httpx.Response(404, text="", request=httpx.Request("GET", "http://x")))
257
257
  assert "not found" in str(err).lower()
258
+
259
+ def test_a_4xx_carries_the_servers_sentence_not_its_json(self):
260
+ # A 424 means the user's own dependency failed, and serve's sentence says
261
+ # which and what to run next; a dict repr around it buries that.
262
+ sentence = "Listing the tools at https://mcp.example.test/mcp failed: the name does not resolve."
263
+ err = self._answering(httpx.Response(424, json={"error": sentence}, request=httpx.Request("GET", "http://x")))
264
+ assert f"Request failed (424): {sentence}" in str(err)
265
+ assert "{'error'" not in str(err)
266
+
267
+ def test_a_5xx_hint_names_the_platform_not_the_users_server(self):
268
+ # A 5xx is the platform's own failure. The hint must not read as the
269
+ # user's tool server or model provider, which a 424 covers instead.
270
+ err = self._answering(httpx.Response(502, text="bad gateway", request=httpx.Request("GET", "http://x")))
271
+ assert "If you operate this server" not in str(err)
272
+ assert "cmpnd" in str(err).split("\n", 1)[1]
@@ -496,7 +496,7 @@ wheels = [
496
496
 
497
497
  [[package]]
498
498
  name = "cmpnd"
499
- version = "0.49.0"
499
+ version = "0.50.0"
500
500
  source = { editable = "." }
501
501
  dependencies = [
502
502
  { name = "dspy" },
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
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