내 LLM CLI 도구가 이제 Python 코드나 플러그인에서 툴을 실행할 수 있음
(simonwillison.net)- LLM 0.26에서는 다양한 툴 실행 기능이 추가되어, OpenAI, Anthropic, Gemini, Ollama 등 여러 LLM 모델이 Python 함수나 플러그인으로 구현된 도구를 활용할 수 있음
- 명령줄이나 Python API에서 툴을 직접 설치하거나 함수로 전달할 수 있어 확장성과 유연성이 크게 향상됨
- 툴 플러그인으로 수학 계산, JavaScript 실행, SQL 질의, 외부 서비스 연동 등 다양한 기능이 모델에 손쉽게 추가 가능함
- 모든 주요 LLM 벤더 및 로컬 모델에서 툴 호출 패턴이 보편화되고, LLM 0.26도 표준화된 방식으로 통합함
- 향후 계획 및 발전 방향으로는 MCP 표준 지원, 플러그인 개발 생태계 확장, 툴 실행 로그 개선 등이 논의됨
LLM 0.26: 터미널에서 대형언어모델로 툴 실행 지원
2025년 5월 27일 기준으로 LLM 0.26 버전이 출시됨. 이 버전은 LLM 프로젝트 시작 이래 최대 규모의 변화로, 도구(tool) 지원이 추가됨. 이제 OpenAI, Anthropic, Gemini, Ollama 등 다양한 LLM 모델을 LLM의 CLI 도구 및 Python 라이브러리와 연동하여, Python 함수로 표현 가능한 어떠한 툴에도 접근할 수 있음.
주요 기능 및 변화
-
플러그인에서 툴 설치 및 불러오기:
--tool/-T
옵션으로 설치된 플러그인을 통해 툴을 등록하고 사용할 수 있음 -
명령줄 Python 코드 전달:
--functions
옵션으로 직접 Python 함수 코드를 넘겨주어 툴 활용 가능 -
Python API에서도 툴 지원:
.chain
메서드에tools=[함수명]
전달로 손쉽게 툴 연결 - 동기 및 비동기 컨텍스트 지원: sync/async 상황 모두에서 툴 호출 가능
툴 사용 예시
사용 준비
-
최신 LLM 설치 또는 업그레이드 필요
-
OpenAI 등 API 키 등록:
llm keys set openai # API 키 입력
-
첫 번째 툴 실행 예시:
llm --tool llm_version "What version?" --td
- llm_version은 기본 제공되는 간단한 데모 툴임
-
--td
는 툴 디버그 출력 옵션으로, 툴 호출 과정 및 응답 내용 확인 가능
-
모델 변경:
llm models default gpt-4.1-mini
- 옵션으로 다양한 모델 지원 가능 (
-m o4-mini
등)
- 옵션으로 다양한 모델 지원 가능 (
-
내장 시간 툴 호출:
llm --tool llm_time "What time is it?" --td -m o4-mini
- 시간 및 타임존 정보를 상세히 출력함
다양한 모델 및 플러그인 지원
- Anthropic Claude 4, Google Gemini 2.5 Flash, Ollama Qwen3:4b 등 여러 LLM 모델 환경에서 동일한 툴 인터페이스로 동작함
- 예시 명령어:
llm install llm-anthropic -U llm keys set anthropic llm --tool llm_version "What version?" --td -m claude-4-sonnet
수학 연산 및 코드 실행
- 수학에 약한 LLM 한계를 Python 툴로 극복 가능
-
llm-tools-simpleeval 플러그인을 통한 안전한 산술 연산 지원
llm install llm-tools-simpleeval llm -T simpleeval llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
-
sqrt()
지원이 없을 경우** 0.5
로 대체하는 식으로, 코드 실행 유연성 확보
-
도구 플러그인 소개
- [llm-tools-simpleeval]: 산술 및 간단한 식 계산
- [llm-tools-quickjs]: QuickJS 자바스크립트 샌드박스 해석기 툴
- [llm-tools-sqlite]: 로컬 SQLite 데이터베이스 읽기 전용 SQL 질의
- [llm-tools-datasette]: 원격 Datasette 인스턴스에 SQL 쿼리 실행 지원
예시:
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
- 툴박스 형태 플러그인이라 URL 등 인자를 통해 설정 가능
- 잘못된 컬럼 명시 시 툴 에러 감지 및 재시도 → 스키마 조회 → 올바른 쿼리 생성 방식으로, LLM의 어댑티브 능력 입증
직접 Python 코드로 툴 정의
- 명령줄에서
--functions
옵션으로 임의의 Python 함수를 전달, 즉시 툴화 - 예시:
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'
- 간단한 웹 검색 도구 구현 가능
- System prompt를 통해 모델에 툴 활용 방향성 설정이 중요함
Python 라이브러리로의 통합 활용
- LLM은 CLI와 Python API 모두 지원
-
.chain()
메서드로 툴 호출 요청 감지 → 실행 → 결과 반영까지 일련 과정을 자동화 - 예시:
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)
- 비동기 함수(async def)도 지원되어 동시 실행 가능
- 툴박스 플러그인도
tools=[Datasette(...)]
형태로 그대로 연결
도구 패러다임의 발전 과정
- 툴 호출 패턴은 2022년 ReAcT 논문 등에서 소개된 후, 모든 주요 LLM 벤더와 로컬 모델이 도입
- API마다 "Function calling" 또는 "툴 사용" 등 다양한 명칭으로 통일된 형태 채택
- Ollama, llama.cpp 등도 이미 툴 지원 추가 및 기능 확장
개발 및 운영 뒷이야기
- LLM이 오랫동안 툴 연동 지원이 필요함을 인지했으나, 다양한 모델 간 추상화 계층 설계가 어려움
- 벤더 간 툴 패턴 표준화가 진행됨에 따라 LLM 0.26에서 통합 구현이 가능해짐
- PyCon US 2025 워크숍에서 실무 활용 사례로 시연
“에이전트”와의 관계
- "에이전트"란 용어는 아직 논란이나, 현재 LLM 생태계에서 "툴 인 더 루프" 형태로 표준화됨
- LLM 0.26은 에이전트 개발에도 적합한 구현임
- 향후 플러그인 제작을 위한 템플릿, 개선 이슈, 고급 플러그인 문서화 등이 활발히 진행 중
Model Context Protocol (MCP) 지원 예정
- MCP는 LLM이 툴에 접근하는 새로운 표준 프로토콜로 급부상
- 지난 8일 내에 OpenAI, Anthropic, Mistral 등 대형 벤더 API에도 빠르게 도입되고 있음
- 향후 LLM을 MCP 클라이언트로 만들어 다양한 MCP 서버에 쉽게 연동 계획
커뮤니티 및 확장
- LLM 프로젝트 플러그인, 툴 개발 논의 및 생태계 확장을 위해 Discord 커뮤니티 운영
- 오픈소스 생태계에서 툴 기반 LLM 활용의 가능성은 사실상 무한함을 강조
이상의 방식으로 LLM 0.26은 모든 주요 LLM 모델과 연동되는, 범용적이며 확장 가능한 툴 연동 플랫폼으로 거듭나고 있음. 툴을 통해 언어모델의 활용 범위가 폭넓게 확장된다는 점에서, 개발자 및 IT 실무자에게 매우 의미 있는 도구임.
Hacker News 의견
-
내가 이 도구를 위해 직접 만든 스트리밍 마크다운 렌더러가 있음
자세한 내용은 Streamdown에서 확인 가능
또 참고할 만한 것이 여기에 있고
llmehelp라는 tmux 도구도 직접 만들었는데 Simon의 llm 위에 올려져 있음
매일 사용하는 필수 도구가 된 상황-
이 라이브러리 정말 멋지게 보임
플러그인들이 내용 표시 부분을 직접 제어하도록 할 수 있는 훅이 있었으면 좋겠다는 생각
이에 대해 이슈를 여기에 올림
몇 가지 디자인 옵션을 포함했지만 아직 100% 확신되는 느낌은 아님
피드백을 꼭 받고 싶음 -
또 하나 빼먹었던 게 있음
이번엔 llm 기반으로 만든 ZSH 플러그인임
zle을 사용해 영어를 한 번에 셸 명령어로 번역하는 데 사용
Zummoner가 그 주인공
내 생활을 완전히 바꿔준 도구임
예를 들어 오늘 직접 만든 명령어$ git find out if abcdefg is a descendent of hijklmnop
실제로 이 댓글 중 하나에서 사용한 명령문
$ for i in $(seq 1 6); do printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; done | pv -bqL 30
원래는
$ for i in $(seq 1 6); do printf "(# $i times)\n\n-----\n" done | pv (30 bps and quietly)
내 신뢰하는 ctrl-x x 조합으로 버퍼를 openrouter에 보내고 1초 안에 올바른 문법으로 돌아옴
-
멋짐
나도 스트리밍 LLM 출력을 빠르게 표시하려고 여러 언어로 스트리밍 마크다운 렌더러를 만들어본 경험 있음
나만 그런 줄 알았는데 반가운 감정 -
흥미로움, 꼭 시도해볼 생각
나는 llm을 bat과 함께 문법 강조로 사용 중 -
이런 기능 정말 원했었음
고마움
-
-
이런 식의 도구는 footgun(스스로 위험을 초래할 수 있음) 위험성이 상당히 높아짐
문서에서 prompt injection(프롬프트 주입)에 대한 주의가 있긴 하지만 실제로는 셀프 실수로 인한 피해가 더 흔할 것 같음
예시로, 툴에 브로커리지 계정 접근 권한을 주면 트레이딩 자동화가 가능함
프롬프트 주입이 없어도, 봇이 바보 같은 거래를 해도 막을 방법이 없음
참고 문서-
이런 식의 사고 사고 위험성 정말 큼
LLM에 툴들을 연결하면 인증된 호출로 내 대신 뭔가 행동할 수 있는 경우 너무 많은 예기치 못한 상황이 벌어질 수 있음
최근 GitHub MCP 사례 등에서 이런 현상을 볼 수 있음 관련 기사
문서에도 위험 경고를 크게 표시했고, 실제로 손해를 줄 수 있는 초기 툴 플러그인은 아예 공개하지 않았음
그래서 내 QuickJS 샌드박스나 SQLite 플러그인은 오로지 읽기 전용임
그렇지만 이 분야 자체는 매우 재미있고 신기한 스펙트럼임 -
만약 llm을 브로커리지 계정에 연결하는 사람 있다면, 그건 봇이 아니라 사람이 멍청한 것에 가까운 상황
-
어떤 도구든 오용될 위험성 존재
-
-
llm 사용 중인 분들께 Gtk-llm-chat을 추천
엄청나게 많은 노력을 들여 만든 바탕
llm 명령줄 툴과 데스크톱 통합, 트레이 아이콘, 깔끔한 챗창 제공
3대 주요 데스크톱 OS용 패키지로 최근 3.0.0 버전 출시- 흥미로움
평범한 채팅 외에 다른 용도로 어떻게 쓰는지 궁금한 상황
- 흥미로움
-
이건 정말 최고의 타이밍임
최근 터미널(Warp)에서 이런 저런 실험 중인데 agent 도입 아이디어는 맘에 들지만 Cursor 같은 "우리 프롬프트/LLM 콜에 믿고 맡겨주세요(그리고 비용 부과)" 방식은 뭔가 꺼려짐
그래서 그냥 내가 부족한 셸 실력을 메우기 위한 간단한 CLI 기반 터미널 에이전트가 필요했음
이런 툴은 footgun 위험이 크다는 건 너무 잘 인지함
하지만 터미널 툴 + llm 조합이 정말 가볍게 이상적인 조합이라 기대 중
다른 일부 "에이전트" 제품들처럼, llm이rm -rf ./*
같은 툴 호출 시 "Y를 눌러 승인" 식으로 매번 허락을 받아내는 방식 지원 여부가 궁금함
이 방식이 되면 LLM이 내 터미널을 마음대로 조작하는 걸 막을 수 있고, 어느 정도 보호장치 마련이 가능할 것 같음- Codex CLI 기본 모드가 아마 그런 방식일 것
--full-auto
플래그 없이 실행하면 매번 승인 묻는 형태
- Codex CLI 기본 모드가 아마 그런 방식일 것
-
나는 LLM CLI 탭 완성용 zsh/omz 플러그인을 열심히 관리하고 있는데, 새로운 기능 릴리스 속도가 너무 빨라 따라잡기가 쉽지 않은 상황
다행히 아래 명령이 90%까지는 자동으로 구현해줌llm -f README.md -f llm.plugin.zsh -f completions/_llm -f https://simonwillison.net/2025/May/27/llm-tools/ "implement tab completions for the new tool plugins feature"
내 플러그인 저장소는 여기
다양한 옵션들을 최대한 다뤄보고 싶어서 구조가 다소 복잡함
피드백 받을 수 있으면 정말 고마운 상황- 진짜 SF가 아니라 현실이 이런 수준인 게 신기한 상황
미래 세대는 우리가 어떻게 뭐 하나 만들었는지 신기해할 듯
우리가 어셈블리 프로그래머들 어떻게 일했는지 상상 못하는 것과 똑같은 느낌
- 진짜 SF가 아니라 현실이 이런 수준인 게 신기한 상황
-
GPT-4.1은 구조화된 출력부터 툴 호출까지 정말 강력한 모델임
지난 2년간 내 일상적인 반복 작업은 거의 LLM이 다 처리
저렴하면서도 성능 좋은 모델 조합이라 항상 이걸 기본 사용 모델로 선택- 솔직히 GPT-4.1 mini에 정말 놀람
모든 걸 API에서 만져본 결과, 터무니없이 저렴하면서도 진짜 대부분을 잘 처리
코딩할 때는 o4-mini로, 그 외에는 4.1-mini가 보통 충분
오늘 재미로 쓴 케이스
주석 하나 없는 훌륭한 CSS Minecraft 데모 코드를 GPT-4.1 mini에게 해설하도록 파이프llm -f https://raw.githubusercontent.com/BenjaminAster/CSS-Minecraft/… \ -s 'explain all the tricks used by this CSS'
관련 데모 소스
GPT-4.1 mini가 답변한 내용이 정말 훌륭함
"이 CSS는 최첨단 CSS 기술로 3D 인터랙티브 복셀 스타일 UI를 최소한의 자바스크립트로 구현한다" 등 어려운 트릭까지 정확히 지적
설명 전체
입력 토큰 3,813, 출력 토큰 1,291
계산 결과 약 0.3591센트로 1센트의 1/3 비용에 불과한 수준
- 솔직히 GPT-4.1 mini에 정말 놀람
-
Simon의 도구 정말 대단함
매일 사용 중
파이프 조합과 모델 손쉬운 전환(ollama 등의 로컬, 원격 모두 지원) 덕분에 작업이 매우 쉬워짐 -
정말 멋진 내용임
내가 아는 바로는 llama.cpp도 툴을 지원하지만, llm에서 연동하는 방법을 아직 못 찾았음
extra-openai-models.yaml에 뭔가 추가해서 해결 가능한지 궁금한 상황- 이건 아마 llm-gguf나 llm-llama-server에 변경이 필요할 듯
... 실험해보니 두 번째 방법이 통함
그리고 별도 창에서brew install llama.cpp llama-server --jinja -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL
정리 내용은 여기에 정리llm install llm-llama-server llm -m llama-server-tools -T llm_time 'what time is it?' --td
- 이건 아마 llm-gguf나 llm-llama-server에 변경이 필요할 듯
-
이번 릴리즈에 정말 감사한 분위기
이 라이브러리가 기존 클라이언트들의 한계와 제약을 벗어난 LLM의 가능성을 완전히 여는 핵심 구성요소라 생각
0.26 alpha 버전 출시 이후 MCP 서버와 상호작용하는 플러그인을 만들려 했는데 좀 어렵게 느껴지는 상황
일단 연결해 툴을 동적으로 가져와 사용할 수 있게는 만들었지만, 아직 파라미터 전달까지는 해결하지 못한 상태- 나 역시 오늘 아침 MCP 실험을 약간 해 봄
간단한 플러그인 데모를 최대한 시도해봤는데 쉽지는 않은 경험
공식 mcp Python 라이브러리는 asyncio 실행, 서버 연결, 사용가능 툴 인트로스펙트 등을 요구하는 형태임
- 나 역시 오늘 아침 MCP 실험을 약간 해 봄
-
기다려온 오랜 숙원이던 기능
mcp, openapi 기반 구현일 거라 예상했으나 지금 방식이 훨씬 단순하고 유연할지도 모름
플러그인으로 구현하는 것도 어렵지 않을 듯한 생각