여러 플랫폼에서 AI 코딩 어시스턴트의 토큰 사용량과 비용을 추적하는 고성능 CLI 도구 및 시각화 대시보드
Tip
v2 출시 — 네이티브 Rust TUI, 크로스 플랫폼 지원 등.
저는 매주 새로운 오픈소스 프로젝트를 공개합니다. 놓치지 마세요.
| X에서 @Tokscale을 팔로우하고 릴리스 소식과 업데이트를 받아보세요. | |
|---|---|
| Discord에서 함께해요 — 세계 최고의 바이버들과 어울리세요. | |
| GitHub Sponsors를 통해 Tokscale의 지속적인 개발을 후원해 주세요. | |
| GitHub에서 @junhoyeo를 팔로우하고 더 많은 프로젝트를 만나보세요. AI, 인프라 등 다양한 분야를 다룹니다. |
🇺🇸 English | 🇰🇷 한국어 | 🇯🇵 日本語 | 🇨🇳 简体中文
| Overview | Models |
|---|---|
![]() |
![]() |
| Daily Summary | Stats |
|---|---|
![]() |
![]() |
| Session Details | Hourly |
|---|---|
![]() |
![]() |
| Frontend (3D Contributions Graph) | Wrapped 2025 |
|---|---|
![]() |
![]() |
bunx tokscale@latest submit를 실행하여 사용량 데이터를 리더보드에 제출하고 공개 프로필을 만드세요!
Tokscale은 아래 플랫폼들의 토큰 소비량을 수집하고 분석해 한 눈에 볼 수 있도록 해 줍니다.
| 로고 | 클라이언트 | 데이터 위치 |
|---|---|---|
![]() |
OpenCode | ~/.local/share/opencode/opencode.db (1.2+, opencode-stable.db 등 모든 채널 포함) 또는 ~/.local/share/opencode/storage/message/ |
![]() |
Claude Code | ~/.claude/projects/ 및 ~/.claude/transcripts/ |
![]() |
OpenClaw | ~/.openclaw/agents/ (*/agent/openclaw-agent.sqlite + */sessions/*.jsonl; + 레거시: .clawdbot, .moltbot, .moldbot) |
![]() |
Codex CLI | ~/.codex/sessions/ 및 ~/.codex/archived_sessions/ (*.jsonl과 zstd로 압축된 *.jsonl.zst, 기타 아카이브 사본 포함; 같은 rollout의 사본은 한 번만 집계) |
![]() |
Prime Agent | ~/.prime/agent/sessions/ 및 ~/.prime/agent/session-artifacts/ (RLM 하위 세션) |
![]() |
Sakana Fugu | Codex를 통해 추적 — ~/.codex/sessions/ 및 ~/.codex/archived_sessions/의 rollout (model_provider: sakana) |
![]() |
GitHub Copilot CLI | ~/.copilot/session-store.db (CLI 사용량 이벤트; OTEL 불필요), ~/.copilot/otel/*.jsonl (+ COPILOT_OTEL_FILE_EXPORTER_PATH), ~/.copilot/data.db |
![]() |
Hermes Agent | $HERMES_HOME/state.db 및 $HERMES_HOME/profiles/*/state.db (폴백: ~/.hermes/...) |
![]() |
Gemini CLI | $GEMINI_CLI_HOME/tmp/*/chats/*.json (폴백: ~/.gemini/tmp/*/chats/*.json) |
![]() |
Cursor IDE | Cursor API 사용량을 ~/.config/tokscale/cursor-cache/usage*.json에 캐싱 (레거시 usage*.csv 캐시도 계속 읽음; 데스크톱 자동 로그인 또는 쿠키 붙여넣기; ~/.cursor 아님) |
![]() |
Amp (AmpCode) | ~/.config/tokscale/amp-cache/threads/ (tokscale amp sync) |
![]() |
Codebuff | ~/.config/manicode/ (+ manicode-dev, manicode-staging; CODEBUFF_DATA_DIR로 오버라이드 가능) |
![]() |
Freebuff | Codebuff와 동일한 ~/.config/manicode/ 공유 (동일 런타임); 토큰 사용량은 트랜스크립트에서 추정 (로컬 사용량 없음; FREEBUFF_DATA_DIR로 오버라이드 가능) |
![]() |
Droid (Factory Droid) | ~/.factory/sessions/ |
![]() |
Pi | ~/.pi/agent/sessions/ |
| omp (Oh My Pi) | ~/.omp/agent/sessions/**/*.jsonl |
|
![]() |
Senpi (OmO Native) | ~/.senpi/agent/sessions/ (SENPI_CODING_AGENT_DIR로 오버라이드 가능) 및 ~/.omo/agent/sessions/ (OmO Native, omo-ai 5.1.0+), 그리고 각 프로젝트의 .omo/senpi-task/children/에 있는 태스크 하위 세션; 다른 OmO 위치는 scanner.extraScanPaths.senpi로 추가 |
![]() |
Kimchi Coding | ~/.config/kimchi/harness/sessions/ (KIMCHI_CODING_AGENT_DIR로 오버라이드 가능) |
![]() |
Reasonix | ~/.reasonix/stats/*.jsonl (REASONIX_STATE_HOME 또는 REASONIX_HOME으로 오버라이드 가능) |
![]() |
Kimi CLI / Kimi Code | kimi-cli: ~/.kimi/sessions/ kimi-code: ~/.kimi-code/sessions/ (override via KIMI_CODE_HOME) kimi-work: desktop app-data root (auto-discovered) |
![]() |
Qwen CLI | ~/.qwen/projects/ |
![]() |
Roo Code | ~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/ (+ server: ~/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/tasks/) |
![]() |
Kilo | ~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/ (+ server: ~/.vscode-server/data/User/globalStorage/kilocode.kilo-code/tasks/) |
![]() |
Kilo CLI | ~/.local/share/kilo/kilo.db |
![]() |
Mux | ~/.mux/sessions/ |
![]() |
Crush | $XDG_DATA_HOME/crush/projects.json (프로젝트 레지스트리, 기본값: ~/.local/share/crush/projects.json) |
![]() |
Goose | ~/.local/share/goose/sessions/sessions.db / %APPDATA%\Block\goose\data\sessions\sessions.db (+ macOS Application Support, 레거시 Block/goose 경로; GOOSE_PATH_ROOT로 오버라이드 가능) |
![]() |
Google Antigravity | tokscale antigravity sync로 ~/.config/tokscale/antigravity-cache/sessions/*.jsonl에 캐싱 (로컬 언어 서버 RPC 사용) |
![]() |
Antigravity CLI | ~/.gemini/antigravity-cli/conversations/*.db (GEMINI_CLI_HOME로 Gemini 홈 경로 오버라이드 가능; 로컬 SQLite를 직접 읽으므로 antigravity sync가 필요 없음) |
![]() |
Antigravity IDE Extension | ~/.gemini/antigravity/conversations/*.db (로컬 SQLite를 직접 읽음) |
![]() |
Trae IDE / Trae Solo (국제판) | tokscale trae sync로 ~/.config/tokscale/trae-cache/sessions/*.json에 캐싱 (공식 API의 계정 단위 사용량) |
![]() |
Warp / Oz | tokscale warp sync로 ~/.config/tokscale/warp-cache/usage.json에 캐싱 (집계된 요청 수 및 비용만; 토큰 트랜스크립트 없음) |
![]() |
Grok Build | $GROK_HOME/sessions/*/*/updates.jsonl (폴백: ~/.grok/sessions/*/*/updates.jsonl) |
![]() |
Zed Agent | ~/.local/share/zed/threads/threads.db (macOS: ~/Library/Application Support/Zed/threads/threads.db; Windows: %LOCALAPPDATA%/Zed/threads/threads.db; 호스팅된 Zed 모델 전용, 외부 ACP 에이전트 제외) |
![]() |
Kiro | ~/.kiro/sessions/cli/*.json (+ *.jsonl), ~/.local/share/kiro-cli/data.sqlite3 (macOS: ~/Library/Application Support/kiro-cli/data.sqlite3), 그리고 Kiro IDE globalStorage 스냅샷 (Kiro/User/globalStorage/kiro.kiroagent; macOS Application Support, Linux ~/.config/Kiro, Windows %APPDATA%\Kiro) |
![]() |
Cline | VS Code globalStorage tasks (Linux: ~/.config/Code/...; macOS: ~/Library/Application Support/Code/...; Windows: %APPDATA%\Code\...; server: ~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/) + Cline CLI 세션 (사용 가능한 첫 루트를 다음 순서로 선택: $CLINE_SESSION_DATA_DIR, $CLINE_DATA_DIR/sessions/, $CLINE_DIR/data/sessions/, 폴백 ~/.cline/data/sessions/; 비어 있거나 공백만 있는 환경 변수는 무시) |
![]() |
gajae-code (gjc) | ~/.gjc/agent/sessions/ (GJC_CODING_AGENT_DIR, GJC_CONFIG_DIR, PI_CONFIG_DIR로 오버라이드 가능; Linux/macOS에서는 $XDG_DATA_HOME/gjc/sessions/도 확인) |
![]() |
Cherry Studio | %APPDATA%\CherryStudio\Data\Agents\.claude\projects\*.jsonl 및 기존 %APPDATA%\CherryStudio\.claude\projects\*.jsonl (macOS: ~/Library/Application Support/CherryStudio/Data/Agents/.claude/projects/; Linux: $XDG_CONFIG_HOME/CherryStudio/Data/Agents/.claude/projects/; Agent/Claude Code 모드 전사, V2 루트 우선·기존 루트는 미이전 기록) 에 더해 대화 원장 %APPDATA%\CherryStudio\Data\cherrystudio.sqlite (macOS: ~/Library/Application Support/CherryStudio/Data/cherrystudio.sqlite; Linux: $XDG_CONFIG_HOME/CherryStudio/Data/cherrystudio.sqlite; 전사를 남기지 않는 내장 대화·어시스턴트 화면의 ai_usage_record 행을 읽음. 같은 테이블의 Agent 모드 행은 전사 쪽이 이미 집계하므로 건너뛰며, 두 원장은 같은 클라이언트로 합산됨) |
![]() |
LM Studio | ~/.lmstudio/server-logs/**/*.log (LM_STUDIO_HOME 지원, Chat Completions 및 Responses API의 최종 응답 usage만 사용하며 프롬프트와 응답 본문은 보관하지 않음, 로컬 추론 비용은 $0) |
![]() |
Unsloth Studio | $UNSLOTH_STUDIO_HOME/studio.db (폴백: ~/.unsloth/studio/studio.db; 내부 채팅 및 인증된 API의 정확한 추론 사용량을 읽으며 메시지 본문은 읽지 않음; 학습 지표는 제외하고 로컬 추론 비용은 $0) |
![]() |
Hindsight | $HINDSIGHT_HOME/usage/*.jsonl (폴백: ~/.hindsight/usage/*.jsonl, tokscale hindsight sync로 동기화) |
![]() |
Jcode | ~/.jcode/sessions/session_*.json + session_*.journal.jsonl 사이드카 (JCODE_HOME으로 재정의 가능) |
![]() |
MiMo Code | ~/.local/share/mimocode/mimocode.db (XDG 데이터 디렉토리; SQLite) |
![]() |
Xiaomi MiMo AI (desktop) | MiMo Code와 동일한 ~/.local/share/mimocode/mimocode.db 저장소; session.version이 desktop-로 시작하면 micode-desktop으로 분류 |
![]() |
Junie | ~/.junie/sessions/*/events.jsonl |
![]() |
Command Code | ~/.commandcode/projects/**/*.jsonl (토큰 사용량은 트랜스크립트에서 토큰당 약 4자 기준으로 추정; 디스크에 저장되지 않음) |
![]() |
ZCode | ~/.zcode/cli/db/db.sqlite(v2 사용량 데이터베이스) 및 ~/.zcode/projects/**/*.jsonl(레거시 기록) |
![]() |
OpenCodeReview | ~/.opencodereview/sessions/**/*.jsonl |
![]() |
CodeBuddy (CLI, IDE, VS Code 플러그인) | ~/.codebuddy/projects/**/*.jsonl + 확장 프로그램 로그 |
![]() |
WorkBuddy | ~/.workbuddy/projects/**/*.jsonl (5.5+는 ~/.workbuddy-ai/도 스캔) + SQLite 폴백 |
![]() |
Devin CLI | ~/.local/share/devin/cli/sessions.db (SQLite) |
![]() |
Devin Desktop | ACP 이벤트: macOS ~/Library/Application Support/Devin/User/acp-events/; Linux ~/.config/Devin/User/acp-events/; Windows %APPDATA%\Devin\User\acp-events\ |
![]() |
Augment Code (Auggie CLI) | ~/.augment/sessions/*.json |
![]() |
Synthetic | hf: 모델/synthetic provider 감지로 다른 소스에서 재귀속 (+ Octofriend: ~/.local/share/octofriend/sqlite.db) |
![]() |
DeepSeek Harness | ~/.dsh/sessions/**/session.jsonl.zstd(압축 없이 기록된 경우 session.jsonl, 버전이 붙은 session.v<N>.jsonl[.zstd] 형식도 읽음, DSH_HOME으로 재정의 가능) |
![]() |
fx | ~/.fx/sessions/<sessionId>/usage-v2.json (세션 단위 집계) |
![]() |
Muse Code | ~/.local/share/muse/sessions/**/session.jsonl (Windows 포함 전 플랫폼 공통 XDG 경로, subagent/<uuid>/ 하위 서브에이전트 기록 포함) |
![]() |
Aside | ~/.aside/u/<account>/sessions/<session>/messages.jsonl |
![]() |
Mistral Vibe | ~/.vibe/logs/session/<session-dir>/meta.json (Windows 포함 전 플랫폼 공통 경로, 루트는 VIBE_HOME으로 변경 가능) |
| Proma | ~/.proma/agent-sessions/, ~/.proma/sdk-config/{sessions,projects}/; ~/.proma-dev/ |
🚅 LiteLLM의 가격 데이터를 사용해 실시간 비용 계산을 제공합니다. 구간별 가격 모델(대용량 컨텍스트 등)과 캐시 토큰 할인도 지원합니다.
이 프로젝트는 **카르다쇼프 척도(Kardashev Scale)**에서 영감을 받았습니다. 카르다쇼프 척도는 문명의 기술 수준을 에너지 소비량으로 분류합니다. 유형 I 문명은 행성에서 사용 가능한 모든 에너지를 활용하고, 유형 II는 항성의 전체 출력을 포착하며, 유형 III는 은하 전체의 에너지를 통제합니다.
AI 지원 개발 시대에 토큰은 새로운 에너지입니다. 토큰은 우리의 사고력을 구동하고, 생산성을 높이며, 창의적 결과물을 이끌어냅니다. 카르다쇼프 척도가 우주적 규모에서 에너지 소비를 추적하듯, Tokscale은 AI 증강 개발의 단계를 올라가며 토큰 소비를 측정하고 시각화합니다. 가볍게 쓰는 사용자든 매일 수백만 개의 토큰을 소비하는 파워 유저든, Tokscale은 "내가 어디에서 무엇을 얼마나 쓰고 있는지"를 분명하게 보여줍니다.
- 인터랙티브 TUI 모드 - Ratatui 기반의 터미널 UI (기본 모드)
- 10개 인터랙티브 뷰: 개요, Usage, 모델, 일별, 시간별, 월별, 세션, 프로젝트, 통계, 에이전트 (선택적 Minutely 뷰는
minutelyTabEnabled로 활성화) - 키보드 및 마우스 지원
- 설정 가능한 색상 테마의 GitHub 스타일 기여 그래프
- 실시간 필터링 및 정렬
- 깜빡임 없는 렌더링
- 10개 인터랙티브 뷰: 개요, Usage, 모델, 일별, 시간별, 월별, 세션, 프로젝트, 통계, 에이전트 (선택적 Minutely 뷰는
- 멀티 플랫폼 지원 - OpenCode, Claude Code, Codex CLI, Prime Agent, Copilot CLI, Cursor IDE, Gemini CLI, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Kimchi Coding, Reasonix, Kimi CLI, Kimi Work, Qwen CLI, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Antigravity CLI, Antigravity IDE Extension, Zed, Kiro, Trae, Warp/Oz, Cline, Gajae-Code, Grok Build, Jcode, MiMo Code, Xiaomi MiMo AI, Command Code, Junie, ZCode, OpenCodeReview, CodeBuddy, WorkBuddy, Devin CLI, Devin Desktop, Augment Code, Synthetic, Cherry Studio, LM Studio, Unsloth Studio, Hindsight, fx, Oh My Pi, Muse Code, Aside, Mistral Vibe, Proma 사용량 통합 추적
- 실시간 가격 반영 - LiteLLM에서 최신 가격을 가져와(디스크 캐시 1시간) 비용 계산; OpenRouter 자동 폴백 및 신규 모델용 Cursor 가격 지원
- 상세 분석 - 입력, 출력, 캐시 읽기/쓰기, 추론 토큰까지 추적
- 네이티브 Rust 코어 - 모든 파싱과 집계를 Rust로 처리해 최대 10배 빠른 성능
- 웹 시각화 - 2D 및 3D 뷰의 인터랙티브 기여 그래프
- 유연한 필터링 - 플랫폼, 날짜 범위 또는 연도별 필터링
- 작업 기반 리포트 - LLM 기반 세션 요약 및 작업 그룹화, 여러 백엔드 지원 (Apple FM, Claude, Codex, Gemini, Kiro, MiniMax)
- JSON 내보내기 - 외부 시각화 도구/자동화용 데이터 생성
- 소셜 플랫폼 - 사용량 공유, 리더보드 경쟁, 공개 프로필 조회
# npx로 바로 실행
npx tokscale@latest
# 또는 bunx 사용
bunx tokscale@latest
# 별칭 설치 없이 Deno 사용
deno x npm:tokscale@latest
# 라이트 모드 (테이블 렌더링만)
npx tokscale@latest --light이게 전부입니다! 별도 설정 없이 바로 완전한 인터랙티브 TUI 경험을 제공합니다.
패키지 구조:
tokscale은@tokscale/cli를 설치하는 별칭 패키지입니다 (swc처럼). 둘 다 네이티브 Rust 코어 (@tokscale/core)가 포함된 동일한 CLI를 설치합니다.
로컬 개발 또는 소스에서 빌드하는 경우:
# 저장소 클론
git clone https://github.com/junhoyeo/tokscale.git
cd tokscale
# Bun 설치 (아직 설치하지 않은 경우)
curl -fsSL https://bun.sh/install | bash
# 의존성 설치
bun install
# 개발 모드에서 CLI 실행
bun run cli참고:
bun run cli는 로컬 개발용입니다.bunx tokscale로 설치하면 명령이 직접 실행됩니다. 아래 사용법 섹션은 설치된 바이너리 명령을 보여줍니다.
네이티브 Rust 모듈은 CLI 동작에 필수입니다. 병렬 파일 스캐닝과 SIMD JSON 파싱을 통해 처리 속도를 약 10배 향상시킵니다:
# 네이티브 코어 빌드 (저장소 루트에서 실행)
bun run build:core참고:
bunx tokscale@latest로 설치하면 네이티브 바이너리가 사전 빌드되어 포함됩니다. 소스에서 빌드는 로컬 개발 시에만 필요합니다.
# 인터랙티브 TUI 실행 (기본)
tokscale
# 특정 탭으로 TUI 실행
tokscale models # 모델 탭
tokscale monthly # 일별 뷰 (일별 분석 표시)
# 레거시 CLI 테이블 출력 사용
tokscale --light
tokscale models --light
# 명시적으로 TUI 실행
tokscale tui
# 기여 그래프 데이터를 JSON으로 내보내기
tokscale graph --output data.json
# JSON으로 데이터 출력 (스크립팅/자동화용)
tokscale --json # 기본 모델 뷰를 JSON으로
tokscale models --json # 모델 분석을 JSON으로
tokscale monthly --json # 월별 분석을 JSON으로
tokscale models --json > report.json # 파일로 저장인터랙티브 TUI 모드는 다음을 제공합니다:
- 10개 뷰: 개요 (차트 + 상위 모델), Usage (구독 할당량), 모델, 일별, 시간별, 월별, 세션, 프로젝트 (워크스페이스별 집계), 통계 (기여 그래프), 에이전트. 프로젝트 뷰에서는 Codex Desktop의 일반 채팅 디렉터리(
Documents/Codex/YYYY-MM-DD/<chat>)가 세션 수·토큰·비용을 보존한 채 Codex Chat으로 통합되며, Git 저장소를 포함한 디렉터리는 별도로 유지됩니다. 분 단위 뷰(Minutely)는 기본적으로 숨겨져 있으며settings.json의minutelyTabEnabled로 활성화할 수 있습니다 — 설정 참조 - 키보드 내비게이션:
←/→/Tab/BackTab: 뷰 전환↑/↓또는Home/End: 목록 탐색Enter: 일별 상세 보기 (Daily 탭) / ms/1K 및 Cost/1M 일별 추이 (Models 탭) / 그래프 셀 선택 (Stats 탭)Esc또는Backspace: 다이얼로그 닫기 / 상세 보기 나가기c/d/t: 비용/날짜/토큰별 정렬j: 오늘로 이동s: 소스 선택 다이얼로그 열기g: 그룹 기준 선택 다이얼로그 열기 (모델, 클라이언트+모델, 클라이언트+프로바이더+모델, 워크스페이스+모델, 세션+모델, 클라이언트+세션+모델)h: Daily/Hourly 차트 단위 전환 (Overview 탭)v: Table/Profile 뷰 전환 (Hourly 탭)b: 서브에이전트 세션을 부모 세션에 롤업 표시 전환 (Sessions 탭)y: 선택된 행을 클립보드에 복사p: 색상 테마 순환L: 라이트 모드 (흰색 배경) 토글r: 데이터 새로고침;Shift+R로 자동 새로고침 토글;+/-로 간격 조정e: JSON으로 내보내기q또는Ctrl+C: 종료
- 마우스 지원: 탭, 버튼, 필터 클릭
- 테마: Green, Halloween, Teal, Blue, Pink, Purple, Orange, Monochrome, YlGnBu, Graphite, Lagoon, Dusk
- 설정 저장: 설정이
~/.config/tokscale/settings.json에 저장됨 (설정 참조)
TUI에서 g를 누르거나 --light/--json 모드에서 --group-by를 사용하여 모델 행 집계 방식을 제어합니다:
| 전략 | 플래그 | TUI 기본값 | 효과 |
|---|---|---|---|
| 모델 | --group-by model |
✅ | 모델당 한 행 — 모든 클라이언트와 프로바이더 병합 |
| 클라이언트 + 모델 | --group-by client,model |
클라이언트-모델 쌍당 한 행 | |
| 클라이언트 + 프로바이더 + 모델 | --group-by client,provider,model |
가장 세분화 — 병합 없음 | |
| 워크스페이스 + 모델 | --group-by workspace,model |
로컬 사용량을 워크스페이스 키별로, 그 다음 모델별로 그룹화. --merge-worktrees를 추가하면 git 워크트리를 상위 리포지터리로 병합합니다 |
|
| 세션 + 모델 | --group-by session,model |
session_id와 모델당 한 행 — 특정 에이전트-CLI 세션에 비용 귀속 |
|
| 클라이언트 + 세션 + 모델 | --group-by client,session,model |
클라이언트, 세션, 모델당 한 행 — session_id로 조인하는 멀티 에이전트 러너에 유용 |
--group-by model (가장 통합)
| 클라이언트 | 프로바이더 | 모델 | 비용 |
|---|---|---|---|
| OpenCode, Claude, Amp | github-copilot, anthropic | claude-opus-4-5 | $2,424 |
| OpenCode, Claude | anthropic, github-copilot | claude-sonnet-4-5 | $1,332 |
--group-by client,model (CLI 기본값)
| 클라이언트 | 프로바이더 | 모델 | 비용 |
|---|---|---|---|
| OpenCode | github-copilot, anthropic | claude-opus-4-5 | $1,368 |
| Claude | anthropic | claude-opus-4-5 | $970 |
--group-by client,provider,model (가장 세분화)
| 클라이언트 | 프로바이더 | 모델 | 비용 |
|---|---|---|---|
| OpenCode | github-copilot | claude-opus-4-5 | $1,200 |
| OpenCode | anthropic | claude-opus-4-5 | $168 |
| Claude | anthropic | claude-opus-4-5 | $970 |
--group-by session,model (세션별 비용 귀속)
tokscale models --json --group-by session,model은 (session_id, model)당 하나의 항목을 출력합니다. 각 항목은 최상위 sessionId 필드를 포함하므로, 다운스트림 도구(예: 멀티 에이전트 IDE)가 비용 데이터를 특정 에이전트-CLI 세션에 다시 조인할 수 있습니다:
{
"groupBy": "session,model",
"entries": [
{
"sessionId": "019e1e27-af49-7cd1-89b7-7bad1c3f3be2",
"client": "codex",
"provider": "openai",
"model": "gpt-5",
"input": 25251,
"output": 47,
"cacheRead": 1920,
"cacheWrite": 0,
"reasoning": 40,
"messageCount": 12,
"cost": 0.0123
}
]
}모든 행에 클라이언트 이름도 필요하다면 --group-by client,session,model을 사용하세요 (20개 이상 지원되는 모든 CLI에 걸친 단일 스폰).
--group-by workspace,model은 에이전트가 실행된 디렉터리에 사용량을 귀속시키므로 프로젝트별 비용을 볼 수 있습니다:
# (워크스페이스, 모델)당 한 행
tokscale models --light --group-by workspace,model --month
# 모든 git 워크트리를 상위 리포지터리로 병합 — 리포지터리당 한 행
tokscale models --light --group-by workspace,model --merge-worktrees --month
# JSON에는 workspaceKey(그룹화 식별자)와 workspaceLabel(표시 이름)이 포함됩니다
tokscale models --json --group-by workspace,model --merge-worktreesTUI에서는 g → 워크스페이스 + 모델을 선택한 뒤 w로 워크트리 병합을 토글합니다(푸터에 [w:worktrees] 또는 [w:repos]가 표시됩니다).
워크스페이스 행의 라벨은 repo 또는 repo ⑃ worktree입니다. 클라이언트마다 워크스페이스 기록 방식이 달라서(Claude Code는 대시로 변환한 디렉터리 슬러그 -Users-me-devpro-app, Codex와 OpenCode는 실제 경로) tokscale은 슬러그를 파일시스템과 대조해 실제 경로로 되돌립니다. 알아둘 점이 네 가지 있습니다:
--merge-worktrees없이는 각 git 워크트리가 별도 행입니다. 작업마다 워크트리를 만드는 에이전트 CLI에서는 하나의 리포지터리가 여러 행으로 흩어집니다.--merge-worktrees가 이를 다시 합칩니다(서로 다른 클라이언트가 다른 키 형식으로 기록한 같은 리포지터리도 합칩니다).--merge-worktrees는 리포지터리 안쪽과 바깥쪽 워크트리를 모두 찾습니다.<repo>/.claude/worktrees/<name>(에이전트 CLI가 만드는 형태)와<repo>/.git/worktrees/<name>은 경로만으로 인식하고, 다른 위치에 체크아웃한 워크트리(git worktree add ../feature-x)는.git포인터 파일을 읽어 리포지터리까지 추적합니다. 다만 심볼릭 링크와 실제 경로처럼 두 가지 표기로 도달하는 리포지터리는 워크스페이스 식별자를 문자열로 비교하므로 여전히 두 행으로 남습니다. 어느 쪽이든 합계는 그대로입니다 — 사용량이 행으로 나뉠 뿐 사라지거나 중복 계산되지 않습니다.- 같은 이름이 될 행은 상위 디렉터리로 한정됩니다. 라벨은 디렉터리 이름 자체라서
~/work/api와~/oss/api는 둘 다api가 됩니다. 충돌한 라벨에는 구분될 때까지 앞쪽 경로 조각이 붙고(work/api,oss/api), 경로 조각으로도 구분되지 않으면 — 같은 디렉터리를 두 클라이언트가 서로 다른 키 형식으로 기록한 경우 — 워크스페이스 키가 붙습니다. 그룹화는 바뀌지 않고 표시 문자열만 달라집니다. - 워크스페이스를 기록하지 않는 클라이언트는 하나의
Unknown workspace행으로 모입니다. 지원 클라이언트의 약 절반(gemini, cursor, amp, droid, roocode, kilocode, goose, Copilot의 OTEL 경로 등)은 워크스페이스를 남기지 않아 디렉터리에 귀속시킬 수 없습니다.
--client (단축형 -c) 플래그로 하나 이상의 클라이언트로 리포트 범위를 좁힐 수 있습니다. 반복 사용 가능하며 콤마로 구분된 값도 지원하고, 모든 리포트 명령에서 동작합니다:
# OpenCode 사용량만 표시
tokscale --client opencode
# 콤마로 구분: 여러 클라이언트 동시 필터
tokscale --client opencode,claude
# 반복: 같은 효과 (쉘 alias와 함께 쓰기 좋음)
tokscale -c opencode -c claude
# Cursor IDE는 Tokscale의 API 캐시를 사용; 저장된 로그인이 없으면 데스크톱 세션을 가져옴
tokscale --client cursor
# Synthetic (synthetic.new) 은 다른 에이전트 세션에서 검출됨
tokscale --client synthetic
# 다른 필터와 조합
tokscale --client opencode,claude --week --json가능한 값: opencode, claude, codex, copilot, gemini, cursor, amp, codebuff, droid, openclaw, hermes, pi, prime-agent, kimchi, kimi, qwen, roocode, kilocode, kilo, mux, crush, goose, antigravity, antigravity-cli, antigravity-extension, zed, kiro, trae, warp, cline, gjc, grok, jcode, micode, micode-desktop, commandcode, junie, zcode, opencodereview, codebuddy, augment, synthetic, cherrystudio, lmstudio, unsloth, hindsight, muse, aside, vibe, proma.
Breaking change (v4.0.0): 클라이언트별 boolean 플래그(
--opencode,--claude,--codex등)는 제거되었으며 이제 오류를 발생시킵니다. 대신 정식--client/-c플래그를 사용하세요 — 예:tokscale --client opencode,claude.
날짜 필터는 리포트를 생성하는 모든 명령어에서 작동합니다 (tokscale, tokscale models, tokscale monthly, tokscale graph):
# 빠른 날짜 단축키
tokscale --today # 오늘만
tokscale --yesterday # 어제만
tokscale --week # 최근 7일
tokscale --month # 이번 달
# 사용자 정의 날짜 범위 (포함, 로컬 타임존)
tokscale --since 2024-01-01 --until 2024-12-31
# 연도별 필터
tokscale --year 2024
# 다른 옵션과 조합
tokscale models --week --client claude --json
tokscale monthly --month --benchmark참고: 날짜 필터는 로컬 타임존을 사용합니다.
--since와--until모두 해당 날짜를 포함합니다. v2.2.0 참고: 세션 활성 시간의 일별 버킷도 로컬 타임존을 사용하므로, UTC가 아닌 환경에서는 활성 시간 날짜가 UTC 일 경계가 아니라 로컬 토큰/비용 리포트 날짜와 맞춰질 수 있습니다.
모든 모델의 실시간 가격을 조회합니다:
# 모델 가격 조회
tokscale pricing "claude-3-5-sonnet-20241022"
tokscale pricing "gpt-4o"
tokscale pricing "grok-code"
# 특정 프로바이더 소스 강제 지정
tokscale pricing "grok-code" --provider openrouter
tokscale pricing "claude-3-5-sonnet" --provider litellm
# 사용자 정의 가격 오버라이드 확인
tokscale pricing list-overrides조회 전략:
가격 조회는 다단계 해석 전략을 사용합니다:
- 사용자 정의 가격 오버라이드 -
~/.config/tokscale/custom-pricing.json의 정확한 사용자 정의 항목 - 정확한 일치 - LiteLLM/OpenRouter 데이터베이스에서 직접 조회
- 별칭 해석 - 친숙한 이름 해석 (예:
big-pickle→glm-4.7) - 티어 접미사 제거 - 품질 티어 제거 (
gpt-5.2-xhigh→gpt-5.2) - 버전 정규화 - 버전 형식 처리 (
claude-3-5-sonnet↔claude-3.5-sonnet) - 프로바이더 접두사 매칭 - 일반 접두사 시도 (
anthropic/,openai/등) - Cursor 모델 가격 - LiteLLM/OpenRouter에 아직 없는 모델의 하드코딩 가격 (예:
gpt-5.3-codex) - 퍼지 매칭 - 부분 모델 이름에 대한 단어 경계 매칭
업스트림 가격 데이터베이스가 아직 정확히 다루지 못하는 모델 ID의 가격을 오버라이드하려면 Tokscale의 설정 디렉터리(기본값은 macOS/Linux의 ~/.config/tokscale/custom-pricing.json; TOKSCALE_CONFIG_DIR가 설정된 경우 동일한 디렉터리로 해석됨)에 custom-pricing.json을 생성하세요.
{
"models": {
"accounts/fireworks/routers/kimi-k2p6-turbo": {
"input_cost_per_million_tokens": 2.00,
"output_cost_per_million_tokens": 8.00,
"cache_read_input_token_cost_per_million_tokens": 0.30,
"source": "https://docs.fireworks.ai/serverless/pricing",
"notes": "Fireworks Kimi K2.6 Turbo (preview)"
},
"accounts/fireworks/models/kimi-k2p6": {
"input_cost_per_million_tokens": 0.95,
"output_cost_per_million_tokens": 4.00,
"cache_read_input_token_cost_per_million_tokens": 0.16
},
"kimi-k2p6-turbo": {
"input_cost_per_million_tokens": 2.00,
"output_cost_per_million_tokens": 8.00
}
}
}JSON 스키마는 이 저장소의 schemas/custom-pricing.schema.json에 있습니다. 편집기 검증에는 해당 스키마의 로컬 사본을 사용하세요.
오버라이드 가격은 대부분의 API 프로바이더가 가격을 공개하는 방식과 같이 백만 토큰당 달러 단위로 입력하며, Tokscale은 내부적으로 토큰당 요율로 변환합니다. input_cost_per_million_tokens 또는 output_cost_per_million_tokens 중 적어도 하나는 존재해야 하며, 캐시 읽기/캐시 생성 필드는 선택 사항입니다. 명시적인 0도 허용되며, 무료 모델을 선언하는 방법입니다 — 0은 "비용이 없다"는 진술이고, 필드를 생략하는 것은 요율을 모른다는 뜻이라 사용량이 가격 미책정으로 남습니다. 복사/붙여넣기 호환성을 위해 input_cost_per_token, output_cost_per_token, cache_read_input_token_cost 같은 LiteLLM 스타일의 토큰당 필드명도 허용되지만, 백만 토큰당 이름이 권장되는 사용자용 형식입니다. 티어나 캐시 가격을 생략하려면 해당 필드를 비워 두세요. 음수이거나 유한하지 않은 값은 잘못된 것으로 처리되어 오타가 회계를 조용히 바꾸지 않도록 해당 모델 항목 전체를 건너뜁니다. 선택적 source 및 notes 필드는 Tokscale이 무시하므로 사용자 자신의 기록용으로 사용할 수 있습니다.
오버라이드는 정확 일치 전용이며 대소문자를 구분하지 않습니다. Tokscale은 원본 모델 ID를 먼저 확인하고, 그다음 기존 합성 /models/ 정규화를 확인한 뒤, 일치하는 오버라이드가 없으면 LiteLLM, OpenRouter, Cursor 가격, 퍼지 매칭으로 넘어갑니다. 원본 정확 일치가 정규화된 정확 일치보다 우선하므로, accounts/fireworks/routers/kimi-k2p6-turbo는 특정 게이트웨이 모델을 오버라이드할 수 있고 kimi-k2p6-turbo는 정규화된 /models/ 경로를 커버할 수 있습니다. 오버라이드는 시작 시 한 번 로드되므로 파일을 편집한 후에는 명령을 다시 실행하세요. 업스트림 LiteLLM 가격 업데이트를 기다리는 동안 잘못된 모델 가격 버그를 로컬에서 수정하는 권장 방법입니다.
프로바이더 우선순위:
여러 일치 항목이 있을 때 원본 모델 제작사가 리셀러보다 우선됩니다:
| 우선 (원본) | 후순위 (리셀러) |
|---|---|
xai/ (Grok) |
azure_ai/ |
anthropic/ (Claude) |
bedrock/ |
openai/ (GPT) |
vertex_ai/ |
google/ (Gemini) |
together_ai/ |
meta-llama/ |
fireworks_ai/ |
예시: grok-code는 azure_ai/grok-code-fast-1 ($3.50/$17.50) 대신 xai/grok-code-fast-1 ($0.20/$1.50)와 일치합니다.
기존 전역 models와 함께 provider_overrides를 설정할 수 있습니다. tokscale pricing MODEL --billing-provider vertex --source custom --json --no-spinner로 조회합니다. 기존 --provider는 여전히 가격표 출처를 뜻합니다. 채널은 로그의 전체 라벨을 공백 제거 및 ASCII 대소문자 무시로 비교하며 모델 제조사에서 추론하지 않습니다. 실제 결제 계정이나 판매자를 검증하는 기능은 아닙니다.
tokscale pricing validate-overrides --strict --json --no-spinner로 오프라인 검증하고, tokscale pricing explain --json --no-spinner로 메시지별 채널·요율 배수·커버리지·추정 상태를 로컬에서 확인하세요. 사용자 요율은 기본 요율이며 기록된 확정 비용은 0도 유지합니다. 설정 수정 후 재시작하면 과거 추정액도 현재 가격으로 재계산하고 만료된 추정액은 합계에서 제외합니다. 구버전으로 내려가면 채널별 규칙은 무시됩니다. 우선순위, 캐시 이전 및 예제.
# Tokscale 로그인 (GitHub 인증을 위해 브라우저 열기)
tokscale login
# 브라우저 인증 없이 기존 Tokscale API 토큰 저장
tokscale login --token tt_xxx
# 로그인한 사용자 확인
tokscale whoami
# 저장된 API 토큰을 QR 코드로 표시 (다른 기기로 공유할 때 유용)
# {"token":"tt_xxx","username":"..."}를 인코딩 — 아무 QR 리더로 스캔
tokscale qr
# 사용량 데이터를 리더보드에 제출
tokscale submit
# 자격 증명을 기록하지 않고 CI/헤드리스 환경에서 제출
# 우선순위: TOKSCALE_API_TOKEN 환경 변수 > 저장된 자격 증명 파일 (~/.config/tokscale/credentials.json).
# 환경 변수가 설정되면 해당 실행에서는 저장된 파일이 무시됩니다.
TOKSCALE_API_TOKEN=tt_xxx tokscale submit
# 토큰 폐기: 리더보드 사이트의 Settings > API Tokens
# (https://tokscale.ai/settings)를 방문해 해당 토큰 행의 "Revoke"를 클릭.
# 폐기는 즉시 적용됩니다 — 이후 해당 토큰을 사용한 요청은
# HTTP 401 "Invalid API token"을 받습니다.
# 필터와 함께 제출
tokscale submit --client opencode,claude --since 2024-01-01
# 제출될 내용 미리보기 (드라이 런)
tokscale submit --dry-run
# 로그아웃
tokscale logout제출하기 전에 모든 메시지는 해당 메시지가 실제로 사용한 토큰 버킷(입력, 출력, 캐시 읽기, 캐시 쓰기)을 모두 커버하는 신뢰할 수 있는 가격으로 확인되어야 합니다. 가격을 확인할 수 없는 메시지는 건너뛰며 Warning: excluded N unpriced provider/model message(s) 경고로 보고됩니다. 알 수 없는 모델이 추측된 요금으로 제출되는 일은 없으며, 나머지 가격이 책정된 사용량은 정상적으로 제출됩니다.
제외 사유:
no authoritative model-to-price mapping— 모델 ID가 LiteLLM, OpenRouter, models.dev, 사용자 지정 가격 어디에도 존재하지 않습니다.generic routing label has no authoritative model-to-price mapping— 해당 ID는 라우팅 레이블(auto,gemini-default등)로, 요청마다 실제 모델이 달라지므로 그대로는 거부됩니다. 실제 요금을 알고 있다면custom-pricing.json에 명시적 항목을 추가하는 것이 공식적으로 지원되는 방법입니다.pricing does not cover every populated token bucket— 가격 행을 찾았지만, 실제로 사용된 토큰(대개 캐시 읽기 또는 캐시 쓰기)에 대한 요금이 누락되었습니다.model price match does not establish the requested provider— 모델 ID의 모델 부분만으로, 또는 공급자 접두사 추정으로 가격 행을 찾았을 뿐이어서 해당 요금이 실제 공급자의 요금이라고 확정할 수 없습니다.model price match does not exactly name the requested model— 유사 일치로 가격 행을 찾았지만, 그 키가 실제로 사용한 모델을 정확히 가리킨다는 근거가 없습니다.model price lookup is ambiguous across non-equivalent candidates— 여러 후보 행이 일치했지만 서로 다른 가격을 제시합니다.
제외된 사용량을 포함하려면 ~/.config/tokscale/custom-pricing.json에 정확히 일치하는 항목을 추가하세요(명시적인 0은 실제 무료 모델의 선언입니다). 그런 다음 tokscale submit --dry-run을 다시 실행하여 경고가 없어졌는지 확인하세요. tokscale pricing <model-id>로 어떤 항목이 일치했는지 확인할 수 있습니다. 이 파일의 키는 모델 ID 단독입니다 — 경고에 표시되는 provider/model 중 model 부분만 사용하세요.
Autosubmit은 일반적인 tokscale submit 흐름을 운영체제 스케줄러에 등록합니다. 터미널에서 수동으로 실행하지 않아도 공개 프로필을 최신 상태로 유지할 수 있어 유용합니다.
# 주기적 제출을 활성화합니다. macOS에서는 launchd, Linux에서는 가능한 경우 systemd 사용자 타이머
# (폴백으로 cron), Windows에서는 Windows 작업 스케줄러를 사용합니다.
tokscale autosubmit enable --interval 24h
# submit에 전달하는 것과 동일한 클라이언트/날짜 필터를 그대로 지정할 수 있습니다.
tokscale autosubmit enable --interval 2h --client opencode,claude --week
# 저장된 설정과 마지막 실행/오류를 표시합니다.
tokscale autosubmit status
tokscale autosubmit status --json
# 저장된 간격이 지나지 않았더라도 지금 한 번 실행합니다.
tokscale autosubmit run --force
# Autosubmit을 비활성화하고 스케줄러 항목을 제거합니다.
tokscale autosubmit disable예약된 실행은 비대화형입니다. GitHub 인증이나 스타 확인을 묻지 않습니다. tokscale login --token tt_xxx를 한 번 실행하거나 스케줄러 환경에서 TOKSCALE_API_TOKEN을 설정하세요. Tokscale은 스케줄러 상태를 settings.json에 기록하고, 로그를 ~/.config/tokscale/autosubmit/ 아래에 기록하며, 잠금 파일을 사용해 스케줄러 틱이 겹쳐도 두 번 제출하지 않도록 합니다.
Cursor IDE는 Cursor의 usage-events API를 사용합니다. 활성 계정은 ~/.config/tokscale/cursor-cache/usage.json에, 다른 계정은 usage.account-<sha256-of-exact-account-id>.json에 소유자 메타데이터와 함께 저장합니다. 소유자를 확인할 수 없는 이전 JSON/CSV는 동기화나 계정 변경 전에 cursor-cache/archive/에 보관합니다. Tokscale은 로컬 ~/.cursor 기록을 파싱하거나 데스크톱 SQLite DB를 사용량 원장으로 취급하지 않습니다.
Cursor 데스크톱 앱이 설치되어 있고 로그인되어 있으면, 저장된 Cursor 로그인이 없을 때 리포트, submit, wrapped가 state.vscdb의 cursorAuth/accessToken을 가져올 수 있습니다. wrapped는 요청한 클라이언트에 Cursor가 포함된 경우에만 가져옵니다. 사용량 캐시가 아직 최신이면 리포트는 동기화를 건너뜁니다. 명시적인 tokscale cursor sync를 포함해 동기화가 실행될 때마다 사용 가능한 데스크톱 토큰을 갱신하며, 활성 계정이 해당 데스크톱 로그인으로 전환될 수 있습니다. 데스크톱 세션이 없어도 저장된 로그인은 계속 사용할 수 있습니다. 사용량 행은 Cursor usage-events API에서만 가져오며, 로컬 ~/.cursor 기록은 파싱하지 않습니다.
설정 (데스크톱 자동 로그인):
- Cursor 데스크톱 앱에 로그인하세요.
- 선택:
tokscale cursor login --name work를 실행해 그 데스크톱 세션을 이름으로 저장하세요. 저장된 Cursor 로그인이 아직 없으면 리포트, submit, sync가 자동으로 가져옵니다. - 선택:
tokscale cursor sync --json을 실행해~/.config/tokscale/cursor-cache/usage.json을 지금 새로 고치세요. 캐시가 오래되면 리포트가 직접 동기화합니다. tokscale --client cursor또는 아무 리포트 명령을 실행하세요.
대체 방법 (브라우저 쿠키 수동 붙여넣기) — 데스크톱 로그인을 쓸 수 없을 때:
- 브라우저에서 https://www.cursor.com/settings 를 열고 로그인하세요.
WorkosCursorSessionToken쿠키 값을 복사하세요:- Network 탭:
cursor.com/api/*로 아무 요청이나 보낸 뒤,Cookie요청 헤더에서WorkosCursorSessionToken=뒤의 값을 복사합니다. - Application 탭: Cookies →
https://www.cursor.com을 열고WorkosCursorSessionToken값을 복사합니다.
- Network 탭:
tokscale cursor login --name work를 실행하고 프롬프트에서 토큰을 붙여 넣으세요.- 위와 같이
tokscale cursor sync --json을 계속 진행하세요.
세션 토큰은 비밀번호처럼 취급하세요. 토큰은 ~/.config/tokscale/cursor-credentials.json에 로컬로 저장됩니다.
# Cursor 로그인 (데스크톱 로그인 자동 감지; 실패 시 브라우저 쿠키 붙여넣기)
# --name은 선택이며, 나중에 계정을 구분하는 데만 도움이 됩니다
tokscale cursor login --name work
# Cursor 인증 상태 및 세션 유효성 확인
tokscale cursor status
# 저장된 Cursor 계정 목록
tokscale cursor accounts
# 캐시된 Cursor 사용량 수동 새로고침
tokscale cursor sync --json
# 느리거나 사용량이 아주 많은 계정에 시간을 더 주기 (전체 예산, 초 단위)
tokscale cursor sync --timeout 600
# 활성 계정 전환 (cursor-cache/usage.json에 동기화되는 계정 제어)
tokscale cursor switch work
# 특정 계정 로그아웃 (기록은 보관, 합산에서는 제외)
tokscale cursor logout --name work
# 로그아웃 + 해당 계정 캐시 삭제
tokscale cursor logout --name work --purge-cache
# 모든 Cursor 계정 로그아웃 (기록은 보관, 합산에서는 제외)
tokscale cursor logout --all
# 모든 계정 로그아웃 + 캐시 삭제
tokscale cursor logout --all --purge-cache기본적으로 저장된 모든 Cursor 계정의 cursor-cache/usage*.json을 합산합니다. 파일명은 정확한 계정 ID의 SHA-256을 사용하며 소유자를 검증하므로 이전 파일명이 충돌해도 기록이나 동기화 진행 상태를 공유하지 않습니다. 소유자를 확인할 수 없는 이전 JSON/CSV는 원래 바이트와 파일명 그대로 cursor-cache/archive/ 안의 고유 디렉터리에 보관하고 각 계정을 처음부터 가져옵니다. 백업은 리포트에서 제외되며 가져오기가 실패해도 복구할 수 있습니다. 보관 실패 시 덮어쓰기 전에 중단합니다. 이전 캐시는 이 전환 전까지 오프라인 리포트에서 읽을 수 있습니다. 새로운 사용량과 최신 유효 이벤트의 1시간 전까지의 정정 내역을 가져오고 더 오래된 기록은 유지합니다. 시간 초과 시 가져온 페이지를 저장하지 않고 기존 캐시를 유지하여 다음 동기화에서 누락 구간을 건너뛰지 않게 합니다.
로그아웃 시 Tokscale은 캐시된 사용량을 cursor-cache/archive/로 옮겨 더 이상 합산되지 않도록 합니다. 캐시된 사용량을 대신 삭제하려면 --purge-cache를 사용하세요.
tokscale cursor sync는 저장된 각 계정의 사용량 기록을 페이지 단위로 내려받고, 계정마다 전체 시간 예산을 하나씩 적용합니다. 기본 예산은 120초에서 시작해 Cursor가 알려 주는 해당 계정의 사용량 이벤트 수에 맞춰 최대 1800초(30분)까지 늘어납니다. 고정된 예산을 쓰려면 한 번만 적용할 때는 --timeout <SECONDS>를 넘기고, 계속 적용하려면 settings.json(기본 위치는 ~/.config/tokscale/settings.json; Windows, XDG_CONFIG_HOME, TOKSCALE_CONFIG_DIR은 설정 참고)에 cursor.syncTimeoutSeconds를 저장하세요. 둘 다 1-86400 사이의 정수(초)를 받습니다. 설정에 그 밖의 값이 있으면 --timeout 없이 실행한 tokscale cursor sync가 경고를 출력하고 기본 예산을 씁니다. 플래그가 설정보다 우선하고, 설정은 기본 예산보다 우선합니다.
{
"cursor": {
"syncTimeoutSeconds": 600
}
}Antigravity 동기화는 현재 macOS와 Linux에서만 지원됩니다. Antigravity가 활성화된 에디터가 실행 중이고 로컬 언어 서버를 사용할 수 있을 때만 동작하며, tokscale은 해당 로컬 언어 서버에서 사용량을 읽어 정규화된 아티팩트를 로컬에 캐시합니다.
# 실행 중인 Antigravity 언어 서버를 tokscale이 인식하는지 확인
tokscale antigravity status
# 로컬 Antigravity 언어 서버에서 사용량을 tokscale 캐시로 동기화
tokscale antigravity sync
# 캐시된 Antigravity 아티팩트 삭제
tokscale antigravity purge-cache캐시 위치: ~/.config/tokscale/antigravity-cache/
동작 방식: tokscale antigravity sync는 로컬 Antigravity 세션 후보를 검색하고, 로컬 언어 서버 RPC에서 확정된 사용량 데이터를 가져와, tokscale-core가 나중에 파싱할 수 있도록 정규화된 JSONL 아티팩트로 저장합니다. 가장 최신의 Antigravity 데이터를 반영하려면 리포트 실행 전에 sync를 먼저 실행하세요.
Trae(ByteDance의 AI IDE)는 두 국제판 제품군을 제공합니다. 사용량 데이터는 계정 단위로 공유되므로 tokscale은 하나의 trae 클라이언트로 표시합니다:
--variant ide— Trae IDE (국제판)의 자격 증명 사용--variant solo— Trae Solo (국제판)의 자격 증명 사용
tokscale trae sync는 공식 query_user_usage_group_by_session API를 호출하고 원본 JSON을 로컬 캐시에 저장합니다. --variant solo / --variant ide는 login/logout에서 자격 증명 출처를 선택할 때만 사용하며, sync는 저장된 Trae 토큰으로 단일 trae 리포트 클라이언트를 갱신합니다.
# 로그인 (Trae 데스크톱 클라이언트에서 자격 증명 자동 감지)
tokscale trae login
# 수동 JWT 입력 (storage.json을 자동 감지할 수 없는 환경용)
tokscale trae login --manual --variant solo
# 어떤 변형에 자격 증명이 캐시되어 있는지 확인
tokscale trae status
# 최근 30일 사용량을 동기화
tokscale trae sync --since 30
# 특정 변형의 캐시된 자격 증명 삭제
tokscale trae logout --variant solo캐시 위치: ~/.config/tokscale/trae-cache/
동작 방식: tokscale은 데스크톱 클라이언트의 iCubeAuthInfo://* blob(globalStorage/storage.json)을 복호화해 JWT를 얻거나, --manual로 붙여 넣은 JWT를 사용합니다. 이후 POST /trae/api/v1/pay/query_user_usage_group_by_session을 페이지 단위로 호출하고 원본 JSON을 저장합니다. 최신 Trae 데이터를 반영하려면 리포트 실행 전에 sync를 먼저 실행하세요.
Antigravity와 Trae 동기화는 롤링 업그레이드 중 이전 tokscale 바이너리와 겹치지 않도록 레거시 호환 sync.lock 파일을 사용합니다. 크래시나 강제 종료 후에는 이 파일이 남아 있을 수 있습니다. 이전 바이너리가 같은 경로를 생성하거나 갱신 중일 수 있으므로, Tokscale은 이를 교체하지 않고 의도적으로 안전하게 실패합니다. tokscale antigravity sync 또는 tokscale trae sync 프로세스가 실행 중이 아닌지 확인한 다음, 명령어가 출력한 정확한 따옴표 안의 sync.lock 경로를 삭제하고 다시 시도하세요. 동기화가 아직 실행 중일 수 있다면 락을 삭제하지 마세요.
가격에 대한 참고: Trae 비용 수치는 벤더가 보고한 값입니다 — tokscale은 토큰 수로부터 tokscale의 가격 엔진을 통해 비용을 재계산하는 대신 Trae 자체 API가 반환한
dollar_float값을 그대로 표시합니다. 따라서 수치는 동일한 사용량에 대해 tokscale이 계산했을 값이 아니라trae.ai/account-setting#usage에서 보이는 값과 일치합니다.
중국판: 중국판(
trae.com.cn)은 의도적으로 지원하지 않습니다. CN 백엔드는 세션 단위 사용량 조회 API를 공개하지 않습니다. 공식 엔드포인트가 제공되면 지원을 추가할 예정입니다.
Warp/Oz는 로컬 토큰 트랜스크립트를 제공하지 않습니다. Tokscale은 Warp의 GraphQL API가 반환하는 집계 요청 수와 비용 카운터만 동기화하며, 이를 토큰 버킷이 0인 warp / aggregate-requests 행으로 표시합니다.
# 인증된 Warp 요청에서 복사한 bearer 토큰 또는 Cookie 헤더 저장
tokscale warp login
# 자격 증명/캐시 상태 및 진단 확인
tokscale warp status
# 집계된 요청 수와 비용을 tokscale 로컬 캐시에 동기화
tokscale warp sync
# 저장된 자격 증명 삭제; --purge-cache를 추가하면 동기화된 사용량도 삭제
tokscale warp logout --purge-cache캐시 위치: ~/.config/tokscale/warp-cache/usage.json
동작 방식: tokscale warp sync는 Warp의 인증된 GraphQL API를 호출하여 계정 및 워크스페이스 집계 카운터를 가져옵니다. Tokscale은 요청 수를 메시지 카운트로, 벤더가 보고한 비용을 그대로 보존하지만, 요청 수를 합성 토큰으로 변환하지는 않습니다. Warp는 공개 리더보드가 토큰 기반 사용량만 수용하므로 기본 submit 데이터에서 제외됩니다.
report 명령어는 작업 기반 사용량 분석을 생성합니다. LLM을 사용해 각 세션을 짧은 제목과 카테고리로 요약한 뒤, 관련 세션들을 상위 수준의 작업 클러스터로 묶어 토큰이 어디에 쓰였는지 한눈에 볼 수 있게 해 줍니다.
# 기본 리포트 (오늘, 기본 Apple FM 요약기)
tokscale report
# 최근 7일
tokscale report --week
# Claude Code를 요약 백엔드로 사용
tokscale report --week --summarizer claude
# Codex, Gemini, Kiro 또는 MiniMax 사용
tokscale report --summarizer codex
tokscale report --summarizer gemini
tokscale report --summarizer kiro
tokscale report --summarizer minimax
# LLM 요약 건너뛰기 (원본 데이터만 표시)
tokscale report --no-summarize
# 처음부터 다시 요약 (범위 내 캐시된 요약 초기화)
tokscale report --week --rebuild
# JSON으로 출력
tokscale report --week --json
# 워크스페이스 또는 클라이언트로 필터
tokscale report --workspace my-project --client opencode요약 백엔드:
| 백엔드 | 명령어 | 비고 |
|---|---|---|
apple-fm |
(기본값) | 네이티브 Rust FFI를 통한 온디바이스 Apple Foundation Models (Python 불필요). 사전 빌드된 Apple Silicon(macOS arm64) 바이너리에 기본 포함되어 있으며, Apple Intelligence가 켜진 macOS 26 이상에서 동작합니다. 그 외 환경(Intel Mac, 이전 macOS, Linux, Windows)에서는 내장 Rust 휴리스틱으로 투명하게 폴백하므로 기본값은 모든 플랫폼에서 동작합니다. |
claude |
claude -p |
Claude Code CLI가 설치되어 인증되어 있어야 함. |
codex |
codex --quiet |
Codex CLI가 설치되어 인증되어 있어야 함. |
gemini |
gemini -p |
Gemini CLI가 설치되어 인증되어 있어야 함. |
kiro |
kiro --non-interactive |
Kiro CLI가 설치되어 인증되어 있어야 함. |
minimax |
(HTTP API) | OpenAI 호환 chat-completions API를 사용하므로 CLI가 필요하지 않음. MINIMAX_API_KEY 또는 MINIMAX_API_TOKEN 설정. 기본값은 글로벌 엔드포인트(https://api.minimax.io/v1)의 MiniMax-M3이며, MINIMAX_API_REGION=cn을 설정하면 https://api.minimaxi.com/v1을 사용하고 MINIMAX_MODEL로 다른 모델(예: MiniMax-M2.7)을 선택할 수 있음. |
동작 방식:
- 세션을 스캔하여 로컬 SQLite 위키 데이터베이스(
wiki.db, 플랫폼 설정 디렉터리 — Linux:~/.config/tokscale/, macOS:~/Library/Application Support/tokscale/)에 삽입합니다 - 요약되지 않은 세션을 선택한 LLM 백엔드에 배치 단위로 보내면, 각 세션에 대해 제목, 카테고리, 설명, 복잡도를 반환합니다
- 두 번째 LLM 패스에서 제목이 붙은 모든 세션을 3~8개의 상위 수준 작업 클러스터로 묶습니다 (예: "Kiro Auth", "Tokscale Report", "System Config")
- 결과는 위키 DB에 캐시되며, 이후 실행 시 이미 요약된 세션은 건너뜁니다
요약은 기본적으로 활성화되어 있으며 기본 백엔드는 apple-fm(네이티브 Rust를 통한 Apple Foundation Models 온디바이스 추론, Python 불필요)입니다. --no-summarize로 요약을 끌 수 있습니다.
예시 출력:
Task Group Sess Tokens Cost
───────────────────────────────────────────────────────────────────────
Tokscale Development 19 4.2B $22.66
Add task-attributed report command
Implement wiki DB schema
Fix pricing lookup for new models
System Config 28 2.1B $10.06
Configure OpenCode workspace settings
Update shell aliases
Kiro Auth 4 890.5M $3.10
Implement JWT refresh flow
Tokscale은 여러 AI 프로바이더에 걸친 실시간 구독 할당량을 가져와 표시할 수 있습니다. 이를 통해 플랜을 얼마나 사용했는지와 한도가 언제 초기화되는지 확인할 수 있습니다.
# 감지된 모든 프로바이더의 구독 사용량 표시
tokscale usage
# JSON으로 출력 (스크립팅용)
tokscale usage --json
# 가벼운 터미널 출력 (TUI 없음)
tokscale usage --lightTUI에서는 Usage 탭으로 이동해 구독 데이터를 확인하세요. [Refresh]로 구독 할당량을 새로고침할 수 있습니다. 키보드 새로고침 단축키 r도 동일한 새로고침 경로를 사용합니다.
참고: 구독 할당량과 잔액은 벤더가 보고한 값입니다 — tokscale은 각 프로바이더의 자체 할당량 엔드포인트를 호출하고 그 응답을 그대로 표시합니다. 표시되는 수치는 프로바이더가 보고하는 값(공식 대시보드에 나타나는 값과 동일)이며, tokscale 자체 사용량 추적과 독립적으로 검증되지 않습니다.
| 프로바이더 | 인증 방식 | 지표 | 설정 |
|---|---|---|---|
| Claude | OAuth (자격 증명 파일 또는 macOS Keychain) | 세션(5시간), 주간, 모델별 할당량 | claude를 실행해 로그인 |
| Codex (OpenAI) | OAuth (Codex 인증, 저장된 Tokscale 계정 또는 OpenCode의 $XDG_DATA_HOME/opencode/auth.json) |
세션, 주간 할당량 | [Add Codex], codex, tokscale codex import --name work 또는 OpenCode에서 OpenAI ChatGPT Plus/Pro 연결 사용 |
| Z.ai | API 키 (환경 변수) | 토큰 한도, 웹 검색 | ZAI_API_KEY 또는 GLM_API_KEY 설정 |
| Amp | API 키 (~/.local/share/amp/secrets.json) |
무료 티어 잔액, 크레딧 | amp를 실행해 로그인 |
| GitHub Copilot | GitHub 토큰 (keychain 또는 ~/.config/gh/hosts.yml) |
프리미엄 상호작용, 채팅 할당량 | gh auth login 실행 |
| Grok Build | OAuth (~/.grok/auth.json) |
크레딧, 구독 플랜 | grok login 실행 |
| Kimi | OAuth (~/.kimi/credentials/kimi-code.json) |
세션, 주간 할당량 | kimi를 실행해 로그인 |
| MiniMax | API 키 (환경 변수) | 모델별 프롬프트 할당량 | MINIMAX_API_KEY 또는 MINIMAX_API_TOKEN 설정 |
| MiniMax Token Plan | API 키 (환경 변수) | 구간 + 주간 잔여 비율 할당량 (지역별: CN minimaxi.com + Global minimax.io) | MINIMAX_TOKEN_PLAN_CN_KEY 및/또는 MINIMAX_TOKEN_PLAN_GLOBAL_KEY 설정 |
| OpenCode Go | API 키 (~/.local/share/opencode/auth.json 또는 환경 변수) |
Rolling, Weekly, Monthly 할당량 | OpenCode에서 /connect 실행, 또는 OPENCODE_API_KEY 설정 |
| Sakana (Fugu) | 세션 쿠키 (환경 변수 또는 파일) — 빌링 콘솔 HTML 스크레이프, 공개 API 없음 | 5시간, 주간 할당량 창 (플랜 티어 + 월 가격은 메타데이터) | SAKANA_SESSION_COOKIE 설정 (docs/providers/sakana.md 참조) |
프로바이더는 자동 감지됩니다 — 유효한 자격 증명이 있는 프로바이더만 표시됩니다. 프로바이더가 보이지 않으면 로그인했는지 또는 필요한 환경 변수를 설정했는지 확인하세요.
Tokscale은 구독 사용량 표시를 위해 여러 Codex OAuth 계정을 저장할 수 있습니다. TUI Usage 탭은 저장된 계정들을 하나의 Codex 섹션 아래에 묶습니다. 활성 계정은 *로 표시되고, 비활성 계정은 [Use]로 선택할 수 있으며, 계정 삭제는 [Remove] 후 [Confirm]으로 진행합니다.
TUI를 벗어나지 않고 계정을 추가하려면 Usage 탭에서 [Add Codex]를 클릭하세요. Tokscale은 임시 CODEX_HOME으로 codex login을 시작하고, 로그인 출력을 Usage 탭에 표시한 뒤, 결과 인증을 Tokscale의 저장 계정 스토어로 가져오고, 사용량을 새로고침합니다. 이렇게 하면 로그인이 격리되며 현재 Codex 인증을 전환하지 않습니다. Tokscale이 실제 Codex 인증 파일에 특정 계정을 쓰게 하려면 저장된 계정에서 [Use]를 클릭하세요.
스크립트 기반 또는 수동 계정 관리를 위한 CLI 명령도 계속 제공됩니다:
# 현재 Codex 인증을 이름 있는 Tokscale 계정으로 저장
tokscale codex import --name work
# 저장된 Codex 계정 목록
tokscale codex accounts
tokscale codex accounts --json
# 활성 Codex 계정 전환 및 Codex auth.json 기록
tokscale codex switch work
# 저장된 Codex 계정 추적 중지 (Tokscale 스토어에서만 제거 —
# codex CLI 자체의 auth.json/로그인은 절대 건드리지 않음)
tokscale codex remove personal
# 활성 또는 이름 있는 계정의 구독 사용량 확인
tokscale codex status
tokscale codex status --name personal --json저장된 Codex 계정이 있으면 tokscale usage --json은 각 Codex 항목에 대한 구조화된 계정 메타데이터를 포함하며 TUI는 해당 항목들을 하나의 Codex 그룹 아래에 표시합니다. 저장된 계정이 없으면 Tokscale은 현재 Codex 인증 탐색 경로(CODEX_HOME/auth.json, ~/.config/codex/auth.json, ~/.codex/auth.json, 그리고 macOS Keychain)로 폴백합니다.
이러한 네이티브 Codex 소스에서 성공한 사용량 결과가 없으면 Tokscale은 OpenCode의 $XDG_DATA_HOME/opencode/auth.json(일반적으로 ~/.local/share/opencode/auth.json)에서 openai OAuth 항목을 읽습니다. OpenAI API 키 항목은 ChatGPT 구독 자격 증명이 아니므로 무시됩니다. OpenCode 자격 증명은 읽기 전용이며 Tokscale은 이를 가져오거나 갱신하거나 다시 쓰지 않습니다. 액세스 토큰이 거부되면 OpenCode를 사용해 로그인을 갱신하거나 /connect로 OpenAI를 다시 연결하세요.
╭──────────────────────────────────────────────────────────╮
│ Session 85% left [=========---] resets in 2h 15m │
│ Weekly 72% left [========----] resets Fri 3pm │
│ Plan Max 20x │
╰──────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ Session 40% left [=====-------] resets in 4h 30m │
│ Weekly 90% left [==========--] resets Mon 12am │
│ Account user@example.com │
│ Plan Pro │
╰──────────────────────────────────────────────────────────╯
Tokscale은 설정 디렉터리의 settings.json에 설정을 저장합니다. 기본 위치는 ~/.config/tokscale/settings.json입니다. Linux에서 XDG_CONFIG_HOME이 설정되어 있으면 $XDG_CONFIG_HOME/tokscale/settings.json이고, Windows에서는 %APPDATA%\tokscale\settings.json입니다. TOKSCALE_CONFIG_DIR을 설정하면 모든 플랫폼에서 그 디렉터리를 대신 씁니다. 설정 디렉터리를 전혀 찾을 수 없으면 현재 작업 디렉터리의 ./.tokscale/settings.json을 씁니다:
{
"colorPalette": "blue",
"includeUnusedModels": false,
"defaultClients": ["opencode", "claude"],
"usage": {
"disabledProviders": ["copilot"]
},
"scanner": {
"extraScanPaths": {
"codex": [
"/Users/me/workspace/project-a/.codex/sessions",
"/Users/me/workspace/project-b/.codex/archived_sessions"
],
"hermes": [
"/Users/me/.hermes/profiles/director_planning",
"/Users/me/.hermes/profiles/research/state.db"
]
}
}
}| 설정 | 타입 | 기본값 | 설명 |
|---|---|---|---|
colorPalette |
string | "blue" |
TUI 색상 테마 (green, halloween, teal, blue, pink, purple, orange, monochrome, ylgnbu, graphite, lagoon, dusk, tokyo-night, catppuccin, solarized, gruvbox, gruvbox-material, one-dark) |
includeUnusedModels |
boolean | false |
리포트에서 제로 토큰 모델 표시 |
autoRefreshEnabled |
boolean | false |
TUI 자동 새로고침 활성화 |
autoRefreshMs |
number | 60000 |
자동 새로고침 간격 (30000-3600000ms) |
nativeTimeoutMs |
number | 300000 |
네이티브 서브프로세스 처리 최대 시간 (5000-3600000ms) |
defaultClients |
string[] | [] |
--client/-c 플래그를 전달하지 않을 때 적용되는 기본 클라이언트 필터. --client와 동일한 ID를 받습니다 (예: ["opencode", "claude", "synthetic"]). 알 수 없는 ID는 자동으로 무시됩니다. CLI 플래그가 있으면 이 목록은 완전히 무시됩니다 — 병합되지 않습니다. |
usage.disabledProviders |
string[] | [] |
자격 증명 탐색이나 네트워크 접근 전에 건너뛸 구독 usage 프로바이더. 유효한 ID(대소문자 무시, 앞뒤 공백 허용): claude, codex, zai, amp, antigravity, copilot, grok, kimi, minimax, minimax-token-plan, warp, sakana, opencode-go. 알 수 없는 ID는 무시됩니다. 비활성화된 프로바이더는 캐시된 TUI 카드와 진단에서도 숨겨집니다. 변경 사항은 다음 tokscale usage 실행 또는 TUI 시작/새로고침부터 적용됩니다. |
light.writeCache |
boolean | false |
true이면 tokscale --light가 렌더링 직후 TUI 캐시를 원자적으로 덮어씁니다. CLI 플래그 --write-cache / --no-write-cache가 실행별로 우선합니다. |
minutelyTabEnabled |
boolean | false |
TUI에 분 단위 Minutely 탭을 표시하고 데이터 로딩 중에 분 단위 집계를 수행합니다. 대부분의 사용자에게 분 단위 세분화는 틈새/진단 뷰이며, 대규모 데이터셋에서는 분 단위 버케팅에 무시할 수 없는 비용이 들기 때문에 기본적으로 비활성화되어 있습니다. |
cursor.syncTimeoutSeconds |
number | 미설정 | tokscale cursor sync가 계정별 사용량을 내려받을 때 쓰는 전체 시간 예산(초, 1-86400). 설정하지 않으면 120초에서 시작해 Cursor가 알려 주는 사용량 이벤트 수에 맞춰 최대 1800초까지 늘어납니다. tokscale cursor sync --timeout <SECONDS>가 실행별로 우선합니다. Cursor IDE 명령어를 참조하세요. |
scanner.extraScanPaths |
object | {} |
Tokscale의 기본 home-root 위치 밖에 있는 세션을 위한 클라이언트별 추가 스캔 루트 |
scanner.bucketTimezone |
string | 자동 감지 | 이 기기가 사용량 날짜를 버킷화하는 시간대의 IANA 이름(예: "Asia/Seoul"). 최초 실행 시 자동으로 기록됩니다. 직접 편집하는 대신 tokscale config set timezone <zone>을 사용하세요. |
메시지가 어느 달력 날짜에 집계되는지는 시간대에 따라 달라집니다. Tokscale은 매 스캔마다 현재 시스템 시간대를 읽는 대신, 이 기기의 시간대를 최초 실행 시 기록하고 계속 사용합니다.
일별 합계는 날짜별로 제출되며 절대 감소할 수 없기 때문에 중요합니다. 이동, 시스템 시계 변경, 다른 TZ를 사용하는 CI 실행처럼 같은 기록을 다른 시간대에서 다시 버킷화하면 자정 부근의 세션이 인접한 날짜로 이동합니다. 이전 날짜와 새 날짜는 모두 값을 유지하므로 새 사용량이 없어도 합계가 증가합니다. 시간대를 고정하면 날짜 경계가 안정되어, 변경되지 않은 기록을 재스캔해도 항상 동일한 버킷이 생성됩니다.
$ tokscale config list
timezone Asia/Seoul
$ tokscale config get timezone
Asia/Seoul
# `set timezone auto`는 유효한 고정 값이 아직 없거나, 직접 편집한 잘못된 값을 복구할 때만 허용됩니다. 이미 설정된 기기의 시간대를 다시 고정할 수는 없습니다.
$ tokscale config set timezone autoIANA 시간대 이름만 허용됩니다. +09:00 같은 고정 UTC 오프셋은 거부됩니다. 오프셋은 일광 절약 시간제를 따를 수 없으므로 DST 전환 후에는 지역 자정과 일치하지 않아 날짜 경계 근처의 사용량이 다시 분할됩니다. 이는 고정으로 방지하려는 문제의 축소판입니다.
유효하게 설정된 시간대는 auto를 포함해 변경하거나 해제할 수 없습니다. 과거에 제출된 일별 행은 단조 증가하므로, 이전 사용량의 키를 다시 매기면 영구적인 이중 집계가 발생합니다. 기기를 이전하려면 다른 버킷 시간대를 선택하기 전에 서버 재동기화/교체 전환이 필요합니다.
기존 설치는 시간대를 고정할 때까지 영향을 받지 않습니다. 고정하는 실행은 이미 사용 중인 시간대를 기록하며, 이미 고정된 시간대가 있는 기기를 Tokscale이 자동으로 다시 고정하지 않습니다.
scanner.extraScanPaths는 프로젝트 단위 .codex 디렉터리나 가져온 Gemini/OpenClaw 히스토리 같은 영구적인 추가 루트에 사용하세요. Tokscale은 $HERMES_HOME/profiles/*/state.db 아래의 Hermes 프로필 데이터베이스를 자동으로 발견합니다(HERMES_HOME이 없으면 ~/.hermes/profiles/*/state.db). 비표준 Hermes 프로필 위치에만 scanner.extraScanPaths.hermes를 사용하세요. Hermes 항목은 state.db를 포함하는 프로필 디렉터리를 가리키거나 state.db 파일을 직접 가리킬 수 있습니다. ~/.omo/agent 밖에 있는 OmO Native 에이전트 디렉터리는 scanner.extraScanPaths.senpi에 추가하세요. 항목은 에이전트 디렉터리나 그 안의 sessions/ 디렉터리를 가리킬 수 있습니다(Senpi (OmO Native) 참조). Tokscale은 매 실행마다 이 경로들을 기본 스캔 루트와 병합하고, 겹치는 루트는 정규 경로(canonical path) 기준으로 중복 제거합니다.
defaultClients로 개인 기본값을 고정할 수 있습니다 — 예를 들어 OpenCode와 Claude만 사용한다면 ["opencode", "claude"]로 설정하면, tokscale(플래그 없이)은 모든 리포트를 자동으로 해당 클라이언트로 범위를 좁힙니다. 단일 실행에 대해 재정의하려면 명령줄에서 --client를 전달하세요.
Minutely 탭은 토큰 사용량을 분 단위로 표시하며, 버스트 패턴 진단, 단일 세션 디버깅, autoRefreshEnabled와 함께 거의 실시간 모니터링에 가장 유용합니다. 분 단위 집계는 데이터 로딩 중 모든 파싱된 메시지를 처리하므로 대부분의 사용자에게는 불필요한 RAM과 CPU 비용이 발생합니다. 그래서 기본적으로 숨겨져 있습니다.
활성화하려면 ~/.config/tokscale/settings.json에서 minutelyTabEnabled를 true로 설정하세요:
{
"minutelyTabEnabled": true
}재시작 후 탭 스트립의 Hourly와 Stats 사이에 Minutely 탭이 나타나며, Tab / BackTab / Left / Right 내비게이션이 이를 순환합니다. 플래그를 다시 false로 설정하면 탭이 숨겨지고 집계도 다시 건너뜁니다.
재생성 가능한 CLI/TUI/가격/Wrapped 캐시는 ~/.config/tokscale/cache/ 아래에 저장됩니다 (TOKSCALE_CONFIG_DIR를 설정한 경우 ${TOKSCALE_CONFIG_DIR}/cache/). 통합 동기화 아티팩트는 ~/.config/tokscale/antigravity-cache/ 및 ~/.config/tokscale/trae-cache/ 같은 클라이언트별 캐시 루트에 저장됩니다:
tui-data-cache.json— TUI 시작 캐시source-message-cache-v2/+source-message-cache.lock— 샤딩된 소스 메시지 캐시와 락 파일pricing-litellm.json/pricing-openrouter.json— 가격 캐시opencode-migration.json— OpenCode 마이그레이션 기록fonts/,images/— Wrapped 에셋 캐시
이 디렉터리는 삭제해도 안전합니다. 필요할 때 Tokscale이 다시 생성하고 채웁니다.
Claude Code에만 해당하는 주의사항이 있습니다. Claude Code는 세션을 재개하거나 압축할 때 트랜스크립트를 제자리에서 다시 씁니다. 파일 이름은 유지되지만 이전에 기록했던 어시스턴트 턴은 사라집니다. source-message-cache-v2/는 트랜스크립트 파일이 존재하는 동안 그 턴을 기억하므로 합계에 계속 반영됩니다. 이 정보는 캐시에만 남으며 트랜스크립트 자체에는 더 이상 존재하지 않습니다. 캐시를 삭제하거나 Claude 파서 업그레이드로 캐시를 다시 만들면 압축된 트랜스크립트에서 재구성되므로, 많이 압축된 세션의 합계는 더 낮아질 수 있습니다. 반대로 트랜스크립트를 삭제하면 어느 경우든 해당 턴은 제거되며, 이것이 로컬 디스크가 소스 오브 트루스인 이유입니다.
환경 변수는 설정 파일 값을 오버라이드합니다. CI/CD 또는 일회성 사용:
| 변수 | 기본값 | 설명 |
|---|---|---|
TOKSCALE_NATIVE_TIMEOUT_MS |
300000 (5분) |
nativeTimeoutMs 설정 오버라이드 |
TOKSCALE_API_TOKEN |
unset | 비대화형 submit 및 delete-submitted-data 실행을 위한 Tokscale 개인 API 토큰. Settings > API Tokens에서 생성하거나 tokscale login --token tt_xxx로 로컬에 저장하세요. |
TOKSCALE_EXTRA_DIRS |
unset | 일회성 추가 세션 루트, client:/abs/path,client:/abs/path 형식 |
TOKSCALE_CONFIG_DIR |
unset | 설정 디렉토리 루트(settings.json, star-cache.json, cache/, antigravity-cache/, trae-cache/ 위치)를 오버라이드합니다. 절대 경로 권장; 상대 경로는 프로세스 CWD 기준으로 해석됩니다. CI 샌드박스나 비기본 위치를 고정할 때 유용합니다. 설정되면 tokscale은 macOS 레거시 경로(~/Library/Application Support/tokscale/)로 폴백하지 않습니다. |
TOKSCALE_FM_DEBUG |
unset | 설정되면 Apple Foundation Models 진단 정보(macOS 버전 게이트, dlopen dylib 경로, 로드/심볼 오류)를 stderr로 출력하여 온디바이스 apple-fm이 동작했는지 또는 동작하지 않았는지 이유를 설명합니다. |
TOKSCALE_RECOVERY_DISABLE |
unset | 설정되면 파일이 존재하더라도 로컬 사용량 복구 원장(recovered-usage-v1.json)을 비활성화합니다. |
# 예시: 매우 큰 데이터셋에 대한 타임아웃 증가
TOKSCALE_NATIVE_TIMEOUT_MS=600000 tokscale graph --output data.json
# 예시: 일회성 추가 스캔 루트
TOKSCALE_EXTRA_DIRS='codex:/Users/me/workspace/project-a/.codex/sessions,gemini:/Users/me/imports/imac/gemini/tmp' tokscale
# 예시: 대화형 브라우저 로그인 없이 CI에서 제출
TOKSCALE_API_TOKEN=tt_xxx tokscale submit참고: 영구적인 추가 루트는
~/.config/tokscale/settings.json의scanner.extraScanPaths를 권장합니다.TOKSCALE_EXTRA_DIRS는 일회성 오버라이드나 CI/CD에 가장 적합합니다.
Tokscale은 자동화, CI/CD 파이프라인 및 배치 처리를 위한 Codex CLI headless 출력의 토큰 사용량을 집계할 수 있습니다.
Headless 모드란?
Codex CLI를 JSON 출력 플래그와 함께 실행할 때(예: `codex exec --json`), 일반 세션 디렉토리에 저장하는 대신 사용량 데이터를 stdout으로 출력합니다. Headless 모드를 사용하면 이러한 사용량을 캡처하고 추적할 수 있습니다.
저장 위치: `~/.config/tokscale/headless/`
macOS에서는 `TOKSCALE_HEADLESS_DIR`이 설정되지 않은 경우 Tokscale이 `~/Library/Application Support/tokscale/headless/`도 스캔합니다.
Tokscale은 다음 디렉토리 구조를 자동으로 스캔합니다: ``` ~/.config/tokscale/headless/ └── codex/ # Codex CLI JSONL 출력 ```
환경 변수: `TOKSCALE_HEADLESS_DIR`을 설정하여 headless 로그 디렉토리를 커스터마이징할 수 있습니다: ```bash export TOKSCALE_HEADLESS_DIR="$HOME/my-custom-logs" ```
권장 (자동 캡처):
| 도구 | 명령어 예시 |
|---|---|
| Codex CLI | `tokscale headless codex exec -m gpt-5 "implement feature"` |
수동 리다이렉트 (선택사항):
| 도구 | 명령어 예시 |
|---|---|
| Codex CLI | `codex exec --json "implement feature" > ~/.config/tokscale/headless/codex/ci-run.jsonl` |
진단:
```bash
tokscale sources tokscale sources --json ```
CI/CD 통합 예시:
```bash
- name: Run AI automation run: | mkdir -p ~/.config/tokscale/headless/codex codex exec --json "review code changes" \ > ~/.config/tokscale/headless/codex/pr-${{ github.event.pull_request.number }}.jsonl
- name: Report token usage run: tokscale --json ```
참고: Headless 캡처는 Codex CLI만 지원됩니다. Codex를 직접 실행하는 경우 위와 같이 stdout을 headless 디렉토리로 리다이렉트해야 합니다.
프론트엔드는 GitHub 스타일의 기여 그래프 시각화를 제공합니다:
- 2D 뷰: 클래식 GitHub 기여 캘린더
- 3D 뷰: 토큰 사용량에 따른 높이의 아이소메트릭 3D 기여 그래프
- 다양한 색상 팔레트: GitHub, GitLab, Halloween, Winter 등
- 3가지 테마 토글: Light / Dark / System (OS 설정 따름)
- GitHub Primer 디자인: GitHub의 공식 색상 시스템 사용
- 인터랙티브 툴팁: 호버 시 상세 일별 분석 표시
- 일별 분석 패널: 클릭하여 소스별, 모델별 세부사항 확인
- 연도 필터링: 연도 간 탐색
- 소스 필터링: 플랫폼별 필터 (OpenCode, Claude, Codex, Copilot, Cursor, Gemini, Amp, Codebuff, Droid, OpenClaw, Hermes Agent, Pi, Prime Agent, Kimi, Qwen, Roo Code, Kilo, Mux, Kilo CLI, Crush, Goose, Antigravity, Antigravity CLI, Antigravity IDE Extension, Zed, Kiro, Trae, Warp, Cline, Gajae-Code, Grok Build, Jcode, MiMo Code, Xiaomi MiMo AI, Command Code, Junie, ZCode, OpenCodeReview, CodeBuddy, WorkBuddy, Devin CLI, Devin Desktop, Augment Code, Synthetic, Cherry Studio, LM Studio, Unsloth, Hindsight, Muse Code, Aside, Mistral Vibe, Proma)
- 통계 패널: 총 비용, 토큰, 활동 일수, 연속 기록
- FOUC 방지: React 하이드레이션 전 테마 적용 (깜빡임 없음)
cd packages/frontend
bun install
bun run devhttp://localhost:3000을 열어 소셜 플랫폼에 접근하세요.
Tokscale은 사용량 데이터를 공유하고 다른 개발자와 경쟁할 수 있는 소셜 플랫폼을 포함합니다.
- 리더보드 - 모든 플랫폼에서 가장 많은 토큰을 사용하는 사람 확인
- 사용자 프로필 - 기여 그래프와 통계가 있는 공개 프로필
- 기간 필터링 - 전체 기간, 이번 달, 이번 주 통계 조회
- GitHub 통합 - GitHub 계정으로 로그인
- 로컬 뷰어 - 제출하지 않고 비공개로 데이터 조회
GitHub 프로필 README에 Tokscale 공개 통계를 직접 임베드할 수 있습니다:
[](https://tokscale.ai/u/<username>)<username>을 GitHub 사용자명으로 교체하세요. 쿼리 파라미터가 없으면
기본 classic 카드가 렌더링됩니다. 디자인을 커스터마이즈하려면 아래
파라미터를 덧붙이세요.
| 파라미터 | 값 | 효과 |
|---|---|---|
template |
classic (기본값) · minimal · terminal · graph · orbit · vitals · blueprint · receipt |
카드 디자인 |
color |
blue · green · teal · purple · pink · orange · monochrome · halloween · YlGnBu |
강조 색상 및 기여 그래프 팔레트 |
theme |
dark (기본값) · light |
라이트 또는 다크 카드 |
period |
all (기본값) · month (최근 30일) · week (최근 7일) |
토큰, 비용, 기여 활동 및 랭크 기간. 제출 횟수는 전체 기간 기준 |
sort |
tokens (기본값) · cost |
랭크를 가져올 리더보드 기준 |
tokens, cost |
compact · full |
숫자 형식, 독립적으로 설정 — 20.9B vs 20,941,000,000 |
rank |
plain (기본값, #134) · percent (top 12%) · total (#134 / 1,174) |
리더보드 랭크 표시 방식 |
graph |
1로 기여 그래프 추가 (기본값은 꺼짐) |
classic, minimal, terminal, orbit, blueprint, receipt에서 지원 |
compact |
1로 컴팩트 레이아웃 사용 |
classic 전용 |
예시:




shields.io 스타일의 더 간결한 뱃지를 사용할 수도 있습니다:
<username>을 GitHub 사용자명으로 교체하세요- 선택적 쿼리 파라미터:
metric=tokens(기본값),metric=cost, 또는metric=rankstyle=flat(기본값) 또는style=flat-squaresort=tokens(기본값) 또는sort=cost랭킹 기준 제어compact=1간결한 숫자 표기 사용 (예:1.2M,$3.4K)label=<텍스트>왼쪽 라벨 커스텀color=<hex>오른쪽 배경색 커스텀 (예:color=ff5733)
- 예시:
https://tokscale.ai/api/badge/<username>/svg?metric=cost&compact=1https://tokscale.ai/api/badge/<username>/svg?metric=rank&sort=cost&style=flat-square
- 로그인 -
tokscale login을 실행하여 GitHub로 인증 - 제출 -
tokscale submit을 실행하여 사용량 데이터 업로드 - 조회 - 웹 플랫폼을 방문하여 프로필과 리더보드 확인
제출된 데이터는 레벨 1 검증을 거칩니다:
- 수학적 일관성 (합계 일치, 음수 없음)
- 미래 날짜 없음
- 필수 필드 존재
- 중복 감지
Spotify Wrapped에서 영감을 받아, AI 코딩 어시스턴트 사용량을 요약한 아름다운 연간 리뷰 이미지를 생성합니다.
bunx tokscale@latest wrapped |
bunx tokscale@latest wrapped --clients |
|---|---|
![]() |
![]() |
# 현재 연도의 Wrapped 이미지 생성
tokscale wrapped
# 특정 연도의 Wrapped 이미지 생성
tokscale wrapped --year 2025생성된 이미지에는 다음이 포함됩니다:
- 총 토큰 - 해당 연도의 총 토큰 소비량
- 상위 모델 - 비용 기준 상위 3개 AI 모델
- 상위 클라이언트 - 가장 많이 사용한 3개 플랫폼 (OpenCode, Claude Code, Cursor 등)
- 메시지 - 총 AI 인터랙션 수
- 활동 일수 - 최소 1회 이상 AI 인터랙션이 있었던 일수
- 비용 - LiteLLM 가격 기준 추정 총비용
- 연속 기록 - 가장 긴 연속 활동 일수
- 기여 그래프 - 연간 활동을 보여주는 히트맵
생성된 PNG는 소셜 미디어 공유에 최적화되어 있습니다. 커뮤니티와 함께 코딩 여정을 공유하세요!
빠른 설정: 빠르게 시작하려면 위 설치 섹션의 개발 환경 설정을 참조하세요.
# Bun (필수)
bun --version
# Rust (네이티브 모듈용)
rustc --version
cargo --version개발 환경 설정을 따른 후:
# 네이티브 모듈 빌드 (선택사항이지만 권장)
bun run build:core
# 개발 모드로 실행 (TUI 실행)
cd packages/cli && bun src/index.ts
# 또는 레거시 CLI 모드 사용
cd packages/cli && bun src/index.ts --light셀프 호스팅으로 실행
이 저장소는 단일 호스트 배포를 위한 Makefile과 Docker/Podman Compose 스택을 제공합니다. 로컬 Rust나 Bun 설치는 필요하지 않으며, 스택은 docker보다 podman을 자동으로 우선 감지합니다.
첫 실행 — 이미지 빌드는 데이터베이스에 연결하지 않습니다. Compose가 Postgres의 정상 상태를 확인한 후 앱 컨테이너가 시작될 때 마이그레이션이 실행됩니다.
make docker/build # 프론트엔드 이미지를 빌드하고 태그 지정 (tokscale:latest)
make up # Postgres와 프론트엔드를 http://localhost:3333 에서 시작make up은 미리 빌드된 tokscale:latest 이미지를 사용하며 Compose 재빌드를 실행하지 않습니다.
이후 실행 — 이미지가 이미 빌드되어 있으므로 서비스를 시작하기만 하면 됩니다.
make upTUI — 웹 스택과 독립적으로 실행되며, 호스트 파일 시스템 마운트에서 세션 데이터를 직접 읽습니다.
make tui/build # 한 번 빌드
make tui # 실행make tui는 현재 호스트의 UID와 GID로 컨테이너를 실행하고, 필요한 경우 ~/.config/tokscale과 ~/.cache/tokscale만 생성해 읽기/쓰기로 마운트합니다. 세션 데이터 마운트는 읽기 전용으로 유지되므로 컨테이너가 클라이언트 디렉터리에 root 소유 파일을 만들 수 없습니다. make tui 대신 Compose를 직접 호출한다면 TOKSCALE_UID=$(id -u)와 TOKSCALE_GID=$(id -g)를 설정하고, 이 두 쓰기 가능 디렉터리를 직접 만드세요.
기본 TUI 프로필은 의도적으로 클라이언트 데이터 디렉터리를 바인드하지 않습니다. rootful Docker는 읽기 전용 마운트에도 없는 바인드 소스를 root 소유로 만들기 때문입니다. 다음처럼 자신의 컴퓨터에 이미 존재하는 경로만 명시적으로 선택하세요.
TOKSCALE_UID=$(id -u) TOKSCALE_GID=$(id -g) \
docker compose --profile tui run --rm \
-v "$HOME/.claude:/home/tokscale/.claude:ro" tui사용하는 클라이언트에 맞게 동등한 -v 플래그를 추가하세요. 기본 명령어가 임의의 호스트 클라이언트 디렉터리를 생성하지 않도록 합니다.
그 밖의 자주 쓰는 대상:
make down # 모든 서비스 중지
make logs/app # 앱 로그 추적
make help # 전체 대상 목록사용자 지정 자격 증명 — make up 전에 네 변수를 모두 함께 설정하세요. Compose는 POSTGRES_* 변수로부터 DATABASE_URL을 자동 파생할 수 없습니다. 호스트 이름 db는 Compose 네트워크의 앱 컨테이너에서만 유효하므로 호스트 셸이나 Docker 빌드 인수에서 사용하지 마세요.
export POSTGRES_USER=myuser
export POSTGRES_PASSWORD=mypass
export POSTGRES_DB=mydb
export DATABASE_URL=postgresql://myuser:mypass@db:5432/mydb기본값(tokscale/tokscale/tokscale)은 로컬 개발 전용입니다.
공개 배포 — 이 Compose 파일은 두 포트를 모두 루프백에 바인드하며 TLS를 종료하는 리버스 프록시 뒤에 두는 용도입니다. make up 전에 APP_URL을 공개 HTTPS origin(예: https://tokscale.example.com)으로 설정하고 프록시에도 해당 URL을 구성하세요. 런타임에 OAuth 리디렉션, CSRF 기본값, canonical 메타데이터, sitemap, robots에 사용됩니다. 번들 로컬 Postgres 서비스에만 DATABASE_SSL=false를 유지하세요. 관리형 데이터베이스는 DATABASE_URL, DATABASE_SSL=require, APP_URL, 선택적인 GitHub OAuth 자격 증명을 보호된 .env/시크릿 저장소에 넣은 후 docker compose -f docker-compose.external-db.yml up -d를 실행하세요. 이 파일에는 db 서비스나 로컬 데이터베이스 종속성이 없습니다. 샘플 기본값은 의도적으로 OAuth를 활성화하지 않습니다.
재사용 가능한 이미지 하나가 페이지 메타데이터와 소셜 카드에 런타임 APP_URL을 출력해야 하므로 루트 레이아웃은 요청 동적입니다. 이는 배포별로 올바른 공개 origin을 제공하는 대신 전체 라우트의 static/ISR 출력을 의도적으로 포기하는 것이며, 데이터 가져오기는 기존 캐시 태그와 재검증 정책을 계속 사용합니다.
고급 개발
| 스크립트 | 설명 |
|---|---|
bun run cli |
개발 모드에서 CLI 실행 (Bun으로 TUI) |
bun run build:core |
네이티브 Rust 모듈 빌드 (릴리스) |
bun run build:cli |
CLI TypeScript를 dist/로 빌드 |
bun run build |
core와 CLI 모두 빌드 |
bun run dev:frontend |
프론트엔드 개발 서버 실행 |
패키지별 스크립트 (패키지 디렉토리 내에서):
packages/cli:bun run dev,bun run tuipackages/core:bun run build:debug,bun run test,bun run bench
참고: 이 프로젝트는 개발 시 Bun을 패키지 매니저로 사용합니다.
# 네이티브 모듈 테스트 (Rust)
cd packages/core
bun run test:rust # Cargo 테스트
bun run test # Node.js 통합 테스트
bun run test:all # 둘 다cd packages/core
# 디버그 모드로 빌드 (빠른 컴파일)
bun run build:debug
# 릴리스 모드로 빌드 (최적화됨)
bun run build
# Rust 벤치마크 실행
bun run bench# 그래프 데이터를 파일로 내보내기
tokscale graph --output usage-data.json
# 날짜 필터링 (모든 단축키 사용 가능)
tokscale graph --today
tokscale graph --week
tokscale graph --since 2024-01-01 --until 2024-12-31
tokscale graph --year 2024
# 플랫폼별 필터
tokscale graph --client opencode,claude
# 처리 시간 벤치마크 표시
tokscale graph --output data.json --benchmark성능 분석을 위한 처리 시간 표시:
tokscale --benchmark # 기본 뷰와 함께 처리 시간 표시
tokscale models --benchmark # 모델 리포트 벤치마크
tokscale monthly --benchmark # 월별 리포트 벤치마크
tokscale graph --benchmark # 그래프 생성 벤치마크# 시각화용 데이터 내보내기
tokscale graph --output packages/frontend/public/my-data.json네이티브 Rust 모듈은 상당한 성능 향상을 제공합니다:
| 작업 | TypeScript | Rust 네이티브 | 속도 향상 |
|---|---|---|---|
| 파일 탐색 | ~500ms | ~50ms | 10배 |
| JSON 파싱 | ~800ms | ~100ms | 8배 |
| 집계 | ~200ms | ~25ms | 8배 |
| 총합 | ~1.5초 | ~175ms | ~8.5배 |
약 1000개의 세션 파일, 100k 메시지 기준 벤치마크
네이티브 모듈은 다음을 통해 약 45% 메모리 절감도 제공합니다:
- 스트리밍 JSON 파싱 (전체 파일 버퍼링 없음)
- 제로 카피 문자열 처리
- 맵-리듀스를 통한 효율적인 병렬 집계
# 합성 데이터 생성
cd packages/benchmarks && bun run generate
# Rust 벤치마크 실행
cd packages/core && bun run bench| 플랫폼 | 아키텍처 |
|---|---|
| macOS | x86_64 |
| macOS | aarch64 (Apple Silicon) |
| Linux | x86_64 (glibc) |
| Linux | aarch64 (glibc) |
| Linux | x86_64 (musl) |
| Linux | aarch64 (musl) |
| Windows | x86_64 |
| Windows | aarch64 |
Linux에서는 런처가 glibc와 musl을 자동으로 감지합니다 (process.report, /lib/ld-musl-*.so.1의 musl 동적 로더, 그리고 ldd를 통해). 감지가 잘못된 종류를 선택하는 경우 — 예를 들어 최소 컨테이너에서 — TOKSCALE_LIBC=musl (또는 TOKSCALE_LIBC=gnu)를 설정해 강제할 수 있습니다.
Tokscale은 Windows를 완벽하게 지원합니다. TUI와 CLI는 macOS/Linux와 동일하게 작동합니다.
Windows 설치:
# Bun 설치 (PowerShell)
powershell -c "irm bun.sh/install.ps1 | iex"
# tokscale 실행
bunx tokscale@latestAI 코딩 도구들은 크로스 플랫폼 위치에 세션 데이터를 저장합니다. 대부분의 도구는 모든 플랫폼에서 동일한 상대 경로를 사용합니다:
| 도구 | Unix 경로 | Windows 경로 | 출처 |
|---|---|---|---|
| OpenCode | ~/.local/share/opencode/ |
%USERPROFILE%\.local\share\opencode\ |
크로스 플랫폼 일관성을 위해 xdg-basedir 사용 (소스) |
| Claude Code | ~/.claude/ |
%USERPROFILE%\.claude\ |
모든 플랫폼에서 동일한 경로 |
| OpenClaw | ~/.openclaw/ (+ 레거시: .clawdbot, .moltbot, .moldbot) |
%USERPROFILE%\.openclaw\ (+ 레거시 경로) |
모든 플랫폼에서 동일한 경로 |
| Codex CLI | ~/.codex/ |
%USERPROFILE%\.codex\ |
CODEX_HOME 환경변수로 설정 가능 (소스) |
| Prime Agent | ~/.prime/agent/ |
%USERPROFILE%\.prime\agent\ |
루트 세션 및 RLM 하위 세션; settings.json의 sessionDir, PRIME_AGENT_CODING_AGENT_DIR, PRIME_AGENT_SESSION_DIR 또는 레거시 PRIME_AGENT_CODING_AGENT_SESSION_DIR로 설정 가능 |
| Copilot CLI | ~/.copilot/session-store.db, ~/.copilot/otel/, ~/.copilot/data.db |
%USERPROFILE%\.copilot\session-store.db, %USERPROFILE%\.copilot\otel\, %USERPROFILE%\.copilot\data.db |
CLI 사용량 이벤트는 session-store.db에서 수집 (OTEL 불필요); COPILOT_OTEL_FILE_EXPORTER_PATH와 Desktop data.db도 자동 수집 |
| Hermes Agent | ~/.hermes/ |
%USERPROFILE%\.hermes\ |
HERMES_HOME 환경변수로 설정 가능 (소스) |
| Gemini CLI | ~/.gemini/ |
%USERPROFILE%\.gemini\ |
GEMINI_CLI_HOME 환경변수로 설정 가능 |
| Amp | ~/.config/tokscale/amp-cache/ (+ 레거시 ~/.local/share/amp/) |
%APPDATA%\tokscale\amp-cache\ (+ 레거시 %USERPROFILE%\.local\share\amp\) |
tokscale amp sync로 동기화. 레거시 경로는 OpenCode와 동일하게 xdg-basedir 사용 |
| Cursor | API 동기화 | API 동기화 | API로 가져와 usage*.json으로 캐시(레거시 usage*.csv 캐시도 계속 읽음); 데스크톱 자동 로그인은 state.vscdb 인증만 읽음; 로컬 ~/.cursor 세션 데이터는 파싱하지 않음 |
| Droid | ~/.factory/ |
%USERPROFILE%\.factory\ |
모든 플랫폼에서 동일한 경로 |
| Pi | ~/.pi/ |
%USERPROFILE%\.pi\ |
모든 플랫폼에서 동일한 경로 |
| Oh My Pi | ~/.omp/ |
%USERPROFILE%\.omp\ |
모든 플랫폼에서 동일한 경로 (Oh My Pi) |
| Kimchi Coding | ~/.config/kimchi/harness/sessions/ |
%USERPROFILE%\.config\kimchi\harness\sessions\ |
KIMCHI_CODING_AGENT_DIR 환경변수로 오버라이드 가능; Pi 호환 JSONL 세션 |
| Kimi CLI | ~/.kimi/ |
%USERPROFILE%\.kimi\ |
모든 플랫폼에서 동일한 경로 |
| Kimi Code | ~/.kimi-code/ |
%USERPROFILE%\.kimi-code\ |
모든 플랫폼에서 동일한 경로 |
| Kimi Work (desktop) | ~/Library/Application Support/kimi-desktop/ |
%APPDATA%\kimi-desktop\ |
Linux 빌드 없음 |
| Qwen CLI | ~/.qwen/ |
%USERPROFILE%\.qwen\ |
모든 플랫폼에서 동일한 경로 |
| Roo Code | ~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/ |
%USERPROFILE%\.config\Code\User\globalStorage\rooveterinaryinc.roo-cline\tasks\ |
VS Code globalStorage 작업 로그 |
| Kilo | ~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/ |
%USERPROFILE%\.config\Code\User\globalStorage\kilocode.kilo-code\tasks\ |
VS Code globalStorage 작업 로그 |
| Cline | Linux: ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/; macOS: ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/; 서버: ~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/; Cline CLI 폴백: ~/.cline/data/sessions/ |
%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\tasks\; Cline CLI 폴백: %USERPROFILE%\.cline\data\sessions\ |
VS Code globalStorage 작업 로그; Cline CLI는 {SESSION_ID}/{SESSION_ID}.messages.json을 사용하며 루트는 $CLINE_SESSION_DATA_DIR → $CLINE_DATA_DIR/sessions/ → $CLINE_DIR/data/sessions/ → ~/.cline/data/sessions/ 순으로 선택; 비어 있거나 공백만 있는 환경 변수는 무시 |
| Mux | ~/.mux/sessions/ |
%USERPROFILE%\.mux\sessions\ |
모든 플랫폼에서 동일한 경로 |
| Codebuff | ~/.config/manicode/projects/ (+ manicode-dev, manicode-staging) |
%USERPROFILE%\.config\manicode\projects\ |
CODEBUFF_DATA_DIR 환경변수로 오버라이드 |
| Kilo CLI | ~/.local/share/kilo/ |
%USERPROFILE%\.local\share\kilo\ |
OpenCode와 같이 xdg-basedir 사용 |
| Crush | $XDG_DATA_HOME/crush/ (기본값: ~/.local/share/crush/) |
%USERPROFILE%\.local\share\crush\ (설정된 경우 %XDG_DATA_HOME%\crush\) |
기본 경로를 포함한 XDG 데이터 디렉토리 사용 |
| Goose | ~/.local/share/goose/sessions/ (+ macOS Application Support, 레거시 Block 경로) |
%APPDATA%\Block\goose\data\sessions (폴백: %USERPROFILE%\.local\share\goose\sessions\ 및 레거시 Block 경로) |
GOOSE_PATH_ROOT 환경변수로 설정 가능 |
| Antigravity | ~/.config/tokscale/antigravity-cache/sessions/ |
— | tokscale antigravity sync는 현재 macOS/Linux에서만 지원 |
| Zed Agent | ~/.local/share/zed/threads/threads.db |
%LOCALAPPDATA%\Zed\threads\threads.db |
호스팅된 Zed 모델 사용량 전용; 외부 ACP 에이전트는 포함되지 않음 |
| Kiro | ~/.kiro/sessions/cli/ 및 ~/.local/share/kiro-cli/data.sqlite3 |
%USERPROFILE%\.kiro\sessions\cli\ 및 %USERPROFILE%\.local\share\kiro-cli\data.sqlite3 |
Kiro 세션 파일과 함께 존재하는 경우 Kiro CLI SQLite 데이터베이스를 파싱 |
| Trae | ~/.config/tokscale/trae-cache/sessions/ |
%APPDATA%\tokscale\trae-cache\sessions\ |
tokscale trae sync로 한 번 동기화; 설치된 Trae IDE 또는 Trae Solo 데스크톱 앱에서 자격 증명 자동 발견 |
| Warp/Oz | ~/.config/tokscale/warp-cache/usage.json |
%APPDATA%\tokscale\warp-cache\usage.json |
tokscale warp sync로 동기화; 집계된 요청 수와 비용만, 토큰 트랜스크립트 없음 |
| Grok Build | ~/.grok/sessions/ |
%USERPROFILE%\.grok\sessions\ |
GROK_HOME 환경변수로 설정 가능; updates.jsonl 세션 업데이트 파싱 |
| Jcode | ~/.jcode/sessions/ |
%USERPROFILE%\.jcode\sessions\ |
JCODE_HOME 환경변수로 설정 가능; session_*.json 스냅샷과 session_*.journal.jsonl 사이드카 파싱 |
| MiMo Code | ~/.local/share/mimocode/ |
%USERPROFILE%\.local\share\mimocode\ |
XDG 데이터 디렉토리 사용; SQLite 데이터베이스 mimocode.db |
| Xiaomi MiMo AI | ~/.local/share/mimocode/ |
%USERPROFILE%\.local\share\mimocode\ |
MiMo Code와 공유 엔진 저장소; 데스크톱 세션은 session.version 접두사 desktop-로 micode-desktop 처리 |
| Gajae-Code | ~/.gjc/agent/sessions/ |
%USERPROFILE%\.gjc\agent\sessions\ |
GJC_CODING_AGENT_DIR로 설정 가능 (GJC_CONFIG_DIR/PI_CONFIG_DIR도 지원; Linux/macOS에서는 $XDG_DATA_HOME/gjc/sessions/도 확인) |
| Cherry Studio | V2: $XDG_CONFIG_HOME/CherryStudio/Data/Agents/.claude/projects/ (기본값 ~/.config/CherryStudio/Data/Agents/.claude/projects/; macOS: ~/Library/Application Support/CherryStudio/Data/Agents/.claude/projects/); V1: $XDG_CONFIG_HOME/CherryStudio/.claude/projects/ (기본값 ~/.config/CherryStudio/.claude/projects/; macOS: ~/Library/Application Support/CherryStudio/.claude/projects/); 대화 원장: $XDG_CONFIG_HOME/CherryStudio/Data/cherrystudio.sqlite (기본값 ~/.config/CherryStudio/Data/cherrystudio.sqlite; macOS: ~/Library/Application Support/CherryStudio/Data/cherrystudio.sqlite) |
V2: %APPDATA%\CherryStudio\Data\Agents\.claude\projects\; V1: %APPDATA%\CherryStudio\.claude\projects\; 대화 원장: %APPDATA%\CherryStudio\Data\cherrystudio.sqlite |
Agent/Claude Code 모드 전사; 동일한 이름의 세션은 V2를 우선하며 V1은 이전되지 않은 기록을 유지. 대화 원장은 ai_usage_record에서 대화·어시스턴트 호출을 제공하고, Agent 모드 행은 전사 쪽이 담당해 이중 집계를 피함 |
| Junie | ~/.junie/sessions/ |
%USERPROFILE%\.junie\sessions\ |
모든 플랫폼에서 동일한 home 상대 경로 사용; events.jsonl 사용 이벤트 파싱 |
| ZCode | ~/.zcode/cli/db/db.sqlite 및 ~/.zcode/projects/ |
%USERPROFILE%\.zcode\cli\db\db.sqlite 및 %USERPROFILE%\.zcode\projects\ |
v2 SQLite 모델 사용량과 레거시 *.jsonl 세션 트랜스크립트 파싱; Z.ai의 GLM 모델용 ADE |
| OpenCodeReview | ~/.opencodereview/sessions/ |
%USERPROFILE%\.opencodereview\sessions\ |
*.jsonl 세션 트랜스크립트 파싱; Alibaba의 AI 코드 리뷰 도구 |
| CodeBuddy | ~/.codebuddy/projects/ + 확장 프로그램 로그 |
%USERPROFILE%\.codebuddy\projects\ + CodeBuddy / VS Code 확장 프로그램 로그 |
CodeBuddy CLI, IDE, VS Code 플러그인 토큰 사용량 파싱 |
| WorkBuddy | ~/.workbuddy/projects/ + ~/.workbuddy/workbuddy.db (5.5+는 ~/.workbuddy-ai/) |
%USERPROFILE%\.workbuddy\projects\ + %USERPROFILE%\.workbuddy\workbuddy.db (5.5+는 %USERPROFILE%\.workbuddy-ai\) |
WorkBuddy 토큰 사용량 파싱, 집계 SQLite 데이터베이스를 폴백으로 사용 |
| Devin CLI | ~/.local/share/devin/cli/sessions.db |
%USERPROFILE%\.local\share\devin\cli\sessions.db |
신뢰할 수 있는 로컬 SQLite 사용량 데이터베이스 읽기 |
| Devin Desktop | Linux: ~/.config/Devin/User/acp-events/; macOS: ~/Library/Application Support/Devin/User/acp-events/ |
%APPDATA%\Devin\User\acp-events\ |
ACP 사용량 이벤트를 파싱하고, CLI 데이터베이스가 있으면 일치하는 세션 제목을 확인 |
| Augment Code | ~/.augment/sessions/ |
%USERPROFILE%\.augment\sessions\ |
Auggie CLI 세션 JSON 스냅샷(*.json) 파싱; 조인 키는 최상위 sessionId |
| Synthetic | 다른 소스에서 재귀속 | 다른 소스에서 재귀속 | hf: 모델 접두사 + synthetic provider 감지 |
| Hindsight | $HINDSIGHT_HOME/usage/ (폴백: ~/.hindsight/usage/) |
%HINDSIGHT_HOME%\usage\ (폴백: %USERPROFILE%\.hindsight\usage\) |
tokscale hindsight sync를 통한 API 동기화; Hindsight 자체는 로컬 세션 로그를 남기지 않으므로 LLM 추적 API에서 추가 전용 JSONL 캐시로 동기화 |
| Muse Code | ~/.local/share/muse/sessions/ |
%USERPROFILE%\.local\share\muse\sessions\ |
전 플랫폼 공통 XDG 경로; session.jsonl의 model_completed 사용량 이벤트와 subagent/ 기록 파싱 |
| Aside | ~/.aside/u/<account>/sessions/<session>/messages.jsonl |
%USERPROFILE%\.aside\u\<account>\sessions\<session>\messages.jsonl |
계정별 네이티브 브라우저 사용량; messages.jsonl만 읽고 artifacts, memory, passwords 제외. |
| Mistral Vibe | $VIBE_HOME/logs/session/ (기본값: ~/.vibe/logs/session/) |
%VIBE_HOME%\logs\session\ (기본값: %USERPROFILE%\.vibe\logs\session\) |
전 플랫폼 공통 ~/.vibe 루트; 각 세션 디렉터리의 meta.json 누적 stats만 읽고 messages.jsonl 대화 내용은 읽지 않음 |
| Proma | ~/.proma/, ~/.proma-dev/ |
%USERPROFILE%\.proma\, %USERPROFILE%\.proma-dev\ |
Pi SDK 사용량을 표시용 사본보다 우선하며, 이전 Claude SDK 기록과 단독 표시 로그도 지원합니다. 집계 방식과 제한을 참고하세요. |
참고: Windows에서
~는%USERPROFILE%로 확장됩니다 (예:C:\Users\사용자이름). 일부 도구는 크로스 플랫폼 일관성을 위해 Unix 스타일 경로(.local/share등)를 사용하고, Goose를 포함한 다른 도구는 위 표의 Windows 기본 경로(%APPDATA%등)를 사용합니다.
Devin Desktop 에이전트 지원: 로컬 사용량 파싱은 NDJSON 스트림에서
usage_update이벤트를 내보내는 ACP 연결 에이전트(예: Cascade/Windsurf, claude-code, opencode)에서 동작합니다. 기본 devin-cloud 에이전트는 로컬usage_update이벤트를 내보내지 않으므로, 계정 수준 API 없이는 tokscale로 추적할 수 없으며 사용량은 서버에만 남습니다.
Tokscale은 다음 위치에 설정을 저장합니다:
- TUI 설정:
%APPDATA%\tokscale\settings.json(플랫폼 기본값.TOKSCALE_CONFIG_DIR로 오버라이드 가능) - 캐시:
%APPDATA%\tokscale\cache\(통합 캐시 루트) - 레거시 캐시 경로: 이전 릴리스의
%USERPROFILE%\.cache\tokscale\같은 분리된 경로가 새 경로로 다시 생성 가능한 데이터가 기록될 때까지 남아 있을 수 있습니다. - Cursor 자격 증명:
%USERPROFILE%\.config\tokscale\cursor-credentials.json - Trae 자격 증명 및 동기화된 사용량:
%APPDATA%\tokscale\trae-cache\ - Tokscale 계정 자격 증명:
%USERPROFILE%\.config\tokscale\credentials.json
기본적으로 일부 AI 코딩 어시스턴트는 오래된 세션 파일을 자동으로 삭제합니다. 정확한 추적을 위해 사용 기록을 보존하려면 정리 기간을 비활성화하거나 연장하세요.
| 플랫폼 | 기본값 | 설정 파일 | 비활성화 설정 | 출처 |
|---|---|---|---|---|
| Claude Code | ~/.claude/settings.json |
"cleanupPeriodDays": 9999999999 |
문서 | |
| Gemini CLI | 비활성화됨 | $GEMINI_CLI_HOME/settings.json (폴백: ~/.gemini/settings.json) |
"general.sessionRetention.enabled": false |
문서 |
| Codex CLI | 비활성화됨 | N/A | 정리 기능 없음 | #6015 |
| OpenCode | 비활성화됨 | N/A | 정리 기능 없음 | #4980 |
기본값: 30일 정리 기간
~/.claude/settings.json에 추가:
{
"cleanupPeriodDays": 9999999999
}매우 큰 값 (예:
9999999999일 ≈ 2700만 년)을 설정하면 사실상 정리가 비활성화됩니다.
기본값: 정리 비활성화됨 (세션이 영구 보존)
정리를 활성화했다가 비활성화하려면 $GEMINI_CLI_HOME/settings.json (폴백: ~/.gemini/settings.json)에서 제거하거나 enabled: false로 설정:
{
"general": {
"sessionRetention": {
"enabled": false
}
}
}또는 매우 긴 보존 기간 설정:
{
"general": {
"sessionRetention": {
"enabled": true,
"maxAge": "9999999d"
}
}
}기본값: 자동 정리 없음 (세션이 영구 보존)
Codex CLI는 내장 세션 정리가 없습니다. ~/.codex/sessions/의 세션은 무기한 유지됩니다.
참고: 이에 대한 기능 요청이 있습니다: #6015
기본값: 자동 정리 없음 (세션이 영구 보존)
OpenCode는 내장 세션 정리가 없습니다. ~/.local/share/opencode/storage/의 세션은 무기한 유지됩니다.
참고: #4980 참조
위치: ~/.local/share/opencode/opencode.db (v1.2+) 또는 storage/message/{sessionId}/*.json (레거시)
OpenCode 1.2+는 세션을 SQLite에 저장합니다. Tokscale은 SQLite를 먼저 읽고, 이전 버전의 경우 레거시 JSON 파일로 폴백합니다.
OpenCode는 빌드된 릴리스 채널에 따라 DB 파일명을 결정합니다: latest, beta 채널은 opencode.db를 사용하고, 나머지 채널은 opencode-<channel>.db (예: opencode-stable.db, opencode-nightly.db)를 사용합니다. Tokscale은 모든 변형을 스캔하므로 여러 채널을 함께 사용하는 경우에도 통합된 뷰를 제공합니다.
OPENCODE_DB를 ~/.local/share/opencode 밖의 파일로 지정해 opencode를 실행한 경우, tokscale이 매 실행마다 찾을 수 있도록 ~/.config/tokscale/settings.json에 절대 경로를 추가하세요:
{
"scanner": {
"opencodeDbPaths": [
"/custom/location/opencode.db",
"/another/location/opencode-stable.db"
]
}
}경로는 자동 발견과 병합되고, 정규 경로 기준으로 중복 제거되며, 존재하지 않는 항목은 조용히 건너뜁니다 (오래된 설정이 스캔을 깨뜨리지 않도록). opencode.db-wal, opencode.db-shm 및 기타 SQLite 사이드카는 거부됩니다.
Tokscale의 기본 home-root 위치 밖에 세션을 보관하는 경우, 클라이언트별 추가 스캔 루트를 영구적으로 지정할 수도 있습니다:
{
"scanner": {
"extraScanPaths": {
"codex": [
"/Users/me/workspace/project-a/.codex/sessions",
"/Users/me/workspace/project-b/.codex/archived_sessions"
],
"gemini": ["/Users/me/imports/imac/gemini/tmp"],
"hermes": [
"/Users/me/.hermes/profiles/director_planning",
"/Users/me/.hermes/profiles/research/state.db"
],
"openclaw": ["/Users/me/imports/imac/openclaw/agents"]
}
}
}이는 프로젝트 단위 .codex 디렉터리, 가져온 히스토리, 그리고 기본 $HERMES_HOME/state.db나 ~/.hermes/state.db 위치 밖의 Hermes 프로필 데이터베이스에 유용합니다. Tokscale은 여전히 기본 루트를 스캔한 다음, 그 위에 scanner.extraScanPaths와 TOKSCALE_EXTRA_DIRS를 정규 경로 중복 제거와 함께 병합합니다. 워크스페이스 전체를 자동 발견하지는 않습니다.
각 메시지 포함 내용:
{
"id": "msg_xxx",
"role": "assistant",
"modelID": "claude-sonnet-4-20250514",
"providerID": "anthropic",
"tokens": {
"input": 1234,
"output": 567,
"reasoning": 0,
"cache": { "read": 890, "write": 123 }
},
"time": { "created": 1699999999999 }
}위치: ~/.claude/projects/{projectPath}/*.jsonl 및 ~/.claude/transcripts/*.jsonl
어시스턴트 메시지의 사용량 데이터를 포함하는 JSONL 형식:
{"type": "assistant", "message": {"model": "claude-sonnet-4-20250514", "usage": {"input_tokens": 1234, "output_tokens": 567, "cache_read_input_tokens": 890}}, "timestamp": "2024-01-01T00:00:00Z"}~/.claude/transcripts/ 아래의 래퍼 트랜스크립트 파일은 실제 Claude 사용량 메타데이터를 포함할 때만 계산됩니다. 사용자/도구 이벤트는 있지만 usage 블록이 없는 파일은 추정하지 않고 건너뜁니다.
claude 클라이언트는 Claude Desktop에 남아 있는 Code/Cowork 트랜스크립트와 대화 캐시의 사용량 정보도 로컬에서 읽습니다. 캐시는 전체 계정 이력이 아니므로 삭제되거나 일부만 남은 대화, 사용량 카운터가 없는 채팅은 누락될 수 있습니다. 대화 텍스트로 토큰을 추정하지 않습니다. 날짜를 알 수 없는 누적 잔여량은 전체 기간의 로컬 합계에만 반영하며, 날짜별 보고서·그래프·리더보드 제출에서는 제외합니다. 가격표로 계산한 비용은 API 사용 기준 추정치이며 구독 요금이 아닙니다. tokscale usage는 구독 할당량을 별도로 보여줍니다.
클라우드/웹 세션: Tokscale은 Claude Code 웹 버전(claude.ai/code)의 세션 이력을 자동으로 가져오지 않습니다. 사용량이 클라우드에만 남아 있는 세션은 로컬 합계·보고서·내보내기·제출·리더보드에 포함되지 않습니다. 로컬 트랜스크립트와 Desktop 캐시에 기록된 사용량은 위의 수집 범위와 날짜 제한에 따라 집계할 수 있습니다. tokscale clients는 클라우드 계정 조회 없이 이 수집 범위를 안내합니다.
Claude의 --teleport <session-id>는 클라우드 세션을 로컬 터미널로 가져옵니다. Tokscale이 해당 이력을 집계하려면 가져온 로컬 기록에 사용량 메타데이터가 있어야 합니다. 대화 텍스트만으로는 부족하며, teleport가 완전한 토큰 이력을 보장하지는 않습니다. 기본 경로 밖의 트랜스크립트는 scanner.extraScanPaths로 추가할 수 있습니다.
위치: ~/.codex/sessions/ 및 ~/.codex/archived_sessions/ (*.jsonl rollout, zstd로 압축된 *.jsonl.zst 사본, .jsonl 이름 뒤에 접미사를 붙인 기타 아카이브 사본)
token_count 이벤트가 있는 이벤트 기반 형식:
{"type": "event_msg", "payload": {"type": "token_count", "info": {"last_token_usage": {"input_tokens": 1234, "output_tokens": 567}}}}같은 rollout의 사본은 한 번만 집계됩니다. 두 디렉터리에 모두 있거나 일반 파일과 압축 파일로 함께 있는 세션도 사용량이 두 번 잡히지 않습니다.
클라우드 작업: Tokscale은 Codex 클라우드(chatgpt.com/codex)의 작업 이력을 자동으로 가져오지 않습니다. 로컬 rollout이 없는 작업은 로컬 합계·보고서·내보내기·제출·리더보드에 포함되지 않습니다. tokscale codex activity 또는 tokscale codex activity --json을 실행하면 설치된 Codex app-server의 현재 인증으로 조회 시각이 표시된 계정 활동 스냅샷을 확인할 수 있습니다. 이 조회는 명시적으로 실행할 때만 이루어지며, tokscale clients는 로컬 수집 범위만 안내합니다.
계정 활동에는 이 기기에 남은 rollout 밖의 사용량이 포함될 수 있지만, 토큰 계산 방식과 날짜 경계가 로컬 파싱과 동일하다는 보장은 없습니다. 계정 값에서 로컬 합계를 빼도 클라우드 사용량이 되지는 않습니다. 다른 기기, 계정 차이, 누락된 로컬 이력도 차이를 만들 수 있습니다. 스냅샷은 로컬 합계·보고서·내보내기·제출·리더보드와 분리되며 비용은 확인할 수 없음(N/A)으로 표시됩니다.
위치: ~/.copilot/session-store.db (CLI 사용량 이벤트; OTEL 불필요), ~/.copilot/otel/*.jsonl 또는 COPILOT_OTEL_FILE_EXPORTER_PATH에 명시된 경로, Desktop ~/.copilot/data.db
Copilot CLI 사용량은 기본적으로 session-store.db에서 읽습니다. 파일로 내보낸 OpenTelemetry JSONL도 지원되며, 둘 다 있으면 세션 단위로 OTEL이 우선합니다. Copilot을 실행하기 전에 OTEL을 활성화하세요:
export COPILOT_OTEL_ENABLED=true
export COPILOT_OTEL_EXPORTER_TYPE=file
mkdir -p "$HOME/.copilot/otel"
export COPILOT_OTEL_FILE_EXPORTER_PATH="$HOME/.copilot/otel/copilot-otel-$(date +%Y%m%d-%H%M%S).jsonl"PowerShell:
$otelDir = "$HOME/.copilot/otel"
New-Item -ItemType Directory -Force -Path $otelDir | Out-Null
$env:COPILOT_OTEL_ENABLED = "true"
$env:COPILOT_OTEL_EXPORTER_TYPE = "file"
$env:COPILOT_OTEL_FILE_EXPORTER_PATH = Join-Path $otelDir ("copilot-otel-{0}.jsonl" -f (Get-Date -Format "yyyyMMdd-HHmmss"))타임스탬프가 포함된 파일명을 사용하면 각 Copilot 세션이 하나의 거대한 OTEL 로그에 누적되지 않고 새 파일에 기록됩니다.
Tokscale은 chat span을 토큰 집계의 출처로 취급하고, 도구 span과 누적 메트릭은 1단계에서 무시합니다:
{"type":"span","name":"chat gpt-5.4-mini","attributes":{"gen_ai.operation.name":"chat","gen_ai.response.model":"gpt-5.4-mini","gen_ai.conversation.id":"session-id","gen_ai.usage.input_tokens":1234,"gen_ai.usage.output_tokens":567,"gen_ai.usage.cache_read.input_tokens":890,"gen_ai.usage.reasoning.output_tokens":123}}Copilot의 OTEL 페이로드는 현재 안정적인 워크스페이스 메타데이터를 노출하지 않으므로, Copilot 행은 워크스페이스 속성 없이 표시될 수 있습니다. Tokscale은 가능한 경우 보고된 모델로부터 해당 행의 가격을 책정하며,
github.copilot.cost를 직접 신뢰하지 않습니다.
위치: $GEMINI_CLI_HOME/tmp/{projectHash}/chats/*.json (폴백: ~/.gemini/tmp/{projectHash}/chats/*.json)
메시지 배열을 포함한 세션 파일:
{
"sessionId": "xxx",
"messages": [
{"type": "gemini", "model": "gemini-2.5-pro", "tokens": {"input": 1234, "output": 567, "cached": 890, "thoughts": 123}}
]
}위치: ~/.config/tokscale/cursor-cache/usage*.json (Cursor API를 통해 동기화; 같은 계정의 JSON 캐시가 없으면 레거시 usage*.csv 캐시도 계속 읽음)
Cursor 데이터는 세션 토큰을 사용하여 Cursor API에서 가져와 로컬에 캐시됩니다. 인증은 Cursor 데스크톱 state.vscdb(cursorAuth/accessToken만)에서 가져오거나 브라우저 쿠키를 붙여 넣을 수 있습니다. Tokscale은 리포트를 위해 API 캐시 파일을 읽으며, 로컬 ~/.cursor 세션 데이터나 데스크톱 사용량 테이블은 파싱하지 않습니다. 설정 안내는 Cursor IDE 명령어를 참조하세요.
위치: ~/.config/tokscale/antigravity-cache/sessions/*.jsonl (로컬 Antigravity 언어 서버 RPC를 통해 동기화)
Antigravity 데이터는 루트 명령에서 자동으로 가져오지 않습니다. Antigravity가 활성화된 에디터가 열려 있는 동안 tokscale antigravity sync를 실행해 로컬 캐시를 새로 고친 다음, 캐시된 JSONL 아티팩트에 대해 일반적인 tokscale 리포트와 필터를 사용하세요.
위치: ~/.config/tokscale/trae-cache/sessions/*.json (공식 사용량 API를 통해 동기화)
Trae 데이터는 루트 명령에서 자동으로 가져오지 않습니다. 먼저 tokscale trae login을 실행한 뒤, 리포트 전에 tokscale trae sync 또는 tokscale trae sync --since 30을 실행하세요. Tokscale은 동기화된 API dump를 세션 수준 레코드로 파싱하고 Trae가 반환한 비용 합계를 보존합니다.
위치: ~/.config/tokscale/warp-cache/usage.json (인증된 GraphQL API를 통해 동기화)
Warp/Oz 데이터는 루트 명령으로 자동으로 가져오지 않습니다. 리포트 전에 tokscale warp login을 실행한 다음 tokscale warp sync를 실행하세요. Warp는 토큰에 귀속된 로컬 트랜스크립트를 노출하지 않으므로, Tokscale은 집계된 요청 수와 지출만 기록합니다.
위치: $GROK_HOME/sessions/*/*/updates.jsonl (폴백: ~/.grok/sessions/*/*/updates.jsonl)
Grok Build 데이터는 로컬 세션 업데이트에서 직접 파싱됩니다. 현재 로그는 안정적인 input/output 분리 없이 누적 totalTokens 카운터를 노출하므로, Tokscale은 턴별 양수 증가분을 input 토큰으로 기록합니다. grok-composer-2.5-fast는 전용 공개 가격이 생길 때까지 Composer 2.5 Fast 가격 override에 임시 매핑됩니다.
위치: $JCODE_HOME/sessions/session_*.json (폴백: ~/.jcode/sessions/session_*.json) 및 매칭되는 session_*.journal.jsonl 사이드카.
Jcode 데이터는 로컬 세션 스냅샷에서 직접 파싱됩니다. Tokscale은 다른 클라이언트 신원을 위장하지 않고 어시스턴트의 messages[].token_usage 필드(input_tokens, output_tokens, cache_read_input_tokens, cache_creation_input_tokens, reasoning_output_tokens)를 읽습니다. 매칭되는 저널 사이드카는 중복 제거 전에 동일한 세션 스트림으로 병합되므로, Jcode가 스냅샷에 체크포인트로 반영하기 전까지 최근에 추가된 메시지도 포함됩니다. 재생(replay) 중복 제거에는 안정적인 메시지 ID를 사용하며, ID가 없는 잘못된/커스텀 레코드는 범위가 한정된 폴백 키를 사용합니다.
위치: ~/.augment/sessions/<sessionId>.json
Augment Code / Auggie CLI는 채팅 세션마다 하나의 JSON 스냅샷을 기록합니다. Tokscale은 chatHistory[]의 완료된 턴을 읽고, 세션 기본값 agentState.modelId보다 exchange.model_id를 우선하며, exchange.response_nodes[]의 단일 token_usage 관측값(input_tokens, output_tokens, cache_read_input_tokens, cache_creation_input_tokens)을 사용합니다. 최상위 sessionId는 그대로 보존되어 외부 도구가 ACP 세션 ID에 비용을 조인할 수 있습니다.
위치: ~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite (현재 OpenClaw) 및 ~/.openclaw/agents/<agentId>/sessions/*.jsonl* (레거시 트랜스크립트, 발행된 아카이브, *.jsonl.pre-doctor-*.bak 같은 doctor 백업; 레거시 경로도 스캔: ~/.clawdbot/, ~/.moltbot/, ~/.moldbot/)
현재 OpenClaw(2026.x)는 실시간 트랜스크립트를 에이전트별 SQLite 데이터베이스에 저장합니다. Tokscale은 모든 에이전트 데이터베이스를 읽기 전용으로 열어(게이트웨이가 실행 중인 WAL 모드에서도 안전) transcript_events 테이블을 읽고, usage 블록이 있는 assistant 이벤트를 집계하며(모델 출력이 아닌 OpenClaw 자체 부기 행, 예: delivery-mirror는 제외), 이벤트에 model/provider가 없으면 session_windows의 값으로 대체합니다. OpenClaw가 Codex app-server 하네스로 실행한 턴은 트랜스크립트에 마지막 model response의 usage를 가진 최종 assistant 메시지만 미러링되므로, Tokscale은 OpenClaw가 ~/.openclaw/agents/<agentId>/agent/codex-home/sessions/(기본 에이전트별 CODEX_HOME)에 남기는 Codex rollout도 읽어 그 안의 모든 response를 미러링된 OpenClaw 세션 아래 openclaw로 귀속하고, 해당 thread의 미러 행은 제외합니다. OpenClaw가 사용자 Codex 홈을 공유하도록 설정된 경우(appServer.homeScope: "user" 또는 supervision branch) ~/.codex/sessions에 생성되는 rollout에는 originator: "openclaw"가 기록되며, Codex 클라이언트가 아니라 같은 방식으로 openclaw에 귀속됩니다. Codex 클라이언트가 이미 집계하는 thread(supervision으로 사용자 자신의 Codex 홈에서 resume한 경우)는 codex로 유지되고 그 미러 행은 제외되어 이중 집계가 없으며, rollout을 어디서도 찾을 수 없는 미러 행은 그대로 유지됩니다. /fork가 새 세션 id로 복사한 트랜스크립트와 openclaw doctor --fix가 SQLite로 가져온 레거시 JSONL은 한 번만 집계됩니다. doctor가 참조하지 않는 것으로 확인된 레거시 JSONL은 절대 가져오지 않으며, session-sqlite-import-archive/archive-tier.<sessionId>.jsonl.imported-<ts>로 이동한 뒤 원래 세션 id로 그 위치에서 다시 읽힙니다.
레거시 설치는 세션마다 JSONL 파일 하나를 기록했고(sessions.json으로 인덱싱), openclaw doctor --fix는 이를 SQLite로 가져오되 원본 파일은 그대로 둡니다. 두 저장소 모두에서 assistant 이벤트는 자체 이벤트 id·timestamp·토큰 수로 식별되므로, JSONL로도 남아 있는 마이그레이션된 트랜스크립트는 한 번만 집계됩니다.
JSONL 세션 파일을 가리키는 레거시 인덱스 파일:
{
"agent:main:main": {
"sessionId": "uuid",
"sessionFile": "/path/to/session.jsonl"
}
}model_change 이벤트와 어시스턴트 메시지가 포함된 세션 JSONL 형식:
{"type":"model_change","provider":"openai-codex","modelId":"gpt-5.2"}
{"type":"message","message":{"role":"assistant","usage":{"input":1660,"output":55,"cacheRead":108928,"cost":{"total":0.02}},"timestamp":1769753935279}}위치: $HERMES_HOME/state.db (폴백: ~/.hermes/state.db) 및 표준 프로필 데이터베이스 $HERMES_HOME/profiles/*/state.db (HERMES_HOME이 활성 프로필을 가리키는 경우 형제 ~/.hermes/profiles/*/state.db)
Hermes는 세션 수준 사용량을 SQLite sessions 테이블에 저장합니다. Tokscale은 model이 존재하고 토큰 또는 비용 합계가 0이 아닌 행을 가져오며, started_at을 타임스탬프로 사용하고, message_count를 보존하며, actual_cost_usd를 estimated_cost_usd보다 우선합니다.
위치: ~/.pi/agent/sessions/<encoded-cwd>/*.jsonl. Oh My Pi는 동일한 세션 형식을 ~/.omp/agent/sessions/ 아래에 기록하며 별도의 omp 클라이언트로 추적됩니다.
세션 헤더와 메시지 항목을 포함하는 JSONL 형식:
{"type":"session","id":"pi_ses_001","timestamp":"2026-01-01T00:00:00.000Z","cwd":"/tmp"}
{"type":"message","id":"msg_001","timestamp":"2026-01-01T00:00:01.000Z","message":{"role":"assistant","model":"claude-3-5-sonnet","provider":"anthropic","usage":{"input":100,"output":50,"cacheRead":10,"cacheWrite":5,"totalTokens":165}}}위치: ~/.senpi/agent/sessions/<encoded-cwd>/*.jsonl 및 ~/.omo/agent/sessions/<encoded-cwd>/*.jsonl (OmO Native, omo-ai 5.1.0+), 그리고 각 프로젝트의 .omo/senpi-task/children/ 아래 태스크 하위 세션
Senpi는 Pi와 같은 JSONL 세션 형식을 사용합니다. OmO는 태스크 하위 세션을 각 프로젝트 안에 저장하므로, Tokscale은 두 세션 트리의 세션 헤더에서 cwd를 읽고 <project>/.omo/senpi-task/children/가 있는 모든 프로젝트에서 이 디렉터리를 스캔합니다. OmO의 task.state_dir가 절대 경로로 설정되어 있으면(프로젝트의 .omo/omo.jsonc 또는 .omo/omo.json, 또는 ~/.omo/ 아래의 같은 파일) 대신 <state_dir>/children/를 스캔합니다.
OmO 에이전트 디렉터리가 다른 곳에 있다면 settings.json(기본 위치는 ~/.config/tokscale/settings.json; Windows, XDG_CONFIG_HOME, TOKSCALE_CONFIG_DIR은 설정 참고)의 scanner.extraScanPaths.senpi에 추가하세요. 항목은 에이전트 디렉터리나 그 안의 sessions/ 디렉터리를 가리킬 수 있습니다. Tokscale은 그곳의 세션을 스캔하고, 세션에 기록된 프로젝트의 태스크 하위 세션도 같은 방식으로 찾습니다:
{
"scanner": {
"extraScanPaths": {
"senpi": ["/Users/me/custom/omo/agent"]
}
}
}위치: 루트 세션은 ~/.prime/agent/sessions/*.jsonl, RLM 하위 세션은 ~/.prime/agent/session-artifacts/*/sub-*/*.jsonl에 저장됩니다. 에이전트 루트는 PRIME_AGENT_CODING_AGENT_DIR로 이동할 수 있으며, sessionDir 설정, PRIME_AGENT_SESSION_DIR 또는 레거시 PRIME_AGENT_CODING_AGENT_SESSION_DIR로 세션 디렉터리를 별도로 이동할 수 있습니다.
Prime Agent는 Pi와 동일한 추가 전용 JSONL 메시지 형식을 사용합니다. Tokscale은 루트 세션과 하위 세션 파일을 별도 소스로 스캔하고 child_usage_attributed 장부 기록을 무시하여 RLM 하위 세션 토큰이 상위 집계와 하위 세션 자체 트랜스크립트에서 중복 계산되지 않도록 합니다. 이름이 지정된 RLM 세션은 에이전트 귀속 정보로 노출됩니다.
위치: ~/.kimi/sessions/{GROUP_ID}/{SESSION_UUID}/wire.jsonl
StatusUpdate 메시지를 포함하는 wire.jsonl 형식:
{"type": "metadata", "protocol_version": "1.3"}
{"timestamp": 1770983426.420942, "message": {"type": "StatusUpdate", "payload": {"token_usage": {"input_other": 1562, "output": 2463, "input_cache_read": 0, "input_cache_creation": 0}, "message_id": "chatcmpl-xxx"}}}위치: ~/.kimi-code/sessions/{WORKDIR}/{SESSION_UUID}/agents/{AGENT}/wire.jsonl
{"type":"usage.record","model":"kimi-code/kimi-for-coding","usage":{"inputOther":1163,"output":352,"inputCacheRead":22272,"inputCacheCreation":0},"usageScope":"turn","time":1780410897480}위치: ~/.qwen/projects/{PROJECT_PATH}/chats/{CHAT_ID}.jsonl
형식: JSONL — 줄당 하나의 JSON 객체, 각각 type, model, timestamp, sessionId, usageMetadata 필드 포함.
토큰 필드 (usageMetadata에서):
promptTokenCount→ 입력 토큰candidatesTokenCount→ 출력 토큰thoughtsTokenCount→ 추론/사고 토큰cachedContentTokenCount→ 캐시된 입력 토큰
위치:
- 로컬:
~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/tasks/{TASK_ID}/ui_messages.json - 서버 (최선 노력):
~/.vscode-server/data/User/globalStorage/rooveterinaryinc.roo-cline/tasks/{TASK_ID}/ui_messages.json
각 작업 디렉토리에는 모델/에이전트 메타데이터에 사용되는 <environment_details> 블록이 포함된 api_conversation_history.json이 포함될 수 있습니다.
ui_messages.json은 UI 이벤트 배열입니다. Tokscale은 다음만 계산합니다:
type == "say"say == "api_req_started"
text 필드는 토큰/비용 메타데이터를 포함하는 JSON입니다:
{
"type": "say",
"say": "api_req_started",
"ts": "2026-02-18T12:00:00Z",
"text": "{\"cost\":0.12,\"tokensIn\":100,\"tokensOut\":50,\"cacheReads\":20,\"cacheWrites\":5,\"apiProtocol\":\"anthropic\"}"
}위치:
- 로컬:
~/.config/Code/User/globalStorage/kilocode.kilo-code/tasks/{TASK_ID}/ui_messages.json - 서버 (최선 노력):
~/.vscode-server/data/User/globalStorage/kilocode.kilo-code/tasks/{TASK_ID}/ui_messages.json
Kilo는 Roo Code와 동일한 작업 로그 형식을 사용합니다. Tokscale은 동일한 규칙을 적용합니다:
ui_messages.json에서say/api_req_started이벤트만 계산textJSON에서tokensIn,tokensOut,cacheReads,cacheWrites,cost,apiProtocol파싱- 사용 가능한 경우 인접한
api_conversation_history.json에서 모델/에이전트 메타데이터 보강
위치:
- Linux 데스크톱 VS Code:
~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/{TASK_ID}/ui_messages.json - macOS 데스크톱 VS Code:
~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/tasks/{TASK_ID}/ui_messages.json - Windows 데스크톱 VS Code:
%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\tasks\{TASK_ID}\ui_messages.json - 서버 (최선 노력):
~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/tasks/{TASK_ID}/ui_messages.json
Cline은 Roo Code와 Kilo가 포크한 원본(upstream) 프로젝트로, 동일한 VS Code globalStorage 작업 로그 형식을 사용합니다. Tokscale은 동일한 규칙을 적용합니다:
ui_messages.json에서say/api_req_started이벤트만 계산textJSON에서tokensIn,tokensOut,cacheReads,cacheWrites,cost,apiProtocol파싱- 사용 가능한 경우 인접한
api_conversation_history.json에서 모델/에이전트 메타데이터 보강 Cline CLI 세션은 다음 우선순위에 따라 사용 가능한 첫 번째 루트를 선택합니다:$CLINE_SESSION_DATA_DIR→$CLINE_DATA_DIR/sessions/→$CLINE_DIR/data/sessions/→ 폴백~/.cline/data/sessions/. 비어 있거나 공백만 있는 환경 변수는 설정되지 않은 것으로 처리됩니다. 선택된 루트에서 세션은{SESSION_ID}/{SESSION_ID}.messages.json에서 읽습니다. Tokscale은 영구metrics가 있는 어시스턴트 메시지를 계산하며 입력/출력/캐시 토큰과 프로바이더가 보고한 비용을 포함하고, 형제 세션 매니페스트에서 워크스페이스 및 폴백 모델 메타데이터를 사용합니다. 환경 루트 검색을 비활성화하면 홈 폴백만 사용합니다.
위치:
~/.config/kimchi/harness/sessions/{ENCODED_WORKSPACE}/*.jsonl(또는$KIMCHI_CODING_AGENT_DIR/sessions/)
Kimchi는 Pi 호환 JSONL 세션 형식을 사용합니다. Tokscale은 영구 입력/출력/캐시 사용량이 있는 어시스턴트 메시지를 계산하며, 세션 스키마가 공유되더라도 Kimchi를 Pi와 별도의 클라이언트로 유지합니다.
위치:
~/.mux/sessions/{WORKSPACE_ID}/session-usage.json
Mux는 세션별 누적 토큰 사용량을 session-usage.json 파일에 저장합니다. 각 파일에는 모델별 토큰 분류가 포함된 byModel 맵이 있습니다:
input, cached (캐시 읽기), cacheCreate (캐시 쓰기), output, reasoning
모델명은 provider:model 형식을 사용합니다 (예: anthropic:claude-opus-4-6) — tokscale은 모델 식별을 위해 provider 접두사를 제거합니다
하위 에이전트 사용량은 Mux에 의해 자동으로 상위 세션에 합산되므로 중복 집계가 없습니다
위치: ~/.local/share/kilo/kilo.db
Kilo CLI는 OpenCode와 유사한 SQLite 데이터베이스에 세션 데이터를 저장합니다. 각 메시지 행에는 모델 및 공급자 속성과 함께 메시지별 토큰 분류(입력, 출력, 캐시 읽기/쓰기, 추론)가 포함됩니다.
위치: $XDG_DATA_HOME/crush/projects.json를 통해 발견되는 프로젝트별 SQLite 데이터베이스 (기본값: ~/.local/share/crush/projects.json)
Crush는 프로젝트별 SQLite 데이터베이스(crush.db)에 사용량을 저장합니다. Crush는 신뢰할 수 있는 메시지별 또는 모델별 토큰 집계를 제공하지 않으므로, Tokscale은 루트 세션의 세션 수준 비용 합계만 가져옵니다. 레코드는 model=session-total로 표시되며 토큰 분류는 0입니다.
위치: ~/.local/share/goose/sessions/sessions.db (~/Library/Application Support/goose/, ~/Library/Application Support/Block/goose/, ~/.local/share/Block/goose/도 스캔; GOOSE_PATH_ROOT로 오버라이드 가능)
네이티브 Windows 스캔은 XDG 및 기존 위치보다 먼저 %APPDATA%\Block\goose\data\sessions\sessions.db를 확인합니다. APPDATA가 설정되지 않았거나 비어 있으면 시스템 Roaming 디렉터리를 먼저 확인한 뒤 Desktop의 <HOME>/AppData/Roaming을 확인합니다. --home 스캔은 GOOSE_PATH_ROOT와 프로세스 환경 기반 Windows 위치를 사용하지 않으며 <home>/AppData/Roaming/Block/goose/data/sessions/sessions.db도 확인합니다. --home 없이 절대 경로인 GOOSE_PATH_ROOT가 지정되면 데이터베이스가 없어도 다른 위치로 폴백하지 않으며, 상대 경로 값은 무시합니다. 실행 파일을 옮겨도 데이터베이스 위치는 바뀌지 않습니다.
Goose는 세션별 사용량을 SQLite sessions.db에 저장합니다. Tokscale은 model_config_json에서 모델, provider_name에서 공급자, 그리고 세션별로 누적된 입력/출력 토큰 합계를 추출합니다. 추론 토큰은 해당 컬럼이 채워져 있을 때 추정됩니다.
위치: ~/.config/manicode/projects/<project>/chats/<chatId>/chat-messages.json (manicode-dev 및 manicode-staging 채널도 스캔; CODEBUFF_DATA_DIR로 오버라이드 가능)
Codebuff(이전 Manicode)는 채팅별 JSON 파일을 저장합니다. Tokscale은 metadata.usage, metadata.codebuff.usage 및 run-state의 messageHistory[*].providerOptions 폴백에서 토큰 사용량을 파싱하며, 부분적으로 갱신된 최신 항목이 실제 토큰 카운트를 가진 이전 항목을 가리지 않도록 히스토리를 역순으로 순회합니다. 메시지별 타임스탬프가 없을 때는 chat-id 디렉토리 이름, 마지막으로 파일 mtime으로 폴백합니다.
위치: ~/.gjc/agent/sessions/<project-slug>/*.jsonl (GJC_CODING_AGENT_DIR로 에이전트 디렉토리 오버라이드 가능; GJC_CONFIG_DIR/PI_CONFIG_DIR에 agent/sessions를 붙인 경로도 확인하며, Linux/macOS에서는 $XDG_DATA_HOME/gjc/sessions/로 단축된 경로도 지원). 뎁스-2 패스별 서브에이전트 전사본(<slug>/<session>/N-*.jsonl)도 탐색합니다.
세션 헤더와 메시지 항목으로 구성된 JSONL 형식입니다. Tokscale은 어시스턴트 메시지만 처리하며, 메시지당 usage.cost.total(USD)이 있으면 그 값을 우선 사용하고, 없을 때만 토큰에서 비용을 재계산합니다:
{"type":"session","id":"S1","timestamp":"2026-01-01T00:00:00.000Z","cwd":"/work/proj"}
{"type":"message","id":"M1","timestamp":"2026-01-01T00:00:01.000Z","message":{"role":"assistant","model":"claude-sonnet-4","provider":"anthropic","usage":{"input":1000,"output":500,"cacheRead":0,"cacheWrite":0,"totalTokens":1500,"cost":{"input":0.1,"output":0.2,"total":0.3}}}}메시지는 <세션 id>:<메시지 id>로 중복 제거됩니다(결정론적 폴백 포함). 재실행된 뎁스-1/뎁스-2 전사본은 한 번만 집계됩니다. service_tier_change 항목과 잘못된 형식의 줄은 줄 단위로 건너뜁니다.
Synthetic은 기존 에이전트 세션을 후처리하여 재귀속합니다. hf: 접두사 모델 ID 또는 synthetic / glhf / octofriend provider를 감지하면 해당 메시지를 synthetic 소스로 처리합니다.
또한 ~/.local/share/octofriend/sqlite.db를 감지해 토큰 정보가 있는 레코드를 파싱합니다.
위치: ~/.local/share/mimocode/mimocode.db (XDG 데이터 디렉토리)
MiMo Code는 SQLite 데이터베이스에 세션 데이터를 저장합니다. Tokscale은 워크스페이스 컨텍스트를 위해 session 테이블과 조인된 message 테이블을 쿼리합니다:
SELECT m.id, m.session_id, m.data, NULLIF(s.directory, '') AS workspace_root
FROM message m
LEFT JOIN session s ON s.id = m.session_id
WHERE json_extract(m.data, '$.role') = 'assistant'
AND json_extract(m.data, '$.tokens') IS NOT NULLdata 컬럼은 JSON 형식이며 다음 토큰 관련 필드를 포함합니다:
{
"role": "assistant",
"modelID": "claude-sonnet-4",
"providerID": "anthropic",
"cost": 0.0032,
"tokens": {
"input": 1200,
"output": 450,
"reasoning": 0,
"cache": { "read": 800, "write": 0 }
},
"time": { "created": 1780410897000, "completed": 1780410912000 },
"agent": "micode",
"path": { "root": "/Users/me/project" }
}Tokscale은 타임스탬프, 모델, 프로바이더, 토큰 수, 비용, 에이전트 이름의 지문을 사용하여 포크된 세션 간 메시지를 중복 제거합니다.
Aside의 평면 assistant 사용량 기록은 ~/.aside/u/<account>/sessions/<session>/messages.jsonl에 저장됩니다. Tokscale은 원본 타임스탬프, 모델 정보, 캐시 입력 구간(1시간 TTL 캐시 쓰기 부분 포함)을 보존합니다. reasoning은 output에서 분리하여 토큰 합계와 추정 비용에 한 번만 반영합니다. Aside의 provider 필드는 공급자가 아니라 경로를 기록하므로, Claude Code 경로는 Anthropic으로 집계하고 범용 게이트웨이 경로는 모델 계열 추론을 따릅니다. 명시적인 공급자 ID는 그대로 우선합니다. 같은 제공자의 반복 response ID는 세션·계정 간 한 번만 집계하고, ID 없는 호출은 각각 유지합니다. 양수 기록 비용은 보존하며 0 또는 누락 비용에는 기존 가격 계산을 적용합니다. tokscale --no-spinner --client aside로 필터링할 수 있습니다. Windows 실행은 검증하지 않았습니다.
위치: ~/.local/share/muse/sessions/YYYY/MM/DD/<session-uuid>/session.jsonl (Windows 포함 전 플랫폼 공통 XDG 경로, subagent/<uuid>/ 하위 서브에이전트 기록도 함께 스캔)
Muse Code는 세션마다 이벤트 소싱 방식의 JSONL 트랜스크립트를 하나씩 기록합니다. Tokscale은 모델 ID(muse-spark-*), Responses 형태의 usage 객체(input_tokens, output_tokens, cached_tokens/cache_read_tokens, cache_write_tokens, reasoning_tokens), 호출의 duration_ms를 담은 model_completed 이벤트를 읽습니다. recorded_at의 단위는 마이크로초입니다. cached_tokens은 input_tokens의 부분집합이고 reasoning은 output_tokens에 포함되어 있으므로, 가격 계산과 집계 전에 둘 다 분리합니다. 부모 세션의 workflow_child_lifecycle 사용량 집계는 자식 트랜스크립트를 별도로 스캔하므로 건너뜁니다. 워크스페이스 레이블은 파일의 runtime.session.metadata 레코드에서 가져옵니다.
Muse Spark 모델은 업스트림 데이터셋에서 가격이 책정됩니다. LiteLLM과 models.dev가 Meta 공개 요금의 meta/muse-spark-* 행을 수록하고 있어 Muse 사용량은 별도 설정 없이 비용이 계산됩니다 (Standard: 입력/출력 100만 토큰당 $1.25/$4.25, 캐시 입력 $0.15; Contributor: $0.10/$0.20, 캐시 입력 $0.002 — 가격 및 rate limit 참조).
위치: ~/.vibe/logs/session/<prefix>_<YYYYMMDD_HHMMSS>_<short-id>/meta.json (macOS, Linux, Windows 모두 동일한 ~/.vibe 루트 — Vibe는 XDG나 %APPDATA% 경로를 쓰지 않음; 루트는 VIBE_HOME, 세션 디렉터리는 session_logging.save_dir로 변경 가능)
Vibe는 세션마다 디렉터리를 만들어 meta.json과 messages.jsonl 대화 기록을 저장합니다. 사용량은 세션 단위입니다. 대화 기록에는 메시지별 모델, 타임스탬프, 토큰 수가 없으므로 Tokscale은 meta.json의 누적 stats 블록(session_prompt_tokens, session_completion_tokens, session_cached_tokens)만 읽고 대화 내용은 읽지 않습니다. session_cached_tokens는 session_prompt_tokens에 더해지는 값이 아니라 그 부분집합이므로, 가격 계산 전에 캐시 읽기를 입력 토큰에서 분리합니다 — Vibe 자체 비용 표시와 동일한 계산입니다. 따라서 세션당 메시지 1건이 이 포맷이 지원하는 가장 세밀한 단위이며, steps가 메시지 수, end_time(ISO-8601, 없으면 start_time)이 타임스탬프가 됩니다. 2.0 이전 세션은 같은 필드를 metadata 키 아래 담은 플랫 <prefix>_*.json 파일로 저장했고, 이 형식도 계속 읽습니다.
모델은 meta.json의 config.active_model에서 가져오며, 이는 세션에 고정된 별칭입니다. 한 번도 고정하지 않은 세션은 빈 문자열을 기록하는데 이는 Vibe가 문서화한 "설정된 기본값을 따름" 센티널이므로, Tokscale은 빈 모델로 사용량을 집계하지 않고 세션 자체의 config.models 테이블, 다음으로 Mistral이 공개한 기본 별칭에서 해석합니다. 별칭(mistral-medium-3.5)은 실제 전송 ID가 아닙니다. Vibe는 공개 가격 데이터셋에 없는 CLI 전용 엔드포인트 이름(mistral-vibe-cli-latest)을 전송하므로 가격은 별칭으로 조회합니다. 워크스페이스 레이블은 environment.working_directory에서, 없으면 origin_directory에서 가져옵니다.
Tokscale은 LiteLLM의 가격 데이터베이스에서 실시간 가격을 가져옵니다.
동적 폴백: LiteLLM에 아직 없는 모델(예: 최근 출시된 모델)은 OpenRouter의 엔드포인트 API에서 자동으로 가격을 가져옵니다.
Cursor 모델 가격: LiteLLM과 OpenRouter 모두에 없는 최신 모델(예: gpt-5.3-codex)은 Cursor 모델 문서에서 가져온 하드코딩 가격을 사용합니다. 이 오버라이드는 모든 업스트림 소스 다음에, 퍼지 매칭 이전에 확인되므로 실제 업스트림 가격이 사용 가능해지면 자동으로 양보합니다.
Sakana Fugu 가격: Fugu Ultra 비용은 Sakana가 공개한 종량제(pay-as-you-go) 요율로 추정하며, fugu 라우터 모델은 실제로 오케스트레이션한 기반 모델의 가변 요율이 곧 그 비용이므로 의도적으로 가격을 책정하지 않습니다.
캐싱: 가격 데이터는 1시간 TTL로 디스크에 캐시되어 빠른 시작을 보장합니다:
- LiteLLM 캐시:
~/.config/tokscale/cache/pricing-litellm.json - OpenRouter 캐시:
~/.config/tokscale/cache/pricing-openrouter.json(지원 제공자의 모델에 대한 작성자 가격 정보를 캐시)
가격 포함 항목:
- 입력 토큰
- 출력 토큰
- 캐시 읽기 토큰 (할인)
- 캐시 쓰기 토큰
- 추론 토큰 (o1과 같은 모델용)
- 모델별 구간 가격 (예: 200k 또는 272k 토큰 이상)
클라이언트가 오래된 세션 트랜스크립트를 삭제한 경우, 옵트인 원장 ~/.config/tokscale/recovered-usage-v1.json(TOKSCALE_CONFIG_DIR로 해석되는 설정 디렉토리)을 통해 해당 세션의 이전 로컬 내보내기(export)를 로컬 리포트에 맞춰 복구할 수 있습니다. 파일은 Archive JSON 객체로, version(반드시 1), home(스캔 대상 홈 디렉토리와 정확히 일치해야 함), 그리고 선택적 messages / daily_floors 배열(직렬화된 UnifiedMessage 레코드)로 구성됩니다. messages는 디스크에 더 이상 없는 세션의 아카이브된 요청 행을 복원하고, daily_floors는 (클라이언트, 날짜)별 집계 스냅샷을 보관하여 스냅샷과 집계된 일일 합계 사이의 양의 차이만 채웁니다. 실제 트랜스크립트가 항상 우선하며, 복구된 행은 local-recovery: 중복 제거(dedup) 키와 "Recovered request archive" / "Recovered daily aggregate (component split estimated)" 에이전트 레이블로 표시됩니다. 오버레이는 철저히 로컬 전용입니다: 복구된 사용량은 리더보드에 제출되지 않고, 소스 메시지 캐시에 기록되지도 않으며, 일일 플로어 집계는 Sessions, Agents, Hourly, Minutely 뷰에서 제외됩니다. 원장을 무시하려면 TOKSCALE_RECOVERY_DISABLE을 설정하세요. 형식은 내부 전용입니다: local-recovery: 키는 Tokscale이 직접 생성한 것으로 신뢰되므로 수동으로 작성하지 마세요. 일치하는 원장이 존재하는 동안 로컬 리포트는 메시지를 스트리밍하지 않고 모두 수집하므로, 매우 큰 코퍼스를 가진 사용자는 메모리 사용량이 늘어날 수 있습니다.
{
"version": 1,
"home": "/Users/you",
"messages": [ /* 직렬화된 UnifiedMessage 형태의 아카이브된 요청 행 */ ],
"daily_floors": [ /* 직렬화된 UnifiedMessage 형태의 (클라이언트, 날짜)별 집계 스냅샷 */ ]
}기여를 환영합니다! 다음 단계를 따르세요:
- 저장소 포크
- 기능 브랜치 생성 (
git checkout -b feature/amazing-feature) - 변경 사항 작성
- 테스트 실행 (
cd packages/core && bun run test:all) - 변경 사항 커밋 (
git commit -m 'Add amazing feature') - 브랜치에 푸시 (
git push origin feature/amazing-feature) - Pull Request 열기
- 기존 코드 스타일 따르기
- 새로운 기능에 테스트 추가
- 필요에 따라 문서 업데이트
- 커밋은 집중적이고 원자적으로 유지
- 영감을 준 ccusage, viberank, Isometric Contributions
- 터미널 UI 프레임워크 Ratatui
- 반응형 렌더링을 위한 Solid.js
- 가격 데이터를 위한 LiteLLM
- Rust/Node.js 바인딩을 위한 napi-rs
- 2D 그래프 참조를 위한 github-contributions-canvas
MIT © Junho Yeo
이 프로젝트가 흥미롭다면 **스타(⭐)**를 눌러주세요.
GitHub에서 저를 팔로우하고 함께 빌드해도 좋아요. (이미 1.1k+명이 탑승해 있어요!)

































































