핵심 개념레퍼런스

컨텍스트 조립

모든 LLM 호출의 컨텍스트가 여기서 만들어집니다. 메모리 계층과 프롬프트 레이어를 토큰 예산 안에서 합칩니다.

이 문서의 목차
  1. 명시적 facade: 메모리 계층
  2. 실제 모델 경로: 시스템 프롬프트 레이어
  3. 오버플로 처리: 요청 경로와 복구
  4. 대형 도구 결과: 오프로드
  5. 장기 컨텍스트 아티팩트: dreaming
  6. 캐시를 깨지 않는 이력
  7. 실패 모드
  8. 다음

기본 AgenticLoop의 모델 컨텍스트는 레이어로 조립된 시스템 프롬프트와 대화 히스토리로 만들어집니다. 이와 별도로 GeodeRuntime은 명시적 소비자를 위한 5계층 context facade를 제공합니다. 이 페이지는 두 경계를 구분하고, 토큰 예산을 넘으면 무엇이 양보하는지 정리합니다.

명시적 facade: 메모리 계층

core/memory/context.py의 ContextAssembler가 5계층 메모리를 병합해 _llm_summary가 포함된 dict를 만듭니다. 이 경로는 GeodeRuntime.assemble_context()를 호출할 때만 실행되며 기본 AgenticLoop prompt에는 자동 연결되지 않습니다. 병합은 Identity, User Profile, Organization, Project, Session 순서로 흐릅니다.

계층요약 예산
Identity (SOUL.md)10%
User Profile있으면 앞부분 예산에 짧게 포함
Organization25%
Project25%
Session나머지. 최신 항목부터 채웁니다

계층 병합 뒤에는 프로젝트 타입, 최근 실행 기록, 프로젝트 저널, Vault 요약 같은 보강 블록이 붙습니다. 계층 자체의 구조와 override 규칙은 메모리 계층에서 다룹니다.

실제 모델 경로: 시스템 프롬프트 레이어

core/agent/system_prompt.py의 build_system_prompt(model)이 캐시 가능한 정적 prefix와 턴마다 바뀌는 동적 섹션(<dynamic_context>)을 경계 마커로 나눠 조립합니다. 레이어 구성과 모드는 프롬프트 조립, 캐시 동작은 프롬프트 캐싱을 참고합니다.

오버플로 처리: 요청 경로와 복구

공통 요청 경로는 미들웨어와 도구 허용 목록 적용 뒤의 모델·공급자· source·출력 예비분으로 예산을 정합니다. 요청이 원래 대화를 유지하면 ContextWindowManager가 한 번만 유지보수를 수행합니다. 미들웨어가 대화를 교체했다면 원래 세션을 대신 요약하지 않습니다. 최종 적합성 검사는 읽기 전용이며, 훅이나 요약을 다시 실행하지 않습니다. 이 준비 경계는 루트와 보조 모델 호출이 공유합니다.

티어윈도 범위경고 임계임계
small≤ 256K50%90%
standard≤ 512K70%90%
large> 512K80%90%

퍼센트의 기준은 윈도에서 요청의 출력 예비분을 빼고, 알려진 입력 상한도 적용한 유효 프롬프트 예산입니다. Codex 구독 경로는 Platform 출력 매개변수를 보내지 않으므로 로컬 계획용 예비분을 씁니다. 카탈로그 값·클라이언트 기본값·미상 경로 폴백은 실제 계정의 서버 허용량과 구분합니다. API의 한도를 구독 경로에 그대로 적용하거나 OpenRouter를 동명의 직접 공급자 모델로 간주하지 않습니다.

추정에는 시스템 지침, 실제 도구 스키마, 재전송할 native 내용이 포함됩니다. 암호화된 내용과 이미지의 크기는 추정치이며 청구 토큰이 아닙니다. 지원되는 Anthropic PAYG 경로에서는 마지막 성공한 native compaction 블록부터 활성 문맥을 추정하되 저장된 재전송 바이트는 보존합니다. 비어 있거나 실패한 블록은 성공한 압축으로 보지 않습니다.

  • Anthropic. 지원 모델의 자동 threshold compaction은 유지합니다. Tool-result clearing은 별도 지원 목록을 따릅니다. 알려진 Haiku 4.5·Sonnet 4.5·Opus 4.5처럼 threshold compaction이 없는 모델은 클라이언트 요약을 사용할 수 있습니다. 수동 압축과 실제 오버플로 복구도 알려진 모델의 호환 이력에서 가능하지만, native compaction 블록이 있거나 모델 계약이 미상이면 텍스트 교체와 강제 정리를 막습니다. Signed thinking과 도구 호출·결과 쌍을 임의로 삭제하지 않습니다.
  • OpenAI / Codex / GLM / OpenRouter. 현재는 GEODE의 클라이언트 텍스트 요약 경로입니다. 값싼 관측 마스킹과 도구 결과 축소, 구조화 요약, 명시적인 hard 경계의 보호된 정리 순으로 처리합니다. 공개 native API가 있다는 사실만으로 GEODE 연결이나 구독 사용 권한이 입증되지는 않습니다.
  • 200K는 로컬의 soft 유지보수 선호입니다. 모든 공급자의 입력 상한이나 rate-limit 풀 경계가 아니며, 이를 넘었다는 이유만으로 이력을 강제 삭제하지 않습니다.

