> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vexlo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Install

> Get the package into a process: requirements, the install from a checkout, and the import check.

The SDK is the Python package `vexlo`. It runs inside your process, marks functions, captures
their values, and writes records to the spool directory on the same host. The relay daemon
that forwards those records is a separate process, not something inside yours; it is covered
on [the relay daemon page](https://docs.vexlo.ai/server/relay-daemon.md).

## Requirements

| Requirement | Value | Where it is declared |
| - | - | - |
| Python | 3.10 or later (`requires-python = ">=3.10"`) | `pyproject.toml` |
| Dependencies | none (`dependencies = []`) | `pyproject.toml` |
| Build backend | setuptools 68 or later, resolved by `pip` at install time | `pyproject.toml` |

The package ships `py.typed`, so `mypy` and other type checkers read its annotations.
`@vexlo.trace` and `@vexlo.step` are typed with `typing.ParamSpec`, which is what sets the
3.10 floor.

## Install from a checkout

`vexlo` is not yet published on PyPI, so the package is installed from a checkout of the
`vexlo-sdk-python` repository. Both forms below install the same package.

```bash regular theme={null}
python -m pip install /path/to/vexlo-sdk-python
```

```bash editable theme={null}
python -m pip install -e /path/to/vexlo-sdk-python
```

The regular form builds a wheel and copies it into the environment. The editable form points
the interpreter at the checkout's `src/` directory instead, so a change there is picked up by
the next interpreter start without reinstalling.

Below the floor, `pip` refuses before installing anything. On Python 3.9.6 the same command
ends with:

```text theme={null}
... 9 lines omitted
ERROR: Package 'vexlo' requires a different Python: 3.9.6 not in '>=3.10'
```

## Verify the install

The two outputs below are from Python 3.14.8. Import the package and print its public surface:

```bash theme={null}
python -c "import vexlo; print(vexlo.__all__)"
```

```text theme={null}
['DEFAULT_REDACT_KEYS', 'Carrier', 'Diagnostics', 'VexloError', 'attach', 'carrier', 'diagnostics', 'flush', 'init', 'step', 'tag', 'trace']
```

Confirm the version and that nothing else was pulled in:

```bash theme={null}
python -m pip show vexlo | grep -E '^(Name|Version|Summary|Requires):'
```

```text theme={null}
Name: vexlo
Version: 0.1.0
Summary: Captures how code actually ran, and sends it to a Vexlo server.
Requires: 
```

The regular install and the editable install print the same two blocks.

## The public surface

`vexlo.__all__` is the whole public surface. Everything else under `vexlo.` is private and
changes without notice.

| Symbol | What it is | Page |
| - | - | - |
| `init` | Configures the SDK for the process, once, at startup | [Initialise](https://docs.vexlo.ai/sdk/initialise.md) |
| `trace` | Marker: opens a trace, or records a step when one is already open | [Mark functions](https://docs.vexlo.ai/sdk/mark-functions.md) |
| `step` | Marker: records a step inside the current trace | [Mark functions](https://docs.vexlo.ai/sdk/mark-functions.md) |
| `tag` | Attaches key/value pairs to the current trace | [Tags](https://docs.vexlo.ai/sdk/tags.md) |
| `carrier`, `attach` | Carry the current trace onto another thread | [Context across threads](https://docs.vexlo.ai/sdk/context-across-threads.md) |
| `Carrier` | The type `carrier()` returns and `attach()` takes | [Context across threads](https://docs.vexlo.ai/sdk/context-across-threads.md) |
| `flush` | Drains buffered records to the spool directory, for at most 2 seconds | [Configuration](https://docs.vexlo.ai/sdk/configuration.md) |
| `diagnostics` | Reads the eleven counters of what the SDK absorbed in this process | [Configuration](https://docs.vexlo.ai/sdk/configuration.md#reading-what-the-sdk-absorbed) |
| `Diagnostics` | The type `diagnostics()` returns | [Configuration](https://docs.vexlo.ai/sdk/configuration.md#reading-what-the-sdk-absorbed) |
| `DEFAULT_REDACT_KEYS` | The 12 names whose values are redacted unless `redact_keys` replaces them | [What gets captured](https://docs.vexlo.ai/sdk/what-gets-captured.md#redaction) |
| `VexloError` | The base class of every exception the package raises | [Configuration](https://docs.vexlo.ai/sdk/configuration.md) |

Two exception classes are not exported, and both subclass `VexloError`, so a host catches
`vexlo.VexloError`: `ConfigurationError`, which `init()` raises on bad configuration, and
`UnsupportedCallable`, which a marker raises at decoration over a `classmethod`, `property`,
`cached_property`, or `partialmethod` object. Those two moments are the only ones that raise
whatever else is configured. A marker, `tag()`, and `flush()` raise into the host only under
`init(strict=True)`; see
[the never-raise boundary](https://docs.vexlo.ai/sdk/mark-functions.md#the-never-raise-boundary).

Next: [initialise the SDK and record a first trace](https://docs.vexlo.ai/sdk/initialise.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.