New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging

Simon Willison

LLM 신버전 출시, 추론 과정 표시와 OpenAI Responses, 서버 측 도구 및 개선된 로깅 지원 추가

원문은 Simon Willison님이 에 게재했습니다. 이 블로그 구독하기

오늘 아침 LLM 0.32를 출시했다. 프로젝트가 처음 공개된 이후 가장 큰 규모의 업데이트다. 이번 버전은 보이는 추론 과정, 서버 측 프로바이더 도구, 재설계된 콘텐츠 주소 지정 SQLite 로그, 새로운 모델, 그리고 OpenAI Responses API로 가능해진 새로운 기능에 대한 지원을 포함한다. 상당한 업데이트가 담긴 llm-anthropic 플러그인의 새 버전도 함께 출시했다.

LLM CLI 사용자를 위한 주요 기능

이제 추론 모델에 대해 LLM을 실행하면 추론 과정이 표준 에러로 표시되어, 다른 도구에 파이프로 연결할 수 있는 표준 출력에 포함되지 않고도 모델이 무엇을 “생각”하는지 확인할 수 있다. 이 기능을 끄려면 -R/--hide-reasoning을 추가하면 된다.

macOS 터미널 창에서 llm "think about the best thing about pelicans"를 실행하는 모습 - 회색 텍스트로 Exploring pelican qualities라는 추론 과정이 한 단락 출력된 뒤, 이어서 흰색 텍스트로 답변이 출력된다: 펠리컨의 가장 멋진 점은 놀랍도록 크고 실용적인 디자인이다. 그 거대한 부리와 주머니는 우스꽝스러워 보이지만 펠리컨을 놀라울 정도로 뛰어난 어부로 만들어 준다. 더 멋진 점은 많은 종이 협력한다는 것이다. 함께 물고기를 몰아 넣은 뒤 건져 올린다. 펠리컨은 어수룩하면서도 우아하고 놀랍게도 영리한 매력을 두루 갖춘 존재다.

LLM은 GPT-5.6 모델 패밀리를 기본으로 지원하며, llm "prompt"로 사용할 때의 새로운 기본 모델은 저렴하면서도 성능이 뛰어난 GPT-5.6 Luna다.

이제 LLM 호출에서 다양한 프로바이더가 제공하는 서버 측 도구를 사용할 수 있다. OpenAI는 서버 측 도구로 코드 실행 환경을 제공하며, LLM에서는 이를 활용하는 프롬프트를 다음과 같이 실행할 수 있다:

llm --tool CodeInterpreter 'Show current python and SQLite versions'

OpenAI에는 WebSearch 도구도 추가됐다.

llm-anthropic 플러그인은 WebSearch, WebFetch, CodeExecution 그리고 AnthropicMCP를 추가하며, 사용법은 다음과 같다:

llm -m claude-sonnet-5 -T 'AnthropicMCP("https://datasette.simonwillison.net/-/mcp")' \
  'how many rows in the blog_blogmark table?'

이렇게 하면 Anthropic이 API와의 단일 요청/응답 상호작용 과정에서 필자의 새로운 datasette-mcp 플러그인을 상대로 MCP 호출을 실행하게 된다.

새로운 llm openai endpoint 명령어는 모든 OpenAI 호환 엔드포인트에 대해 프롬프트를 실행하는 도구를 한 줄 명령어로 제공한다. 이 호출은 로그에 남지 않으므로, LLM API 세계의 공용어를 사용하는 모든 대상에 일회성 프롬프트를 실행하기에 유용한 도구다.

다음은 uvx를 이용해(LLM 설치 없이) llm-tools-quickjs 도구 플러그인까지 곁들여, 로컬호스트의 LM Studio API에서 실행 중인 Gemma 4 12B에 프롬프트를 보내는 필자의 사용 예다:

uvx --with llm-tools-quickjs \
  llm openai endpoint http://localhost:1234/v1 -m google/gemma-4-12b \
  -T QuickJS 'Use QuickJS to multiply 3434 * 2434' --td

출력 내용: Tool call: QuickJS_execute_javascript({'javascript': '3434 * 2434'}) 8358356 The result of 3434 * 2434 is 8,358,356.

Python API의 새로운 기능

LLM의 Python API는 이전에는 대화를 생성한 뒤 메시지를 하나씩 보내야 했다. 이는 각 요청이 이전 메시지들의 전체 히스토리를 담아 전송된다는 LLM의 실제 동작을 추상화한 것이었는데, 일부 고급 사용 사례에서는 오히려 방해가 되기 시작했다. 그래서 이번 릴리스에서는 model.prompt(messages=[]) 파라미터를 도입했으며, 다음과 같이 사용할 수 있다:

