<p align="center">
<img src="https://raw.githubusercontent.com/fkiene/llmtrim/HEAD/assets/logo.png" alt="llmtrim" width="450">
</p>
<h1 align="center">llmtrim</h1>
<p align="center">
<strong>LLM API 트래픽을 압축하여 비용을 절감하는 로컬 프록시. 동일한 답변, 더 작은 청구서입니다.</strong>
</p>
<p align="center">
<sub class="text-sm">
<b class="text-green-600">−31% 입력 · −74% 출력 · −66% 왕복 비용</b>
· 112개 실시간 A/B 케이스 · ~5 ms/호출 · 로드할 모델 없음
</sub>
</p>
<p align="center">
<sub class="text-sm">
<b class="text-blue-600">Claude Code</b>를 사용하시나요? 한 번의 설치로 CLIProxyAPI를 통해 서비스하는 <a href="#claude-code"><code>/sub</code></a>도 얻을 수 있습니다.
</sub>
</p>
<p align="center">
<sub class="text-sm">
프록시 · CLI · MCP · 라이브러리 (Python · Ruby · Swift · Kotlin · JS/WASM)
</sub>
</p>
<p align="center">
<picture>
<source media="(prefers-color-scheme: light)" srcset="assets/status-watch-light.svg">
<img src="https://raw.githubusercontent.com/fkiene/llmtrim/HEAD/assets/status-watch-dark.svg" alt="llmtrim status: Overview savings dashboard, Sessions, Detail, and Sub routing tab (CLIProxyAPI presets, fallback hops, and model map)" width="760">
</picture>
</p>
<p align="center">
<a href="https://github.com/fkiene/llmtrim/actions/workflows/ci.yml"><img src="https://github.com/fkiene/llmtrim/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MPL--2.0-blue" alt="License: MPL 2.0"></a>
<a href="https://crates.io/crates/llmtrim"><img src="https://img.shields.io/crates/v/llmtrim?logo=rust&cacheSeconds=3600" alt="crates.io"></a>
<a href="https://www.npmjs.com/package/@llmtrim/cli"><img src="https://img.shields.io/npm/v/@llmtrim/cli?logo=npm&cacheSeconds=3600" alt="npm"></a>
<a href="https://www.npmjs.com/package/@llmtrim/cli"><img src="https://img.shields.io/npm/dm/@llmtrim/cli?cacheSeconds=3600" alt="npm downloads"></a>
<img src="https://img.shields.io/badge/rust-1.88%2B-orange" alt="Rust 1.88+">
</p>
<p align="center">
<a href="#what-it-does">기능</a> •
<a href="#get-started">설치</a> •
<a href="#day-to-day">일상 사용</a> •
<a href="#in-action">실제 적용</a> •
<a href="#works-with">호환성</a> •
<a href="#claude-code">Claude Code</a> •
<a href="#the-numbers">수치 분석</a> •
<a href="#configuration">설정</a> •
<a href="#use-it-as-a-cli-mcp-or-library">CLI 및 라이브러리</a>
</p>
기능 (What it does)
You은 Claude Code, Codex, Cursor 또는 자체 앱을 실행합니다. 매 턴마다 도구는 시스템 프롬프트(system prompt), 도구 목록(tools), 대화 기록(history), 원시 명령어 출력(raw command output) 등 거대한 요청을 전송합니다. 사용자는 이 모든 토큰에 대해 비용을 지불하며, 여기에는 모델에게 도움이 되지 않는 부분도 포함됩니다.
200줄 분량의 빌드 로그와 두 개의 오류 메시지. 매 호출마다 재전송되는 도구 스키마(tool schemas). 수백 개가 거의 동일한 행으로 구성된 JSON 데이터. 이러한 대용량 데이터 역시 청구 대상입니다.
llmtrim은 로컬 프록시(local proxy)로 사용자의 장치에 위치하여, 불필요한 부분을 잘라내고(trims the waste), 더 작은 요청을 전송합니다. 응답 내용은 변경되지 않습니다. 사용자들은 동일한 도구와 답변을 유지하면서 비용을 절감할 수 있습니다.
이전: 당신의 도구 ───── 전체 요청 ─────▶ OpenAI / Anthropic / …
◀──────── 응답 ──────────
...
압축은 청구 금액을 올리거나 요청을 망가뜨릴 수 없습니다. 최악의 경우 비용 절감액이 '0'인 것뿐입니다. 모든 과정은 로컬에서 실행되며, 아무것도 우리에게 전송되지 않습니다. 실제 적용 →
Claude Code의 경우, 동일한 설치로 /sub 경로를 연결하여 세션을 다른 구독을 통해 라우팅할 수도 있습니다. 세부 정보 →
시작하기 (Get started)
npm install -g @llmtrim/cli@latest && llmtrim setup
llmtrim status
이것으로 충분합니다. setup 명령은 로컬 프록시를 시작하고 셸(shell)에 연결합니다. Claude Code가 존재할 경우, 자동으로 /sub도 활성화됩니다. 이를 위해 별도의 설치 과정이 필요하지 않습니다.
| 원하는 기능 | 실행 명령어 |
|---|
| 첫 설치 시 | llmtrim setup |
| ... | |
HTTPS_PROXY를 지원하는 모든 도구가 작동합니다 (Claude Code, Codex, Cursor, Aider, 사용자 SDK). GitHub Copilot은 작동하지 않습니다 (인증서 고정(certificate pinning) 문제). 전체 목록 →
<details>
<summary><b>다른 설치 프로그램</b> (Homebrew, curl, Scoop, Cargo, Docker)</summary>
curl -fsSL https://raw.githubusercontent.com/fkiene/llmtrim/main/install.sh | sh
...
전체 옵션: INSTALL.md.
</details>
<details>
<summary><b>데스크톱 트레이</b> (메뉴 바 / 시스템 트레이)</summary>
동일한 절감 수치를 보여주는 메뉴 바/시스템 트레이 팝오버를 제공합니다. Homebrew, Scoop, npm에 번들로 포함되어 있으며, setup을 통해 로그인 시 자동 실행을 활성화할 수 있습니다. llmtrim tray로 열 수 있습니다. Linux 데스크톱의 경우, 대화형 ensure를 사용하여 최신 릴리스에서 트레이 바이너리를 가져올 수 있습니다 (libwebkit2gtk-4.1 및 libayatana-appindicator3 필요).
<p align="center"><img src="https://raw.githubusercontent.com/fkiene/llmtrim/HEAD/crates/llmtrim-tray/docs/popover.svg" alt="llmtrim tray popover" width="320"></p>
</details>
<details>
<summary><b>안전한가요?</b></summary>
mitmproxy와 동일한 기술을 사용하지만, LLM API 호스트로만 범위를 제한합니다. setup은 세 가지를 변경하며, llmtrim uninstall이 이 세 가지를 모두 되돌립니다:
~/.llmtrim/ 내의 개인 CA (이름 제약; 은행이나 이메일을 가로챌 수 없음)
- 셸 환경 변수:
HTTPS_PROXY + CA 신뢰
- 로그인 서비스: 로그인 시 데몬 실행
API 키는 저장하지 않습니다 (사용자 도구의 인증은 전달됩니다). 프롬프트는 디스크에 절대 기록되지 않으며, 익명 토큰 카운트만 이루어집니다. 복구 가능한 도구 결과는 기본적으로 5시간 동안 제한된 데몬 RAM에 유지되며 재시작 시 사라집니다. 전체 위협 모델: SECURITY.md.
llmtrim ca
openssl x509 -in ~/.llmtrim/ca.pem -noout -text | grep -A3 "Name Constraints"
</details>
일상 사용법
llmtrim status
llmtrim update
llmtrim ensure
| 상황 | 명령어 |
|---|
| 절감액 확인 | llmtrim status |
| ... | |
After setup, update, 또는 ensure 실행 후, 소유한 Claude Code /sub는 바이너리와 동기화됩니다. | |
시계열 데이터: llmtrim status --daily · --weekly · --monthly · --json · --csv.
사용 예시 (In action)
에이전트가 빌드를 실행했습니다. 도구는 58줄을 반환했고, 그중 두 줄은 오류였습니다. 이 58줄 전체가 청구되었을 것입니다.
4,662자 → 978자 (−79%). 오류 내용은 그대로 유지됩니다. 반복되는 INFO 라인은 템플릿과 값으로 접혀서(범위가 규칙적일 때 손실 없음) 처리됩니다.
# 이전 (노이즈 + 신호)
[2026-06-13T10:02:00Z] INFO compiling module core::worker::task_0 (incremental)
… 28개의 유사한 INFO 라인 …
...
자신의 요청 본문으로도 시도해 보세요:
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim compress --provider openai
로그 접기(Log folding)는 한 단계일 뿐입니다. 다른 단계들은 다양한 종류의 낭비에 적용됩니다:
| 낭비 유형 | 처리 방식 |
|---|
| 빌드 로그, diff, grep 출력 | 오류 / 변경 사항 / 일치하는 항목은 유지하고 나머지는 접습니다 |
| ... | |
[!중요]
압축이 청구액을 늘리거나 요청을 실패하게 만들 수 없습니다. 각 단계는 제공업체의 실제 토크나이저로 재측정되며, 토큰 절약에 기여하지 못하면 되돌려집니다. 만약 제공업체가 압축된 본문을 거부할 경우, 원래의 본문이 다시 전송됩니다. 최악의 경우 절감액은 0입니다.
기존 프롬프트 캐시 접두사(cache_control)는 그대로 유지됩니다. 첫 도착 복구형(First-arrival recoverable shaping) (llmtrim recall r_…)은 기본적으로 비활성화되어 있습니다. 라이브 영역 도구 출력 창(live-zone tool-output windowing)은 여전히 작동하며, 동일한 도구를 재실행할 경우 전체 내용이 전송됩니다. 명령어의 접기 방지(verbatim stdout, 터미널 트레일러 포함)를 건너뛰려면 `toolout_passthrough = [
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
| Stage | 기능 설명 | 실행 시점 |
|---|
| tool-output | 손실 없는 템플릿 폴딩을 먼저 수행한 후, 창 로그(logs) · diffs · grep · dumps를 오류/변경 사항/일치 항목으로 축소합니다. llmtrim recall을 사용하면 선택적 첫 도착 회상(first-arrival recall)을 통해 누락된 캐시 경계 결과(cache-boundary results)를 복원할 수 있습니다. | 도구 결과 (tool results) |
| ... | | |
기본값인 auto는 비용이 발생하는 단계에서만 각 단계를 활성화합니다. safe는 손실 없는 경우에만 작동합니다. 설정 → | | |
Claude Code
~/.claude가 존재하는 경우, setup, update, 및 ensure 명령은 /sub (및 라우팅된 서브 에이전트)를 연결합니다. 별도의 설치 명령어가 필요하지 않습니다.
| 기능 | 얻게 되는 것 |
|---|
/sub | 창별: `/sub on [선택적:codex |
<details>
<summary><b>구독 라우팅 (`sub`)</b> (선택 사항; 제공업체 ToS와 충돌할 수 있음)</summary>
Anthropic 대신 CLIProxyAPI를 통해 Claude Code를 전송하거나, 현재 경로가 실패했을 때 폴백(fallback) 홉으로 사용할 수 있습니다. 로그인은 CLIProxyAPI의 TUI입니다. 이것이 제공업체 ToS에 적합한지 스스로 결정해야 합니다.
llmtrim sub on
llmtrim sub on grok
llmtrim sub auth
...
대화형: llmtrim status → 탭 4 Sub — Off / Always / Fallback, 그런 다음 e를 눌러 입력→출력 맵을 편집합니다 (검색하려면 CLIProxyAPI의 카탈로그로 타이핑). s는 저장(save), a는 추가(add), d는 삭제(delete)입니다. [ ]를 사용하여 폴백 첫 홉을 순환합니다. llmtrim update는 CLIProxyAPI를 사용할 때 자동으로 업데이트됩니다. 관리되는 사이드카(managed sidecar)를 건너뛰려면 LLMTRIM_CLIPROXY_URL을 기존 인스턴스로 지정하세요.
부모 창은 변경하지 않고 특정 위임된 Claude Code 서브 에이전트만 라우팅하는 방법:
자연스럽게 다음과 같이 질문하세요: Grok 서브 에이전트를 사용해 구현, Terra를 사용, 또는 GPT Terra로 검토.
Provider 전용 에이전트는 구성된 매핑을 통해 자식 요청의 Claude 티어를 보존합니다. 명시적 모델 에이전트는 해당 Provider 모델을 고정(pin)합니다. 요청 로컬 에이전트는 자체 요청에 대해서만 윈도우 /sub와 글로벌 정책을 재정의합니다. llmtrim agents uninstall은 llmtrim 소유의 에이전트 파일만 제거하고, ensure가 이들을 제거하도록 옵트아웃(opt-out) 기록을 남깁니다.
이 윈도우는 오직 (ensure로 설치되며; 서브 에이전트를 포함하며; /clear에도 살아남음):
/sub on [선택 사항:cli-or-model] # gemini, codex, claude, grok, kimi, vertex, qwen, copilot, 또는 모델 ID
/sub off
/sub status
사이드카(Sidecar): ~/.llmtrim/cliproxy/ (바이너리 + 설정). 인증(Auth): 존재 시 ~/.cli-proxy-api, 아니면 ~/.llmtrim/cliproxy/auth. 환경 변수(Env): LLMTRIM_SUB, LLMTRIM_SUB_MODE, LLMTRIM_CLIPROXY_URL, LLMTRIM_CLIPROXY_KEY.
Anthropic /login 대 claude.ai 커넥터: 글로벌 sub가 always 모드일 경우, 기본적으로 llmtrim은 더미(dummy) ANTHROPIC_AUTH_TOKEN을 ~/.claude/settings.json에 작성합니다 (이는 claude-code-proxy의 ANTHROPIC_AUTH_TOKEN=unused와 같은 아이디어입니다). 따라서 Claude Code는 활성 Anthropic OAuth 세션이 필요하지 않습니다.
MITM은 이 더미 토큰을 제거하고 /v1/messages를 CLIProxyAPI로 전송합니다. 메시지가 아닌 Anthropic 프로브(probe) 요청은 로컬에서 응답되므로 401 Invalid bearer token을 반환하지 않습니다.
Claude Code는 모든 API 키 인증을 claude.ai 로그인 재정의로 취급하므로, 더미 토큰이 설정된 동안 claude.ai 커넥터는 비활성화됩니다. 이는 예상된 동작입니다. 커넥터를 유지하고 (세션 만료 시 Anthropic /login을 수락하려면):
llmtrim sub anthropic-login keep
llmtrim sub anthropic-login skip
<details>
<summary>설정 변경 적용을 위해 `sub on` / `sub off` / `sub mode` / `sub anthropic-login` 후 Claude Code를 재시작해야 합니다. 첫 번째 호퍼가 'what's in use'인 폴백(Fallback)도 실제 Anthropic 로그인이 필요합니다.</summary>
</details>
CLI, MCP 또는 라이브러리로 사용하기
동일한 엔진을 사용하며 프록시가 필요 없습니다. 추가 모델 호출 없이 압축이 인프로세스(in-process)로 실행됩니다.
| 언어 | 설치 방법 |
|---|
| Rust | cargo add llmtrim-core |
| ... | |
<details>
<summary><b>CLI 파이프</b></summary>
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim compress --provider openai > out.json
echo '{"model":"gpt-4o","messages":[...]}' | llmtrim send --provider openai
</details>
<details>
<summary><b>Rust · Python · JS</b></summary>
use llmtrim_core::{compress, ir::ProviderKind};
let out = compress(request_json, Some(ProviderKind::OpenAi))?;
import llmtrim
out = llmtrim.compress(request_json, llmtrim.Provider.OPEN_AI, "aggressive")
import { compress } from "@llmtrim/js";
const out = compress(requestJson, "openai", "aggressive");
</details>