Repository guide · getting started · v2
simonw / llm · Getting started
This repository presents itself, in its own metadata, as a Python command-line tool for accessing large language models, licensed Apache-2.0 with release 0.35. The analyzer parsed dependencies only from docs/requirements.txt and records two entrypoints: llm/__main__.py, whose guard calls cli(), and llm/cli.py. Five bounded static paths are listed. Start reading with README.md, pyproject.toml, LICENSE, llm/cli.py and the 44-file tests directory.
- Original repository
- simonw/llm
- License
- Apache-2.0 · open-source license
- Analyzed revision · last verified
- 1df47ddcac20d58726a993949da8ef84f4081085 ·
Newer revision observed; the code this guide cites is unchanged. The default branch moved to 764dc386c58b, checked 2026-10-03. A revision diff of 32 changed files found no change in the code regions this guide cites. The guide still describes revision 1df47ddcac20; repository-wide counts (files, calls and so on) refer to that revision.
Getting started with simonw/llm: a Python command-line LLM tool
Terms used on this page
- Entrypoint record
- A file the analyzer marks as a place where execution can start. When it carries a __main__ guard excerpt, the file contains an if __name__ == "__main__": block and the excerpt shows what that block calls; without an excerpt, the file was flagged by its name only.
- Bounded static execution path
- A call chain reconstructed from the source code without running it, stopped after a fixed number of steps. It shows how far the code can be followed on paper, not what happens at run time.
- Unresolved boundary
- Where a static path stops because the next call goes into an external library or cannot be resolved without running the code. It marks the edge of this analysis, not a defect in the repository.
- Static relations
- Calls and imports found in the source. "External or unresolved" relations point outside the analyzed files.
- Module role
- The analyzer's label for a file, inferred from how many calls go in and out (for example core, entry/orchestration, leaf). It describes a position in the call graph, not the authors' design.
- Test-like files
- Files whose names or locations look like tests. This analysis counts them; it does not run them.
- Observed · inferred · author-claimed · unresolved
- How each statement is supported: read directly from the analyzed files; derived by the analyzer from them; stated by the repository's authors (metadata, README); or not established by this analysis.
- Verified
- Two uses on these pages. In an analyzer record ("verified provenance", "a verified entrypoint") it means the record was read directly from the analyzed files, which these guides call observed; for an entrypoint, the __main__ guard text is present. Since the analyzer fix of 2026-10-04, a file that only has an entrypoint-like name such as cli.py or main.py is recorded as inferred; guides analyzed before that still call such a file verified, and it is still only a guess about how the file is used. It does not mean the code was run or tested. "Last verified" is the date the guide last passed the lab's checks against the analysis record of the stated revision; it is not a review of the repository itself.
What you are looking at
The repository's platform metadata describes the project in one line: a way to access large language models from the command-line. That line is the author's own description, not something this analysis observed in the code. The metadata records Python as the primary language, with 1,226,965 bytes of Python alongside 972 bytes of 'Just' and 929 of Shell. The license is recorded as Apache-2.0, and the latest listed release is 0.35, published 2026-09-07. The metadata also counts 12,489 stargazers as of 2026-09-12 and lists the topics ai, llms and openai. The author-declared homepage is https://llm.datasette.io. The analyzer's own summary adds size signals: 116 analyzed files, organized around the docs, llm and tests directories. Taken together, the metadata and summary describe a Python project that presents itself as a command-line tool for large language models.
What it needs
The dependency picture in this packet is narrow. All seven dependency records come from a single manifest, docs/requirements.txt, and each is recorded with scope 'runtime'. The named packages are sphinx (==7.2.6), furo (==2023.9.10), sphinx-autobuild, sphinx-copybutton, sphinx-markdown-builder (==0.6.8), myst-parser and cogapp; four of the seven carry no recorded version. The 'sphinx'-prefixed names and the manifest's docs/ location suggest these records relate to documentation tooling rather than the project's core runtime needs. The analyzer's summary counts three manifest files in the repository overall, but its limitation statement says dependency records come only from requirements-style manifests. pyproject.toml is flagged as a project-level important file, yet its dependency tables were not parsed by this analysis, so the project's full dependency set is not established here.
How it starts
Two starting points are recorded. llm/__main__.py contains a Python __main__ execution guard whose body is a single call, cli(); llm/cli.py is flagged as a likely executable entrypoint by a filename heuristic. Five bounded static paths are listed and none is truncated. One runs from the guard to cli in llm/cli.py as a local call and ends as a leaf. The other four start at llm/cli.py and stop at unresolved boundaries: a call to warnings.simplefilter, and three targets reached through load_plugins in llm/plugins.py — hasattr, pm.load_setuptools_entrypoints and a split on LLM_LOAD_PLUGINS. Read together, they suggest the guard hands off to cli.py, whose early flow touches plugin loading, with every further step ending at an external or unresolved target. What the program does at runtime beyond these records is not established: the analysis is static only and does not resolve reflection, dynamic imports, dynamic dispatch or framework runtime wiring.
Where to look first
Five files are flagged as important. README.md, pyproject.toml and LICENSE are project-level important files; llm/__main__.py and llm/cli.py are flagged because they look like entrypoints. A teaching claim recommends reading README.md early for exactly that reason. The analyzer's learning-path claim advises starting from manifests and important symbols, then tracing the bounded execution path and inspecting unresolved boundaries before changing code; its claim about modifications says to begin at the detected entrypoint llm/cli.py and verify downstream effects manually. Top-level structure concentrates in tests (44 files), docs (35) and llm (20), with 6 files under .github and 11 at the root. The analyzer counts 44 test-like files and states the repository includes tests, so the tests directory is a reasonable early stop for seeing expected behaviour, according to the packet's counts.
What this analysis cannot tell you
Four limits bound what this asset can say. The analysis is static only: reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring and dynamic dispatch are not resolved. Install, run and build inference is partial and installation commands are not verified, which is why this asset contains no commands to copy. Dependency records cover only requirements-style manifests — pyproject.toml's dependency tables are not parsed — so the dependency picture above is incomplete by construction. README claim extraction is line-based and may capture code lines instead of prose, so README-derived statements are author-claimed at best. The packet also disagrees with itself: one teaching claim says no bounded static execution path is available, yet the same packet lists five bounded paths and an architecture claim counts thirteen. The full set of paths, like the full dependency set, is not established here.
What this analysis could not establish
The writing model's own notes on the analysis record. Identifiers such as lim_3, exec_* or claim_… name records of that analysis; the claims table cites the same records.
- claim_4d30ade3e21e states that no bounded static execution path is available, but first_execution_paths_static lists five bounded paths; the packet offers no explanation for the discrepancy.
- claim_3a9d1854f837 counts 13 bounded execution paths, but only five are listed in first_execution_paths_static; the shapes of the other paths are not in the packet.
- The full dependency set is unknown: pyproject.toml dependency tables are not parsed (lim_3), and only docs/requirements.txt produced dependency records.
- No installation, build or run command is verified in this packet (lim_2), so none is offered in this asset.
Claims and evidence — 28 claims, 28 supported by an independent verifier
Every substantive statement above is a claim bound to grounding IDs of the analyzed revision. Global grounding IDs are namespaced by the analysis run.
| Claim | Epistemic status | Verifier | Grounding (global IDs) |
|---|---|---|---|
| c1 The repository's platform metadata describes the project as 'Access large language models from the command-line'; this is the author's own description, not an observation made by this analysis. | author_claimed | supported | analysis_f20a9f60553ce57f:meta_description |
| c2 Platform metadata records Python as the primary language and reports 1,226,965 bytes of Python, 972 of 'Just' and 929 of Shell. | observed | supported | analysis_f20a9f60553ce57f:meta_primary_language, analysis_f20a9f60553ce57f:meta_language_bytes |
| c3 The license is recorded as Apache-2.0, and the latest release in the metadata is 0.35, published 2026-09-07. | observed | supported | analysis_f20a9f60553ce57f:meta_license, analysis_f20a9f60553ce57f:meta_latest_release |
| c4 The metadata counts 12,489 stargazers as of 2026-09-12 and lists the topics ai, llms and openai. | observed | supported | analysis_f20a9f60553ce57f:meta_stars, analysis_f20a9f60553ce57f:meta_topics |
| c5 The analyzer's summary describes a Python project of 116 analyzed files organized around the docs, llm and tests directories; this is the analyzer's inferred characterization. | inferred | supported | analysis_f20a9f60553ce57f:summary_repository |
| c6 The author-declared project homepage in the metadata is https://llm.datasette.io. | author_claimed | supported | analysis_f20a9f60553ce57f:meta_homepage |
| c7 All seven dependency records in the packet come from one manifest, docs/requirements.txt, and every record carries scope 'runtime'. | observed | supported | analysis_f20a9f60553ce57f:dep_1, analysis_f20a9f60553ce57f:dep_2, analysis_f20a9f60553ce57f:dep_3, analysis_f20a9f60553ce57f:dep_4, analysis_f20a9f60553ce57f:dep_5, analysis_f20a9f60553ce57f:dep_6, analysis_f20a9f60553ce57f:dep_7 |
| c8 The recorded dependencies are sphinx (==7.2.6), furo (==2023.9.10), sphinx-autobuild, sphinx-copybutton, sphinx-markdown-builder (==0.6.8), myst-parser and cogapp; four of the seven records carry no version. | observed | supported | analysis_f20a9f60553ce57f:dep_1, analysis_f20a9f60553ce57f:dep_2, analysis_f20a9f60553ce57f:dep_3, analysis_f20a9f60553ce57f:dep_4, analysis_f20a9f60553ce57f:dep_5, analysis_f20a9f60553ce57f:dep_6, analysis_f20a9f60553ce57f:dep_7 |
| c9 The 'sphinx'-prefixed names among the seven records and the manifest's docs/ location suggest the records relate to documentation tooling rather than the project's core runtime needs; this is an inference from names and paths, not an observed capability. | inferred | supported | analysis_f20a9f60553ce57f:dep_1, analysis_f20a9f60553ce57f:dep_2, analysis_f20a9f60553ce57f:dep_3, analysis_f20a9f60553ce57f:dep_4, analysis_f20a9f60553ce57f:dep_5, analysis_f20a9f60553ce57f:dep_6, analysis_f20a9f60553ce57f:dep_7 |
| c10 pyproject.toml is flagged as a project-level important file, but its dependency tables were not parsed by this analysis, so the project's full dependency set is not established here. | observed | supported | analysis_f20a9f60553ce57f:important_3, analysis_f20a9f60553ce57f:lim_3 |
| c11 The analyzer's summary counts three manifest files in the repository, while its limitation statement restricts dependency records to requirements-style manifests. | inferred | supported | analysis_f20a9f60553ce57f:summary_repository, analysis_f20a9f60553ce57f:lim_3 |
| c12 The packet records two entrypoints: llm/__main__.py, which contains a Python __main__ execution guard whose body calls cli(), and llm/cli.py, flagged as a likely executable entrypoint by a filename heuristic. | observed | supported | analysis_f20a9f60553ce57f:py_entry_8d052da6b4aa, analysis_f20a9f60553ce57f:entry_1 |
| c13 One bounded static path runs from the guard in llm/__main__.py to cli in llm/cli.py as a local call and terminates as a leaf, without truncation. | inferred | supported | analysis_f20a9f60553ce57f:exec_1883828468e7 |
| c14 Four listed bounded paths start at llm/cli.py and stop at unresolved boundaries: a call to warnings.simplefilter, and three targets reached through load_plugins in llm/plugins.py — hasattr, pm.load_setuptools_entrypoints and a split on LLM_LOAD_PLUGINS. | inferred | supported | analysis_f20a9f60553ce57f:exec_837f2dee781c, analysis_f20a9f60553ce57f:exec_bbf7b5170507, analysis_f20a9f60553ce57f:exec_c714034a13f9, analysis_f20a9f60553ce57f:exec_cf7f251ec694 |
| c15 None of the five listed bounded paths is truncated; read together they suggest the guard hands off to cli.py and that cli.py's early flow calls into llm/plugins.py:load_plugins, with every further step ending at an external or unresolved target. | inferred | supported | analysis_f20a9f60553ce57f:exec_1883828468e7, analysis_f20a9f60553ce57f:exec_837f2dee781c, analysis_f20a9f60553ce57f:exec_bbf7b5170507, analysis_f20a9f60553ce57f:exec_c714034a13f9, analysis_f20a9f60553ce57f:exec_cf7f251ec694 |
| c16 What the program does at runtime beyond these recorded paths is not established here: this analysis is static only and does not resolve reflection, dynamic imports, dynamic dispatch or framework runtime wiring. | observed | supported | analysis_f20a9f60553ce57f:lim_1 |
| c17 The packet flags five files as important: README.md, pyproject.toml and LICENSE as project-level important files, and llm/__main__.py and llm/cli.py because they look like entrypoints. | observed | supported | analysis_f20a9f60553ce57f:important_1, analysis_f20a9f60553ce57f:important_3, analysis_f20a9f60553ce57f:important_4, analysis_f20a9f60553ce57f:important_5, analysis_f20a9f60553ce57f:important_6 |
| c18 Top-level file counts concentrate in tests (44), docs (35) and llm (20), with 6 under .github and 11 at the root, per the analyzer's summary. | inferred | supported | analysis_f20a9f60553ce57f:summary_repository |
| c19 The analyzer's summary counts 44 test-like files and states that the repository includes tests. | inferred | supported | analysis_f20a9f60553ce57f:summary_repository |
| c20 The analyzer's learning-path teaching claim advises starting from manifests and important symbols, then tracing the bounded execution path and inspecting unresolved boundaries before changing code. | inferred | supported | analysis_f20a9f60553ce57f:claim_e56db45165bf |
| c21 A teaching claim about modifications says to begin at the detected entrypoint llm/cli.py and verify downstream effects manually. | inferred | supported | analysis_f20a9f60553ce57f:claim_b4ae7eab0895 |
| c22 A teaching claim recommends reading README.md early because the analyzer classified it as a project-level important file. | inferred | supported | analysis_f20a9f60553ce57f:claim_5e040738cac5 |
| c23 This analysis is static only: reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring and dynamic dispatch are not resolved. | observed | supported | analysis_f20a9f60553ce57f:lim_1 |
| c24 Install, run and build inference is partial and installation commands are not verified by this analysis. | observed | supported | analysis_f20a9f60553ce57f:lim_2 |
| c25 Dependency records cover only requirements-style manifests; pyproject.toml dependency tables are not parsed, so the dependency picture in this asset is incomplete by construction. | observed | supported | analysis_f20a9f60553ce57f:lim_3 |
| c26 README claim extraction is line-based and may capture code lines instead of prose claims, so README-derived statements are author-claimed at best. | observed | supported | analysis_f20a9f60553ce57f:lim_4 |
| c27 One teaching claim in the packet states that no bounded static execution path is available and that runtime flow must be treated as unresolved, which contradicts the five bounded paths listed in the same packet; the packet does not resolve this discrepancy. | unresolved | supported | analysis_f20a9f60553ce57f:claim_4d30ade3e21e |
| c28 An architecture teaching claim counts 2 entrypoints, 2,059 resolved static call relations and 13 bounded execution paths, while the packet's path list shows five; the remaining paths are not spelled out in this packet. | inferred | supported | analysis_f20a9f60553ce57f:claim_3a9d1854f837, analysis_f20a9f60553ce57f:exec_1883828468e7, analysis_f20a9f60553ce57f:exec_837f2dee781c, analysis_f20a9f60553ce57f:exec_bbf7b5170507, analysis_f20a9f60553ce57f:exec_c714034a13f9, analysis_f20a9f60553ce57f:exec_cf7f251ec694 |
Sources, rights and disclosure · attribution-license-templates/v0.1
Rights notice. Original repository hosted on GitHub. Repository source code, documentation, names, media, and related project materials remain subject to the rights of their respective authors, contributors, and other rights holders and to applicable repository license terms.
Platform notice. GitHub is the source hosting platform for the linked repository. GitHub and related marks are trademarks of GitHub, Inc. EVEMISS Technology is not affiliated with or endorsed by GitHub unless explicitly stated otherwise.
How this page is produced. This page was produced using revision-aware repository analysis and AI-assisted editorial tooling. Technical claims are tied to the analyzed repository revision and may be revalidated when the source repository changes.
AI-assisted analysis. Reviewed by EVEMISS Technology through human–AI collaborative review. · Report a rights concern · Back to the overview