Compatibility Bridge Via Thread-Pool Adaptation Enabled By New Core Hook
Sources: 1 • Confidence: High • Updated: 2026-04-13 03:55
Key takeaways
- Enabling sync-to-async conversion required an additional LLM plugin hook mechanism that shipped in LLM 0.30.
- LLM plugins can define new models in both synchronous and asynchronous forms.
- The llm-mrchatterbox plugin is synchronous only.
- The llm-all-models-async plugin converts synchronous models into asynchronous models using a thread pool.
- Version 0.1 of the llm-all-models-async plugin has been released.
Sections
Compatibility Bridge Via Thread-Pool Adaptation Enabled By New Core Hook
- Enabling sync-to-async conversion required an additional LLM plugin hook mechanism that shipped in LLM 0.30.
- The llm-all-models-async plugin converts synchronous models into asynchronous models using a thread pool.
- Version 0.1 of the llm-all-models-async plugin has been released.
Sync-Vs-Async Model Interface Split In The Llm Plugin Ecosystem
- LLM plugins can define new models in both synchronous and asynchronous forms.
- Async model variants are usually used for API-backed models, while sync variants more often run the model directly inside the plugin.
Async-Only Consumer Constraint Creates An Integration Bottleneck
- The llm-mrchatterbox plugin is synchronous only.
- Datasette can only use asynchronous models, blocking the use of sync-only plugins for features such as datasette-enrichments-llm.
Unknowns
- What are the latency, throughput, and resource impacts (including thread exhaustion behavior) when the adapter converts sync models to async under concurrent load?
- What is the exact LLM 0.30 hook mechanism used by the adapter, and what stability/compatibility guarantees (if any) apply to that hook?
- Does Datasette (and datasette-enrichments-llm specifically) work end-to-end with sync-only plugins once adapted, and what feature limitations remain after adaptation?
- Which sync-only plugins besides the named example are intended or known to be unblocked by the adapter, and are any categories of sync implementations incompatible with thread-pool wrapping?
- What configuration knobs exist for the adapter (thread pool size, queueing behavior, cancellation semantics, timeouts), and what defaults are used?