모델 시스템

4개 프로바이더, 5개 선택 레이어, 2개 확장 컨텍스트 계층에 걸친 AI 모델 해석, 구성, 마이그레이션.

01

개요

Claude Code의 모델 시스템은 다양한 AI 모델을 통합 인터페이스로 관리합니다. 4개 프로바이더의 모델들을 5개 우선순위 레이어를 통해 선택하고, 1M 컨텍스트 윈도우 같은 확장 기능을 런타임에 구성합니다.

다루는 소스 파일: models/config.tsmodels/selector.tsmodels/aliases.tsmodels/effort.tsmodels/allowlist.tsmodels/migration.ts

모델 시스템의 핵심 구성 요소:

02

ALL_MODEL_CONFIGS — 4프로바이더 레지스트리

ALL_MODEL_CONFIGS는 모든 지원 모델의 구성 정보를 담는 중앙 레지스트리입니다. 각 모델 항목은 프로바이더, 컨텍스트 크기, 토큰 가격, 기능 플래그 등을 포함합니다.

// models/config.ts — 4프로바이더 모델 레지스트리
const ALL_MODEL_CONFIGS: ModelConfig[] = [
  // Anthropic 직접 API
  {
    id: 'claude-opus-4-6',
    provider: 'anthropic',
    contextWindow: 200_000,
    extendedContextWindow: 1_000_000,
    maxOutputTokens: 32_768,
    inputPricePer1M: 15.00,
    outputPricePer1M: 75.00,
    supportsExtendedThinking: true,
  },
  // AWS Bedrock
  {
    id: 'anthropic.claude-opus-4-6-v1:0',
    provider: 'bedrock',
    contextWindow: 200_000,
    // Bedrock는 확장 컨텍스트 미지원
    maxOutputTokens: 32_768,
  },
  // GCP Vertex AI
  {
    id: 'claude-opus-4-6@20250515',
    provider: 'vertex',
    contextWindow: 200_000,
  },
  // Azure (OpenAI 호환)
  {
    id: 'claude-opus-4-6',
    provider: 'azure',
    contextWindow: 200_000,
  },
  // ... 다수의 추가 모델 구성
]
03

선택 우선순위 체인 — 5레이어

모델 선택은 5개 레이어를 순서대로 평가하여 결정됩니다. 높은 우선순위 레이어에서 모델이 지정되면 하위 레이어는 무시됩니다.

// models/selector.ts — 5레이어 우선순위 체인
function resolveModel(context: ModelContext): ResolvedModel {
  // 레이어 1: CLI 인수 (--model 플래그)
  if (context.cliModel) return resolve(context.cliModel)

  // 레이어 2: 환경 변수 (CLAUDE_MODEL)
  if (process.env.CLAUDE_MODEL) return resolve(process.env.CLAUDE_MODEL)

  // 레이어 3: 프로젝트 설정 (.claude/settings.json)
  if (context.projectConfig?.model) return resolve(context.projectConfig.model)

  // 레이어 4: 글로벌 설정 (~/.claude/settings.json)
  if (context.globalConfig?.model) return resolve(context.globalConfig.model)

  // 레이어 5: 기본값
  return resolve(DEFAULT_MODEL)
}
딥 다이브 — 5레이어 설계의 이유

5레이어 체인은 다양한 사용 시나리오를 지원합니다. CI/CD에서는 환경 변수로 모델을 고정하고, 특정 프로젝트에서는 프로젝트 설정으로 모델을 제한하며, 개인 개발자는 CLI 플래그로 일시적으로 모델을 변경할 수 있습니다. 이 우선순위 체인은 가장 구체적인 설정이 가장 일반적인 설정을 오버라이드하는 "가장 가까운 설정이 이긴다" 원칙을 따릅니다.

04

모델 앨리어스 & [1m] 접미사

모델 앨리어스는 긴 모델 ID 대신 편의 이름을 사용할 수 있게 합니다. [1m] 접미사는 1M 컨텍스트 윈도우를 활성화하는 런타임 플래그입니다.

// models/aliases.ts — 앨리어스 매핑 & [1m] 접미사
const MODEL_ALIASES: Record<string, string> = {
  'opus':    'claude-opus-4-6',
  'sonnet':  'claude-sonnet-4-6',
  'haiku':   'claude-haiku-3-5',
}

function resolve(input: string): ResolvedModel {
  // [1m] 접미사 감지 & 제거
  const use1m = input.endsWith('[1m]')
  const modelName = use1m ? input.slice(0, -4) : input

  // 앨리어스 해석
  const modelId = MODEL_ALIASES[modelName] ?? modelName

  // 레지스트리에서 설정 조회
  const config = ALL_MODEL_CONFIGS.find(c => c.id === modelId)

  return {
    ...config,
    contextWindow: use1m && config?.extendedContextWindow
      ? config.extendedContextWindow  // 1M 활성화
      : config?.contextWindow ?? 200_000,
  }
}

