{
  "source_file": "0930",
  "source_platform": "Substack",
  "author": "Simon Willison's Weblog",
  "title_listed": "The LLM CLI Tool Now Supports Self-Hosted Models via Plugins",
  "keywords": "LLM应用,API集成,提示工程,流式输出",
  "domain": "大模型算法",
  "content_type": "技术实践",
  "is_paid_flag": "否",
  "url": "https://simonwillison.net/2023/Jul/12/llm/",
  "publish_date": "2023-07",
  "corpus_stage": "SFT",
  "notes": "LLM应用构建实践，含API调用和流式处理",
  "id": "2dca19818e53",
  "collected_at": "2026-10-01T19:50:51",
  "title": "My LLM CLI tool now supports self-hosted language models via plugins",
  "body_markdown": "Simon Willison’s Weblog\nNewsletter\nSponsored by:\nPomerium — Static OAuth scopes won't stop AI agent breakouts.\nUpgrade to Pomerium's agentic access management trusted by NVIDIA and OpenAI\nMy LLM CLI tool now supports self-hosted language models via plugins\n12th July 2023\nLLM\nis my command-line utility and Python library for working with large language models such as GPT-4. I just released\nversion 0.5\nwith a huge new feature: you can now install plugins that add support for\nadditional models\nto the tool, including models that can run on your own hardware.\nHighlights of today’s release:\nPlugins to add support for 17 openly licensed models from the\nGPT4All project\nthat can run directly on your device, plus Mosaic’s MPT-30B self-hosted model and Google’s PaLM 2 (via their API).\nThis means you can\npip install\n(or\nbrew install\n) models along with a CLI tool for using them!\nA\ndetailed tutorial\ndescribing how to build new plugins that add support for additional models.\nA documented\nPython API\nfor running prompts through any model provided by a plugin, plus a way of continuing a conversation across multiple prompts.\nUpdate 18th July 2023:\n—I released a new plugin,\nllm-replicate\n, which can be used to access models hosted on\nReplicate\n, including the new Llama 2 model from Meta AI. More on this in\nAccessing Llama 2 from the command-line with the llm-replicate plugin\n.\nUpdate 23rd July 2023:\n—Tom Viner released\nllm-claude\n, adding support for Claude and Claude Instant by\nAnthropic\n.\nUpdate 17th August 2023:\nThe\nllm-mlc\nplugin can run Llama 2 models on an Apple Silicon Mac with GPU acceleration.\nHow to try it out\nFirst, install LLM. You can install it with\npip\n:\npip install llm\nOr\npipx\n:\npipx install llm\nOr if you don’t yet have a Python 3 environment, you can use\nHomebrew\n:\nbrew install llm\nThe default tool can work with OpenAI’s models via their API, provided you have an API key. You can see\nusage instructions for that here\n.\nBut let’s do something more interesting than that: Let’s install a model that can run on our own machine!\nWe’ll use the new\nllm-gpt4all plugin\n, which installs models published by the\nGPT4All project\nby Nomic AI.\nInstall the plugin like this:\nllm install llm-gpt4all\nNow let’s run a prompt against a small model. LLM will download the model file the first time you query that model.\nWe’ll start with\nggml-vicuna-7b-1\n, a 4.21GB download which should run if you have at least 8GB of RAM.\nTo run the prompt, try this:\nllm -m ggml-vicuna-7b-1\n\"\nThe capital of France?\n\"\nYou’ll see a progress bar showing the download of the model, followed by the answer to the prompt, generated a word at a time.\nAll prompts and responses are automatically logged to a SQLite database. Calling\nllm logs\nwith a\n-n 1\nargument will show the most recent record:\nllm logs -n 1\nThis outputs something like the following:\n[\n  {\n\"id\"\n:\n\"\n01h549p8r12ac1980crbr9yhjf\n\"\n,\n\"model\"\n:\n\"\nggml-vicuna-7b-1\n\"\n,\n\"prompt\"\n:\n\"\nThe capital of France?\n\"\n,\n\"system\"\n:\nnull\n,\n\"prompt_json\"\n:\nnull\n,\n\"options_json\"\n: {},\n\"response\"\n:\n\"\nParis is the capital of France.\n\"\n,\n\"response_json\"\n: {\n\"full_prompt\"\n:\n\"\n### Human:\n\\n\nThe capital of France?\n\\n\n### Assistant:\n\\n\n\"\n},\n\"conversation_id\"\n:\n\"\n01h549p8r0abz6ebwd7agmjmgy\n\"\n,\n\"duration_ms\"\n:\n9511\n,\n\"datetime_utc\"\n:\n\"\n2023-07-12T05:37:44.407233\n\"\n,\n\"conversation_name\"\n:\n\"\nThe capital of France?\n\"\n,\n\"conversation_model\"\n:\n\"\nggml-vicuna-7b-1\n\"\n}\n]\nYou can see a full list of available models by running the\nllm models list\ncommand. The\nllm-gpt4all\nplugin adds 17 models to the tool:\nllm models list\nI’ve installed all three plugins that provide extra models, so I see the following:\nOpenAI Chat: gpt-3.5-turbo (aliases: 3.5, chatgpt)\nOpenAI Chat: gpt-3.5-turbo-16k (aliases: chatgpt-16k, 3.5-16k)\nOpenAI Chat: gpt-4 (aliases: 4, gpt4)\nOpenAI Chat: gpt-4-32k (aliases: 4-32k)\nPaLM 2: chat-bison-001 (aliases: palm, palm2)\ngpt4all: orca-mini-3b - Orca (Small), 1.80GB download, needs 4GB RAM (installed)\ngpt4all: ggml-gpt4all-j-v1 - Groovy, 3.53GB download, needs 8GB RAM (installed)\ngpt4all: orca-mini-7b - Orca, 3.53GB download, needs 8GB RAM (installed)\ngpt4all: ggml-vicuna-7b-1 - Vicuna, 3.92GB download, needs 8GB RAM (installed)\ngpt4all: ggml-mpt-7b-chat - MPT Chat, 4.52GB download, needs 8GB RAM (installed)\ngpt4all: ggml-replit-code-v1-3b - Replit, 4.84GB download, needs 4GB RAM (installed)\ngpt4all: ggml-vicuna-13b-1 - Vicuna (large), 7.58GB download, needs 16GB RAM (installed)\ngpt4all: nous-hermes-13b - Hermes, 7.58GB download, needs 16GB RAM (installed)\ngpt4all: ggml-model-gpt4all-falcon-q4_0 - GPT4All Falcon, 3.78GB download, needs 8GB RAM\ngpt4all: ggml-wizardLM-7B - Wizard, 3.92GB download, needs 8GB RAM\ngpt4all: ggml-mpt-7b-base - MPT Base, 4.52GB download, needs 8GB RAM\ngpt4all: ggml-mpt-7b-instruct - MPT Instruct, 4.52GB download, needs 8GB RAM\ngpt4all: orca-mini-13b - Orca (Large), 6.82GB download, needs 16GB RAM\ngpt4all: GPT4All-13B-snoozy - Snoozy, 7.58GB download, needs 16GB RAM\ngpt4all: ggml-nous-gpt4-vicuna-13b - Nous Vicuna, 7.58GB download, needs 16GB RAM\ngpt4all: ggml-stable-vicuna-13B - Stable Vicuna, 7.58GB download, needs 16GB RAM\ngpt4all: wizardLM-13B-Uncensored - Wizard Uncensored, 7.58GB download, needs 16GB RAM\nMpt30b: mpt30b (aliases: mpt)\nIn addition to the\ngpt4all\nmodels I can also run\nPaLM 2\nfrom Google and\nmpt30b\nfrom Mosaic, as well as the four OpenAI models.\nModels have aliases, so in some cases you can run\nllm -m mpt\ninstead of\nllm -m mpt30b\n.\nWe’ll try one more model. Google’s PaLM 2 was released\na few weeks ago\n, and can be accessed through their\nPaLM API\n.\nObtain an API key\nfor that, and install the\nllm-palm\nplugin:\npip install llm-palm\nSet your API key like this:\nllm keys\nset\npalm\nNow you can run prompts against it like this:\nllm -m palm\n\"\nTen absurd names for a pet giraffe\n\"\nPaLM replies:\nHere are ten absurd names for a pet giraffe:\nStretch\nNecky\nLong Legs\nTree Top\nTall Boy\nHigh Five\nSky Walker\nCloud Chaser\nStar Gazer\nHorizon Hopper\nI hope you find these names amusing!\nThis also gets logged to the database—run\nllm logs -n 1\nagain to see the log entry.\nLLM supports continuing a conversation with more prompts. We can run another prompt through PaLM as part of the same conversation like this:\nllm --continue\n\"\n3 more and make them weirder\n\"\nPaLM replies:\nSure, here are three more absurd names for a pet giraffe, even weirder than the first ten:\nGiraffey McFierceface\nLongneck von Longneck\nThe Giraffe Whisperer\nI hope you find these names even more amusing than the first ten!\nUsing\n-c/--continue\nwill continue the most previous conversation. You can also pass a conversation ID (available in the output from\nllm logs\n) using\n--cid ID\nto reply to an older conversation thread.\nAdding a new model\nI’ve tried to make it as easy as possible to add support for additional models through writing plugins. The tutorial\nWriting a plugin to support a new model\nis extremely thorough, and includes detailed descriptions of how to start a new plugin, set up a development environment for it, integrate it with a new model and then package it for distribution.\nThe tutorial uses a\nMarkov chain\nimplementation as an example, possibly the simplest possible form of language model.\nThe source code of the other existing plugins should help show how to integrate with more complex models:\nllm_palm/__init__.py\ndemonstrates how to integrate with a model exposed via Google’s API library.\nllm/default_plugins/openai_models.py\ndemonstrates integration against the OpenAI APIs.\nllm_gpt4all.py\nshows an integration with the\ngpt4all\nPython library.\nllm_mpt30b.py\ndemonstrates a direct integration against a model using the\nctransformers\nlibrary.\nUsing LLM from Python\nLLM was originally designed to be used from the command-line, but in version 0.5 I’ve expanded it to work as a Python library as well.\nThe\ndocumentation for that is here\n, but here’s the short version:\nimport\nllm\nmodel\n=\nllm\n.\nget_model\n(\n\"gpt-3.5-turbo\"\n)\nmodel\n.\nkey\n=\n'YOUR_API_KEY_HERE'\nresponse\n=\nmodel\n.\nprompt\n(\n\"Five surprising names for a pet pelican\"\n)\nfor\nchunk\nin\nresponse\n:\nprint\n(\nchunk\n,\nend\n=\n\"\"\n)\n# Or wait for the whole response to be ready:\nprint\n(\nresponse\n.\ntext\n())\nAny model that can be installed via a plugin can be accessed in the same way.\nThe API also supports conversations, where multiple prompts are sent to the model as part of the same persistent context:\nimport\nllm\nmodel\n=\nllm\n.\nget_model\n(\n\"ggml-mpt-7b-chat\"\n)\nconversation\n=\nmodel\n.\nconversation\n()\nr1\n=\nconversation\n.\nprompt\n(\n\"Capital of Spain?\"\n)\nprint\n(\nr1\n.\ntext\n())\nr2\n=\nconversation\n.\nprompt\n(\n\"What language do they speak there?\"\n)\nprint\n(\nr2\n.\ntext\n())\nWhat’s next?\nYou can follow ongoing LLM development in the\nGitHub repository issues\n.\nMy next priority is to get\nOpenAI functions\nworking. I want to provide the option for other models from plugins to implement a similar pattern using\nthe reAct pattern\nas well.\nI’ll likely do this by implementing the concept of a “chain” of LLM calls, where a single prompt might lead to multiple calls being made to the LLM based on logic that decides if another call is necessary.\nI’m also planning a web interface. I’m particularly excited about the potential for plugins here—I love the idea of plugins that provide new interfaces for interacting with language models that go beyond the chat interfaces we’ve mostly seen so far.\nPosted\n12th July 2023\nat 2:24 pm · Follow me on\nMastodon\n,\nBluesky\n,\nTwitter\nor\nsubscribe to my newsletter\nMore recent articles\nHello Python 3.15, goodbye 3.10, and now I can use 3.11\n- 12th October 2026\nA new feature for my blog, built using my voice\n- 9th October 2026\nClaude Haiku 5.5\n- 7th October 2026\nWe're going to need default hard budget caps on pretty much everything\n- 3rd October 2026\nThis is\nMy LLM CLI tool now supports self-hosted language models via plugins\nby Simon Willison, posted on\n12th July 2023\n.\nPart of series\nNew releases of LLM\nllm, ttok and strip-tags - CLI tools for working with ChatGPT and other LLMs\n- May 18, 2023, 9:04 p.m.\nMy LLM CLI tool now supports self-hosted language models via plugins\n- July 12, 2023, 2:24 p.m.\nLLM now provides tools for working with embeddings\n- Sept. 4, 2023, 8:32 p.m.\nLLM 0.13: The annotated release notes\n- Jan. 26, 2024, 11:08 p.m.\nYou can now run prompts against images, audio and video in your terminal using LLM\n- Oct. 29, 2024, 3:09 p.m.\nLLM 0.22, the annotated release notes\n- Feb. 17, 2025, 6:19 a.m.\nStructured data extraction from unstructured content using LLM schemas\n- Feb. 28, 2025, 5:07 p.m.\n… more\ncli\n109\nprojects\n558\nai\n2,279\ngenerative-ai\n2,021\nlocal-llms\n165\nllms\n1,987\nllm\n639\nanthropic\n348\nNext:\nWeeknotes: Self-hosted language models with LLM plugins, a new Datasette tutorial, a dozen package releases, a dozen TILs\nPrevious:\nWeeknotes: symbex, LLM prompt templates, a bit of a break\nMonthly briefing\nSponsor me for\n$10/month\nand get a curated email digest of the month's most important LLM developments.\nPay me to send you less!\nSponsor & subscribe\nDisclosures\nColophon\n©\n2002\n2003\n2004\n2005\n2006\n2007\n2008\n2009\n2010\n2011\n2012\n2013\n2014\n2015\n2016\n2017\n2018\n2019\n2020\n2021\n2022\n2023\n2024\n2025\n2026",
  "metadata": {
    "title": "My LLM CLI tool now supports self-hosted language models via plugins",
    "description": null,
    "keywords": null,
    "author": "Simon Willison",
    "og:site_name": "Simon Willison’s Weblog",
    "og:url": "https://simonwillison.net/2023/Jul/12/llm/",
    "og:title": "My LLM CLI tool now supports self-hosted language models via plugins",
    "og:image": "https://static.simonwillison.net/static/2023/llm-vicuna-card.jpg",
    "og:type": "article",
    "og:description": "LLM is my command-line utility and Python library for working with large language models such as GPT-4. I just released version 0.5 with a huge new feature: you can now …",
    "og:updated_time": "1689171880",
    "twitter:card": "summary",
    "twitter:image": "https://static.simonwillison.net/static/2023/llm-vicuna-card.jpg",
    "twitter:creator": "@simonw"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/2dca19818e53/code/body-000.txt",
      "chars": 15,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-001.txt",
      "chars": 16,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-002.txt",
      "chars": 16,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-003.txt",
      "chars": 23,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-004.txt",
      "chars": 48,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-005.txt",
      "chars": 13,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-006.txt",
      "chars": 575,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-007.txt",
      "chars": 15,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-008.txt",
      "chars": 1607,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-009.txt",
      "chars": 20,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-010.txt",
      "chars": 17,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-011.txt",
      "chars": 48,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-012.txt",
      "chars": 45,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-013.txt",
      "chars": 268,
      "language": "text"
    },
    {
      "file": "attachments/2dca19818e53/code/body-014.txt",
      "chars": 234,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://static.simonwillison.net/static/2023/llm-vicuna.gif",
      "bytes": 71163,
      "reused": true,
      "local_path": "attachments/2dca19818e53/images/000.gif",
      "src": "https://static.simonwillison.net/static/2023/llm-vicuna.gif",
      "alt": "Animated screenshot. Running that command produces a progress bar as the 4.21GB model downloads - once the download finishes it spits out the sentence Paris is the capital of France one word at a time. Then the user types llm logs -n 1 and sees a JSON log revealing the details about the prompt that were saved in the database.",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://simonwillison.net/",
      "label": "Simon Willison’s Weblog",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/newsletters/",
      "label": "Newsletter",
      "type": "a"
    },
    {
      "href": "https://fandf.co/4hJeKAm",
      "label": "Upgrade to Pomerium's agentic access management trusted by NVIDIA and OpenAI",
      "type": "a"
    },
    {
      "href": "https://llm.datasette.io/",
      "label": "LLM",
      "type": "a"
    },
    {
      "href": "https://llm.datasette.io/en/stable/changelog.html",
      "label": "version 0.5",
      "type": "a"
    },
    {
      "href": "https://gpt4all.io/",
      "label": "GPT4All project",
      "type": "a"
    },
    {
      "href": "https://llm.datasette.io/en/stable/plugins/tutorial-model-plugin.html",
      "label": "detailed tutorial",
      "type": "a"
    },
    {
      "href": "https://llm.datasette.io/en/stable/python-api.html",
      "label": "Python API",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm-replicate",
      "label": "llm-replicate",
      "type": "a"
    },
    {
      "href": "https://replicate.com/",
      "label": "Replicate",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/Jul/18/accessing-llama-2/",
      "label": "Accessing Llama 2 from the command-line with the llm-replicate plugin",
      "type": "a"
    },
    {
      "href": "https://github.com/tomviner/llm-claude",
      "label": "llm-claude",
      "type": "a"
    },
    {
      "href": "https://www.anthropic.com/",
      "label": "Anthropic",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm-mlc",
      "label": "llm-mlc",
      "type": "a"
    },
    {
      "href": "https://pypa.github.io/pipx/",
      "label": "pipx",
      "type": "a"
    },
    {
      "href": "https://brew.sh/",
      "label": "Homebrew",
      "type": "a"
    },
    {
      "href": "https://llm.datasette.io/en/latest/usage.html",
      "label": "usage instructions for that here",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm-gpt4all",
      "label": "llm-gpt4all plugin",
      "type": "a"
    },
    {
      "href": "https://blog.google/technology/ai/google-palm-2-ai-large-language-model/",
      "label": "a few weeks ago",
      "type": "a"
    },
    {
      "href": "https://developers.generativeai.google/",
      "label": "PaLM API",
      "type": "a"
    },
    {
      "href": "https://makersuite.google.com/waitlist",
      "label": "Obtain an API key",
      "type": "a"
    },
    {
      "href": "https://llm.datasette.io/en/latest/plugins/tutorial-model-plugin.html",
      "label": "Writing a plugin to support a new model",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Markov_chain",
      "label": "Markov chain",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm-palm/blob/main/llm_palm/__init__.py",
      "label": "llm_palm/__init__.py",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm/blob/main/llm/default_plugins/openai_models.py",
      "label": "llm/default_plugins/openai_models.py",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm-gpt4all/blob/main/llm_gpt4all.py",
      "label": "llm_gpt4all.py",
      "type": "a"
    },
    {
      "href": "https://docs.gpt4all.io/gpt4all_python.html",
      "label": "gpt4all",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm-mpt30b/blob/main/llm_mpt30b.py",
      "label": "llm_mpt30b.py",
      "type": "a"
    },
    {
      "href": "https://github.com/marella/ctransformers",
      "label": "ctransformers",
      "type": "a"
    },
    {
      "href": "https://github.com/simonw/llm/issues",
      "label": "GitHub repository issues",
      "type": "a"
    },
    {
      "href": "https://openai.com/blog/function-calling-and-other-api-updates",
      "label": "OpenAI functions",
      "type": "a"
    },
    {
      "href": "https://til.simonwillison.net/llms/python-react-pattern",
      "label": "the reAct pattern",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/Jul/12/",
      "label": "12th July 2023",
      "type": "a"
    },
    {
      "href": "https://fedi.simonwillison.net/@simon",
      "label": "Mastodon",
      "type": "a"
    },
    {
      "href": "https://bsky.app/profile/simonwillison.net",
      "label": "Bluesky",
      "type": "a"
    },
    {
      "href": "https://twitter.com/simonw",
      "label": "Twitter",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/about/",
      "label": "subscribe to my newsletter",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2026/Oct/12/python-3-15/",
      "label": "Hello Python 3.15, goodbye 3.10, and now I can use 3.11",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2026/Oct/9/built-using-my-voice/",
      "label": "A new feature for my blog, built using my voice",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2026/Oct/7/claude-haiku-5-5/",
      "label": "Claude Haiku 5.5",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2026/Oct/3/default-hard-budget-caps/",
      "label": "We're going to need default hard budget caps on pretty much everything",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/series/llm-releases/",
      "label": "New releases of LLM",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/May/18/cli-tools-for-llms/",
      "label": "llm, ttok and strip-tags - CLI tools for working with ChatGPT and other LLMs",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/Sep/4/llm-embeddings/",
      "label": "LLM now provides tools for working with embeddings",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2024/Jan/26/llm/",
      "label": "LLM 0.13: The annotated release notes",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2024/Oct/29/llm-multi-modal/",
      "label": "You can now run prompts against images, audio and video in your terminal using LLM",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2025/Feb/17/llm/",
      "label": "LLM 0.22, the annotated release notes",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2025/Feb/28/llm-schemas/",
      "label": "Structured data extraction from unstructured content using LLM schemas",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/cli/",
      "label": "cli 109",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/projects/",
      "label": "projects 558",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/ai/",
      "label": "ai 2,279",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/generative-ai/",
      "label": "generative-ai 2,021",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/local-llms/",
      "label": "local-llms 165",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/llms/",
      "label": "llms 1,987",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/llm/",
      "label": "llm 639",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/tags/anthropic/",
      "label": "anthropic 348",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/Jul/16/weeknotes/",
      "label": "Weeknotes: Self-hosted language models with LLM plugins, a new Datasette tutorial, a dozen package releases, a dozen TIL",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/Jun/27/weeknotes/",
      "label": "Weeknotes: symbex, LLM prompt templates, a bit of a break",
      "type": "a"
    },
    {
      "href": "https://github.com/sponsors/simonw/",
      "label": "Sponsor & subscribe",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2002/",
      "label": "2002",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2003/",
      "label": "2003",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2004/",
      "label": "2004",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2005/",
      "label": "2005",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2006/",
      "label": "2006",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2007/",
      "label": "2007",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2008/",
      "label": "2008",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2009/",
      "label": "2009",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2010/",
      "label": "2010",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2011/",
      "label": "2011",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2012/",
      "label": "2012",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2013/",
      "label": "2013",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2014/",
      "label": "2014",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2015/",
      "label": "2015",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2016/",
      "label": "2016",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2017/",
      "label": "2017",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2018/",
      "label": "2018",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2019/",
      "label": "2019",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2020/",
      "label": "2020",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2021/",
      "label": "2021",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2022/",
      "label": "2022",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2023/",
      "label": "2023",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2024/",
      "label": "2024",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2025/",
      "label": "2025",
      "type": "a"
    },
    {
      "href": "https://simonwillison.net/2026/",
      "label": "2026",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:47:02Z",
  "source_url": "https://simonwillison.net/2023/Jul/12/llm/",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 11133,
  "expected_body_images": 1,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/2dca19818e53/pages/source.html",
  "local_html": "attachments/2dca19818e53/pages/article.html",
  "body_base_path": "attachments/2dca19818e53/pages/",
  "body_markdown_path": "attachments/2dca19818e53/pages/article.md"
}