전략은 컨텍스트 소유자가 결정합니다. PreCompact는 keep_recent만 바꾸거나 soft 요약을 유예할 수 있고, 모델·공급자·trigger·hard는 바꿀 수 없습니다. PostCompact는 이력 교체와 호출자가 제공한 체크포인트 콜백 뒤에 실행됩니다. persisted는 요약 아티팩트의 저장 여부이며, 세션 전체가 원자적으로 저장됐다는 뜻은 아닙니다. 관측 훅은 공급자 허용량이나 복구 전략을 결정하지 않습니다.

공급자가 입력 초과를 확인하면 로컬 추정이 낮아도 제한된 복구를 시도합니다. 메시지 개수가 같아도 내용은 줄어들 수 있으므로 작업 결과로 진행 여부를 판단하고, 다음 실제 요청의 수락 여부는 별도로 확인합니다. 복구가 불가능하거나 한도를 소진하면 context_exhausted로 끝납니다. 안내문은 추가 모델 호출 없이 반환하며, 모든 진입점에서 세션이 자동 초기화된다고 주장하지 않습니다.

메시지가 30개를 넘었다는 이유만으로 이력을 버리지 않습니다. 별도의 ConversationContext.max_turns 한도는 유지합니다. 가장 최근의 명시적 원본 사용자 입력, 인과 관계가 있는 도구 쌍, 마지막 도구 묶음의 use_skill 결과를 보호합니다. soft 요약·저장이 실패하면 입력을 유지하되 앞선 관측 마스킹까지 되돌리지는 않습니다. 보호된 tail이 여전히 한도를 넘으면 종료할 수 있으며, 보호가 모델 용량을 늘리지는 않습니다.

예산은 core/orchestration/context_budget.py, 경로별 모델 정보는 core/llm/model_catalog.py, 변환은 core/orchestration/compaction.py가 소유합니다. 이 설명의 9월 25일 변경은 Unreleased입니다. 실제 공급자의 요청 수락과 사용량은 로컬 회귀 검사와 별도로 검증해야 합니다.

대형 도구 결과: 오프로드

모델에 전달할 도구 결과가 기본 15,000 토큰 임계값을 넘으면 core/orchestration/tool_offload.py의 ToolResultOffloadStore가 결과를 디스크 (.geode/tool-offload/ 아래 세션 디렉터리)로 내리고, 컨텍스트에는 요약과 ref_id만 남깁니다. 모델은 필요할 때 recall_tool_result(ref_id) 경로로 원본을 다시 가져옵니다. 오프로드 시 TOOL_RESULT_OFFLOADED 훅이 발화합니다.

MCP의 CallToolResult는 호환성을 위해 같은 값을 content와 structuredContent에 함께 담을 수 있습니다. 원본은 session timeline과 tool log에 receipt로 그대로 남기고, 모델 경계에서는 structured 값을 우선해 한 표현만 고른 뒤 오프로드와 25,000-token hard guard를 적용합니다. 따라서 증거는 보존하면서 중복 JSON을 컨텍스트에 다시 넣지 않습니다.

장기 컨텍스트 아티팩트: dreaming

메시지 트랜스크립트와 별개로, 프로젝트별 sessions.db(SQLite)에는 context_artifacts 행이 쌓입니다. 합성된 장기 컨텍스트 기록으로, 턴 경로 밖에서 만들어집니다. core/memory/dreaming.py의 DreamingService가 TURN_COMPLETED 훅에서 백그라운드로 동작합니다(best-effort — 포그라운드 턴을 절대 막지 않습니다). 트랜스크립트를 증거로 삼아 지속 사실, 결정, 미해결 작업, 낡은 리스크, 유용한 recall 질의, 인용을 정해진 헤딩으로 요약하고, dream 종류의 아티팩트로 되씁니다. source_end_seq 기준으로 멱등이라 새 메시지가 없으면 건너뛰고, LLM을 못 쓰면 LLM 없는 로컬 요약으로 폴백합니다.

주입은 경계가 있습니다. ContextAssembler의 _inject_long_context_artifacts가 최신 compaction_summary/dream 아티팩트 최대 3개를 각 500자로 잘라 _long_context_summary로 넣습니다. session_search 도구는 include_artifacts=true(선택적 artifact_kinds 필터)로 FTS5 메시지 검색과 함께 이 합성 아티팩트도 뒤집니다.

캐시를 깨지 않는 이력

날짜와 runtime rule은 system_prompt.py의 동적 시스템 영역에 한 번 조립됩니다. 라운드별 reminder message는 만들지 않으며, 대화 이력에는 실제 user, assistant, tool turn만 append합니다. 그래서 다음 요청이 이전 요청의 메시지열을 정확한 prefix로 보존하고 Anthropic·OpenAI 캐시가 재사용할 수 있습니다.

실패 모드

증상원인해법
긴 세션에서 context_exhausted 종료압축 후에도 히스토리가 임계 상태새 세션을 열거나 /compact로 현재 세션을 요약합니다. --prune일 때만 명시적으로 이력을 정리합니다
도구 결과가 요약으로만 보임15,000 토큰 임계값을 넘어 오프로드됨정상 동작입니다. recall_tool_result(ref_id)로 원본을 조회합니다
캐시 적중률이 갑자기 하락히스토리 앞부분을 변형하는 커스텀 주입턴별 메타데이터는 시스템 동적 영역에 두고, 대화에는 실제 turn만 append합니다

다음

GEODE 저장소의 문서 사이트에서 옮겨 온 문서입니다. 원문 커밋 de077a4 · GitHub에서 원문 보기