AgentCLIHub 개발 노트 3: 모델·추론 강도·권한을 CLI별로 나누는 설정 설계

CLI별 모델, 추론 강도와 권한 설정을 표현한 애니메이션 스타일 일러스트

CLI별 설정을 표현한 AI 생성 일러스트입니다.

Read in English / 영문 버전

이 글은 고정 커밋 46dfca2 기준의 코드 해설입니다. 실제 환경에서의 실행 시험이나 성능 측정 결과는 포함하지 않습니다.

여러 AI CLI를 한 화면에 모으면 설정도 공통 항목 몇 개로 정리하고 싶어집니다. 하지만 같은 ‘모델’이나 ‘권한’이라는 이름 아래 실제로 받는 값과 실행 옵션은 다릅니다. Agent CLI Hub는 화면 구성을 공유하면서 각 CLI의 설정값과 의미를 따로 유지합니다.

1. 공통 입력칸 하나가 만드는 잘못된 조합

Claude에서 선택한 모델 별칭을 그대로 Codex에 전달하면 유효한 모델이라고 기대할 수 없습니다. CLI를 바꿀 때마다 공용 모델 값을 덮어쓰면, 다른 CLI로 돌아왔을 때 이전 설정을 복구하는 문제도 생깁니다.

Settings는 ClaudeModel, CodexModel, AntigravityModel을 별도 필드로 둡니다. 추론 강도와 실행 파일 경로도 각각 분리합니다. CliProfile은 자신에게 해당하는 필드 이름과 값을 제공하고, 명령행을 만들 때도 그 CLI의 필드만 읽습니다.

이때 마지막으로 선택한 CLI를 기억하는 LastBackend는 새로운 대화 선택 창의 초기 위치를 정합니다. 이미 열려 있는 모든 탭을 다른 CLI로 바꾸는 전역 스위치는 아닙니다. 사용자는 같은 창에서 서로 다른 CLI를 열고, 각각에 저장한 옵션을 사용할 수 있습니다. 설정 필드, CLI별 설정 참조

2. 화면과 저장 검증이 같은 표를 읽는다

설정 UI의 선택지와 C#의 허용 목록을 별도로 관리하면 한쪽만 바뀔 수 있습니다. 화면에서는 고를 수 있는데 저장할 때 지워지거나, 저장은 되지만 CLI가 받지 않는 값이 전달되는 상황입니다.

Agent CLI Hub는 CliCatalog에 모델, 추론 강도, 권한 항목을 모읍니다. ForUi는 표시 이름, 설정 키, 선택지, 모델별 추론 강도 등을 화면에 전달합니다. 웹 화면은 이 자료를 사용해 CLI별 설정 카드를 만듭니다.

저장하는 쪽은 같은 카탈로그의 ClampModel, ClampEffort, ClampPermission을 사용합니다. 현재 선택한 CLI만 검사하지 않고 각 CLI의 값을 해당 기준으로 정리합니다. 지금 사용하지 않는 CLI의 설정도 다음 대화에서는 실제 실행 인자가 될 수 있기 때문입니다.

화면에서 필터링하는 것과 호스트가 저장값을 검사하는 것은 역할이 다릅니다. 전자는 고를 수 있는 항목을 안내하고, 후자는 들어온 값을 실행 설정으로 받아들일지 결정합니다. 두 단계의 기준이 같은 곳에 있어야 유지보수할 때 차이를 줄일 수 있습니다. 카탈로그와 UI 자료, 저장 시 검증

3. 모델 목록이 완전한지 먼저 판단한다

목록에 없는 값을 무조건 지우는 검증은 목록이 얼마나 완전한지에 달려 있습니다. Claude의 모델 별칭 목록은 입력을 돕는 용도입니다. 전체 모델 이름을 직접 적는 경로도 있으므로, 목록에 없다는 이유만으로 값을 제거하지 않습니다. 화면에서도 추천 목록이 붙은 입력칸을 사용합니다.

Codex는 models_cache.json에서 모델 식별자와 supported_reasoning_levels를 읽습니다. 표시 대상으로 분류된 항목을 모으고 중복 식별자를 제외합니다. 이 구현은 읽어 온 목록이 있으면 이를 검증 기준으로 취급하며, 화면에는 선택 상자를 제공합니다. 캐시가 없거나 읽히지 않으면 직접 입력할 수 있는 형태로 전환합니다.

캐시를 다시 쓸 때는 수정 시각과 파일 경로를 함께 비교합니다. 설정 홈이 달라졌는데 두 파일의 수정 시각이 같다면, 시각만 비교하는 캐시는 이전 홈의 목록을 돌려줄 수 있습니다. 경로까지 비교하는 이유입니다.

