Skip to content

v0.6.90b420.dev727

Choose a tag to compare

@github-actions github-actions released this 25 Jul 19:47

Intel-only laptops get their GPU back

lilbee worked out which GPU vendors a machine had by looking at which Vulkan driver files were installed. Mesa ships every vendor's driver together, so an Intel-only laptop looked like it also had an AMD card. AMD won that tie, lilbee disabled the Intel driver, and the engine then reported zero GPUs. Every chat and every ingest failed.

Vendor detection now reads the hardware itself: PCI display controllers in sysfs on Linux, the display-adapter class in the registry on Windows. The driver left enabled always drives a card that is really in the box. Anyone already stuck in this state recovers on upgrade.

A stale GPU pin no longer takes the server down

A GPU placement saved in config.toml that no longer matched the machine was fatal, and the only way out was editing the file by hand. It now falls back to automatic placement, and the CLI, the TUI and the JSON surfaces all say when a saved pin is being ignored, so nothing is silently dropped. Applying a placement by hand still fails loudly, so a pin you just typed that does not fit is still an error.

A crash can no longer leave engines running

Three paths could leave a llama-swap, a llama-server or a GPU device probe alive after lilbee had gone. macOS had no lifetime binding at all, so a killed lilbee orphaned its whole fleet, and an orphaned lilbee serve kept the server lock and made the next start refuse.

Spawned children are now bound to lilbee's lifetime by a death pipe. The kernel closes it however lilbee dies, SIGKILL included, and a watcher reaps the child at EOF. Kernel primitives still win where they exist; the pipe covers macOS and every host where they do not. The device probe and launcher-spawned serve are bound the same way.

A wedged GPU probe can no longer hang lilbee

subprocess.run kills a child when its timeout expires, then waits for it to be reaped with no bound. A process stuck in uninterruptible driver I/O ignores even SIGKILL, so that wait never returns. The memory estimator, the NVLink probe and the live GPU util sampler all had this hole, and the sampler holds a lock while it hangs, so one wedge stalled every other sampler behind it.

All three now share one bounded reaper: kill the whole process group, wait a bounded time, then abandon an unkillable child rather than block the caller.