Skip to content

refactor: restructure LLM module with provider registry pattern#36

Merged
ikjeong merged 32 commits intomainfrom
refactor/llm
Dec 8, 2025
Merged

refactor: restructure LLM module with provider registry pattern#36
ikjeong merged 32 commits intomainfrom
refactor/llm

Conversation

@ikjeong
Copy link
Contributor

@ikjeong ikjeong commented Dec 7, 2025

Summary

  • LLM 모듈을 Provider Registry 패턴으로 재구조화하여 확장성 및 유지보수성 향상
  • Legacy 코드 정리 및 설정 방식을 .env에서 config.json으로 마이그레이션
  • Converter/Validator에 동시성 제어 및 fallback 메커니즘 추가

Changes

LLM Provider Registry 패턴 적용

  • Provider 인터페이스 도입 (llm/llm.go)
  • RawProvider + Wrapper 패턴으로 공통 로직 분리 (llm/wrapper.go)
  • Registry를 통한 동적 provider/model 조회 지원 (llm/registry.go)
  • Provider별 패키지 분리:
    • llm/claudecode/ - Claude Code CLI
    • llm/geminicli/ - Gemini CLI
    • llm/openaiapi/ - OpenAI API

Legacy 코드 제거

  • llm/engine/ 패키지 전체 삭제 (api.go, cli.go, mcp.go, cliprovider/)
  • llm/client.go 삭제
  • cmd/api_key.go 삭제 (deprecated)
  • llm/mcp/ 삭제 (YAGNI - 미사용 MCP sampling provider)

설정 마이그레이션

  • .envconfig.json 마이그레이션
  • API key 처리를 각 provider에 위임
  • internal/config/project.go 추가

Converter/Validator 개선

  • Adapter converter에 concurrency control 추가
  • 변환 실패 규칙에 대한 llm-validator fallback 추가
  • ConversionResult 구조체로 규칙별 성공/실패 추적

@ikjeong ikjeong self-assigned this Dec 7, 2025
- EngineConfig, Registration 구조체 추가
- Register(), GetAllRegistrations() 함수 구현
- llm/openai/engine.go 생성
- llm/openai/register.go 생성 (init 자동 등록)
- llm/claudecode/engine.go 생성
- llm/claudecode/register.go 생성
- llm/geminicli/engine.go 생성
- llm/geminicli/register.go 생성
- llm/mcp/engine.go 생성
- llm/mcp/register.go 생성
- registry를 engine 패키지로 이동
- 모든 provider가 engine 패키지만 import하도록 수정
- client.go가 engine.GetAllRegistrations() 사용
- engine/api.go, cli.go, mcp.go, cliprovider/ 삭제
- cli_detect.go 추가 (CLI 감지 유틸리티)
- config.go, cmd/llm.go 참조 수정
- client_test.go 테스트 기대값 수정
- bootstrap/providers.go 생성
- llm/client.go에서 side-effect imports 제거
- Move interface and types from llm/engine/ to llm/
- Delete llm/engine/ subdirectory (no longer needed)
- Update all providers to import llm directly
- Fix cmd/llm.go to use llm.Mode instead of engine.Mode
- Update tests with mock engine registration

This change follows the same pattern as adapter/ package:
- Interface in llm/engine.go
- Registry in llm/registry.go
- Providers in llm/<provider>/
- Side-effect imports in bootstrap/providers.go
MCP sampling provider was designed for future llm-validator
feature but is currently unused (no llm-validator rules exist).

Removed:
- internal/llm/mcp/ directory
- ModeMCP constant and related code
- WithMCPSession option
- MCP mode from CLI setup menu

Following YAGNI principle - can be re-implemented if needed.
- Add ConversionResult struct with per-rule success/failure tracking
- Update all adapter converters to return ConversionResult
- Update main converter to fallback failed rules to llm-validator
- Failed rules now get engine: "llm-validator" in code-policy.json
- Add ModelInfo, APIKeyConfig types to ProviderInfo
- Add registry helper functions for dynamic provider/model queries
- Remove hardcoded provider options from cmd/llm.go
- Add compile-time RawProvider interface checks to all providers
- Update README.md with new registration examples
- Replace emoji outputs with ui package functions
- Use ui.PrintOK, ui.PrintError, ui.PrintWarn, ui.PrintTitle consistently
- Affected files: init, my_role, policy, convert, mcp, mcp_register, validate, dashboard
@ikjeong ikjeong merged commit 51c361a into main Dec 8, 2025
1 check passed
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