이 설계는 모델 이름을 앱 소스에 계속 추가하는 부담을 줄입니다. 동시에 캐시 내용과 형식에 의존합니다. 캐시가 존재한다는 사실만으로 공급자의 최신 전체 모델 목록이나 모든 계정의 사용 가능 범위를 확정할 수는 없습니다. 목록을 검증에 사용하는 범위까지 함께 이해해야 합니다. 모델 목록의 완전성 판단, Codex 캐시 읽기

4. 추론 강도는 모델과 함께 고른다

Codex의 추론 강도 선택지는 모델이 알려 준 목록에서 가져옵니다. 모델을 지정하면 해당 모델의 항목을 사용하고, 지정하지 않으면 캐시에 있는 모델들의 항목을 합칩니다. 이후 앱에서 정한 표시 순서로 정렬합니다. 모델 변경 시 추론 강도 선택지를 다시 만드는 이유가 여기에 있습니다.

캐시를 읽지 못했을 때는 코드에 정한 대체 목록을 사용합니다. 이 경로에서는 실제 모델별 지원 여부를 캐시로 확인한 상태가 아닙니다. 대체 목록이 있다는 사실을 모든 조합의 호환성 보장으로 확대해서는 안 됩니다.

Antigravity는 별도의 agy models 명령으로 모델 ID와 표시 이름을 읽습니다. 출력의 두 열을 해석하고 중복이나 제어문자가 있는 항목을 거르며, 조회에는 15초 제한을 둡니다. 화면에는 직접 입력 경로도 남깁니다. 공통 카탈로그 모양을 사용하면서 모델 목록을 구하는 방식은 각 CLI에 맞게 유지하는 구성입니다. 추론 강도 선택, Antigravity 모델 조회

5. 권한의 서로 다른 축을 그대로 보여 준다

Claude 설정은 --permission-mode에 대응하는 항목을 사용합니다. Codex는 샌드박스 -s와 승인 -a를 별도 항목으로 둡니다. Antigravity도 자체 권한 선택을 별도로 정의합니다.

이를 하나의 ‘보통·자동’ 같은 이름으로 합치면 실제로 어떤 범위와 승인 정책이 적용되는지 숨기기 쉽습니다. 통합 UI에서도 공급자가 나눈 축을 유지하면 사용자가 선택한 값과 실행 플래그를 비교할 수 있습니다. 권한 선택지가 있다는 이유로 제한을 넓히는 설정이 권장되는 것은 아닙니다. 작업 범위와 승인 필요에 맞는 선택이 우선입니다.

권한 값은 저장 시점에 검사하고, 명령행을 만들 때도 다시 검사합니다. 예전 버전의 설정이나 직접 수정한 파일에 더 이상 목록에 없는 값이 남을 수 있기 때문입니다. 모델과 강도는 저장 단계에서 검증하지만, 이 기준 커밋의 Claude·Codex 명령행 생성부가 모든 항목을 동일하게 재검증하는 구조는 아닙니다. 재검증 범위를 정확히 구분해야 합니다. 권한 카탈로그, 실행 명령 생성

6. 빈 값과 적용 시점도 설정의 의미다

모델·강도·권한의 빈 값은 해당 옵션을 명령행에 붙이지 않는다는 뜻입니다. 화면은 이를 ‘CLI 기본값’으로 표시합니다. 모든 CLI에 같은 모델이나 같은 승인 정책을 강제로 지정하는 기본값과는 구분됩니다.

또한 설정을 저장해도 이미 실행 중인 탭의 시작 인자는 바뀌지 않습니다. TerminalHost는 프로세스를 시작할 때 설정을 읽으며, 화면과 로그는 다음에 여는 대화부터 적용된다고 안내합니다.

기존 단일 모델·강도 필드를 읽는 호환 처리도 있습니다. 이전에 선택한 CLI의 새 필드로 옮기되, 새 필드에 값이 있으면 그 값을 우선합니다. 설정의 항목 수를 늘릴 때는 사용자가 전에 고른 값의 소속과 의미까지 옮겨야 합니다. 적용 시점, 기존 설정 이전

핵심 정리

  • 공통 UI 안에서도 CLI별 설정값과 권한의 의미는 분리합니다.
  • 화면 선택지와 저장 검증은 같은 카탈로그를 사용합니다.
  • 목록의 완전성과 조회 실패 시 대체 경로를 구분합니다.
  • 빈 값, 이전 설정의 이동, 다음 프로세스부터 적용되는 시점까지 설명해야 설정이 예측 가능해집니다.

확인한 고정 커밋 소스

기준: 46dfca2 전체 변경 시점

이전 글: 개발 노트 2: Windows 실행 경로 탐지

댓글