OpenCode 에이전트 주입 토큰 구조 분석 및 최적화 가이드
OpenCode 에이전트 주입 토큰 구조 분석 및 최적화 가이드
핵심 결론
OpenCode는 매 요청마다 약 110,500 토큰이 입력된다. 그중 대화 히스토리가 91.5%를 차지하지만, 고정 주입(시스템프롬프트+규칙+도구 스키마)은 매번 재사용되는 기반이다. 고정 주입을 줄이면 prompt cache 히트율이 올라가고, 총 비용이 절감된다.
| 구분 | Before | After | 절감 |
|---|---|---|---|
| 시스템 프롬프트 | ~5,865 tok | ~5,865 tok | - (하드코딩) |
| 규칙 파일 | ~1,612 tok | ~1,612 tok | - |
| 도구 스키마 | ~2,400 tok | ~2,400 tok | - |
| 고정 주입 합계 | ~9,877 tok | ~9,877 tok | - |
> 오픈코드는 바이너리가 하드코딩이라 시스템프롬프트/도구를 직접 줄이기 어렵다. 대신 규칙 파일과 MCP 서버 정리가 핵심 절감 지점이다.
1. 주입 구조 전체도
[시스템 프롬프트] ~5,865 tok (5.3%) ← 바이너리 하드코딩
[규칙 파일] ~1,612 tok (1.5%) ← .clinerules + .instructions.md
[도구 스키마] ~2,400 tok (2.2%) ← 네이티브 + MCP
[대화 히스토리] ~101,200 tok (91.5%) ← 세션 누적
─────────────────────────────────────
합계 ~110,500 tok (100%)
1-1. 시스템 프롬프트 (~5,865 tok / ~23,458자)
OpenCode 바이너리(~/.opencode/bin/opencode, 184MB)에 하드코딩. 내용:
- 역할 정의: "You are opencode, an interactive CLI tool..."
- 톤/스타일: 간결, 마크다운, 이모지 금지, 4줄 이내 답변
- 도구 사용 정책: Tasktool 우선, 병렬 호출 권장
- 코드 스타일: 검색 우선순위, file_path:line_number 참조 패턴
- 작업 관리: TodoWrite 사용 규칙
이 스크립트는 직접 수정 불가 — 바이너리 재빌드 없인 변경 불가.
1-2. 규칙 파일 (~1,612 tok)
| 파일 | 크기 | 토큰 | 내용 |
|---|---|---|---|
.clinerules | 1,860 bytes | ~1,306 tok | 자동 실행 에이전트 규칙, 웹검색 상세 규칙, 날씨 조회 규칙, 차트 생성 규칙 |
.instructions.md | 551 bytes | ~306 tok | 로컬 AI 개발 환경(Ollama/MTP 서버 정보), 행동 강령, 작업 순서 |
| 합계 | 2,411 bytes | ~1,612 tok |
1-3. 네이티브 도구 (~12개)
OpenCode에 기본 탑재된 도구. MCP 없이 바로 사용 가능.
| 도구 | 용도 |
|---|---|
| bash | 쉘 명령 실행 |
| read | 파일 읽기 |
| edit | 파일 편집(문자열 치환) |
| write | 파일 쓰기 |
| grep | 정규식 검색 |
| glob | 파일 패턴 매칭 |
| compress | 대화 컨텍스트 압축 |
| question | 사용자에게 질문 |
| task | 서브에이전트 호출 |
| skill | 스킬 로드 |
| webfetch | URL 콘텐츠 가져오기 |
| todowrite | 작업 목록 관리 |
1-4. MCP 도구
opencode.json에 정의된 MCP 서버에서 제공하는 도구.
직접 연결 (opencode.json):
| 서버 | 용도 | 활성 |
|---|---|---|
| proxy | mcp-proxy-supervisor.sh 경유 다중 서버 | Yes |
| tavily | 웹 검색 (원격) | Yes |
| weather | 날씨 조회 (wttr-mcp-server) | Yes |
| browseros | 브라우저 제어 (127.0.0.1:9201) | Yes |
프록시 경유 (mcp-proxy.json, lazy 모드):
| 서버 | 도구 수 | Lazy |
|---|---|---|
| playwright | 20+ | Yes |
| ts (Token Savior) | 10+ | Yes |
| filesystem | 10+ | Yes |
| code-review-graph | 9 | Yes |
| smart-context | 15+ | Yes |
| web-search | 2 | Yes |
| weather | 1 | Yes |
lazy 모드 동작: 브릿지 도구(tool_search, tool_describe, tool_call)만 미리 노출. 실제 서버 도구는 사용 시점에 로드.
1-5. tool-slim 플러그인
.config/opencode/plugins/tool-slim.js가 도구 설명을 절단:
- 도구 설명: 80자로 제한
- 파라미터 설명: 60자(최상위), 40자(중첩)
→ 도구 구분 단서가 사라져 모델의 도구 선택 실패를 유발할 수 있음.
2. 실제 측정값 (운영 환경 기준)
아래 수치는 opencode DB에서 최근 응답 기준으로 추출한 실제값이다.
| 구분 | 토큰 | 비율 |
|---|---|---|
| 시스템 프롬프트 | ~5,865 | 5.3% |
| 규칙 파일 | ~1,612 | 1.5% |
| 도구 스키마 | ~2,400 | 2.2% |
| 대화 히스토리 | ~101,200 | 91.5% |
| 합계 | ~110,500 | 100% |
- prompt caching 적용 시 시스템프롬프트+도구는 cache_read로 재사용 (~106,752 tok cache hit)
- 토크나이저: cl100k_base (OpenAI 호환)
- 한국어: ~1.1자/token, 영어: ~4.5자/token
3. 최적화 방법
3-1. 규칙 파일 다이어트 (즉시 적용 가능)
.clinerules와 .instructions.md는 사용자가 직접 편집 가능.
현재 구성:
.clinerules(1,860 bytes): 자동 실행 에이전트 규칙 + 웹검색 + 날씨 + 차트.instructions.md(551 bytes): 로컬 AI 환경 정보
절감 전략:
| 전략 | 예상 절감 | 난이도 |
|---|---|---|
| 불필요 규칙 삭제 (미사용 규칙 분리) | 200~500 tok | 하 |
| 영어로 변환 (한국어 1.1자/tok → 영어 4.5자/tok) | 50~150 tok | 중 |
| 반복 내용 제거 | 50~100 tok | 하 |
주의사항:
.instructions.md의 MTP 서버 주소(127.0.0.1:18081) 삭제 시 서버 연결 불능- 차트 생성 규칙 삭제 시 chart-render 스킬 사용 불가
- 규칙 변경 후 캐시 리셋 필요 (세션 재시작)
3-2. MCP 서버 정리 (가장 큰 절감 지점)
mcp-proxy.json의 7개 서버 중 미사용 서버를 비활성하면 도구 스키마를 절감할 수 있다.
현재 MCP 도구 스키마 추정:
| 서버 | 추정 도구 수 | 추정 스키마 크기 |
|---|---|---|
| playwright | ~20 | ~4,000 tok |
| ts (Token Savior) | ~10 | ~2,000 tok |
| filesystem | ~10 | ~1,500 tok |
| code-review-graph | ~9 | ~1,200 tok |
| smart-context | ~15 | ~3,000 tok |
| web-search | ~2 | ~300 tok |
| weather | ~1 | ~100 tok |
비활성화 대상 후보:
| 서버 | 사용 빈도 | 비활성화 시 절감 |
|---|---|---|
| code-review-graph | 매우 낮음 | ~1,200 tok |
| smart-context | 낮음 | ~3,000 tok |
| playwright | 낮음 | ~4,000 tok |
| filesystem | 중간 | ~1,500 tok |
비활성화 방법: mcp-proxy.json에서 해당 서버 블록을 "enabled": false로 변경.
주의사항:
- playwright 비활성 시 브라우저 자동화 불가
- filesystem 비활성 시 로컬 파일 접근 MCP 경유 불가
- lazy 모드라 사용 시점에만 로드되지만, 도구 목록은 매번 주입됨
- 비활성화 전 해당 서버 도구 사용 이력 확인 필수
3-3. tool-slim 플러그인 조정
.config/opencode/plugins/tool-slim.js의 절단 길이를 늘리면 도구 구분력이 올라간다.
// 현재 설정
const MAX_DESC_CHARS = 80; // 도구 설명
const MAX_PARAM_CHARS = 60; // 파라미터 설명 (최상위)
const MAX_NESTED_PARAM = 40; // 중첩 파라미터
// 제안: 도구 설명 120자로 확장
const MAX_DESC_CHARS = 120;
효과: 도구 설명의 키워드가 살아남아 모델의 도구 선택 정확도 향상.
주의사항:
- 절단 길이를 너무 늘리면 토큰 소모 증가
- 120~150자가 적정 범위
- 변경 후 debug 로그로 절단 동작 확인
3-4. 대화 히스토리 관리
히스토리가 91.5%를 차지하므로, 히스토리 관리가 총 토큰에 가장 큰 영향을 준다.
compaction 설정 (opencode.json):
"compaction": {
"auto": true
}
auto: true: 컨텍스트 창이 차면 자동으로 오래된 턴을 요약- 요약은 MiMo(외부 모델)를 호출하므로 비용 발생
히스토리 절감 전략:
| 전략 | 효과 | 비용 |
|---|---|---|
| 새 세션 시작 (/new) | 즉시 0으로 리셋 | 없음 |
| compaction.auto 유지 | 장기 세션에서 자동 관리 | MiMo 호출 비용 |
| 수동 압축 (compress 도구) | 필요 시점에 선택적 압축 | 없음 |
핵심: compaction은 "내용을 삭제"하는 것이 아니라 "오래된 턴을 요약으로 대체"한다. 총 내용량은 줄지 않지만, 주입 토큰 수는 줄어든다.
3-5. Direct MCP vs Proxy 비교
현재 proxy 서버를 경유하는 구조인데, 직접 연결로 전환하면 오버헤드를 줄일 수 있다.
| 구조 | 장점 | 단점 |
|---|---|---|
| Direct (현재 opencode.json 4개) | 지연 최소, 안정적 | 서버별 관리 필요 |
| Proxy (mcp-proxy.json 7개) | 통합 관리, lazy 로드 | 중간 계층 오버헤드 |
권장: 미사용 proxy 서버 비활성화가 직접 연결 전환보다 우선.
4. 주의사항
4-1. 변경 전 필수 확인
- 현재 사용 중인 MCP 도구 목록 확인:
opencode세션에서 각 MCP 서버 도구 사용 이력 검토 - 규칙 파일 백업:
.clinerules,.instructions.md변경 전 백업 - 테스트: 변경 후 간단한 작업으로 정상 동작 확인
4-2. 변경 후 필수 조치
- 세션 재시작: 규칙/MCP 변경은 새 세션에서만 반영
- 캐시 리셋: prompt cache가 이전 설정을 기억할 수 있음
- 모니터링: 도구 선택 실패율 증가 여부 관찰
4-3. 복구 방법
| 변경 | 복구 |
|---|---|
| 규칙 파일 수정 | 백업에서 복원 |
| MCP 서버 비활성화 | enabled: true로 되돌리기 |
| tool-slim 절단 길이 변경 | 원래 값으로 되돌리기 |
4-4. 오픈코드 vs 헤르메스 비교
| 구분 | OpenCode | Hermes |
|---|---|---|
| 시스템 프롬프트 | 바이너리 하드코딩 (수정 불가) | SOUL.md 파일 (수정 가능) |
| 도구 비활성화 | MCP 서버 단위 | toolset 단위 |
| 규칙 파일 | .clinerules + .instructions.md | SOUL.md + memories/ |
| 스킬 시스템 | skill 도구로 로드 | 8개 활성 스킬 (자동 주입) |
| compaction | 자동 (MiMo 위임) | 수동 설정 가능 |
| 고정 주입 | ~9,877 tok | ~10,967 tok |
5. 체크리스트
- [ ]
.clinerules에서 미사용 규칙 확인 및 정리 - [ ]
.instructions.md에서 불필요 환경 정보 삭제 - [ ]
mcp-proxy.json에서 미사용 서버 비활성화 - [ ]
tool-slim.js절단 길이 검토 (80→120자) - [ ] 세션 재시작 후 정상 동작 확인
- [ ] 도구 선택 실패율 모니터링
운영자 환경 측정 기준 (opencode v1.x, cl100k_base 토크나이저, Linux). 개별 환경에 따라 수치가 달라질 수 있다.