Skip to main content
Before running a full slide, or after something goes wrong, use these tools to check a deployment and package what happened into something you can send to Bioptimus support — nothing here leaves your environment unless you send it yourself. For where logs go and how to customize them, see Logging.
Every artifact below is redacted best-effort, not guaranteed PII-free — see What gets shared before sharing one outside your environment.

Verify an endpoint

Before running a full slide, send one synthetic tile through the endpoint and check the response against the model’s contract:
The CLI prints a checklist, one line per step:
Each backend takes its own connection arguments, all passed straight through to Backbone: For the local backend you can point at the directory holding the checkpoint (model_dir= / --model-dir) instead of naming the .pt2 file. Add --json to print the full HealthReport instead, or --mode embedding/--mode prediction to force a specific mode. The command exits non-zero on any failed check, so it can gate a pipeline before the expensive run starts. Each failure carries its own code and fix — see Error codes:

Read the report

verify_endpoint returns a HealthReport; bioptimus verify --json prints the same object. Every step is a Check, and nothing raises unless you ask it to:
Each Check carries name, passed, skipped, duration_ms, detail, and — on failure — error_code, remediation, and structured context (for example the observed vs. expected output length).

Verify options

By default modes="auto" resolves exactly the modes the model exposes — embedding for the plain backbones, prediction for tissue-seg, both for m-optimus, and embedding-only for the huggingface backend. The tile sent is a deterministic gradient-plus-noise image at the model’s declared tile size, so a synthetic request is never mistaken for customer data in a server log.

Inspect your environment

The same environment snapshot that goes into a bundle is available on its own — useful for self-diagnosis before you open a ticket. It never raises: a probe that cannot run degrades to an {"error": ...} entry instead of failing the snapshot.
The snapshot is stamped with schema_version and captured_at and gathers: Each probe is also callable on its own — for a fast CUDA or checkpoint check without the whole snapshot:
A model that loads but fails at inference is almost always a version or architecture mismatch. snap["dependencies"]["conflicts"] and snap["pt2_compat"] pinpoint it in one call — the same evidence support would ask for.

Build a support bundle

One command packages a redacted environment snapshot and logs into a .tar.gz — attach this to a support request:
--categories selects what goes in the bundle: diagnostics (environment snapshot and logs, the default) and/or usage (model-request records only, e.g. for a billing question). Repeat the flag or comma-separate to combine them. Add a per-slide status ledger with --workspace, or fold in a running server’s own diagnostics:
Or from Python:
What you can put in a bundle: The last two are Python-only, since they need a live inference request or in-memory model objects. The bundle finds your log file automatically through BIOPTIMUS_LOG_FILE and includes its rotations; point it at a different file with --log-file / log_file=. Every option writes a single local .tar.gz; nothing is sent anywhere. Both the CLI and Python redact by default. For local self-debugging you can keep full paths and identifiers with --no-anonymize (CLI) or anonymize=False (Python) — never share an unredacted bundle outside your environment.

What’s inside the archive

Extract the .tar.gz and inspect it before sending — every bundle is one directory:
manifest.json records whether the bundle was anonymized and the exact file list, so a recipient can confirm what they received. The first three files are always present in a diagnostics bundle; the rest appear only when you request the option that produces them. A running server exposes the same redacted data directly:
/diagnostics is unauthenticated — keep it behind the same VPN or network boundary as the rest of your deployment, never on a public network.
usage.json
On AWS SageMaker, the server itself runs in your own account — its logs land in your CloudWatch, not ours. bioptimus support-bundle still captures the client-side SDK logs and diagnostics; CloudWatch is the source for server-side logs on that platform.

Customize what gets redacted

Redaction is driven by a per-field policy you can inspect and change. Each recognized field takes one of three strategies: The default policy (DEFAULT_CONFIG) hashes every recognized identifier and path field. To apply a different policy — for example, redact slide_id outright instead of hashing it — build an AnonymizationConfig and run your own data (a log entry, a manifest, any dict) through the redactor before you share it:
The building blocks are reusable on any value: hash_identifier, redact_text (paths, URIs, and slide names in free text), scrub_user_paths (home-directory user names), and anonymize_value / anonymize_mapping (a single keyed value, or a whole nested mapping). See the anonymize reference.

What gets shared

Before you share a bundle, know what’s in it:
  • Hashed, not encrypted. Identifiers and path-like fields (slide/patient IDs, slide_path, …) are replaced with a stable, unsalted hash so the same slide correlates across log lines — not a cryptographic guarantee. Paths embedded in free text are redacted outright.
  • Nothing is transmitted automatically. Every command above only writes a local file or answers a request you make yourself; sharing it with Bioptimus is a manual step.
  • Best-effort redaction. Bioptimus makes no warranty that the output is free of PII and accepts no liability for it — review a bundle yourself before sharing it outside your environment. An unrecognized field or path shape can pass through unredacted; in particular, connection arguments such as a SageMaker endpoint_name or region_name aren’t recognized identifier fields, so they pass through unchanged.