import llm
from llm import user, assistant, system

model = llm.get_model("gpt-5.6-luna")

response = model.prompt(messages=[
    system("You are a helpful pirate."),
    user("What is the capital of France?"),
    assistant("Paris, matey."),
    user("And Germany?"),
])
print(response.text())

이전에 LLM은 각 프롬프트에 대해 문자열의 이터러블 시퀀스를 반환했다. 모델이 문자열 응답만 반환할 때는 잘 동작했지만, 모델이 진화해 나갈 기묘한 형태를 예측하지는 못했다. 오늘날 많은 모델은 추론 텍스트, 출력 문자열, 도구 호출, 심지어 이미지 첨부까지 뒤섞어 반환한다. LLM 0.32에서는 대신 이렇게 할 수 있다:

for event in model.prompt("Explain cats").stream_events():
    if event.type == "reasoning":
        print(f"[thinking] {event.chunk}", end="", flush=True)
    elif event.type == "text":
        print(event.chunk, end="", flush=True)
    else:
        print(f"Other event: {event}")

이 기능들을 조합하면 준 표준인 OpenAI chat completions API의 견고한 구현을 드디어 제공할 수 있으며, 필자는 이를 llm-chat-completions-server 플러그인으로 출시했다:

llm install llm-chat-completions-server
llm chat-completions-server --port 9000
# Server is now running on http://127.0.0.1:9000/v1

이제 새로운 llm openai endpoint 명령어를 사용해 해당 서버를 통해 LLM에 프롬프트를 실행할 수 있다!

llm openai endpoint http://127.0.0.1:9000/v1 'hello' -m gpt-5.4-mini

이러한 유형의 API에서 더 큰 과제는 로깅이다. 매 요청마다 메시지 시퀀스가 덧붙는 패턴을 지원하려면, 매 턴마다 중복되는 JSON 전체를 로깅하지 않는 것이 이상적이다.

해결책은 Git을 모델로 한 새로운 콘텐츠 주소 지정 메시지 저장소다. 새로운 스키마는 문서에서 확인할 수 있으며, llm logsllm logs --json 명령어는 모두 해당 형식을 다시 쉽게 소비할 수 있는 형태로 변환하도록 업그레이드됐다.

그 밖의 변경 사항

이번 릴리스에는 이 외에도 많은 내용이 담겨 있다. 0.32 릴리스 노트가 꽤 포괄적이며, 0.32rc2, 0.32rc, 0.32a3, 0.32a20.32a0에 대한 노트를 보면 빠진 부분을 채울 수 있을 것이다.

기존 LLM 플러그인은 모두 계속 동작해야 하지만, 추가 모델을 제공하는 플러그인은 새로운 스트리밍 이벤트 시스템에 완전히 참여하려면 0.32로 업그레이드해야 한다. 문서에는 Structured messages and streaming events를 활용한 플러그인 구현 가이드가 있다.

필자의 플러그인 중 일부도 업데이트했다:

  • llm-anthropic 0.26은 Claude 5 모델 패밀리에 대한 지원과 함께 WebSearch, WebFetch, CodeExecutionAnthropicMCP 서버 측 도구를 추가한다.
  • llm-geminillm-openrouter 그리고 llm-mistral도 거의 준비됐으며, 곧 출시될 예정이다.

이제 LLM은 에이전트 프레임워크라고 할 수 있을 것 같다

이번 릴리스의 저수준 도구 변경 사항 중 상당수는 Datasette Agent의 요구에 의해 추진됐다. 필자가 LLM 작업을 시작했을 때 “agent”라는 용어는 정의가 너무 모호해서 사용을 거부했었다. 2025년 9월에 이르러 “LLM 에이전트는 목표를 달성하기 위해 루프 안에서 도구를 실행한다”라는 정의가 충분히 확립됐다고 판단해, 이 용어를 완전히 피하는 것을 그만두게 됐다.

도구 체인은 이제 인간의 승인을 위해 일시 중지하고 저장된 메시지 히스토리에서 재개할 수 있다 — 둘 다 Datasette Agent에 필요한 기능이다.

오늘날 LLM을 보면 점점 에이전트다운 모습이 되어가고 있다. 서로 다른 출처의 다양한 도구와 서로 다른 모델을 한 줄 명령어로 섞어 쓸 수 있는 CLI 유틸리티가 있다는 점이 멋지며, 여기에는 Datasette Agentllm-coding-agent 같은 시스템을 구축할 수 있을 만큼 강력한 Python 라이브러리도 포함되어 있다.

아마 다음 버전의 LLM에서는 “에이전트”라는 개념을 코어 라이브러리에 직접 녹여낼지도 모른다. 아직 그 모습이 어떨지 고민 중이다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글