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.
- {cmpnd-0.53.0 → cmpnd-0.55.0}/AGENTS.md +13 -3
- {cmpnd-0.53.0 → cmpnd-0.55.0}/PKG-INFO +78 -82
- {cmpnd-0.53.0 → cmpnd-0.55.0}/README.md +77 -81
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/__init__.py +46 -28
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_gepa_patch.py +3 -3
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/__init__.py +3 -3
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/admin.py +172 -3
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/optimizations.py +35 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/top.py +19 -8
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/shell.py +11 -8
- cmpnd-0.55.0/cmpnd/client.py +862 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/deployment.py +23 -59
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/deployment_runs.py +19 -13
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/execution.py +36 -82
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/lm_configuration.py +1 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimization.py +56 -225
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/tracker.py +1 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/packaging.py +5 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/cli.md +59 -6
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/client.md +44 -12
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/custom-proposer.md +8 -6
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/sdk-instrumentation.md +34 -28
- {cmpnd-0.53.0 → cmpnd-0.55.0}/examples/generalizing_proposer.py +9 -7
- {cmpnd-0.53.0 → cmpnd-0.55.0}/pyproject.toml +1 -1
- cmpnd-0.55.0/scripts/selfhost_compat.py +127 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/committee_task.py +10 -9
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/helpers.py +12 -2
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_deploy_execute.py +22 -22
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_deploy_pandas.py +7 -9
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_deploy_programs.py +11 -12
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_failures.py +9 -15
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_loop.py +15 -18
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_server_owned_completion.py +5 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_valsets_cli.py +5 -5
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/conftest.py +2 -2
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +9 -7
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/hosted_optimize_probe.py +7 -7
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_cli_deploy_smoketest.py +1 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_logs_renders_traces.py +4 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_provider.py +7 -7
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_reliability.py +1 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_deploy_programs.py +4 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_loop.py +15 -14
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_loop_wasm.py +17 -15
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_stress.py +12 -10
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_real_provider_twins.py +4 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_rlm_wasm.py +10 -12
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_metric_contract.py +26 -15
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_named_models.py +2 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_optimize.py +7 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_admin.py +135 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_optimizations.py +35 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_shell.py +44 -6
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_top.py +9 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_client.py +11 -11
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_client_program_names.py +7 -7
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deploy.py +34 -30
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deploy_mcp_tool_references.py +4 -2
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deploy_program_id.py +39 -36
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deployment_runs.py +54 -43
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_execute.py +73 -37
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_execute_run_identity.py +13 -11
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_lm_configuration.py +6 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_mcp_tools.py +1 -1
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize.py +168 -53
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_budget.py +27 -19
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_proposer.py +7 -4
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging_mcp_tools.py +2 -2
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_id_deprecation.py +19 -53
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_names_in_deploy.py +101 -27
- cmpnd-0.55.0/tests/test_replaced_names.py +87 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/uv.lock +1 -1
- cmpnd-0.53.0/cmpnd/client.py +0 -410
- {cmpnd-0.53.0 → cmpnd-0.55.0}/.gitignore +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/CLAUDE.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_assessments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_authored_import.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_deployments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_exporter_pool.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_http.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_program_patch.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_rlm_patch.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_runtime_tools.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_timespec.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_traces.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/_valsets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/authored.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/callback.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/api_client.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/assessments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/auth.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/datasets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/deployments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/evals.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/login.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/org.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/programs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/signatures.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/tool_servers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/traces.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/commands/valsets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/credentials.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/deprecation.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/pagination.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/trace_render.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/tree_help.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/cli/verbs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/configuration.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/context.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/dataset_sync.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/datasets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/decorators.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/deployment_metadata.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/eval_handler.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/exporter.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/exporter_http.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/helpers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/identity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/imaging.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/decode.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/encode.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/hash.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/program.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/reflection.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/types.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/ir/xxh64.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/mcp_servers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/models.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/named_programs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/gepa.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/gepa_callback.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/optimizers/resume.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/programs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/references.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/retry.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/cmpnd/traces.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/2026-04-02-code-review.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/docs/reading-traces.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/examples/local_ollama.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/LINEAGE.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/README.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/bodies.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/client_floor.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/program_names.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/protocols.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/py.typed +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/request_log.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/retry.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/ingest/pyproject.toml +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/audit-sdist.sh +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/capture_review_run.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/check-pip-install.sh +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/check_release_artifacts.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/fixtures/review_run.json.gz +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/gepa_resume_bug.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/release-stress.sh +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/require_version_bump.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/seed_review_run.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/scripts/test-in-linux.sh +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/__init__.pyi +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/primitives/__init__.pyi +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/primitives/prediction.pyi +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/utils/__init__.pyi +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/utils/callback.pyi +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/stubs/dspy/utils/dummies.pyi +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_deployment_signature_helpers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_exporter_helpers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_fake_clock.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_identity_helpers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_resolve_refs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/_traced_run.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/conftest.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/conftest.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/fake_lm.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/target_capabilities.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_assessments_cli.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_capture_prompts.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_composite_module.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_edge_cases.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_example_hash.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_gepa_optimization.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_interpreter_spans.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_lm_accuracy.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_module_tracing.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimization_lineage.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_optimize_review_committee.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_parallel_export.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_project_attribution.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_react_tool_spans.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_save_load.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_trace_structure.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_traces_read.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/e2e/test_user_attribution.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/01_predict_qa.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/08_opaque_module.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/10_react.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/11_refine.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/12_retrieve.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/13_knn.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/14_parallel.json +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/identity_vectors/README.md +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/ingest_conformance.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/authored_optimize/judge.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/optimization_run_probe.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_optimization_run.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_optimizing_progress.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/integration/test_unhappy_path.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/__main__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/drain.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/ingest.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/latency_transport.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/rlm_shape.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/rlm_size_report.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/sweep.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/test_rlm_shape.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/load/test_rlm_size_report.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/conftest.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/seed_parity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_auth.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_datasets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_deployments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_evals.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_health.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_modules.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_optimizations.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_programs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_signatures.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_trace_streaming.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/parity/test_traces.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/span_reference_fixture.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_readiness.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/_result.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/mint_bedrock_token.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_multi_client_stress.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_optimize_client_committee.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_provider_roles.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_readiness.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_reliability.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_reliability_classify.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/stress/test_trace_search.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_adapter_reentrancy.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_assessments_api.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_authored_bundle_collisions.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_callback.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_candidate_lineage.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/conftest.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_api_client.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_assessments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_auth.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_credentials.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_datasets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_deployment_runs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_deployments.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_evals.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_login.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_main.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_org.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_pagination.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_parity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_programs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_provider_credentials.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_schema_sample.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_signatures.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_tool_servers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_traces.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_traces_search_wire.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_tree_help.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cli/test_valsets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_client_floor.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/__init__.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/conftest.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/test_edge_cases.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/test_hash_consistency.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_clustering/test_type_conversion.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_cmp551_grouping_identity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_configuration.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_context.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_context_propagation.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_dataset_polling.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_dataset_sync.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_datasets.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_decision_client_spans.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_decorators.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deployment_metadata.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_deployments_read.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval_example_attribution.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval_start.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_eval_trace_grouping.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exception_paths.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter_program_names.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter_queue.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_exporter_real.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_fake_lm.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_callback.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_integration.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_output_normalization.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_gepa_resume.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_identity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_imaging.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_import_weight.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ingest_conformance.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ingest_second_producer.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_integration.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_interpreter_callback.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ir_encoder_properties.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ir_golden_vectors.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_ir_roundtrip.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_lm15_native_calls.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_lm_usage_shapes.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_models.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_multi_client_stress_readiness.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimization_progress.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimization_start.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_lift.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_lms.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_reflection_lm.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_optimize_terminal_failure.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging_callable_source.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_packaging_program_source.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_poll_until.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_identity.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_program_lineage_persist.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_programs_create.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_project_payload.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_real_provider_twins_readiness.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_reflector_properties.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_reflector_smoke.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_release_stress_script.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_repro_reactv2_bugs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_require_version_bump.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_retry.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_reversible_failures.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_rlm_patch.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_run_attribution_paths.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_runtime_tools.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_schemas.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_seed_review_run.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_signature_inputs.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_span_references.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_span_sent_once.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_system_one.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_context_concurrency.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_fact_wire_contract.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_facts.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_trace_render.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_traces_read.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_tracked_gepa.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_tracker_enrich.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_truncation.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_upload_auth_headers.py +0 -0
- {cmpnd-0.53.0 → cmpnd-0.55.0}/tests/test_valsets_api.py +0 -0
- {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`: `
|
|
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`, `
|
|
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.
|
|
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
|
|
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.
|
|
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
|
-
- `
|
|
167
|
-
module. The copy keeps the program name
|
|
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
|
|
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.
|
|
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 =
|
|
188
|
+
deployed = sdk.deploy_program(qa4)
|
|
187
189
|
|
|
188
|
-
result = deployed
|
|
190
|
+
result = sdk.run_deployment(deployed, question="What is DSPy?") # runs server-side
|
|
189
191
|
print(result.answer)
|
|
190
192
|
```
|
|
191
193
|
|
|
192
|
-
`
|
|
193
|
-
until the platform has read it. It then returns a `DeployedProgram`.
|
|
194
|
-
|
|
195
|
-
deployment ID. `
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
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. `
|
|
225
|
+
3. `deploy_program()` returns the `DeployedProgram` when the deployment is
|
|
226
|
+
ready.
|
|
222
227
|
|
|
223
228
|
## Optimization on the platform
|
|
224
229
|
|
|
225
|
-
`
|
|
226
|
-
|
|
227
|
-
|
|
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.
|
|
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 =
|
|
247
|
-
|
|
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
|
|
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.
|
|
277
|
-
`ValueError` for the retired `bootstrap_fewshot`
|
|
278
|
-
any network call, and the platform answers them with
|
|
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 =
|
|
300
|
-
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
optimizer="gepa", #
|
|
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
|
-
`
|
|
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,
|
|
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
|
-
- `
|
|
478
|
-
`cmpnd.Program` with a DSPy optimizer
|
|
479
|
-
copy of the program that holds the optimized module.
|
|
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.
|
|
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
|
|
525
|
-
local timeout and returns a `dspy.Prediction`. A
|
|
526
|
-
|
|
527
|
-
|
|
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. `
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
`deployment_run_id
|
|
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
|
-
`
|
|
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
|
-
`
|
|
544
|
-
waiting. `
|
|
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(
|
|
547
|
-
deployment. `RunSubmissionUncertain` names the list command to check before
|
|
548
|
-
|
|
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
|
|
553
|
-
|
|
554
|
-
`.score` is its score when it came from `
|
|
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
|
|