Skip to content

feat(llm): 로컬 모델 자동 발견 — 게이트웨이 /model/info 로 카탈로그 갱신 - #705

Merged
riskpw merged 1 commit into
mainfrom
feat/local-model-discovery
Sep 2, 2026
Merged

feat(llm): 로컬 모델 자동 발견 — 게이트웨이 /model/info 로 카탈로그 갱신#705
riskpw merged 1 commit into
mainfrom
feat/local-model-discovery

Conversation

@riskpw

@riskpw riskpw commented Sep 2, 2026

Copy link
Copy Markdown
Member

배경

로컬 모델 목록의 유일한 출처가 `config/local-models.ts` 의 정적 카탈로그 한 줄이라, DGX 에서 모델을 교체해도(qwen3.6→3.8, PR #704) 앱은 옛 이름을 계속 표시했다. 게이트웨이 `/v1/models` 대조는 가용/불가 표시에만 쓰였다.

변경

  • `config/local-models-discovery.ts` (신규, 순수 선별 + fetch): provider prefix 항목 제외 → 로컬만, `model_info.mode`/id 패턴으로 이미지·음성 제외·임베딩은 `role=embedding`, 같은 upstream 을 가리키는 alias(`gpt-3.5-turbo`) 는 정식 이름 하나로 접음, 이전 카탈로그의 프로브 실측치(가용성·능력·컨텍스트) 보존
  • `local-models.ts`: `discoverLocalModels()` 가 카탈로그를 갱신, `probeLocalModelAvailability` 앞단(Stage 0)에 배선 → 부팅 + 주기 프로브에서 재발견. `LLM_LOCAL_MODELS_JSON` 은 명시 override 로 우선, `LLM_LOCAL_MODELS_DISCOVERY=false` 로 끔. `LLM_DEFAULT_MODEL` 이 발견 목록에 없으면 경고
  • 정적 `DEFAULT_LOCAL_MODELS` 는 게이트웨이 불달 시 폴백으로만 잔존
  • 단위 테스트 6건 (운영 `/model/info` 응답 형태 그대로)

검증

  • 운영 게이트웨이에 선별 로직 실행: `raw 10 → qwen3.8-27b(chat), qwen3.6-35b-a3b(chat), bge-m3(embedding)` (alias·flux·wildcard 제외)
  • tsc·eslint 통과, 관련 jest 19 passed, `local-models.ts` 582줄(Gate 3 600 이내)
  • 배포 후 부팅 로그 `모델 발견:` 확인 + `/api/models` 로컬 목록 확인

참고

vLLM 측 alias(`--served-model-name` 두 번째 이름 `qwen3.6-35b-a3b`)는 LiteLLM upstream 이름이 달라 게이트웨이 정보만으로는 접지 못한다 — DGX `env/chat.env` 에서 제거하면 자연히 사라진다.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BtAjkS2BAQ7JxMsidkdYQD

정적 카탈로그(local-models.ts 한 줄)가 목록의 유일한 출처라 DGX 에서 모델을 교체해도
앱이 옛 이름을 계속 표시했다(qwen3.6→3.8 교체가 alias 뒤에 가려진 사고). 이제 부팅·주기
프로브(Stage 0)가 LiteLLM /model/info 를 읽어 로컬(provider prefix 없는) 모델을 발견한다.

- config/local-models-discovery.ts: 순수 선별 규칙 — provider prefix 제외, mode/id 패턴으로
  이미지·음성 제외·임베딩은 role=embedding, 같은 upstream 을 가리키는 alias(gpt-3.5-turbo)는
  정식 이름 하나로 접음, 이전 카탈로그의 프로브 실측치 보존 (+ fetch, fail-open)
- local-models.ts: discoverLocalModels() 가 _cached 갱신, probeLocalModelAvailability 앞단에 배선.
  LLM_LOCAL_MODELS_JSON(명시 override) 우선, LLM_LOCAL_MODELS_DISCOVERY=false 로 끔.
  LLM_DEFAULT_MODEL 이 발견 목록에 없으면 경고.
- 정적 DEFAULT_LOCAL_MODELS 는 게이트웨이 불달 시 폴백으로만 잔존.
- 단위 테스트 6건 (운영 /model/info 형태 그대로)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BtAjkS2BAQ7JxMsidkdYQD
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

평가 회귀 리포트 (aa806c3)

평가 통과율 통과/전체 베이스라인 상태
Routing (Gate 5) 100.0% 120/120 50.0%
Response (Gate 6) 100.0% 30/30 50.0%
  • 데이터셋 버전: routing=0.8.3, response=0.8.3
  • 베이스라인은 OMK_EVAL_PASS_THRESHOLD / OMK_EVAL_RESPONSE_THRESHOLD 환경변수 기준 (이력 비교 아님)
  • 상세 결과: Actions 실행의 evaluation-results-aa806c3a65db5cec672cb26fad01f5e055a51c8e 아티팩트 참조

@riskpw
riskpw merged commit 8b30fa1 into main Sep 2, 2026
1 check passed
@riskpw
riskpw deleted the feat/local-model-discovery branch September 2, 2026 01:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant