Mi herramienta CLI de LLM ahora puede ejecutar herramientas desde código Python o plugins
(simonwillison.net)- LLM 0.26 agrega varias capacidades de ejecución de herramientas, lo que permite que distintos modelos LLM como OpenAI, Anthropic, Gemini y Ollama aprovechen herramientas implementadas como funciones de Python o plugins
- Las herramientas pueden instalarse directamente o pasarse como funciones desde la línea de comandos o la API de Python, mejorando mucho la extensibilidad y la flexibilidad
- Mediante plugins de herramientas, es fácil añadir al modelo funciones como cálculos matemáticos, ejecución de JavaScript, consultas SQL e integración con servicios externos
- El patrón de llamadas a herramientas se está volviendo común entre todos los principales proveedores de LLM y modelos locales, y LLM 0.26 también lo integra de forma estandarizada
- Entre los planes a futuro y la dirección de desarrollo se mencionan soporte para el estándar MCP, expansión del ecosistema de desarrollo de plugins y mejoras en los registros de ejecución de herramientas
LLM 0.26: soporte para ejecutar herramientas con modelos de lenguaje grandes desde la terminal
Al 27 de mayo de 2025, se lanzó la versión LLM 0.26. Este lanzamiento representa el cambio más grande desde el inicio del proyecto LLM, ya que añade soporte para herramientas (tool). Ahora, distintos modelos LLM como OpenAI, Anthropic, Gemini y Ollama pueden integrarse con la herramienta CLI y la biblioteca de Python de LLM para acceder a cualquier herramienta que pueda expresarse como una función de Python.
Funciones y cambios principales
- Instalación y carga de herramientas desde plugins: con la opción
--tool/-Tse pueden registrar y usar herramientas mediante plugins instalados - Paso de código Python desde la línea de comandos: con la opción
--functionsse puede enviar directamente código de funciones Python para usar herramientas - Soporte de herramientas también en la API de Python: se pueden conectar fácilmente pasando
tools=[nombre_función]al método.chain - Soporte para contextos síncronos y asíncronos: las llamadas a herramientas funcionan tanto en escenarios sync como async
Ejemplos de uso de herramientas
Preparación para usarlas
-
Es necesario instalar o actualizar LLM a la versión más reciente
-
Registrar una API key como la de OpenAI:
llm keys set openai # ingresar la API key -
Primer ejemplo de ejecución de una herramienta:
llm --tool llm_version "What version?" --td- llm_version es una herramienta de demostración simple incluida por defecto
--tdes la opción de salida de depuración de herramientas, que permite ver el proceso de llamada y el contenido de la respuesta
-
Cambiar de modelo:
llm models default gpt-4.1-mini- También se pueden usar distintos modelos mediante opciones (
-m o4-mini, etc.)
- También se pueden usar distintos modelos mediante opciones (
-
Llamar a la herramienta integrada de hora:
llm --tool llm_time "What time is it?" --td -m o4-mini- Muestra en detalle la hora y la información de zona horaria
Soporte para varios modelos y plugins
- Funciona con la misma interfaz de herramientas en distintos entornos de modelos LLM, como Anthropic Claude 4, Google Gemini 2.5 Flash y Ollama Qwen3:4b
- Ejemplo de comandos:
llm install llm-anthropic -U llm keys set anthropic llm --tool llm_version "What version?" --td -m claude-4-sonnet
Operaciones matemáticas y ejecución de código
- Es posible superar las limitaciones de los LLM para matemáticas usando herramientas en Python
- El plugin llm-tools-simpleeval permite operaciones aritméticas seguras
llm install llm-tools-simpleeval llm -T simpleeval llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td- Si no hay soporte para
sqrt(), puede sustituirse por** 0.5, lo que aporta flexibilidad en la ejecución de código
- Si no hay soporte para
Introducción a plugins de herramientas
- [llm-tools-simpleeval]: cálculos aritméticos y expresiones simples
- [llm-tools-quickjs]: herramienta de intérprete sandbox de JavaScript con QuickJS
- [llm-tools-sqlite]: consultas SQL de solo lectura a una base de datos SQLite local
- [llm-tools-datasette]: soporte para ejecutar consultas SQL en una instancia remota de Datasette
Ejemplo:
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
- Es un plugin tipo toolbox, por lo que puede configurarse con argumentos como una URL
- Si se especifica una columna incorrecta, el modelo puede detectar el error de la herramienta y reintentar → consultar el esquema → generar la consulta correcta, demostrando la capacidad adaptativa del LLM
Definir herramientas directamente con código Python
- Desde la línea de comandos, la opción
--functionspermite pasar funciones Python arbitrarias y convertirlas en herramientas al instante - Ejemplo:
llm --functions ' import httpx def search_blog(q): "Search Simon Willison blog" return httpx.get("https://simonwillison.net/search/", params={"q": q}).content ' --td 'Three features of sqlite-utils' -s 'use Simon search'- Permite implementar fácilmente una herramienta simple de búsqueda web
- Es importante usar el system prompt para guiar al modelo sobre cómo aprovechar la herramienta
Integración con la biblioteca de Python
- LLM soporta tanto CLI como API de Python
- El método
.chain()automatiza toda la secuencia: detectar la solicitud de llamada a una herramienta → ejecutarla → reflejar el resultado - Ejemplo:
import llm def count_char_in_text(char: str, text: str) -> int: "How many times does char appear in text?" return text.count(char) model = llm.get_model("gpt-4.1-mini") chain_response = model.chain( "Rs in strawberry?", tools=[count_char_in_text], after_call=print ) for chunk in chain_response: print(chunk, end="", flush=True) - También se soportan funciones asíncronas (
async def), lo que permite ejecución concurrente - Los plugins tipo toolbox también pueden conectarse directamente como
tools=[Datasette(...)]
Evolución del paradigma de herramientas
- El patrón de llamadas a herramientas fue presentado en trabajos como el paper ReAcT de 2022, y desde entonces ha sido adoptado por todos los principales proveedores de LLM y modelos locales
- Aunque cada API usa nombres distintos como "Function calling" o "uso de herramientas", se ha ido consolidando una forma unificada
- Ollama, llama.cpp y otros ya añadieron soporte para herramientas y siguen ampliando esa funcionalidad
Historia de desarrollo y operación
- Durante mucho tiempo, LLM reconoció la necesidad de soportar integración con herramientas, pero era difícil diseñar una capa de abstracción entre modelos tan diversos
- A medida que el patrón de herramientas se fue estandarizando entre proveedores, fue posible implementar esta integración unificada en LLM 0.26
- Se mostró en un taller de PyCon US 2025 como caso práctico de uso real
Relación con los “agentes”
- Aunque el término "agente" sigue siendo debatido, en el ecosistema actual de LLM se está estandarizando la forma de herramientas dentro del ciclo
- LLM 0.26 también ofrece una implementación adecuada para desarrollar agentes
- Ya están avanzando activamente plantillas para crear plugins, issues de mejora y documentación para plugins avanzados
Próximo soporte para Model Context Protocol (MCP)
- MCP está ganando fuerza rápidamente como un nuevo protocolo estándar para que los LLM accedan a herramientas
- En los últimos 8 días, también se ha incorporado rápidamente a las APIs de grandes proveedores como OpenAI, Anthropic y Mistral
- A futuro, el plan es convertir LLM en un cliente MCP para conectarlo fácilmente con distintos servidores MCP
Comunidad y expansión
- Se opera una comunidad en Discord para discutir plugins del proyecto LLM, desarrollo de herramientas y expansión del ecosistema
- Se enfatiza que las posibilidades de uso de LLM basadas en herramientas dentro del ecosistema open source son prácticamente ilimitadas
De esta forma, LLM 0.26 está evolucionando hacia una plataforma universal y extensible de integración de herramientas, conectada con todos los principales modelos LLM. El hecho de que las herramientas amplíen enormemente el alcance de uso de los modelos de lenguaje la convierte en una herramienta muy significativa para desarrolladores y profesionales de TI.
1 comentarios
Comentario de Hacker News
Tengo un renderizador de Markdown en streaming que hice yo mismo para esta herramienta.
Pueden ver más detalles en Streamdown.
También hay algo que puede servir de referencia aquí.
Además hice yo mismo una herramienta para tmux llamada llmehelp, construida sobre el llm de Simon.
Ya se volvió una herramienta indispensable que uso todos los días.
Esta librería se ve realmente genial.
Me gustaría que hubiera un hook para que los plugins pudieran controlar directamente cómo se muestra el contenido.
Publiqué un issue sobre eso aquí.
Incluí varias opciones de diseño, pero todavía no siento que esté 100% seguro de ninguna.
De verdad me gustaría recibir comentarios.
Otra cosa que olvidé mencionar:
esta vez es un plugin de ZSH hecho sobre llm.
Uso
zlepara traducir inglés a comandos de shell de una sola vez.Se llama Zummoner.
Es una herramienta que me cambió completamente la vida.
Por ejemplo, un comando que hice hoy mismo:
Un comando que de hecho usé en uno de estos comentarios:
Originalmente era:
Envío el búfer a OpenRouter con mi confiable combinación
ctrl-x x, y vuelve en menos de un segundo con la sintaxis correcta.Genial.
Yo también he hecho renderizadores de Markdown en streaming en varios lenguajes para mostrar rápido la salida en streaming de un LLM.
Me alegra saber que no soy el único.
Interesante, definitivamente lo voy a probar.
Yo uso llm junto con bat para resaltado de sintaxis.
Justo quería una función así.
Gracias.
Herramientas de este tipo elevan muchísimo el riesgo de ser un footgun (provocarte problemas tú mismo).
La documentación sí tiene advertencias sobre prompt injection, pero en la práctica me parece más probable que el daño venga de errores propios.
Por ejemplo, si le das a la herramienta acceso a una cuenta de corretaje, puedes automatizar operaciones.
Incluso sin prompt injection, no hay forma de detener al bot si hace una operación tonta.
Documentación de referencia
El riesgo de este tipo de incidentes es realmente muy grande.
Cuando conectas herramientas a un LLM, pueden ocurrir demasiadas situaciones inesperadas en las que algo actúe por mí con llamadas autenticadas.
Esto se ha visto recientemente en casos como GitHub MCP artículo relacionado.
En la documentación también puse una advertencia de riesgo bien visible y, de hecho, no publiqué ningún plugin inicial que pudiera causar daños reales.
Por eso mi sandbox de QuickJS y mi plugin de SQLite son estrictamente de solo lectura.
Aun así, este campo en sí es un espectro muy interesante y fascinante.
Si alguien conecta llm a una cuenta de corretaje, en ese caso el tonto no sería el bot sino la persona.
Cualquier herramienta puede usarse mal.
A quienes usen llm, les recomiendo Gtk-llm-chat.
Está hecho sobre una enorme cantidad de trabajo.
Ofrece integración entre la herramienta de línea de comandos llm y el escritorio, ícono en la bandeja y una ventana de chat limpia.
Hace poco salió la versión 3.0.0 empaquetada para los tres principales sistemas operativos de escritorio.
Tengo curiosidad por cómo lo usan para cosas aparte del chat normal.
Esto llega en el mejor momento posible.
Últimamente he estado experimentando bastante en la terminal (Warp), y aunque me gusta la idea de incorporar agentes, me incomoda el enfoque tipo Cursor de “confía en nuestros prompts/llamadas al LLM (y además te cobramos)”.
Así que justo necesitaba un agente de terminal simple, basado en CLI, para compensar lo limitado de mis habilidades con el shell.
Tengo clarísimo que herramientas así implican un gran riesgo de footgun.
Pero la combinación de herramienta de terminal + llm parece una mezcla ideal por lo ligera que es, así que tengo muchas expectativas.
Me pregunto si soporta algo como otros productos “agente”, donde cuando el llm quiere hacer una llamada de herramienta como
rm -rf ./*, te pide permiso cada vez con algo tipo “presiona Y para aprobar”.Si eso existe, podría evitar que el LLM manipule mi terminal a su antojo y servir como una especie de protección.
Si lo ejecutas sin la bandera
--full-auto, te pide aprobación cada vez.Mantengo con bastante dedicación un plugin de zsh/omz para autocompletado con tab de LLM, pero la velocidad a la que salen nuevas funciones hace difícil ponerse al día.
Por suerte, el siguiente comando implementa automáticamente como el 90%:
Mi repositorio del plugin está aquí.
La estructura es un poco compleja porque intento cubrir la mayor cantidad posible de opciones.
Agradecería muchísimo cualquier comentario.
Las generaciones futuras probablemente se sorprenderán de cómo construíamos cualquier cosa.
Se siente igual a como nosotros no logramos imaginar cómo trabajaban los programadores en ensamblador.
GPT-4.1 es un modelo realmente potente, desde salidas estructuradas hasta llamadas de herramientas.
En los últimos dos años, casi todas mis tareas repetitivas del día a día las ha resuelto un LLM.
Como combinación de precio bajo y buen rendimiento, siempre lo elijo como mi modelo predeterminado.
Después de probar de todo vía API, resulta absurdamente barato y realmente resuelve la gran mayoría de las cosas.
Para programar uso
o4-mini; para casi todo lo demás,4.1-minisuele ser suficiente.Un caso divertido que usé hoy: Le pasé a GPT-4.1 mini el código de una excelente demo de CSS Minecraft sin un solo comentario, para que lo explicara.
La demo relacionada fuente.
La respuesta de GPT-4.1 mini fue realmente excelente.
Señaló correctamente incluso trucos difíciles, como que “este CSS implementa una interfaz 3D interactiva de estilo vóxel con técnicas de CSS de vanguardia y un mínimo de JavaScript”.
Explicación completa
3,813 tokens de entrada, 1,291 tokens de salida.
Cálculo: aproximadamente 0.3591 centavos, o sea apenas un tercio de un centavo.
La herramienta de Simon es impresionante.
La uso todos los días.
Gracias a la combinación con pipes y al cambio sencillo entre modelos (tanto locales como remotos, incluidos los de ollama), trabajar se vuelve muy fácil.
Está realmente genial.
Hasta donde sé, llama.cpp también soporta herramientas, pero todavía no he encontrado cómo integrarlo en llm.
Me pregunto si se podrá resolver agregando algo en
extra-openai-models.yaml.... probándolo, resulta que la segunda opción sí funciona. Y en otra ventana: Lo resumí aquí.
Muchísimas gracias por este lanzamiento.
Creo que esta librería es un componente clave que abre por completo el potencial de los LLM más allá de los límites y restricciones de los clientes existentes.
Desde la salida de la versión alpha 0.26 he estado intentando crear un plugin que interactúe con servidores MCP, pero me ha resultado algo complicado.
Por ahora logré conectarlo para traer y usar herramientas dinámicamente, pero todavía no he resuelto cómo pasar parámetros.
Intenté al máximo armar una demo sencilla de plugin, pero no fue una experiencia fácil.
La librería oficial de Python para mcp requiere cosas como ejecución con asyncio, conexión al servidor e introspección de herramientas disponibles.
Una función largamente esperada.
Pensé que estaría implementada sobre mcp u openapi, pero este enfoque actual quizá sea mucho más simple y flexible.
También parece que no sería difícil implementarlo como plugin.