1M 컨텍스트 윈도우

[1m] 접미사가 붙으면 모델의 extendedContextWindow(1,000,000 토큰)이 활성화됩니다. 이는 런타임 플래그이므로 모델 자체가 변경되는 것이 아니라, API 요청 시 확장 컨텍스트 헤더가 포함됩니다.

주의사항

모든 프로바이더가 확장 컨텍스트를 지원하는 것은 아닙니다. AWS Bedrock이나 GCP Vertex에서 [1m] 접미사를 사용하면 경고가 출력되고 기본 컨텍스트(200K)가 적용됩니다.

05

노력 수준 & 빠른 모드

노력 수준(effort level)은 모델의 추론 깊이를 제어합니다. 5단계(auto, low, medium, high, max)로 구분되며, 각 수준은 API의 thinking 파라미터에 매핑됩니다.

// models/effort.ts — 5단계 노력 수준
type EffortLevel = 'auto' | 'low' | 'medium' | 'high' | 'max'

function mapEffortToThinking(effort: EffortLevel): ThinkingConfig {
  switch (effort) {
    case 'low':
      return { type: 'disabled' }
    case 'medium':
      return { type: 'enabled', budget: 2048 }
    case 'high':
      return { type: 'enabled', budget: 8192 }
    case 'max':
      return { type: 'enabled', budget: 32768 }
    case 'auto':
    default:
      return { type: 'auto' }
  }
}

빠른 모드 (Fast Mode)

빠른 모드는 노력 수준을 low로 강제하여 추론(thinking)을 비활성화합니다. 간단한 질문이나 빠른 코드 편집에 적합하며, 응답 지연 시간과 토큰 비용을 크게 줄입니다.

딥 다이브 — auto 노력 수준의 동작

auto 모드에서는 API가 쿼리 복잡도에 따라 자동으로 추론 예산을 조절합니다. 단순 코드 완성은 적은 추론으로 빠르게, 복잡한 아키텍처 분석은 충분한 추론으로 깊이 있게 처리됩니다. 대부분의 사용자에게 auto가 가장 적합한 기본값입니다.

06

허용 목록 (Allowlist)

엔터프라이즈 환경에서는 사용 가능한 모델을 허용 목록으로 제한할 수 있습니다. 3단계 매칭과 축소 규칙이 적용됩니다.

// models/allowlist.ts — 3단계 매칭 & 축소 규칙
function isModelAllowed(modelId: string, allowlist: AllowlistConfig): boolean {
  // 단계 1: 정확한 ID 매칭
  if (allowlist.exact.includes(modelId)) return true

  // 단계 2: 프로바이더 와일드카드 매칭
  const provider = getProvider(modelId)
  if (allowlist.providers.includes(provider)) return true

  // 단계 3: 패턴 글로브 매칭
  return allowlist.patterns.some(p => globMatch(modelId, p))
}

// 축소 규칙: 허용되지 않은 모델이 요청되면
// 같은 프로바이더의 허용된 모델 중 가장 유사한 것으로 축소
function shrinkToAllowed(modelId: string, allowlist: AllowlistConfig): string {
  if (isModelAllowed(modelId, allowlist)) return modelId

  const provider = getProvider(modelId)
  const allowed = allowlist.exact.filter(id => getProvider(id) === provider)
  return findClosestModel(modelId, allowed) ?? DEFAULT_MODEL
}

서브에이전트 모델 상속

서브에이전트(태스크나 도구 실행을 위해 생성되는 하위 Claude 인스턴스)는 부모 에이전트의 모델 설정을 상속합니다. 이는 허용 목록 정책이 서브에이전트에도 일관되게 적용되도록 보장합니다.

07

마이그레이션

모델 이름이 변경되거나 새 버전이 출시될 때, 사용자 구성에 저장된 이전 모델 ID를 자동으로 업그레이드하는 마이그레이션이 실행됩니다.

// models/migration.ts — 6개 마이그레이션 함수
const MODEL_MIGRATIONS: Migration[] = [
  { from: 'claude-3-opus',     to: 'claude-opus-4-6' },
  { from: 'claude-3-sonnet',   to: 'claude-sonnet-4-6' },
  { from: 'claude-3.5-sonnet', to: 'claude-sonnet-4-6' },
  { from: 'claude-opus-4-5',   to: 'claude-opus-4-6' },
  { from: 'claude-sonnet-4-5', to: 'claude-sonnet-4-6' },
  { from: 'opus',              to: 'opus[1m]' },
]

function migrateModelId(modelId: string): string {
  const migration = MODEL_MIGRATIONS.find(m => m.from === modelId)
  if (migration) {
    console.warn(`모델 "${modelId}" → "${migration.to}"로 마이그레이션됨`)
    return migration.to
  }
  return modelId
}

검증 & 폐기

