- LLM 0.26은 CLI와 Python 라이브러리에서 OpenAI, Anthropic, Gemini, Ollama 로컬 모델에 Python 함수로 만든 도구를 연결할 수 있게 한 큰 릴리스임
- 도구는 플러그인으로 설치해
--tool/-T name_of_tool로 불러오거나, --functions로 임시 Python 함수를 명령줄에서 바로 넘겨 사용할 수 있음
- 내장 도구
llm_version, llm_time뿐 아니라 simpleeval, QuickJS, SQLite, Datasette 플러그인이 제공되며, 모델은 실패한 호출 뒤 스키마 조회나 다른 표현식으로 재시도할 수 있음
- Python API의 새
model.chain()은 도구 호출 요청을 감지해 실행하고 결과를 다시 모델에 전달하며, 동기 함수와 asyncio 도구를 모두 지원함
- 여러 벤더의 도구 사용·함수 호출 방식이 수렴하면서 구현이 가능해졌고, 다음 과제는 플러그인 확장, 더 많은 모델 플러그인 지원, Model Context Protocol 클라이언트 지원임
LLM 0.26의 도구 실행 지원
- LLM 0.26은 프로젝트 시작 이후 가장 큰 기능으로 도구 지원을 추가함
- LLM CLI와 Python 라이브러리에서 OpenAI, Anthropic, Gemini, Ollama 로컬 모델에 Python 함수로 표현 가능한 도구 접근 권한을 줄 수 있음
- 새 도구 플러그인을 설치하면 현재 사용하는 모델에 새 기능을 붙일 수 있음
- 핵심 사용 방식은 네 가지임
- 플러그인 도구를 설치하고
--tool/-T name_of_tool로 로드함
--functions 옵션으로 Python 함수 코드를 명령줄에 직접 전달함
- Python API에서도
tools=[locals] 같은 방식으로 도구를 넘길 수 있음
- 도구는 비동기와 동기 컨텍스트 모두에서 동작함
CLI에서 도구 실행하기
- 최신 LLM은
uv tool install llm로 설치하고, 기존 설치는 uv tool upgrade llm로 업그레이드할 수 있음
- OpenAI 사용 예시는
llm keys set openai로 API 키를 설정한 뒤 다음처럼 실행함
llm --tool llm_version "What version?" --td
llm_version은 LLM에 포함된 간단한 데모 도구이며, --tool llm_version은 해당 도구를 모델에 노출함
--tool은 여러 번 지정할 수 있고, 짧은 옵션 -T도 사용할 수 있음
--td는 --tools-debug의 약자로, 도구 호출과 응답 정보를 출력해 내부 동작을 확인하게 해줌
- 기본 모델은 보통
gpt-4o-mini이며, 예시에서는 llm models default gpt-4.1-mini로 gpt-4.1-mini를 기본값으로 바꿈
-m 옵션으로 다른 모델을 지정할 수 있으며, o4-mini와 내장 llm_time 도구를 함께 실행하는 예시도 있음
llm --tool llm_time "What time is it?" --td -m o4-mini
llm_time 도구 응답에는 utc_time, utc_time_iso, local_timezone, local_time, timezone_offset, is_dst 같은 필드가 포함됨
여러 모델과 플러그인에서의 동작
- 도구를 지원하는 모델 플러그인에서도 같은 명령 패턴을 사용할 수 있음
- Anthropic Claude Sonnet 4 예시는 다음 흐름을 사용함
llm install llm-anthropic -U
llm keys set anthropic
llm --tool llm_version "What version?" --td -m claude-4-sonnet
- Google Gemini 2.5 Flash 예시는 다음 흐름을 사용함
llm install llm-gemini -U
llm keys set gemini
llm --tool llm_version "What version?" --td -m gemini-2.5-flash-preview-05-20
- Ollama로 실행하는
qwen3:4b도 간단한 도구를 실행할 수 있음
qwen3:4b는 2.6GB 크기의 작은 모델임
ollama pull qwen3:4b
llm install 'llm-ollama>=0.11a0'
llm --tool llm_version "What version?" --td -m qwen3:4b
수학, JavaScript, SQLite, Datasette 도구 플러그인
- LLM이 약한 큰 숫자 곱셈 같은 작업은 도구 호출로 보완할 수 있음
- llm-tools-simpleeval은 Daniel Fairhead의 simpleeval 라이브러리를 노출함
- simpleeval은 “Simple Safe Sandboxed Extensible Expression Evaluator for Python” 라이브러리임
- 간단한 Python 표현식을 실행하기 위한 충분히 견고한 샌드박스를 제공함
- 계산 예시는 다음처럼 실행함
llm install llm-tools-simpleeval
llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
- 예시 실행에서 모델은 먼저
1234 * 4346 / 32414를 계산해 165.45208860368976을 얻고, sqrt(...)가 정의되지 않아 실패한 뒤 ** 0.5로 바꿔 12.862818066181678을 얻음
- 공개된 도구 플러그인은 네 가지임
Datasette 툴박스와 오류 후 재시도
- Datasette 플러그인은 내부에 여러 도구를 가진 툴박스 형태로 동작함
- 사용 예시는 다음과 같음
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
Datasette("https://datasette.io/content")는 플러그인에 사용할 Datasette 인스턴스 URL을 전달함
- 이 예시는 Datasette 웹사이트를 구동하는 content database를 대상으로 함
- 모델은 세 번의 호출을 수행함
- 처음에는
SELECT name, stars FROM repos ORDER BY stars DESC LIMIT 1를 추측했지만 stars 컬럼이 없어 실패함
- 오류를 받은 뒤
Datasette_schema() 도구로 데이터베이스 스키마를 조회함
- 스키마를 바탕으로 올바른 쿼리를 조립하고 실행함
- 최종 응답에 따르면 별이 가장 많은 저장소는
datasette이며 10,020 stars를 가지고 있음
--functions로 임시 도구 만들기
--functions 옵션은 플러그인보다 덜 구조화된 임시 도구 사용 방식을 제공함
- 명령줄에 Python 코드 블록을 직접 넘기면, 그 안에 정의된 함수들이 모델이 사용할 도구가 됨
- 블로그 검색 도구 예시는 다음처럼
httpx로 검색 페이지를 호출하고 HTML을 그대로 모델에 반환함
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'
- 구현은 검색 페이지 HTML을 그대로 되돌려주는 방식이지만 동작함
- GPT-4.1 계열이 100만 토큰을 처리하므로 거친 HTML도 감당할 수 있다고 봄
- 시스템 프롬프트에
use Simon search를 추가해야 모델이 스스로 답하지 않고 제공된 검색 도구를 사용함
- 더 나은 검색 도구에는 더 상세한 지침과 검색 결과의 관련 스니펫이 필요함
- 예시 결과에서
sqlite-utils 기능으로 CLI와 Python 라이브러리 결합, alter=True를 통한 컬럼 자동 추가, 플러그인 지원이 나옴
Python API의 도구 지원
- LLM은 CLI 도구이면서 Python 라이브러리이며, 0.26에서 Python API에도 도구 지원이 추가됨
- 예시는 “strawberry” 안의
r 개수를 세는 문제를 함수 도구로 해결함
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)
after_call=print는 앞서의 --td 옵션처럼 도구 호출을 확인하는 방법임
- 새
model.chain() 메서드는 model.prompt()와 비슷하지만, 반환된 도구 호출 요청을 감지하고 실행한 뒤 결과와 함께 다시 모델을 호출함
model.chain()은 최종 답을 주기 전까지 여러 응답을 실행할 수 있음
chain_response를 순회하면 여러 응답에 걸쳐 반환되는 토큰을 스트리밍 출력할 수 있음
- 예시 결과에서는
count_char_in_text 도구가 char='r', text='strawberry'로 호출되고, 결과 3을 바탕으로 strawberry에 r이 3개 있다고 답함
- Python 라이브러리는
asyncio도 지원하며, 도구는 async def 함수가 될 수 있음
- 모델이 여러 비동기 도구를 한 번에 요청하면 라이브러리는
asyncio.gather()로 동시에 실행함
- 툴박스도 지원되어
tools=[Datasette("https://datasette.io/content")]를 chain()에 넘기면 CLI의 --tool 'Datasette(...)'와 같은 효과를 냄
구현 배경과 도구 사용 패턴
- 도구 사용 패턴은 2022년 10월 처음 공개된 ReAcT paper에서 본 뒤 추적해 온 방식임
- 기본 패턴은 단순함
- 모델에 사용할 수 있는 도구가 있다고 알려줌
- 모델이 JSON, XML,
tool_name(arguments) 같은 특수 문법으로 도구 동작을 요청하고 멈춤
- 코드가 그 출력을 파싱해 요청된 도구를 실행함
- 실행 결과를 포함해 새 프롬프트를 모델에 보냄
- 이 방식은 현재 거의 모든 모델에서 동작함
- 많은 모델은 도구 사용을 위해 별도 학습되어 있으며, Berkeley Function-Calling Leaderboard 같은 리더보드도 있음
- OpenAI, Anthropic, Google, Mistral, Meta는 API에 도구 사용 또는 함수 호출 기능을 포함하고 있음
- 로컬 모델 쪽에서도 Ollama는 작년에 도구 지원을 추가했고, llama.cpp 서버에도 포함되어 있음
- LLM은 2025년 2월 스키마 지원을 먼저 릴리스했고, 이를 도구 지원을 향한 단계로 삼음
- 여러 모델에서 동작하는 추상화 계층 설계가 과제였으며, 벤더들의 방식이 뚜렷하게 수렴한 현재 구현할 수 있게 됨
- PyCon US의 Building software on top of Large Language Models 워크숍이 알파 구현을 마무리하는 계기가 됐고, 튜토리얼의 tools section도 제공됨
에이전트와 다음 계획
- “agents”라는 용어에는 여전히 거부감이 있지만, LLM 세계에서는 tools in a loop로 수렴하고 있으며 LLM 0.26도 그 형태에 가까움
- 에이전트를 만들고 싶다면 LLM 0.26이 좋은 출발점이 될 수 있음
- 다음 작업은 LLM tools v2 milestone에 13개 이슈로 정리되어 있음
- 주로 도구 실행 로그 표시 개선과 이번 릴리스를 막지 않은 작은 이슈들임
- 추가 이슈는 tools label에 있음
- 플러그인 가능성이 가장 기대되는 영역임
- 더 많은 모델 플러그인에 도구 지원을 추가하는 작업도 남아 있음
- 고급 플러그인 문서에 도구 지원 세부사항이 추가됨
- Gemini 도구 지원을 추가한 커밋이 필요한 작업을 보여주는 예시임
- Model Context Protocol 지원도 계획에 포함됨
- MCP는 모델이 도구에 접근하는 표준 방식으로 빠르게 부상 중임
- 2주 전에는 주요 벤더 API에서 직접 지원되지 않았지만, 최근 8일 사이 OpenAI, Anthropic, Mistral에 추가됨
- LLM이 MCP 클라이언트로 동작해 사람들이 작성하는 MCP 서버를 LLM의 추가 도구 소스로 쉽게 사용할 수 있게 하는 것이 목표임