Undeclared dependencies: what an LLM plugin break teaches about supply-chain hygiene
A small fix in llm-tools-datasette 0.1.1 shows how a core library's HTTP client swap can break plugins that never declared the dependency. It is a low-severity bug, and a useful reminder for anyone running AI tooling in production.
Key Takeaways
- llm-tools-datasette 0.1.1 fixes a break caused by LLM 0.33 switching to httpx2: the plugin used httpx without directly depending on it.
- This is a reliability bug rather than a disclosed vulnerability, but it is the same class of problem as implicit dependencies in any build.
- Plugins that rely on a host application's transitive packages inherit its upgrade decisions without noticing.
- Declare every import you use, pin sensible ranges, and test plugin combinations when a host tool changes its core libraries.
What happened
Simon Willison released llm-tools-datasette 0.1.1, a plugin for his LLM tool that exposes Datasette to models as tools. According to the release note, LLM 0.33 switched to httpx2. That change broke any plugin which used httpx without listing it as its own dependency. llm-tools-datasette was one of them, and 0.1.1 is the fix.
The maintainer's note does not describe a vulnerability, an exploit or any data exposure. We cover it because the failure mode is a common one in software supply-chain work, and it appears in a corner of the ecosystem many security teams are adopting quickly: LLM tool and plugin tooling.
Why an undeclared dependency matters
A plugin that imports a package it never declared works only because something else happened to install it. In this case the host application supplied the HTTP client. When the host changed its client, the plugin broke. Here the symptom was a failure, which is the benign outcome.
The same pattern can have security consequences in other situations. This is our analysis, not something reported in the release note:
- Invisible inventory. An SBOM or dependency scan built from declared requirements will miss packages the plugin actually uses.
- Unreviewed upgrades. Security-relevant libraries such as HTTP clients, TLS handling and parsers change underneath the plugin when the host changes. No one on the plugin side decided to take that change.
- Unpredictable resolution. Without a declared range, the version a plugin runs against depends on whatever the host environment resolved.
Why AI tooling raises the stakes
LLM tool plugins are code that sits between a model and your data. A plugin that lets a model query a database over HTTP makes a network client part of the trust boundary. Teams tend to review the prompt and the permissions, and they review the transport library less often. When agent tooling is assembled from small community plugins, the practical risk is a quiet mismatch between what each plugin assumes and what the host provides.
What to do
- 1Declare every package your code imports directly in its own requirements, even if the host already ships it.
- 2Use compatible version ranges rather than leaving them open, and record them in a lockfile for deployments.
- 3When a host tool such as LLM changes a core library, rerun your plugin tests before rolling the new version out.
- 4Inventory the plugins in your AI tooling the same way you inventory application dependencies, including who maintains them.
The fix in this case was quick and the maintainer owned the cause. The point for practitioners is that the same discipline catches the harder cases, where an implicit dependency changes behaviour rather than failing outright.
Frequently Asked Questions
Was llm-tools-datasette vulnerable to attack?
The release note describes a compatibility break, not a vulnerability. LLM 0.33 moved to httpx2, and the plugin used httpx without declaring it, so release 0.1.1 fixes that.
Why do undeclared dependencies matter for security?
Scanners and SBOMs built from declared requirements miss them, and their versions can change whenever the host environment changes. That makes it harder to know which code you actually run.
How can teams catch this class of problem early?
Declare every direct import, lock versions for deployments, and run plugin tests whenever a host tool changes its core libraries.
Sources
- 1llm-tools-datasette 0.1.1 — Simon Willison
- 2LLM documentation — Datasette / Simon Willison