마이그레이션 테이블에 없는 인식되지 않는 모델 ID는 경고를 출력하고 기본 모델로 폴백합니다. 폐기된 모델은 deprecated: true 플래그가 설정되며, 사용 시 경고 메시지가 표시됩니다.

주의사항

마이그레이션은 부트 시퀀스에서 migrationVersion으로 게이팅되어 실행됩니다. 다운그레이드 후 업그레이드하면 이미 올라간 마이그레이션 버전이 재실행을 방지하여 설정 불일치가 발생할 수 있습니다.

08

핵심 요약

핵심 포인트

  • ALL_MODEL_CONFIGS4개 프로바이더(Anthropic, Bedrock, Vertex, Azure)의 모든 모델 구성을 관리하는 중앙 레지스트리입니다
  • 모델 선택은 5레이어 우선순위 체인(CLI → 환경변수 → 프로젝트 설정 → 글로벌 설정 → 기본값)을 통해 결정됩니다
  • [1m] 접미사는 런타임 플래그로 1M 컨텍스트 윈도우를 활성화하며, 모든 프로바이더가 지원하지는 않습니다
  • 노력 수준은 5단계(auto/low/medium/high/max)로 추론 깊이를 제어하며, 빠른 모드는 low로 강제합니다
  • 허용 목록은 3단계 매칭(정확한 ID, 프로바이더, 글로브 패턴)과 축소 규칙으로 모델 접근을 제어합니다
  • 서브에이전트는 부모의 모델 설정을 상속하여 허용 목록 정책의 일관성을 보장합니다
  • 6개 마이그레이션 함수가 이전 모델 ID를 자동으로 업그레이드하며, 인식되지 않는 모델은 기본값으로 폴백합니다
09

지식 확인

퀴즈 — 5문제

Q1. 모델 선택 우선순위에서 가장 높은 우선순위를 가지는 레이어는?

  • A) CLI 인수 (--model 플래그)
  • B) 환경 변수 (CLAUDE_MODEL)
  • C) 프로젝트 설정 (.claude/settings.json)
  • D) 글로벌 설정 (~/.claude/settings.json)
5레이어 우선순위 체인에서 CLI 인수가 가장 높은 우선순위를 가집니다. 이는 "가장 구체적인 설정이 이긴다" 원칙을 따르며, 일시적인 모델 변경을 가능하게 합니다.

Q2. [1m] 접미사의 역할은?

  • A) 모델을 1분 타임아웃으로 제한
  • B) 1개의 메시지만 처리하도록 제한
  • C) 런타임 플래그로 1M(백만) 토큰 컨텍스트 윈도우를 활성화
  • D) 모델의 첫 번째 마이너 버전을 선택
[1m] 접미사는 모델의 extendedContextWindow(1,000,000 토큰)을 활성화하는 런타임 플래그입니다. API 요청 시 확장 컨텍스트 헤더가 포함되어 기본 200K 대신 1M 컨텍스트가 사용됩니다.

Q3. 노력 수준 "low"에서 모델의 추론(thinking)은 어떻게 동작하는가?

  • A) 2048 토큰 예산으로 제한됨
  • B) 추론이 완전히 비활성화됨
  • C) 자동으로 조절됨
  • D) 8192 토큰 예산으로 제한됨
노력 수준 "low"에서는 thinking.type'disabled'로 설정되어 추론이 완전히 비활성화됩니다. 이는 빠른 모드의 핵심 메커니즘으로, 응답 지연과 토큰 비용을 크게 줄입니다.

Q4. 허용 목록에서 허용되지 않은 모델이 요청되면 어떻게 처리되는가?

  • A) 에러를 발생시키고 세션을 종료
  • B) 요청을 무시하고 이전 모델을 유지
  • C) 관리자에게 알림을 전송
  • D) 같은 프로바이더의 허용된 모델 중 가장 유사한 것으로 축소(shrink)
축소 규칙(shrink rule)은 요청된 모델이 허용 목록에 없을 때, 같은 프로바이더의 허용된 모델 중 가장 유사한 것을 찾아 대체합니다. 적합한 대안이 없으면 기본 모델로 폴백합니다.

Q5. 서브에이전트가 부모의 모델 설정을 상속하는 이유는?

  • A) 서브에이전트에 대한 별도 API 키가 없기 때문에
  • B) 성능 최적화를 위해 모델 조회를 줄이기 위해
  • C) 허용 목록 정책이 서브에이전트에도 일관되게 적용되도록 보장하기 위해
  • D) 서브에이전트는 항상 같은 대화에 참여하기 때문에
엔터프라이즈 환경에서 허용 목록은 보안 정책입니다. 서브에이전트가 부모와 다른 모델을 사용할 수 있다면, 허용 목록을 우회하여 제한된 모델에 접근할 수 있게 됩니다. 상속은 이를 방지합니다.
0 / 5