Local Code
Local Code는 Mac, iPad 및 iPhone용 사설 AI 에이전트이며, 주로 Swift로 작성되었습니다. 이 앱은 세 가지 요소를 하나로 통합합니다: Apple Silicon을 위한 LLM 추론 엔진 (LLM inference engine), 각 모델에 맞게 조정된 코딩 하네스 (coding harness), 그리고 Python, Node.js, 셸 및 기타 친숙한 도구들이 내장된 에이전트 런타임 (agent runtime)입니다. 이를 통해 이 에이전트는 데이터 분석, 차트 작성, 문서 및 슬라이드 데크 작성, 또는 소프트웨어 구축과 같은 전체 작업을 선택한 파일에 걸쳐 처리할 수 있습니다.
DeepSeek 4.1 Flash 1017과 같은 온디바이스 준최첨단 모델(on-device quasi-frontier model)을 사용하면 추론이 장치에서 실행되며 오프라인으로 작동합니다. 또한 Anthropic, OpenAI, OpenRouter 또는 OpenAI와 호환되는 서버에서 클라우드 모델을 선택할 수도 있습니다. 이 경우 프롬프트, 파일 내용 및 도구 출력은 해당 제공업체로 전송됩니다. 어느 쪽이든 에이전트의 도구는 앱의 샌드박스(sandbox) 내에서 실행되며 사용자가 허용한 폴더에만 접근할 수 있습니다.
Local Code는 getlocalcode.app에서 다운로드하세요.
이 저장소에는 앱의 소스 코드와 명령줄 도구, 그리고 이들이 구축된 라이브러리 및 벤더링된 의존성(vendored dependencies)이 포함되어 있습니다.
실제 작업을 수행하는 에이전트
실제 작업을 수행하는 에이전트는 추론 엔진, 하네스, 모델 이상의 것이 필요합니다. 또한 사람들은 잘 만들어진 소프트웨어에서 기대하는 다음 기능들도 필요합니다:
- 지속 가능한 작업 및 스레드 (Durable tasks and threads): 작업과 채팅 스레드는 저장되므로 앱을 닫았다가 나중에 다시 시작할 수 있습니다.
- 재개 가능한 생성 (Resumable generation): 중단된 응답(추론 포함)은 처음부터 다시 시작하는 대신 멈춘 지점부터 계속됩니다.
- 방향 전환 (Steering): 에이전트가 작업하는 동안에도 언제든지 메시지를 보내 그 방향을 바꿀 수 있습니다.
- 장기 컨텍스트 캐시 (Long-term context cache): 모델의 컨텍스트는 이미지와 일부 모델이 유지하는 순환 상태(recurrent state)를 포함하여 디스크에 저장되므로, 긴 대화가 처음부터 다시 읽히지 않습니다.
엔진과 모델은 여전히 중요하며, 이 섹션의 나머지는 그들을 다룹니다: 즉, 모델들, 에이전트가 작동하는 샌드박스, 그리고 모델들이 얼마나 빠르고 정확하게 실행되는지에 대한 내용입니다.
모델 (Models)
Local Code는 각 모델의 양자화된 체크포인트를 자체적으로 다운로드합니다:
| Model | Quantizations | Input | Download size |
|---|
| DeepSeek 4.1 Flash 1017 | 2-bit S, 3-bit S | Text and images | 376 GB, 412 GB |
| ... | | | |
DeepSeek 4.1 Flash 1017의 크기에는 두 양자화 버전이 공유하는 203 GB의 engram 파일이 포함되어 있습니다.
DeepSeek 모델은 전문가 혼합(Mixtures of Experts) 구조를 가지고 있으며, 대부분의 Mac 메모리보다 더 큰 용량을 차지합니다. 예를 들어, DeepSeek 4.1 Flash 1017 (2-bit S) 체크포인트는 약 173 GB입니다. Local Code는 사용 가능한 공간 내에서 가장 많이 사용되는 전문가들을 최대한 메모리에 유지하고, 나머지는 디스크에서 스트리밍합니다. 또한 다른 앱을 실행할 여유 공간도 확보해 줍니다. 메모리에 유지되는 전문가들은 Mac의 메모리가 최소한 32 GB를 초과하지 않으며, 모델 로드 시 확보된 메모리의 72%를 넘지 않습니다. 따라서 이 모델들은 체크포인트보다 적은 메모리를 가진 Mac에서도 실행할 수 있으며, 메모리가 많을수록 더 빠르게 작동하고 나머지 시스템 자원도 사용할 수 있도록 남겨둡니다.
설정 과정 중 Local Code는 장치의 메모리를 기반으로 다음 모델들을 추천합니다:
- 32 GB 미만: Qwen 3.8 27B (2-bit S)
- 32 GB 이상: Qwen 3.8 27B (4-bit S)
- 48 GB 이상: DeepSeek 4 Flash 0731
- 64 GB 이상: DeepSeek 4.1 Flash 1017
나중에 원하는 모델로 전환할 수 있습니다.
앱 내 샌드박스 (The In-App Sandbox)
Local Code는 에이전트의 명령을 컴퓨터에서 별도의 프로그램으로 실행하지 않습니다. 셸(shell), 언어 런타임, 그리고 커맨드라인 도구들은 모두 앱 내에 컴파일되어 Apple의 App Sandbox 내부 프로세스에서 실행됩니다. Mac에서는 Hardened Runtime 역시 앱의 코드를 보호합니다. 에이전트는 전체 디스크 접근 권한을 가지지 못하며, 사용자의 컴퓨터에서 다른 프로그램을 실행할 수 없으므로, 앱에 내장되지 않은 네이티브 프로그램은 실행할 수 없습니다.
각 프로젝트는 사용자가 선택한 작업 공간(workspace) 내의 폴더입니다. 에이전트는 해당 프로젝트 폴더에서 시작하며, 작업 공간 전체와 앱의 임시 폴더 어디든 읽고 쓸 수 있습니다. 에이전트가 프로젝트를 위해 설치하는 패키지 및 캐시는 해당 프로젝트 폴더에 보관됩니다. 웹 검색(web search), curl, ssh와 같이 네트워크를 사용하는 명령어는 에이전트가 실행할 때 외부로 연결됩니다.
샌드박스에는 다음 기능들이 포함되어 있습니다:
- Shell: Oils의 OSH를 통해,
grep, sed, awk, find, diff, rg, jq, zip, curl, git 및 ssh와 같은 일반적인 Unix 명령어를 사용할 수 있습니다.
- Python 3.14: NumPy, pandas, Matplotlib, Pillow, lxml, openpyxl, python-docx, python-pptx, pypdf 라이브러리와 더 많은 패키지를 위한
pip가 포함되어 있습니다.
- Node.js 24:
npm과 npx를 사용할 수 있습니다.
- Lean 4 및 Z3: 증명(proof)을 확인하고 제약 조건 문제(constraint problems)를 해결하는 데 사용됩니다. Lean은 Mathlib도 설치할 수 있습니다.
- 문서 및 미디어:
office 명령어를 통해 LibreOffice가 포함되어 Word, Excel, PowerPoint 및 PDF 파일을 변환하고 렌더링할 수 있습니다. 또한 HTML에서 비디오를 만들기 위한 FFmpeg와 html2video, hyperframes도 제공됩니다.
- 웹(Web): 웹 검색 기능과 에이전트가 페이지 테스트나 JavaScript 또는 로그인 절차가 필요한 사이트를 탐색하는 데 사용할 수 있는 WebKit 브라우저가 포함되어 있습니다.
- 이미지 및 비디오: 이미지와 비디오를 생성하기 위한 Draw Things CLI가 제공됩니다.
- 개인 데이터: 이벤트 읽기 및 편집을 위한
calendar, 사진 및 비디오 검색, 가져오기, 편집 및 정리 기능을 위한 photos가 포함되어 있습니다. Mac의 경우, notes, mail, imessage도 Notes, Mail, Messages를 읽지만, 변경하거나 전송할 수는 없습니다. 각 명령어는 접근 권한을 부여해야만 작동합니다.
내장된 스킬(Built-in skills)은 에이전트가 일반적인 작업을 위해 이러한 도구들을 사용하는 방법을 보여줍니다:
| 스킬 | 용도 |
|---|
office | Word, PowerPoint 및 Excel 파일과 CSV 또는 TSV 테이블을 생성, 읽기, 편집하고 확인하며 PDF 또는 이미지로 내보내기 |
| ... | |
사용자는 프로젝트의 .agents/skills 폴더에 자체 스킬을 추가할 수 있습니다.
Mac에서의 성능
속도는 토큰/초(tokens per second) 단위이며, prefill / decode로 제공됩니다. 각 열은 해당만큼의 컨텍스트가 이미 사용 중인 상태에서 시작합니다. 그 위에 Local Code는 추가로 하나의 전체 청크(chunk)를 prefill하고, 별도로 128 토큰을 decode합니다. 청크는 해당 Mac에서 Local Code가 한 번에 prefill할 수 있는 최대 토큰 수를 의미하며, M5 Max에서는 4,096 토큰, M5 Ultra에서는 8,192 토큰입니다.
M5 Max, 128 GB
| Model | 8K already in context | 16K already in context | 32K already in context | 128K already in context |
|---|
| Qwen 3.8 27B (4-bit S) | 1,450 / 40.4 | 1,296 / 35.0 | 1,005 / 27.9 | 456 / 13.5 |
| ... | | | | |
M5 Max에서는 DeepSeek 4.1 Flash 1017 측정값이 Weight Streaming을 56 GiB로 설정했습니다 (--weights-streaming 56을 CLI에서 사용). DeepSeek 4 Flash 0731은 모든 가중치(weights)를 메모리에 유지합니다. | | | | |
M5 Ultra, 256 GB
| Model | 8K already in context | 16K already in context | 32K already in context | 128K already in context |
|---|
| Qwen 3.8 27B (4-bit S) | 2,689 / 54.5 | 2,247 / 44.0 | 1,988 / 33.2 | 962 / 12.2 |
| ... | | | | |
| M5 Ultra에서는 두 DeepSeek 측정값 모두 동일 세션 내에서 이루어진 두 번째 패스이며, 각 prefill 전에 20초의 냉각 시간(cool-down)이 없습니다. DeepSeek 4.1 Flash 1017의 경우, 그 engram 항목들도 이미 메모리에 있습니다. | | | | |
이 차트는 동일한 M5 Ultra에서 DeepSeek 4.1 Flash 1017의 prefill 속도를 Local Code, MLX-Serve v26.10.3 (iQ-MLX 3.0bpw 체크포인트 사용), 그리고 oMLX 0.7.2 (oQ2.5e 체크포인트 사용)에서 비교합니다. 각 측정값은 주어진 컨텍스트 양 위에 8,192 토큰 청크를 prefill하는 시간만을 측정합니다. Local Code 측정값은 위 표와 동일한 실행에서 나온 것이며, CED가 모두 활성화된 MLX-Serve 및 oMLX 측정값은 세 번의 실행에 대한 중앙값(median)입니다. 각 Local Code 포인트 위의 레이블은 해당 컨텍스트 길이에서 MLX-Serve와 oMLX 중 더 빠른 값보다 얼마나 더 빠른지를 나타냅니다.
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/images/prefill-vs-mlx-dark.svg">
<img alt="Local Code, MLX-Serve v26.10.3 및 oMLX 0.7.2에서 M5 Ultra를 사용한 DeepSeek 4.1 Flash 1017의 prefill 속도. 데이터는 차트 아래 표에 있습니다." src="https://raw.githubusercontent.com/drawthingsai/local-code-community/HEAD/.github/images/prefill-vs-mlx-light.svg">
</picture>
<details>
<summary>데이터(Data)</summary>
속도는 초당 토큰(tokens per second) 단위입니다.
| 사용 컨텍스트 | Local Code (2-bit S) | MLX-Serve v26.10.3 (iQ-MLX 3.0bpw) | oMLX 0.7.2 (oQ2.5e) |
|---|
| 0 | 4,547 | 1,945 | 1,529 |
| ... | | | |
</details>
사용자의 Mac을 측정하려면 앱에서 Model Speed를 열거나, 모델의 최대 길이까지 컨텍스트 길이(context lengths)에 대해 동일한 측정을 CLI로 실행하십시오:
bazel run -c opt //Apps/LocalCode:LocalCodeCLI -- speedometer \
--model qwen_3.8_27b_i4x.ckpt --result-json /path/to/speed.json
벤치마크 (Benchmarks)
이 차트는 Local Code에서 DeepSeek 4.1 Flash 1017 (2-bit S)의 성능을 DeepSeek이 보고한 DeepSeek 4.1 Flash 0910 점수와 비교합니다:
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/images/benchmarks-dark.svg">
<img alt="Local Code에서 DeepSeek 4.1 Flash 1017 (2-bit S)의 벤치마크 점수와 DeepSeek이 보고한 DeepSeek 4.1 Flash 0910 점수. 데이터는 차트 아래 표에 있습니다." src="https://raw.githubusercontent.com/drawthingsai/local-code-community/HEAD/.github/images/benchmarks-light.svg">
</picture>
| 벤치마크 | DeepSeek 4.1 Flash 0910 (보고된 점수) | DeepSeek 4.1 Flash 0910 (2-bit S) | DeepSeek 4.1 Flash 1017 (2-bit S) |
|---|
| AIME 2026 | — | 30/30 (100%) | 30/30 (100%) |
| ... | | | |
보고된 점수는 최대 추론 노력(maximum reasoning effort)을 기준으로 모델 카드에서 가져온 것입니다. 2-bit S MathArena Apex 점수는 12개 문제에 대한 여러 번의 실행 평균입니다: 0910은 두 번, 1017은 세 번입니다.
시도당 평균 추론 토큰 수(Average reasoning tokens per attempt):
| Benchmark | DeepSeek 4.1 Flash 0910 (보고된 수치) | DeepSeek 4.1 Flash 0910 (2-bit S) | DeepSeek 4.1 Flash 1017 (2-bit S) |
|---|
| AIME 2026 | — | 15,710 | 16,909 |
| ... | | | |
양자화 품질 (Quantization Quality)
KL 발산(KLD, Kullback-Leibler Divergence)은 양자화된 모델의 예측이 원본 모델의 예측과 얼마나 벗어나는지를 측정합니다. 수치가 낮을수록 더 가깝습니다. 이 차트들은 두 데이터셋(Wiki10k 및 대화 기록(assistant 토큰만))에 대해 DeepSeek 4.1 Flash 1017 양자화의 KLD를 가중치 크기와 비교합니다.
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/images/kld-vs-size-dark.svg">
<img alt="DeepSeek 4.1 Flash 1017 양자화의 Wiki10k에 대한 KLD와 크기 비교. 데이터는 차트 아래 표에 있습니다." src="https://raw.githubusercontent.com/drawthingsai/local-code-community/HEAD/.github/images/kld-vs-size-light.svg">
</picture>
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/images/kld-conversation-traces-vs-size-dark.svg">
<img alt="DeepSeek 4.1 Flash 1017 양자화의 대화 기록(assistant 토큰만)에 대한 KLD와 크기 비교. 데이터는 차트 아래 표에 있습니다." src="https://raw.githubusercontent.com/drawthingsai/local-code-community/HEAD/.github/images/kld-conversation-traces-vs-size-light.svg">
</picture>
크기(Size)는 engram 테이블과 MTP 레이어를 제외합니다. 체크포인트는 다양한 정밀도로 engram 테이블을 저장하며, MTP 레이어는 MLX 체크포인트에만 포함됩니다.
<details>
<summary>데이터 (Data)</summary>
| Checkpoint | Size of weights | KLD, Wiki10k | KLD, conversation traces (only assistant tokens) |
|---|
| Local Code 2-bit S | 173.0 GB | 0.28516 | 0.050512 |
| ... | | | |
</details>
Qwen 3.8 27B
Qwen 3.8 27B는 이미지를 이해하는 소형 모델이며, 코딩 및 장기 작업(long-horizon work)에 강점을 보입니다. Local Code는 메모리가 48GB 미만인 장치에 이 모델을 추천합니다.
프리필 속도 (Prefill Speed)
모델이 첫 토큰을 작성하기 전에 전체 프롬프트(prompt)를 읽어야 합니다. 에이전트(agent)의 경우, 이는 지금까지의 대화 내용, 열었던 파일, 그리고 도구(tool)의 출력을 의미합니다. 이 단계를 프리필(prefill)이라고 부릅니다. 각 도구 호출은 컨텍스트(context)에 추가되므로, 에이전트 작업에서는 종종 프리필 단계가 기다려지는 부분이 됩니다.
이 차트는 256GB 메모리를 갖춘 M5 Ultra에서 Local Code와 Apple silicon용 오픈 소스 추론 엔진인 Splash에서의 프리필 속도를 비교합니다. Splash는 모델의 UD-Q4_K_XL GGUF 체크포인트(checkpoint)를 실행합니다. 각 읽기는 주어진 컨텍스트 양이 이미 사용된 후 8,192 토큰 청크(chunk)를 프리필합니다. Local Code 지점 위에 표시된 레이블은 두 Splash 설정 중 더 빠른 속도보다 얼마나 더 빠른지를 나타냅니다.
<picture>
<source media="(prefers-color-scheme: dark)" srcset=".github/images/prefill-vs-splash-dark.svg">
<img alt="Qwen 3.8 27B prefill speed on an M5 Ultra, for Local Code and for Splash with a BF16 or an Int8 KV cache. The data is in the table below the chart." src="https://raw.githubusercontent.com/drawthingsai/local-code-community/HEAD/.github/images/prefill-vs-splash-light.svg">
</picture>
<details>
<summary>데이터</summary>