cmpnd 0.71.0__tar.gz → 0.73.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.71.0 → cmpnd-0.73.0}/PKG-INFO +1 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/admin.py +18 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/deployments.py +3 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/verbs.py +2 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/client.py +13 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/execution.py +22 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/cli.md +21 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/client.md +3 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/sdk-instrumentation.md +8 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/pyproject.toml +1 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_admin.py +18 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_deployment_runs.py +34 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_deployment_runs.py +68 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/uv.lock +1 -1
- {cmpnd-0.71.0 → cmpnd-0.73.0}/.gitignore +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/AGENTS.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/CLAUDE.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/README.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_assessments.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_authored_import.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_deployments.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_exporter_pool.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_gepa_patch.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_http.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_program_patch.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_rlm_patch.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_runtime_tools.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_timespec.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_traces.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/_valsets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/authored.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/callback.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/api_client.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/assessments.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/auth.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/datasets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/evals.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/login.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/optimizations.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/org.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/tool_servers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/top.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/traces.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/commands/valsets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/credentials.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/deprecation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/pagination.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/shell.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/trace_render.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/tree_help.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/cli/views.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/configuration.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/context.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/credentials.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/dataset_sync.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/datasets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/decorators.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/deployment.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/deployment_metadata.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/deployment_runs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/eval_handler.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/exporter.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/exporter_http.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/helpers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/identity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/imaging.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/decode.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/encode.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/hash.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/program.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/reflection.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/types.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/ir/xxh64.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/lm_configuration.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/mcp_servers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/models.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/named_programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/optimization.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/optimizers/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/optimizers/gepa.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/optimizers/gepa_callback.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/optimizers/resume.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/optimizers/tracker.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/packaging.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/references.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/retry.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/cmpnd/traces.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/2026-04-02-code-review.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/custom-proposer.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/docs/reading-traces.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/examples/generalizing_proposer.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/examples/local_ollama.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/LINEAGE.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/README.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/bodies.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/client_floor.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/program_names.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/protocols.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/py.typed +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/request_log.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/retry.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/ingest/pyproject.toml +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/audit-sdist.sh +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/capture_review_run.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/check-pip-install.sh +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/check_release_artifacts.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/fixtures/review_run.json.gz +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/gepa_resume_bug.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/install-test-env.sh +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/release-gate.sh +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/release-real-models.sh +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/require_version_bump.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/seed_review_run.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/selfhost_compat.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/scripts/test-in-linux.sh +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/stubs/dspy/__init__.pyi +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/stubs/dspy/primitives/__init__.pyi +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/stubs/dspy/primitives/prediction.pyi +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/stubs/dspy/utils/__init__.pyi +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/stubs/dspy/utils/callback.pyi +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/stubs/dspy/utils/dummies.pyi +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_credential_route.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_deployment_signature_helpers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_exporter_helpers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_fake_clock.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_identity_helpers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_resolve_refs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/_traced_run.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/conftest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/committee_task.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/conftest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/continuation_task.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/fake_lm.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/helpers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/target_capabilities.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_assessments_cli.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_capture_prompts.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_composite_module.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_deploy_execute.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_deploy_pandas.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_deploy_programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_edge_cases.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_example_hash.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_gepa_optimization.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_interpreter_spans.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_lm_accuracy.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_module_tracing.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimization_lineage.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_authored_metric.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_continuation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_custom_proposer.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_failures.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_loop.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_review_committee.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_optimize_server_owned_completion.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_parallel_export.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_project_attribution.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_react_tool_spans.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_save_load.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_trace_structure.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_traces_read.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_user_attribution.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/e2e/test_valsets_cli.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/01_predict_qa.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/08_opaque_module.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/10_react.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/11_refine.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/12_retrieve.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/13_knn.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/14_parallel.json +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/identity_vectors/README.md +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/ingest_conformance.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/authored_optimize/judge.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/conftest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/hosted_optimize_probe.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/optimization_run_probe.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/test_cli_deploy_smoketest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/test_logs_renders_traces.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/test_optimization_run.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/test_optimizing_progress.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/integration/test_unhappy_path.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/__main__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/drain.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/ingest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/latency_transport.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/rlm_shape.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/rlm_size_report.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/sweep.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/test_rlm_shape.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/load/test_rlm_size_report.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/conftest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/seed_parity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_auth.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_datasets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_deployments.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_evals.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_health.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_modules.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_optimizations.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_signatures.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_trace_streaming.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/parity/test_traces.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/_provider.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/_readiness.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/_reliability.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/_result.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/mint_bedrock_token.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_bedrock_converse.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_deploy_programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_multi_client_stress.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_optimize_client_committee.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_optimize_continuation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_optimize_loop.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_optimize_loop_wasm.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_optimize_stress.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_provider_roles.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_readiness.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_real_provider_twins.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_reliability.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_reliability_classify.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_rlm_wasm.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/real_models/test_trace_search.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/span_reference_fixture.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_adapter_reentrancy.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_assessments_api.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_authored.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_authored_binding_credentials.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_authored_bundle_collisions.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_authored_metric_contract.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_authored_named_models.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_authored_optimize.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_callback.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_candidate_lineage.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/conftest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_api_client.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_assessments.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_auth.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_credentials.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_datasets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_deployments.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_evals.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_login.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_main.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_optimizations.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_org.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_pagination.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_parity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_programs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_provider_credentials.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_schema_sample.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_shell.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_tool_servers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_top.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_traces.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_traces_program_and_module.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_traces_search_wire.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_tree_help.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cli/test_valsets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_client.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_client_floor.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_client_program_names.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_clustering/__init__.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_clustering/conftest.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_clustering/test_edge_cases.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_clustering/test_hash_consistency.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_clustering/test_type_conversion.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_cmp551_grouping_identity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_configuration.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_context.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_context_propagation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_credential_kwargs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_credential_selection.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_credential_values.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_dataset_polling.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_dataset_sync.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_datasets.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_decision_client_spans.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_decorators.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_deploy.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_deploy_mcp_tool_references.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_deploy_program_id.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_deployment_metadata.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_deployments_read.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_eval.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_eval_example_attribution.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_eval_program_id.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_eval_start.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_eval_trace_grouping.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_exception_paths.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_execute.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_execute_run_identity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_exporter.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_exporter_program_names.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_exporter_queue.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_exporter_real.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_fake_lm.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_gepa_callback.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_gepa_integration.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_gepa_output_normalization.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_gepa_resume.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_identity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_imaging.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_import_weight.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_ingest_conformance.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_ingest_second_producer.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_integration.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_interpreter_callback.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_ir_encoder_properties.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_ir_golden_vectors.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_ir_roundtrip.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_lm15_native_calls.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_lm_configuration.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_lm_usage_shapes.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_mcp_tools.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_models.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_multi_client_stress_readiness.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimization_progress.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimization_start.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize_budget.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize_lift.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize_lms.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize_proposer.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize_reflection_lm.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_optimize_terminal_failure.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_packaging.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_packaging_callable_source.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_packaging_mcp_tools.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_packaging_program_source.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_poll_until.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_program_id_deprecation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_program_identity.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_program_lineage_persist.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_program_names_in_deploy.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_programs_create.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_project_payload.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_real_provider_twins_readiness.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_reflector_properties.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_reflector_smoke.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_release_gate_script.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_release_real_models_script.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_replaced_names.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_repro_reactv2_bugs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_require_version_bump.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_retry.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_reversible_failures.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_rlm_patch.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_run_attribution_paths.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_runtime_tools.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_schemas.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_seal_lm_credential.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_seed_review_run.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_signature_inputs.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_span_references.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_span_sent_once.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_system_one.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_trace_context_concurrency.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_trace_fact_wire_contract.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_trace_facts.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_trace_render.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_traces_read.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_tracked_gepa.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_tracker_enrich.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_truncation.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_upload_auth_headers.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_valsets_api.py +0 -0
- {cmpnd-0.71.0 → cmpnd-0.73.0}/tests/test_xxh64.py +0 -0
|
@@ -121,6 +121,12 @@ def _register_org(sub: _SubParsersAction[ArgumentParser]) -> None:
|
|
|
121
121
|
elect_owner.add_argument("user_id", help="User id to make owner")
|
|
122
122
|
elect_owner.set_defaults(func=handle_org_elect_owner)
|
|
123
123
|
|
|
124
|
+
usage = osub.add_parser(
|
|
125
|
+
"usage", help="Show the org's limits in use and its activity over 24 hours, 7 days and 30 days"
|
|
126
|
+
)
|
|
127
|
+
_org_id_arg(usage)
|
|
128
|
+
usage.set_defaults(func=handle_org_usage)
|
|
129
|
+
|
|
124
130
|
plan = osub.add_parser("plan", help="An org's plan and its limits")
|
|
125
131
|
plsub = plan.add_subparsers(dest="org_plan_action")
|
|
126
132
|
plan_show = plsub.add_parser("show", help="Show the org's plan and every limit as it resolves for the org")
|
|
@@ -162,6 +168,10 @@ def _register_user(sub: _SubParsersAction[ArgumentParser]) -> None:
|
|
|
162
168
|
_user_id_arg(show)
|
|
163
169
|
show.set_defaults(func=handle_user_show)
|
|
164
170
|
|
|
171
|
+
activity = usub.add_parser("activity", help="Show a user's milestones, memberships and recorded changes")
|
|
172
|
+
_user_id_arg(activity)
|
|
173
|
+
activity.set_defaults(func=handle_user_activity)
|
|
174
|
+
|
|
165
175
|
deprecation.alias(usub, "get", "show", func=handle_user_show, configure=_user_id_arg)
|
|
166
176
|
|
|
167
177
|
create = usub.add_parser("create", help="Provision a user")
|
|
@@ -349,6 +359,10 @@ def handle_org_elect_owner(client: api_client.ApiClient, args: Any) -> Any:
|
|
|
349
359
|
return {"elected": args.user_id, "github_login": args.github_login}
|
|
350
360
|
|
|
351
361
|
|
|
362
|
+
def handle_org_usage(client: api_client.ApiClient, args: Any) -> Any:
|
|
363
|
+
return client.get(f"/api/v1/admin/organizations/{args.org_id}/usage")
|
|
364
|
+
|
|
365
|
+
|
|
352
366
|
def handle_org_plan_show(client: api_client.ApiClient, args: Any) -> Any:
|
|
353
367
|
return client.get(f"/api/v1/admin/organizations/{args.org_id}/plan")
|
|
354
368
|
|
|
@@ -424,6 +438,10 @@ def handle_user_show(client: api_client.ApiClient, args: Any) -> Any:
|
|
|
424
438
|
return client.get(f"/api/v1/admin/users/{args.id}")
|
|
425
439
|
|
|
426
440
|
|
|
441
|
+
def handle_user_activity(client: api_client.ApiClient, args: Any) -> Any:
|
|
442
|
+
return client.get(f"/api/v1/admin/users/{args.id}/activity")
|
|
443
|
+
|
|
444
|
+
|
|
427
445
|
def handle_user_create(client: api_client.ApiClient, args: Any) -> Any:
|
|
428
446
|
# email/name/org_id/is_admin are always sent; password is only included
|
|
429
447
|
# when supplied so the server keeps its own default (e.g. no local login).
|
|
@@ -191,6 +191,9 @@ def submit_cli_run(
|
|
|
191
191
|
raise
|
|
192
192
|
except httpx.HTTPStatusError as exc:
|
|
193
193
|
raise _http_refusal(exc) from exc
|
|
194
|
+
trace_id = settled.get("trace_id")
|
|
195
|
+
if isinstance(trace_id, str) and trace_id:
|
|
196
|
+
print(f"Trace: {trace_id}", file=sys.stderr)
|
|
194
197
|
if settled["status"] == "failed":
|
|
195
198
|
return settled, None
|
|
196
199
|
result = settled.get("result")
|
|
@@ -192,7 +192,8 @@ RELATION_NOUNS: dict[str, str] = {
|
|
|
192
192
|
"registry": "the registered programs, as distinct from the organization's programs",
|
|
193
193
|
"optimized": "the compiled programs optimization runs produced, as distinct from the organization's programs",
|
|
194
194
|
"stats": "a program's execution statistics",
|
|
195
|
-
"usage": "a program's usage over time",
|
|
195
|
+
"usage": "a program's usage over time, or an organization's limits in use and recent activity",
|
|
196
|
+
"activity": "a user's account milestones, memberships and recorded changes",
|
|
196
197
|
"openapi": "the OpenAPI document a deployment serves",
|
|
197
198
|
"history": "a program's distinct prompt instructions over time",
|
|
198
199
|
"evals": "the eval runs recorded against a program",
|
|
@@ -390,6 +390,19 @@ class Client:
|
|
|
390
390
|
|
|
391
391
|
return execution.deployment_run_id(result_or_error)
|
|
392
392
|
|
|
393
|
+
def get_trace_id(self, result_or_error: Any) -> str | None:
|
|
394
|
+
"""The root trace id of a ``run_deployment`` prediction or exception.
|
|
395
|
+
|
|
396
|
+
It reads the id serve returned with the settled run and sends no
|
|
397
|
+
request. ``get_trace`` opens the trace.
|
|
398
|
+
The id lives outside the prediction's output fields. A run that stored no
|
|
399
|
+
trace, a server that names none, and a failure before serve accepted a run
|
|
400
|
+
all return ``None``.
|
|
401
|
+
"""
|
|
402
|
+
from . import execution
|
|
403
|
+
|
|
404
|
+
return execution.get_trace_id(result_or_error)
|
|
405
|
+
|
|
393
406
|
def submit_deployment_run(
|
|
394
407
|
self,
|
|
395
408
|
deployment_or_id: Any,
|
|
@@ -33,6 +33,21 @@ def deployment_run_id(result_or_error: Any) -> str | None:
|
|
|
33
33
|
return getattr(result_or_error, "_cmpnd_deployment_run_id", None)
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
def get_trace_id(result_or_error: Any) -> str | None:
|
|
37
|
+
"""Return the root trace id serve named for a run's prediction or exception.
|
|
38
|
+
|
|
39
|
+
The id lives outside the prediction's program output fields. A run that
|
|
40
|
+
stored no trace, a server that names none, and a failure before serve
|
|
41
|
+
accepted a run all return ``None``.
|
|
42
|
+
"""
|
|
43
|
+
return getattr(result_or_error, "_cmpnd_deployment_trace_id", None)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _settled_trace_id(settled: dict[str, Any]) -> str | None:
|
|
47
|
+
trace_id = settled.get("trace_id")
|
|
48
|
+
return trace_id if isinstance(trace_id, str) and trace_id else None
|
|
49
|
+
|
|
50
|
+
|
|
36
51
|
def _with_run_id(error: Exception, run_id: str | None) -> Exception:
|
|
37
52
|
error._cmpnd_deployment_run_id = run_id # pyright: ignore[reportAttributeAccessIssue]
|
|
38
53
|
return error
|
|
@@ -247,14 +262,20 @@ def run_deployment(
|
|
|
247
262
|
raise
|
|
248
263
|
|
|
249
264
|
settled_id: str = settled["deployment_run_id"]
|
|
265
|
+
trace_id = _settled_trace_id(settled)
|
|
250
266
|
result = settled["result"]
|
|
251
267
|
if settled["status"] == "failed":
|
|
252
|
-
|
|
268
|
+
try:
|
|
269
|
+
_raise_stored_failure(settled_id, result, config.endpoint)
|
|
270
|
+
except Exception as error:
|
|
271
|
+
error._cmpnd_deployment_trace_id = trace_id # pyright: ignore[reportAttributeAccessIssue]
|
|
272
|
+
raise
|
|
253
273
|
if not isinstance(result, dict) or "output" not in result:
|
|
254
274
|
raise _with_run_id(RuntimeError("Deployment run result has no program output"), settled_id)
|
|
255
275
|
output = result["output"]
|
|
256
276
|
prediction = Prediction(**output) if isinstance(output, dict) else Prediction(**{"output": output})
|
|
257
277
|
setattr(prediction, "_cmpnd_deployment_run_id", settled_id)
|
|
278
|
+
setattr(prediction, "_cmpnd_deployment_trace_id", trace_id)
|
|
258
279
|
return prediction
|
|
259
280
|
|
|
260
281
|
|
|
@@ -228,6 +228,10 @@ seconds, unless `--timeout` sets the budget. The CLI prints the accepted run ID
|
|
|
228
228
|
on stderr as soon as serve replies, which can take up to serve's five-second
|
|
229
229
|
wait. A failed run exits nonzero. Human mode prints the stored error code,
|
|
230
230
|
message and provider status. `--json` prints the whole settled run on stdout.
|
|
231
|
+
When a settled run names its root trace, the CLI prints `Trace: <id>` on
|
|
232
|
+
stderr, completed or failed. `cmpnd traces show <id>` opens that trace. The
|
|
233
|
+
run's `trace_id` field holds the same ID, and serve leaves it out when the run
|
|
234
|
+
stored no trace.
|
|
231
235
|
The CLI retries status reads that time out or answer `408`, `429` or `5xx`
|
|
232
236
|
within the budget.
|
|
233
237
|
|
|
@@ -886,6 +890,23 @@ and a value of `none` lifts the plan's limit for that org.
|
|
|
886
890
|
`cmpnd admin org overrides delete ORG_ID NAME` deletes the override, so the org
|
|
887
891
|
follows its plan again.
|
|
888
892
|
|
|
893
|
+
`cmpnd admin org usage ORG_ID` shows what each limit bounds now, in `in_use`,
|
|
894
|
+
and the org's activity in the last 24 hours, 7 days and 30 days, in `windows`.
|
|
895
|
+
Each window counts traces, model calls and tokens, deployment runs by status,
|
|
896
|
+
and hosted optimizations started and cancelled with their compute. `since` is
|
|
897
|
+
the start of the window's first hour. `traces` or `model_usage` is `null` when
|
|
898
|
+
the server has no published count for the window yet.
|
|
899
|
+
|
|
900
|
+
`cmpnd admin user activity USER_ID` shows a user's milestones, every org they
|
|
901
|
+
belong to, and the newest 50 authority changes recorded about them, such as
|
|
902
|
+
approvals, ownership grants, invites and leaves. A milestone that has not
|
|
903
|
+
happened is `null`. `first_approved_at` is the first approval still on record: an admin-created
|
|
904
|
+
user, an invite redemption and an approved founder write no approval event, so
|
|
905
|
+
their date survives only while a membership keeps it. `oldest_key_at` and
|
|
906
|
+
`last_key_used_at` cover only the keys
|
|
907
|
+
the user still holds, because leaving an org deletes the user's keys there.
|
|
908
|
+
Sign-ins are not recorded, and deployment keys do not count as the user's keys.
|
|
909
|
+
|
|
889
910
|
`cmpnd admin plans list` shows every plan's limits and feature flags.
|
|
890
911
|
`cmpnd admin plans limits update PLAN NAME VALUE` and `limits delete PLAN NAME`
|
|
891
912
|
change a plan's default for every org on it. `cmpnd admin plans flags update
|
|
@@ -147,7 +147,9 @@ endpoint. None of these reads the global config:
|
|
|
147
147
|
- `sdk.submit_deployment_run`, `list_deployment_runs`, `get_deployment_run`,
|
|
148
148
|
`get_deployment_run_result` and `wait_deployment_run` submit, find and resume
|
|
149
149
|
runs without waiting in one call. `sdk.deployment_run_id(result)` reads the run
|
|
150
|
-
id of a prediction or an exception.
|
|
150
|
+
id of a prediction or an exception. `sdk.get_trace_id(result)` reads the
|
|
151
|
+
id of the run's root trace the same way, or returns `None` when serve named no
|
|
152
|
+
trace.
|
|
151
153
|
- `sdk.optimize_deployment(deployment, optimizer="gepa", ...)` runs the
|
|
152
154
|
platform's optimization on a deployment and returns the best
|
|
153
155
|
`DeployedProgram`, with `.score`. It never deploys. The program's model comes
|
|
@@ -432,7 +432,12 @@ command, and re-raises.
|
|
|
432
432
|
`client.deployment_run_id(result)` reads the ID from
|
|
433
433
|
private prediction metadata, so a program can use `output` or
|
|
434
434
|
`deployment_run_id` as an output field. The accessor also accepts a stored
|
|
435
|
-
execution error, a refused read, `RunWaitTimeout` and `RunResultExpired`.
|
|
435
|
+
execution error, a refused read, `RunWaitTimeout` and `RunResultExpired`.
|
|
436
|
+
`client.get_trace_id(result)` reads the id of the run's root trace from
|
|
437
|
+
the same metadata, for a completed run's prediction and a failed run's error.
|
|
438
|
+
`cmpnd traces show` opens that trace. It returns `None` when the run stored no
|
|
439
|
+
trace, when the server names none, and when the run failed before serve
|
|
440
|
+
accepted it. A
|
|
436
441
|
retained provider failure keeps its structured `RetryableProviderError` type but
|
|
437
442
|
does not start another run. Trace delivery can finish after the result is
|
|
438
443
|
available.
|
|
@@ -454,8 +459,10 @@ header readable.
|
|
|
454
459
|
try:
|
|
455
460
|
result = client.run_deployment(deployed, question="What changed?")
|
|
456
461
|
run_id = client.deployment_run_id(result)
|
|
462
|
+
trace_id = client.get_trace_id(result)
|
|
457
463
|
except Exception as error:
|
|
458
464
|
run_id = client.deployment_run_id(error)
|
|
465
|
+
trace_id = client.get_trace_id(error)
|
|
459
466
|
raise
|
|
460
467
|
```
|
|
461
468
|
|
|
@@ -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.73.0"
|
|
9
9
|
description = "DSPy observability and deployment SDK for cmpnd"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.11"
|
|
@@ -283,6 +283,24 @@ def _parse(*argv: str) -> Namespace:
|
|
|
283
283
|
return parser.parse_args(["admin", *argv])
|
|
284
284
|
|
|
285
285
|
|
|
286
|
+
class TestAdminUserActivity:
|
|
287
|
+
def test_activity_reads_the_users_history(self, mock_client):
|
|
288
|
+
mock_client.get.return_value = {"user_id": "u_1", "memberships": [], "events": []}
|
|
289
|
+
args = _parse("user", "activity", "u_1")
|
|
290
|
+
result = args.func(mock_client, args)
|
|
291
|
+
mock_client.get.assert_called_once_with("/api/v1/admin/users/u_1/activity")
|
|
292
|
+
assert result["user_id"] == "u_1"
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
class TestAdminOrgUsage:
|
|
296
|
+
def test_usage_reads_the_orgs_limits_in_use_and_activity(self, mock_client):
|
|
297
|
+
mock_client.get.return_value = {"org_id": "o_1", "in_use": {"members.approved": 2}, "windows": []}
|
|
298
|
+
args = _parse("org", "usage", "o_1")
|
|
299
|
+
result = args.func(mock_client, args)
|
|
300
|
+
mock_client.get.assert_called_once_with("/api/v1/admin/organizations/o_1/usage")
|
|
301
|
+
assert result["in_use"] == {"members.approved": 2}
|
|
302
|
+
|
|
303
|
+
|
|
286
304
|
class TestAdminOrgPlan:
|
|
287
305
|
def test_plan_shows_the_orgs_plan(self, mock_client):
|
|
288
306
|
mock_client.get.return_value = {"org_id": "o_1", "plan": "free", "limits": []}
|
|
@@ -537,3 +537,37 @@ def test_json_run_commands_do_not_import_dspy(argv: list[str], replies: list):
|
|
|
537
537
|
assert "JSON run command imported dspy" not in result.stderr
|
|
538
538
|
out = json.loads(result.stdout)
|
|
539
539
|
assert RUN_ID in result.stdout or "yes" in json.dumps(out)
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
TRACE_ID = "0b9c6f2e-4f1d-4c3a-9e2b-7a1d5c3e8f00"
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
def test_failed_run_names_its_trace_on_stderr(monkeypatch: pytest.MonkeyPatch, capsys):
|
|
546
|
+
failure = {"error": {"type": "ProgramError", "message": "bad input"}, "execution_status": 500}
|
|
547
|
+
|
|
548
|
+
def answer(req):
|
|
549
|
+
return httpx.Response(200, json={**_envelope("failed", failure), "trace_id": TRACE_ID}, request=req)
|
|
550
|
+
|
|
551
|
+
with pytest.raises(SystemExit):
|
|
552
|
+
_run_cli(monkeypatch, ["run", DEPLOYMENT_ID, "{}"], answer)
|
|
553
|
+
assert f"Trace: {TRACE_ID}" in capsys.readouterr().err
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def test_completed_run_names_its_trace_on_stderr_and_keeps_stdout_the_output(monkeypatch: pytest.MonkeyPatch, capsys):
|
|
557
|
+
def answer(req):
|
|
558
|
+
return httpx.Response(
|
|
559
|
+
200, json={**_envelope("completed", {"output": {"answer": "yes"}}), "trace_id": TRACE_ID}, request=req
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
_run_cli(monkeypatch, ["run", DEPLOYMENT_ID, "{}", "--json"], answer)
|
|
563
|
+
out = capsys.readouterr()
|
|
564
|
+
assert json.loads(out.out) == {"answer": "yes"}
|
|
565
|
+
assert f"Trace: {TRACE_ID}" in out.err
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
def test_run_without_a_trace_names_none(monkeypatch: pytest.MonkeyPatch, capsys):
|
|
569
|
+
def answer(req):
|
|
570
|
+
return httpx.Response(200, json=_envelope("completed", {"output": {"answer": "yes"}}), request=req)
|
|
571
|
+
|
|
572
|
+
_run_cli(monkeypatch, ["run", DEPLOYMENT_ID, "{}", "--json"], answer)
|
|
573
|
+
assert "Trace:" not in capsys.readouterr().err
|
|
@@ -505,3 +505,71 @@ def test_failure_summary_names_code_message_and_provider_status():
|
|
|
505
505
|
f"Deployment run {RUN_ID} failed: EgressFailed: provider failed (provider status 429)"
|
|
506
506
|
)
|
|
507
507
|
assert deployment_runs.failure_summary(_run("failed", {"error": "boom"})) == f"Deployment run {RUN_ID} failed: boom"
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
TRACE_ID = "0b9c6f2e-4f1d-4c3a-9e2b-7a1d5c3e8f00"
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
def test_a_completed_run_names_its_trace_beside_its_run_id(monkeypatch: pytest.MonkeyPatch):
|
|
514
|
+
def answer(req: httpx.Request) -> httpx.Response:
|
|
515
|
+
body = {**_run("completed", {"output": {"answer": "yes"}}, available=True), "trace_id": TRACE_ID}
|
|
516
|
+
return httpx.Response(200, json=body, request=req)
|
|
517
|
+
|
|
518
|
+
_transport(monkeypatch, answer)
|
|
519
|
+
prediction = _client().run_deployment(DEPLOYMENT_ID, question="hi")
|
|
520
|
+
assert prediction.answer == "yes"
|
|
521
|
+
assert _client().get_trace_id(prediction) == TRACE_ID
|
|
522
|
+
assert _client().deployment_run_id(prediction) == RUN_ID
|
|
523
|
+
assert "trace_id" not in prediction.keys()
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def test_a_failed_run_names_its_trace_on_the_raised_error(monkeypatch: pytest.MonkeyPatch):
|
|
527
|
+
failure = {"error": {"type": "ProgramError", "message": "bad input"}, "execution_status": 500}
|
|
528
|
+
|
|
529
|
+
def answer(req: httpx.Request) -> httpx.Response:
|
|
530
|
+
return httpx.Response(200, json={**_run("failed", failure, available=True), "trace_id": TRACE_ID}, request=req)
|
|
531
|
+
|
|
532
|
+
_transport(monkeypatch, answer)
|
|
533
|
+
with pytest.raises(httpx.HTTPStatusError) as caught:
|
|
534
|
+
_client().run_deployment(DEPLOYMENT_ID)
|
|
535
|
+
assert _client().get_trace_id(caught.value) == TRACE_ID
|
|
536
|
+
assert _client().deployment_run_id(caught.value) == RUN_ID
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
def test_a_retryable_provider_failure_names_its_trace(monkeypatch: pytest.MonkeyPatch):
|
|
540
|
+
failure = {
|
|
541
|
+
"error": {"type": "EgressFailed", "message": "provider refused"},
|
|
542
|
+
"execution_status": 503,
|
|
543
|
+
"retryable": True,
|
|
544
|
+
"failure": {"domain": "provider", "upstream_status": 429, "attempts": 3},
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
def answer(req: httpx.Request) -> httpx.Response:
|
|
548
|
+
return httpx.Response(200, json={**_run("failed", failure, available=True), "trace_id": TRACE_ID}, request=req)
|
|
549
|
+
|
|
550
|
+
_transport(monkeypatch, answer)
|
|
551
|
+
with pytest.raises(cmpnd.RetryableProviderError) as caught:
|
|
552
|
+
_client().run_deployment(DEPLOYMENT_ID)
|
|
553
|
+
assert _client().get_trace_id(caught.value) == TRACE_ID
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
@pytest.mark.parametrize("trace_field", [{}, {"trace_id": None}, {"trace_id": ""}, {"trace_id": 7}])
|
|
557
|
+
def test_a_run_serve_names_no_trace_for_has_none(monkeypatch: pytest.MonkeyPatch, trace_field: dict):
|
|
558
|
+
def answer(req: httpx.Request) -> httpx.Response:
|
|
559
|
+
body = {**_run("completed", {"output": {"answer": "yes"}}, available=True), **trace_field}
|
|
560
|
+
return httpx.Response(200, json=body, request=req)
|
|
561
|
+
|
|
562
|
+
_transport(monkeypatch, answer)
|
|
563
|
+
prediction = _client().run_deployment(DEPLOYMENT_ID, question="hi")
|
|
564
|
+
assert _client().get_trace_id(prediction) is None
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
def test_a_failure_before_acceptance_has_no_trace(monkeypatch: pytest.MonkeyPatch):
|
|
568
|
+
def answer(req: httpx.Request) -> httpx.Response:
|
|
569
|
+
return httpx.Response(404, json={"error": "not found"}, request=req)
|
|
570
|
+
|
|
571
|
+
_transport(monkeypatch, answer)
|
|
572
|
+
with pytest.raises(httpx.HTTPStatusError) as caught:
|
|
573
|
+
_client().run_deployment(DEPLOYMENT_ID)
|
|
574
|
+
assert _client().get_trace_id(caught.value) is None
|
|
575
|
+
assert _client().get_trace_id(object()) is None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|