cmpnd 0.49.0__tar.gz → 0.50.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cmpnd-0.49.0 → cmpnd-0.50.0}/PKG-INFO +1 -1
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_http.py +13 -11
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/deployment.py +4 -4
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/cli.md +9 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/pyproject.toml +1 -1
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_api_client.py +15 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/uv.lock +1 -1
- {cmpnd-0.49.0 → cmpnd-0.50.0}/.gitignore +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/AGENTS.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/CLAUDE.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/README.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_assessments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_authored_import.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_deployments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_exporter_pool.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_gepa_patch.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_program_patch.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_rlm_patch.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_runtime_tools.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_timespec.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_traces.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/_valsets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/authored.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/callback.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/api_client.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/admin.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/assessments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/auth.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/datasets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/deployments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/evals.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/login.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/optimizations.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/org.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/provider_credentials.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/signatures.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/tool_servers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/top.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/traces.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/commands/valsets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/credentials.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/deprecation.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/pagination.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/shell.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/trace_render.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/tree_help.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/cli/verbs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/client.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/configuration.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/context.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/dataset_sync.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/datasets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/decorators.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/deployment_metadata.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/deployment_runs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/eval_handler.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/execution.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/exporter.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/exporter_http.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/helpers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/identity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/imaging.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/decode.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/encode.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/hash.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/program.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/reflection.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/types.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/ir/xxh64.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/lm_configuration.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/mcp_servers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/models.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/named_programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimization.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/gepa.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/gepa_callback.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/resume.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/optimizers/tracker.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/packaging.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/references.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/retry.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/cmpnd/traces.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/2026-04-02-code-review.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/client.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/custom-proposer.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/plans/2026-04-05-train-val-dataset-capture-design.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/plans/2026-04-05-train-val-dataset-capture.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/reading-traces.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/docs/sdk-instrumentation.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/examples/generalizing_proposer.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/examples/local_ollama.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/LINEAGE.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/README.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/bodies.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/client_floor.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/exporter_http.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/program_names.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/protocols.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/py.typed +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/request_log.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/retry.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/cmpnd_ingest/trace_facts.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/ingest/pyproject.toml +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/audit-sdist.sh +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/capture_review_run.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/check-pip-install.sh +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/check_release_artifacts.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/fixtures/review_run.json.gz +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/gepa_resume_bug.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/release-stress.sh +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/require_version_bump.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/seed_review_run.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/scripts/test-in-linux.sh +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/__init__.pyi +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/primitives/__init__.pyi +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/primitives/prediction.pyi +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/utils/__init__.pyi +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/utils/callback.pyi +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/stubs/dspy/utils/dummies.pyi +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_deployment_signature_helpers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_exporter_helpers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_fake_clock.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_identity_helpers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_resolve_refs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/_traced_run.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/conftest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/committee_task.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/conftest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/data/committee_train.ndjson.gz +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/data/committee_val.ndjson.gz +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/fake_lm.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/helpers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/target_capabilities.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_assessments_cli.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_capture_prompts.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_composite_module.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_dataset_auto_creation.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_deploy_execute.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_deploy_pandas.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_deploy_programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_edge_cases.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_example_hash.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_gepa_optimization.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_interpreter_spans.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_lm_accuracy.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_module_tracing.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimization_lineage.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimization_metric_identity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_failures.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_loop.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_review_committee.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_optimize_server_owned_completion.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_parallel_export.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_project_attribution.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_react_tool_spans.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_save_load.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_trace_structure.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_traces_read.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_user_attribution.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/e2e/test_valsets_cli.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/01_predict_qa.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/02_predict_renamed_field.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/03_chain_of_thought_qa.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/04_predict_richer_types.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/05_composite_two_predicts.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/06_multichaincomparison.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/07_program_of_thought.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/08_opaque_module.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/09_predict_pydantic_field.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/10_react.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/11_refine.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/12_retrieve.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/13_knn.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/14_parallel.json +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/identity_vectors/README.md +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/ingest_conformance.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/authored_optimize/judge.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/authored_optimize/optimize_hosted.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/conftest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/hosted_mcp_tool_optimize_probe.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/hosted_optimize_probe.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/optimization_run_probe.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_cli_deploy_smoketest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_logs_renders_traces.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_optimization_run.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_optimizing_progress.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/integration/test_unhappy_path.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/__main__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/drain.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/ingest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/latency_transport.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/rlm_shape.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/rlm_size_report.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/sweep.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/test_rlm_shape.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/load/test_rlm_size_report.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/conftest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/seed_parity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_auth.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_datasets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_deployments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_evals.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_health.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_modules.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_optimizations.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_signatures.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_trace_streaming.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/parity/test_traces.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/span_reference_fixture.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_provider.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_readiness.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_reliability.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/_result.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/mint_bedrock_token.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_deploy_programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_multi_client_stress.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_client_committee.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_loop.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_loop_wasm.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_optimize_stress.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_provider_roles.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_readiness.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_real_provider_twins.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_reliability.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_reliability_classify.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_rlm_wasm.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/stress/test_trace_search.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_adapter_reentrancy.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_assessments_api.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_bundle_collisions.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_metric_contract.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_named_models.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_authored_optimize.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_callback.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_candidate_lineage.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/conftest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_admin.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_assessments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_auth.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_credentials.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_datasets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_deployment_runs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_deployments.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_evals.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_login.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_main.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_optimizations.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_org.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_pagination.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_parity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_programs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_provider_credentials.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_schema_sample.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_shell.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_signatures.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_tool_servers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_top.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_traces.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_traces_search_wire.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_tree_help.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cli/test_valsets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_client.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_client_floor.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_client_program_names.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/__init__.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/conftest.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/test_edge_cases.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/test_hash_consistency.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_clustering/test_type_conversion.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_cmp551_grouping_identity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_configuration.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_context.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_context_propagation.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_dataset_polling.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_dataset_sync.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_datasets.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_decision_client_spans.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_decorators.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deploy.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deploy_mcp_tool_references.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deploy_program_id.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deployment_metadata.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deployment_runs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_deployments_read.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval_example_attribution.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval_start.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_eval_trace_grouping.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exception_paths.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_execute.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_execute_run_identity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter_program_names.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter_queue.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_exporter_real.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_fake_lm.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_callback.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_integration.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_output_normalization.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_gepa_resume.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_identity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_imaging.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_import_weight.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ingest_conformance.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ingest_second_producer.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_integration.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_interpreter_callback.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ir_encoder_properties.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ir_golden_vectors.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_ir_roundtrip.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_lm15_native_calls.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_lm_configuration.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_lm_usage_shapes.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_mcp_tools.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_models.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_multi_client_stress_readiness.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimization_progress.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimization_start.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_budget.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_lift.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_lms.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_proposer.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_reflection_lm.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_optimize_terminal_failure.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging_callable_source.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging_mcp_tools.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_packaging_program_source.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_poll_until.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_program_identity.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_program_lineage_persist.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_programs_create.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_project_payload.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_real_provider_twins_readiness.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_reflector_properties.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_reflector_smoke.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_release_stress_script.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_repro_reactv2_bugs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_require_version_bump.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_retry.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_reversible_failures.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_rlm_patch.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_run_attribution_paths.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_runtime_tools.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_schemas.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_seed_review_run.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_signature_inputs.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_span_references.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_span_sent_once.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_system_one.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_context_concurrency.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_fact_wire_contract.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_facts.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_trace_render.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_traces_read.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_tracked_gepa.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_tracker_enrich.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_truncation.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_upload_auth_headers.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_valsets_api.py +0 -0
- {cmpnd-0.49.0 → cmpnd-0.50.0}/tests/test_xxh64.py +0 -0
|
@@ -234,23 +234,25 @@ class ApiClient:
|
|
|
234
234
|
# which is the difference a user needs most and had the least of.
|
|
235
235
|
raise error(server_detail(response) or "Resource not found.")
|
|
236
236
|
if response.status_code >= 500:
|
|
237
|
-
# 5xx
|
|
238
|
-
#
|
|
239
|
-
#
|
|
240
|
-
#
|
|
241
|
-
#
|
|
237
|
+
# 5xx means the cmpnd platform failed to handle the request — a
|
|
238
|
+
# database hiccup, an unhandled exception, a hop between its own
|
|
239
|
+
# services. A failure at something the user runs (their tool
|
|
240
|
+
# server, their provider) answers 4xx with a sentence naming it,
|
|
241
|
+
# so this hint names the platform and nothing of theirs. The cause
|
|
242
|
+
# lives in the platform's logs, which we can't reach from here.
|
|
242
243
|
body_excerpt = (response.text or "").strip()[:200]
|
|
243
244
|
msg = f"Server error ({response.status_code}) for {method} {path}"
|
|
244
245
|
if body_excerpt:
|
|
245
246
|
msg += f": {body_excerpt}"
|
|
246
|
-
msg +=
|
|
247
|
+
msg += (
|
|
248
|
+
"\n The cmpnd platform failed to handle this request. If you run this cmpnd "
|
|
249
|
+
"instance yourself, its logs hold the cause."
|
|
250
|
+
)
|
|
247
251
|
raise error(msg, exit_code=2)
|
|
248
252
|
if response.status_code >= 400:
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
detail = response.text
|
|
253
|
-
raise error(f"Request failed ({response.status_code}): {detail}")
|
|
253
|
+
# The server's own sentence: a 4xx says what to change, and the
|
|
254
|
+
# JSON envelope around it is noise.
|
|
255
|
+
raise error(f"Request failed ({response.status_code}): {server_detail(response)}")
|
|
254
256
|
|
|
255
257
|
if return_response:
|
|
256
258
|
return response
|
|
@@ -92,8 +92,8 @@ def _raise_http_error(response: httpx.Response, action: str) -> None:
|
|
|
92
92
|
"""Convert an HTTP error response into an actionable RuntimeError.
|
|
93
93
|
|
|
94
94
|
Replaces ``response.raise_for_status()`` so callers see a useful
|
|
95
|
-
message instead of a raw httpx traceback. 5xx
|
|
96
|
-
|
|
95
|
+
message instead of a raw httpx traceback. 5xx says the platform
|
|
96
|
+
failed and points a self-hosting operator at its logs; 4xx surfaces the response
|
|
97
97
|
body so e.g. ``{"error": "Invalid 'since' timestamp"}`` round-trips
|
|
98
98
|
to the terminal.
|
|
99
99
|
"""
|
|
@@ -105,8 +105,8 @@ def _raise_http_error(response: httpx.Response, action: str) -> None:
|
|
|
105
105
|
if body:
|
|
106
106
|
msg += f"\n Body: {body}"
|
|
107
107
|
msg += (
|
|
108
|
-
"\n The
|
|
109
|
-
"If you
|
|
108
|
+
"\n The cmpnd platform failed to handle this request. "
|
|
109
|
+
"If you run this cmpnd instance yourself, its logs hold the cause."
|
|
110
110
|
)
|
|
111
111
|
else:
|
|
112
112
|
msg = f"Failed to {action}: HTTP {response.status_code}"
|
|
@@ -437,6 +437,15 @@ allow-list state and a one-line description. `--schemas` adds the reduced
|
|
|
437
437
|
argument schema the platform enforces. Every command takes `--json` for the
|
|
438
438
|
raw payload.
|
|
439
439
|
|
|
440
|
+
When the platform cannot list a server's tools because of the server itself,
|
|
441
|
+
`create` and `refresh` fail with a `424` that names the URL, the credential and
|
|
442
|
+
the cause. Examples are a name that does not resolve, a refused connection, or
|
|
443
|
+
a `401` from the server. The server stays registered, so run `cmpnd
|
|
444
|
+
tool-servers refresh <server_id>` once the cause is fixed. When you re-register
|
|
445
|
+
a server with a different `--credential` and the listing fails, the server keeps
|
|
446
|
+
its old credential, so repeat the `create` command instead. The `424` names the
|
|
447
|
+
command to run. A `5xx` means the platform itself failed.
|
|
448
|
+
|
|
440
449
|
Deleting a server refuses new dispatches that name its tools and makes calls
|
|
441
450
|
from runs in flight fail at once, because the credential goes with it. The
|
|
442
451
|
confirmation prompt says so.
|
|
@@ -5,7 +5,7 @@ name = "cmpnd"
|
|
|
5
5
|
# it's new) — no git tags. Bump with `uv version --bump {minor,patch}` or by
|
|
6
6
|
# hand. Runtime `cmpnd.__version__` reads installed metadata, so it tracks
|
|
7
7
|
# this automatically. See docs/plans/2026-07-02-sdk-pypi-tag-free-publish.md.
|
|
8
|
-
version = "0.
|
|
8
|
+
version = "0.50.0"
|
|
9
9
|
description = "DSPy observability and deployment SDK for cmpnd"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.11"
|
|
@@ -255,3 +255,18 @@ class TestApiClient:
|
|
|
255
255
|
def test_404_with_no_body_still_says_something(self):
|
|
256
256
|
err = self._answering(httpx.Response(404, text="", request=httpx.Request("GET", "http://x")))
|
|
257
257
|
assert "not found" in str(err).lower()
|
|
258
|
+
|
|
259
|
+
def test_a_4xx_carries_the_servers_sentence_not_its_json(self):
|
|
260
|
+
# A 424 means the user's own dependency failed, and serve's sentence says
|
|
261
|
+
# which and what to run next; a dict repr around it buries that.
|
|
262
|
+
sentence = "Listing the tools at https://mcp.example.test/mcp failed: the name does not resolve."
|
|
263
|
+
err = self._answering(httpx.Response(424, json={"error": sentence}, request=httpx.Request("GET", "http://x")))
|
|
264
|
+
assert f"Request failed (424): {sentence}" in str(err)
|
|
265
|
+
assert "{'error'" not in str(err)
|
|
266
|
+
|
|
267
|
+
def test_a_5xx_hint_names_the_platform_not_the_users_server(self):
|
|
268
|
+
# A 5xx is the platform's own failure. The hint must not read as the
|
|
269
|
+
# user's tool server or model provider, which a 424 covers instead.
|
|
270
|
+
err = self._answering(httpx.Response(502, text="bad gateway", request=httpx.Request("GET", "http://x")))
|
|
271
|
+
assert "If you operate this server" not in str(err)
|
|
272
|
+
assert "cmpnd" in str(err).split("\n", 1)[1]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|