Skip to content

Commit 2bda57b

Browse files
committed
Release 1.2.27 with alchemy GIL fix
1 parent 5435083 commit 2bda57b

4 files changed

Lines changed: 25 additions & 11 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ This project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
99

1010
### Added
1111

12+
## [1.2.27] - 2026-03-25
13+
14+
### Fixed
15+
- Restored GIL release while the Rust `_alchemy` binding blocks waiting for streamed events and final results, fixing Python scheduling stalls introduced by the re-integrated in-repo binding.
16+
1217
## [1.2.26] - 2026-03-24
1318

1419
### Fixed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "tiny-agent-os"
7-
version = "1.2.26"
7+
version = "1.2.27"
88
description = "Python agent loop"
99
readme = "README.md"
1010
requires-python = ">=3.10"

rust/src/lib.rs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -256,12 +256,17 @@ impl StreamHandle {
256256
elapsed_ms(self.opened_at),
257257
);
258258

259-
let next = self
260-
.event_rx
261-
.lock()
262-
.map_err(|_| PyRuntimeError::new_err("event stream lock poisoned"))?
263-
.recv()
264-
.map_err(|_| PyRuntimeError::new_err("event stream closed unexpectedly"))?;
259+
let next = py
260+
.detach(|| {
261+
let receiver = self
262+
.event_rx
263+
.lock()
264+
.map_err(|_| "event stream lock poisoned".to_string())?;
265+
receiver
266+
.recv()
267+
.map_err(|_| "event stream closed unexpectedly".to_string())
268+
})
269+
.map_err(PyRuntimeError::new_err)?;
265270

266271
binding_debug!(
267272
self.stream_id,
@@ -310,9 +315,13 @@ impl StreamHandle {
310315
elapsed_ms(self.opened_at),
311316
);
312317

313-
let value = receiver
314-
.recv()
315-
.map_err(|_| PyRuntimeError::new_err("result channel closed unexpectedly"))?
318+
let value = py
319+
.detach(move || {
320+
receiver
321+
.recv()
322+
.map_err(|_| "result channel closed unexpectedly".to_string())
323+
})
324+
.map_err(PyRuntimeError::new_err)?
316325
.map_err(PyRuntimeError::new_err)?;
317326

318327
binding_debug!(

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)