---
title: Release Notes
slug: sdk/release-notes
docTags: 
createdAt: 2025-10-06T18:26:41.467Z
---

Latest release: [view on GitHub](https://github.com/litmusautomation/litmus-sdk-releases/releases). Wheels are downloaded from the same page.

***

## 2.6.0

### Highlights

- `raw=True`**&#x20;opt-out** added to most devicehub list functions. Returns the API JSON unchanged, skipping pydantic validation. Useful when the schema drifts ahead of your installed SDK or you only need a subset of fields.
- **Critical bug fix**: binary flow downloads (`flows.download_flow_file`, `flows.download_flow_logs`) were silently corrupted by UTF-8 decode in prior versions. They now return proper `bytes`. If you saw mangled output or the literal string `"None"` from these functions before, upgrade.
- **Critical bug fix**: `system.templates.download_template_complete()` raised `TypeError` on every call due to a wrong internal kwarg name. Now works as documented.
- **Bug fix**: `litmussdk.flows.__all__` raised `NameError` on package import in some setups. Resolved.
- **New**: `litmussdk.__version__` package attribute, read from package metadata.

### `raw=True` opt-out

The following list functions now accept `raw: bool = False`:

- `devicehub.devices.list_devices`
- `devicehub.devices.list_device_by_id`
- `devicehub.drivers.list_all_drivers`
- `devicehub.tags.list_all_tags`
- `devicehub.tags.list_registers_from_single_device`
- `devicehub.browse.list_browse_tasks`
- `devicehub.browse.cart_get_items_by_device`

When `raw=True`, the function returns `list[dict[str, Any]]` (or `dict[str, Any]` for single-item getters) instead of the parsed Pydantic model. The default remains `raw=False`, so existing code keeps working unchanged.

```python
# parsed model (default, unchanged)
devices.list_devices()                # list[Device]

# raw API JSON
devices.list_devices(raw=True)        # list[dict[str, Any]]
```

### Internal Changes

These don't affect your code, but are worth noting if you maintain SDK forks or read internals:

- The default-connection substitution decorator now matches sentinels by identity (`is`) instead of value-equality. Half-constructed Connection objects are no longer silently swapped for the env-loaded default; they fail loudly downstream. Audited as a no-op for any documented usage.
- Added `simple_binary_api_call` in `litmussdk.utils.api` for binary endpoints (used by the flow download functions).
- Substantial type-stub coverage improvements across `lem.lifecycle.*`, `devicehub.devices`, and `devicehub.drivers`.

### CI / Infrastructure

- CI/CD migrated from GitLab to GitHub Actions.
- Coverage badges published to GitHub Pages (separate LE and LEM badges).
- Action versions bumped to ones running on Node.js 24.
- `actions/upload-artifact` v5 -> v7, `actions/download-artifact` v5 -> v8.

### Dependency Updates

- `black` 25.1.0 -> 26.3.1
- `brotli` 1.1.0 -> 1.2.0
- `python-dotenv` 1.1.0 -> 1.2.2
- `urllib3` 2.4.0 -> 2.6.3
- `requests` 2.32.3 -> 2.33.0
- `wheel` 0.45.1 -> 0.46.2
- `setuptools` 78.1.0 -> 78.1.1

### Breaking Changes

None for documented usage. The decorator identity-match change above is technically a tighter contract but audited as having zero impact on any internal or external code path.

***

For older releases, see the [GitHub release archive](https://github.com/litmusautomation/litmus-sdk-releases/releases).
