cmpnd 0.68.0__tar.gz → 0.69.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.
- {cmpnd-0.68.0 → cmpnd-0.69.0}/PKG-INFO +1 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_authored_import.py +0 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/authored.py +0 -5
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/deployment.py +1 -4
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/sdk-instrumentation.md +3 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/pyproject.toml +1 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_deploy_programs.py +0 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_loop.py +7 -11
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_authored.py +2 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_deploy.py +3 -4
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_deploy_program_id.py +1 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/uv.lock +1 -1
- {cmpnd-0.68.0 → cmpnd-0.69.0}/.gitignore +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/AGENTS.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/CLAUDE.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/README.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_assessments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_deployments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_exporter_pool.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_gepa_patch.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_http.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_program_patch.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_rlm_patch.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_runtime_tools.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_timespec.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_traces.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/_valsets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/callback.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/api_client.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/admin.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/assessments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/auth.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/datasets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/deployments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/evals.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/login.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/optimizations.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/org.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/programs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/tool_servers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/top.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/traces.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/commands/valsets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/credentials.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/deprecation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/pagination.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/shell.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/trace_render.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/tree_help.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/verbs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/cli/views.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/client.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/configuration.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/context.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/credentials.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/dataset_sync.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/datasets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/decorators.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/deployment_metadata.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/deployment_runs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/eval_handler.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/execution.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/exporter.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/exporter_http.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/helpers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/identity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/imaging.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/decode.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/encode.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/hash.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/program.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/reflection.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/types.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/ir/xxh64.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/lm_configuration.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/mcp_servers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/models.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/named_programs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/optimization.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/optimizers/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/optimizers/gepa.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/optimizers/gepa_callback.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/optimizers/resume.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/optimizers/tracker.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/packaging.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/programs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/references.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/retry.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/cmpnd/traces.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/2026-04-02-code-review.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/cli.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/client.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/custom-proposer.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/docs/reading-traces.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/examples/generalizing_proposer.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/examples/local_ollama.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/LINEAGE.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/README.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/bodies.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/client_floor.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/program_names.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/protocols.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/py.typed +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/request_log.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/retry.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/ingest/pyproject.toml +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/audit-sdist.sh +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/capture_review_run.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/check-pip-install.sh +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/check_release_artifacts.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/fixtures/review_run.json.gz +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/gepa_resume_bug.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/install-test-env.sh +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/release-gate.sh +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/release-real-models.sh +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/require_version_bump.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/seed_review_run.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/selfhost_compat.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/scripts/test-in-linux.sh +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/stubs/dspy/__init__.pyi +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/stubs/dspy/primitives/__init__.pyi +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/stubs/dspy/primitives/prediction.pyi +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/stubs/dspy/utils/__init__.pyi +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/stubs/dspy/utils/callback.pyi +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/stubs/dspy/utils/dummies.pyi +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_credential_route.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_deployment_signature_helpers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_exporter_helpers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_fake_clock.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_identity_helpers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_resolve_refs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/_traced_run.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/conftest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/committee_task.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/conftest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/continuation_task.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/fake_lm.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/helpers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/target_capabilities.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_assessments_cli.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_capture_prompts.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_composite_module.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_deploy_execute.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_deploy_pandas.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_edge_cases.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_example_hash.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_gepa_optimization.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_interpreter_spans.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_lm_accuracy.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_module_tracing.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimization_lineage.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_authored_metric.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_continuation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_custom_proposer.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_failures.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_review_committee.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_optimize_server_owned_completion.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_parallel_export.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_project_attribution.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_react_tool_spans.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_save_load.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_trace_structure.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_traces_read.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_user_attribution.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/e2e/test_valsets_cli.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/01_predict_qa.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/08_opaque_module.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/10_react.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/11_refine.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/12_retrieve.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/13_knn.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/14_parallel.json +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/identity_vectors/README.md +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/ingest_conformance.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/authored_optimize/judge.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/conftest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/hosted_optimize_probe.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/optimization_run_probe.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/test_cli_deploy_smoketest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/test_logs_renders_traces.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/test_optimization_run.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/test_optimizing_progress.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/integration/test_unhappy_path.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/__main__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/drain.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/ingest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/latency_transport.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/rlm_shape.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/rlm_size_report.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/sweep.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/test_rlm_shape.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/load/test_rlm_size_report.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/conftest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/seed_parity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_auth.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_datasets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_deployments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_evals.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_health.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_modules.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_optimizations.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_programs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_signatures.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_trace_streaming.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/parity/test_traces.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/_provider.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/_readiness.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/_reliability.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/_result.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/mint_bedrock_token.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_bedrock_converse.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_deploy_programs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_multi_client_stress.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_optimize_client_committee.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_optimize_continuation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_optimize_loop.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_optimize_loop_wasm.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_optimize_stress.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_provider_roles.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_readiness.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_real_provider_twins.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_reliability.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_reliability_classify.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_rlm_wasm.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/real_models/test_trace_search.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/span_reference_fixture.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_adapter_reentrancy.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_assessments_api.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_authored_binding_credentials.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_authored_bundle_collisions.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_authored_metric_contract.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_authored_named_models.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_authored_optimize.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_callback.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_candidate_lineage.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/conftest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_admin.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_api_client.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_assessments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_auth.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_credentials.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_datasets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_deployment_runs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_deployments.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_evals.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_login.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_main.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_optimizations.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_org.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_pagination.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_parity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_programs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_provider_credentials.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_schema_sample.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_shell.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_tool_servers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_top.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_traces.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_traces_program_and_module.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_traces_search_wire.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_tree_help.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cli/test_valsets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_client.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_client_floor.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_client_program_names.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_clustering/__init__.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_clustering/conftest.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_clustering/test_edge_cases.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_clustering/test_hash_consistency.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_clustering/test_type_conversion.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_cmp551_grouping_identity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_configuration.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_context.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_context_propagation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_credential_kwargs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_credential_selection.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_credential_values.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_dataset_polling.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_dataset_sync.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_datasets.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_decision_client_spans.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_decorators.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_deploy_mcp_tool_references.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_deployment_metadata.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_deployment_runs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_deployments_read.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_eval.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_eval_example_attribution.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_eval_start.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_eval_trace_grouping.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_exception_paths.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_execute.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_execute_run_identity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_exporter.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_exporter_program_names.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_exporter_queue.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_exporter_real.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_fake_lm.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_gepa_callback.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_gepa_integration.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_gepa_output_normalization.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_gepa_resume.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_identity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_imaging.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_import_weight.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_ingest_conformance.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_ingest_second_producer.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_integration.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_interpreter_callback.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_ir_encoder_properties.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_ir_golden_vectors.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_ir_roundtrip.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_lm15_native_calls.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_lm_configuration.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_lm_usage_shapes.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_mcp_tools.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_models.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_multi_client_stress_readiness.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimization_progress.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimization_start.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize_budget.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize_lift.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize_lms.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize_proposer.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize_reflection_lm.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_optimize_terminal_failure.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_packaging.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_packaging_callable_source.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_packaging_mcp_tools.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_packaging_program_source.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_poll_until.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_program_id_deprecation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_program_identity.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_program_lineage_persist.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_program_names_in_deploy.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_programs_create.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_project_payload.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_real_provider_twins_readiness.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_reflector_properties.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_reflector_smoke.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_release_gate_script.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_release_real_models_script.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_replaced_names.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_repro_reactv2_bugs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_require_version_bump.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_retry.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_reversible_failures.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_rlm_patch.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_run_attribution_paths.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_runtime_tools.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_schemas.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_seal_lm_credential.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_seed_review_run.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_signature_inputs.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_span_references.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_span_sent_once.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_system_one.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_trace_context_concurrency.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_trace_fact_wire_contract.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_trace_facts.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_trace_render.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_traces_read.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_tracked_gepa.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_tracker_enrich.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_truncation.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_upload_auth_headers.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_valsets_api.py +0 -0
- {cmpnd-0.68.0 → cmpnd-0.69.0}/tests/test_xxh64.py +0 -0
|
@@ -263,7 +263,6 @@ def _program_facts(
|
|
|
263
263
|
lm = packaging._extract_lm_object(program)
|
|
264
264
|
lm_kwargs = getattr(lm, "kwargs", {}) if lm is not None else {}
|
|
265
265
|
facts = ProgramFacts(
|
|
266
|
-
program_signature_hash=identity.compute_program_hash(program),
|
|
267
266
|
entrypoint_kind=kind,
|
|
268
267
|
module_class=type(program).__name__,
|
|
269
268
|
litellm_model=getattr(lm, "model", None),
|
|
@@ -43,7 +43,6 @@ class SourceCheckError(ValueError):
|
|
|
43
43
|
class ProgramFacts:
|
|
44
44
|
"""Facts derived by importing the staged program without calling forward."""
|
|
45
45
|
|
|
46
|
-
program_signature_hash: int | None = None
|
|
47
46
|
entrypoint_kind: str = "instance"
|
|
48
47
|
module_class: str | None = None
|
|
49
48
|
signature_name: str | None = None
|
|
@@ -72,11 +71,7 @@ class ProgramFacts:
|
|
|
72
71
|
|
|
73
72
|
def deploy_body(self) -> dict[str, Any]:
|
|
74
73
|
"""Return fields the deployment create route accepts."""
|
|
75
|
-
from . import identity
|
|
76
|
-
|
|
77
74
|
body: dict[str, Any] = {}
|
|
78
|
-
if self.program_signature_hash is not None:
|
|
79
|
-
body["program_signature_hash"] = identity.format_signature_hash(self.program_signature_hash)
|
|
80
75
|
for name in (
|
|
81
76
|
"module_class",
|
|
82
77
|
"signature_name",
|
|
@@ -527,13 +527,10 @@ def deploy_module_under(
|
|
|
527
527
|
# Package the module
|
|
528
528
|
zip_bytes = packaging.generate_source_zip(module, metric, mcp_tools=pinned_mcp_tools)
|
|
529
529
|
|
|
530
|
-
#
|
|
531
|
-
# tag included); the signature is kept around only for display metadata.
|
|
530
|
+
# The deployment names its program by id alone; the signature only describes it.
|
|
532
531
|
sig = packaging._get_module_signature(module)
|
|
533
|
-
program_signature_hash = identity.compute_program_hash(module) or 0
|
|
534
532
|
|
|
535
533
|
deploy_body: dict[str, Any] = {
|
|
536
|
-
"program_signature_hash": identity.format_signature_hash(program_signature_hash),
|
|
537
534
|
# Declare the ZIP's exact length so the server can reject an oversized
|
|
538
535
|
# deploy before the upload.
|
|
539
536
|
"declared_content_length": len(zip_bytes),
|
|
@@ -803,7 +803,9 @@ name form. A program name wins over the config's id. `configure()`
|
|
|
803
803
|
checks the id's shape and raises `ValueError` on a bad one, and a `Config` built directly
|
|
804
804
|
is checked the same way.
|
|
805
805
|
|
|
806
|
-
The id rides every body that can declare a program
|
|
806
|
+
The id rides every body that can declare a program. A deployment create names its program
|
|
807
|
+
by the id alone and sends no `program_signature_hash`. The other bodies still carry the
|
|
808
|
+
hash beside the id:
|
|
807
809
|
|
|
808
810
|
| Body | Where | Built by |
|
|
809
811
|
|---|---|---|
|
|
@@ -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.
|
|
8
|
+
version = "0.69.0"
|
|
9
9
|
description = "DSPy observability and deployment SDK for cmpnd"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.11"
|
|
@@ -219,7 +219,6 @@ class TestDeployBadImportRejected:
|
|
|
219
219
|
create_resp = client.post(
|
|
220
220
|
f"{config.endpoint}/api/v1/deployments",
|
|
221
221
|
json={
|
|
222
|
-
"program_signature_hash": 0,
|
|
223
222
|
"declared_content_length": len(zip_bytes),
|
|
224
223
|
"program_id": program_id_for(f"test_deploy_programs-{uuid.uuid4().hex[:8]}"),
|
|
225
224
|
# A worker that spends egress tokens needs the model a token names, so
|
|
@@ -32,7 +32,6 @@ import dspy
|
|
|
32
32
|
import pytest
|
|
33
33
|
|
|
34
34
|
import cmpnd
|
|
35
|
-
from tests import _identity_helpers
|
|
36
35
|
from tests.e2e import committee_task, fake_lm
|
|
37
36
|
from tests.e2e.helpers import named_program, platform_client, poll_until, program_id_for
|
|
38
37
|
from tests.e2e.target_capabilities import needs_an_optimizer
|
|
@@ -190,7 +189,6 @@ class TestOptimizeGepaDeployDetail:
|
|
|
190
189
|
|
|
191
190
|
def test_gepa_deploy_run_stamps_traces_and_lands_detail(self, deployed_source, program_id, server_client):
|
|
192
191
|
program, trainset, valset, deployed = deployed_source
|
|
193
|
-
sig_hash = _identity_helpers.program_hash_for_sig(program.signature)
|
|
194
192
|
before = time.time()
|
|
195
193
|
|
|
196
194
|
platform_client().optimize_deployment(
|
|
@@ -210,10 +208,10 @@ class TestOptimizeGepaDeployDetail:
|
|
|
210
208
|
|
|
211
209
|
# Correlate to THIS run through the optimization index, not by scanning
|
|
212
210
|
# the trace stream: `deployed_source` is module-scoped, so every other test
|
|
213
|
-
# in this file emits traces under the SAME
|
|
214
|
-
#
|
|
215
|
-
#
|
|
216
|
-
# match it on the returned row, which
|
|
211
|
+
# in this file emits traces under the SAME program. This run is the only
|
|
212
|
+
# one of this optimizer + program started after `before`. A run serve
|
|
213
|
+
# starts names its deployment's program_id. The optimization search does
|
|
214
|
+
# not filter by program, so match it on the returned row, which carries it.
|
|
217
215
|
#
|
|
218
216
|
# Poll, don't sleep-once: on serve the deploy run's detail + traces land
|
|
219
217
|
# via a background completion watcher (5s poll cadence) AFTER optimize_deployment()
|
|
@@ -228,11 +226,11 @@ class TestOptimizeGepaDeployDetail:
|
|
|
228
226
|
order_direction="desc",
|
|
229
227
|
per_page=50,
|
|
230
228
|
).get("optimization_runs", [])
|
|
231
|
-
return [r for r in runs if
|
|
229
|
+
return [r for r in runs if r.get("program_id") == program_id]
|
|
232
230
|
|
|
233
231
|
mine = poll_until(_find_run, timeout=60.0, interval=3.0)
|
|
234
232
|
assert mine, (
|
|
235
|
-
f"no GEPA optimization run for
|
|
233
|
+
f"no GEPA optimization run for program_id={program_id} after {start_from} "
|
|
236
234
|
"(serve completion watcher didn't land it within 60s)"
|
|
237
235
|
)
|
|
238
236
|
run_id = mine[0]["run_id"]
|
|
@@ -254,9 +252,7 @@ class TestOptimizeGepaDeployDetail:
|
|
|
254
252
|
assert candidates, f"GEPA deploy run {run_id} landed a header but no candidate detail (CMP-323)"
|
|
255
253
|
|
|
256
254
|
# The worker's tracker stamps the run id onto the run's traces (the collector
|
|
257
|
-
# stamps only deployment_id), and
|
|
258
|
-
# program_signature_hash through the poll without float-rounding it, so the
|
|
259
|
-
# run row matches this signature. Its traces land under the deployment's program.
|
|
255
|
+
# stamps only deployment_id), and the traces land under the deployment's program.
|
|
260
256
|
# Page wide (page_size=500, the API max) so this run's few traces aren't crowded
|
|
261
257
|
# out of the default window by the other tests' runs — module-scoped
|
|
262
258
|
# `deployed_source` means they all share this program —
|
|
@@ -142,8 +142,9 @@ def test_bundle_pins_tools_without_importing_the_program_twice(monkeypatch):
|
|
|
142
142
|
check.assert_called_once()
|
|
143
143
|
|
|
144
144
|
|
|
145
|
-
def
|
|
145
|
+
def test_deploy_body_omits_trace_limits_and_sends_no_hash():
|
|
146
146
|
assert authored.ProgramFacts.minimal().deploy_body() == {}
|
|
147
|
+
assert "program_signature_hash" not in authored.ProgramFacts(module_class="Predict").deploy_body()
|
|
147
148
|
|
|
148
149
|
|
|
149
150
|
def test_deploy_body_preserves_empty_signature_field_lists():
|
|
@@ -414,7 +414,8 @@ class TestDeploy:
|
|
|
414
414
|
create_call = client.post.call_args_list[0]
|
|
415
415
|
assert "ct_test_key" in str(create_call)
|
|
416
416
|
|
|
417
|
-
def
|
|
417
|
+
def test_sends_no_program_signature_hash(self, mock_httpx):
|
|
418
|
+
# A deployment names its program by id alone.
|
|
418
419
|
client = self._setup_mocks(mock_httpx)
|
|
419
420
|
|
|
420
421
|
with mock.patch.object(deployment, "time") as mock_time:
|
|
@@ -425,9 +426,7 @@ class TestDeploy:
|
|
|
425
426
|
|
|
426
427
|
create_call = client.post.call_args_list[0]
|
|
427
428
|
body = create_call.kwargs.get("json", {})
|
|
428
|
-
assert "program_signature_hash" in body
|
|
429
|
-
# CMP-331: carried as a quoted decimal string on the wire, not a number.
|
|
430
|
-
assert isinstance(body["program_signature_hash"], str)
|
|
429
|
+
assert "program_signature_hash" not in body
|
|
431
430
|
|
|
432
431
|
def test_sends_the_programs_signature(self, mock_httpx):
|
|
433
432
|
# A program's signature is known the moment the module is packaged, and the
|
|
@@ -108,7 +108,7 @@ class TestDeployBody:
|
|
|
108
108
|
lambda: deployment.deploy_module_under(dspy.Predict("question -> answer"), None, 300, None, None, config)
|
|
109
109
|
)
|
|
110
110
|
assert "program_id" not in body
|
|
111
|
-
assert "program_signature_hash" in body
|
|
111
|
+
assert "program_signature_hash" not in body
|
|
112
112
|
|
|
113
113
|
def test_an_undeclared_bundle_deploy_omits_the_key(self):
|
|
114
114
|
_configure()
|
|
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
|
|
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
|