Skip to content

Commit 4b0d18b

Browse files
committed
feat: Add provider implementations and CLI interface
Core provider integrations and command-line interface: src/llmkit/_source_providers/: - OpenAI provider: GPT-4o, o1, function calling - Anthropic provider: Claude 3.5, prompt caching - Google provider: Gemini 1.5/2.0, multimodal - Ollama provider: Local models, embeddings src/llmkit/_source_models/: - Model-specific implementations - Parameter handling - Response parsing src/llmkit/__init__.py (680 lines): - Unified package exports - 200+ functions and classes - Organized by module category - Optional dependency checking - Clean import structure src/llmkit/cli.py (490 lines): - Interactive command-line interface - Model selection and configuration - Quick testing and debugging - Provider management src/llmkit/utils/: - Helper utilities - Common functions - Shared resources Complete the core package structure with all providers and utilities
1 parent 2da86f1 commit 4b0d18b

File tree

16 files changed

+3040
-0
lines changed

16 files changed

+3040
-0
lines changed

src/llmkit/__init__.py

Lines changed: 781 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
LLM Provider Enum
3+
지원하는 LLM 제공자 열거형
4+
"""
5+
6+
from enum import Enum
7+
8+
9+
class LLMProvider(str, Enum):
10+
"""지원하는 LLM 제공자"""
11+
12+
OPENAI = "openai"
13+
ANTHROPIC = "anthropic" # Claude
14+
GOOGLE = "google" # Gemini
15+
OLLAMA = "ollama"
16+
AUTO = "auto" # 자동 선택
Lines changed: 364 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,364 @@
1+
"""
2+
Model Configuration
3+
모델 설정 및 관리 (모든 제공자 지원)
4+
"""
5+
6+
from typing import Dict, Optional
7+
from dataclasses import dataclass
8+
from src.models.llm_provider import LLMProvider
9+
10+
11+
@dataclass
12+
class ModelConfig:
13+
"""모델 설정"""
14+
15+
name: str
16+
display_name: str
17+
provider: LLMProvider # 제공자
18+
type: str # 'slm' or 'llm'
19+
max_tokens: int
20+
temperature: float
21+
description: str
22+
use_case: str
23+
# 파라미터 지원 정보 (2025년 12월 15일 기준)
24+
supports_temperature: bool = True # temperature 파라미터 지원 여부
25+
supports_max_tokens: bool = True # max_tokens 파라미터 지원 여부
26+
uses_max_completion_tokens: bool = False # max_completion_tokens 사용 여부 (gpt-5, gpt-4.1 시리즈)
27+
28+
29+
class ModelConfigManager:
30+
"""모델 설정 관리자"""
31+
32+
# 모델 설정 정의 (모든 제공자 포함)
33+
MODELS: Dict[str, ModelConfig] = {
34+
# Ollama 모델
35+
"phi3.5": ModelConfig(
36+
name="phi3.5",
37+
display_name="Phi-3.5 (SLM)",
38+
provider=LLMProvider.OLLAMA,
39+
type="slm",
40+
max_tokens=2048,
41+
temperature=0.0,
42+
description="빠른 응답을 위한 Small Language Model",
43+
use_case="간단한 질문, 검색 제안, 자동완성",
44+
supports_temperature=True,
45+
supports_max_tokens=True,
46+
uses_max_completion_tokens=False,
47+
),
48+
"qwen2.5:7b": ModelConfig(
49+
name="qwen2.5:7b",
50+
display_name="Qwen2.5 7B (LLM)",
51+
provider=LLMProvider.OLLAMA,
52+
type="llm",
53+
max_tokens=4096,
54+
temperature=0.0,
55+
description="균형잡힌 성능의 Large Language Model",
56+
use_case="일반 대화, 설명, 분석",
57+
supports_temperature=True,
58+
supports_max_tokens=True,
59+
uses_max_completion_tokens=False,
60+
),
61+
"llama3.1:70b": ModelConfig(
62+
name="llama3.1:70b",
63+
display_name="Llama 3.1 70B (Large LLM)",
64+
provider=LLMProvider.OLLAMA,
65+
type="llm",
66+
max_tokens=8192,
67+
temperature=0.0,
68+
description="고성능 추론을 위한 Large Language Model",
69+
use_case="복잡한 분석, 전략 수립, 심층 추론",
70+
supports_temperature=True,
71+
supports_max_tokens=True,
72+
uses_max_completion_tokens=False,
73+
),
74+
"ax:3.1-lite": ModelConfig(
75+
name="ax:3.1-lite",
76+
display_name="A.X 3.1 Lite (Korean)",
77+
provider=LLMProvider.OLLAMA,
78+
type="llm",
79+
max_tokens=4096,
80+
temperature=0.0,
81+
description="한국어 특화 모델",
82+
use_case="한국어 금융 질문, 한국 시장 분석",
83+
supports_temperature=True,
84+
supports_max_tokens=True,
85+
uses_max_completion_tokens=False,
86+
),
87+
# OpenAI 모델
88+
"gpt-4o-mini": ModelConfig(
89+
name="gpt-4o-mini",
90+
display_name="GPT-4o Mini",
91+
provider=LLMProvider.OPENAI,
92+
type="llm",
93+
max_tokens=16384,
94+
temperature=0.0,
95+
description="OpenAI의 빠르고 저렴한 모델",
96+
use_case="일반 대화, 빠른 응답",
97+
supports_temperature=True,
98+
supports_max_tokens=True,
99+
uses_max_completion_tokens=False,
100+
),
101+
"gpt-4o": ModelConfig(
102+
name="gpt-4o",
103+
display_name="GPT-4o",
104+
provider=LLMProvider.OPENAI,
105+
type="llm",
106+
max_tokens=128000,
107+
temperature=0.0,
108+
description="OpenAI의 최신 고성능 모델",
109+
use_case="복잡한 분석, 정확한 답변",
110+
supports_temperature=True,
111+
supports_max_tokens=True,
112+
uses_max_completion_tokens=False,
113+
),
114+
"gpt-4-turbo": ModelConfig(
115+
name="gpt-4-turbo",
116+
display_name="GPT-4 Turbo",
117+
provider=LLMProvider.OPENAI,
118+
type="llm",
119+
max_tokens=128000,
120+
temperature=0.0,
121+
description="OpenAI의 고성능 모델",
122+
use_case="복잡한 작업, 긴 컨텍스트",
123+
supports_temperature=True,
124+
supports_max_tokens=True,
125+
uses_max_completion_tokens=False,
126+
),
127+
# GPT-5 시리즈 (max_completion_tokens 사용)
128+
"gpt-5-mini": ModelConfig(
129+
name="gpt-5-mini",
130+
display_name="GPT-5 Mini",
131+
provider=LLMProvider.OPENAI,
132+
type="llm",
133+
max_tokens=16384,
134+
temperature=0.0,
135+
description="OpenAI의 최신 경량 모델",
136+
use_case="일반 대화, 빠른 응답",
137+
supports_temperature=False, # mini는 temperature 미지원 (기본값 1만 지원)
138+
supports_max_tokens=False,
139+
uses_max_completion_tokens=True,
140+
),
141+
"gpt-5-nano": ModelConfig(
142+
name="gpt-5-nano",
143+
display_name="GPT-5 Nano",
144+
provider=LLMProvider.OPENAI,
145+
type="llm",
146+
max_tokens=16384,
147+
temperature=0.0,
148+
description="OpenAI의 최신 초경량 모델",
149+
use_case="초고속 응답, 간단한 작업",
150+
supports_temperature=False, # nano는 temperature 미지원
151+
supports_max_tokens=False,
152+
uses_max_completion_tokens=True,
153+
),
154+
"gpt-5": ModelConfig(
155+
name="gpt-5",
156+
display_name="GPT-5",
157+
provider=LLMProvider.OPENAI,
158+
type="llm",
159+
max_tokens=128000,
160+
temperature=0.0,
161+
description="OpenAI의 최신 고성능 모델",
162+
use_case="복잡한 분석, 정확한 답변",
163+
supports_temperature=True,
164+
supports_max_tokens=False,
165+
uses_max_completion_tokens=True,
166+
),
167+
# GPT-4.1 시리즈 (max_completion_tokens 사용)
168+
"gpt-4.1-mini": ModelConfig(
169+
name="gpt-4.1-mini",
170+
display_name="GPT-4.1 Mini",
171+
provider=LLMProvider.OPENAI,
172+
type="llm",
173+
max_tokens=16384,
174+
temperature=0.0,
175+
description="OpenAI의 경량 모델",
176+
use_case="일반 대화, 빠른 응답",
177+
supports_temperature=False, # mini는 temperature 미지원 (기본값 1만 지원)
178+
supports_max_tokens=False,
179+
uses_max_completion_tokens=True,
180+
),
181+
"gpt-4.1-nano": ModelConfig(
182+
name="gpt-4.1-nano",
183+
display_name="GPT-4.1 Nano",
184+
provider=LLMProvider.OPENAI,
185+
type="llm",
186+
max_tokens=16384,
187+
temperature=0.0,
188+
description="OpenAI의 초경량 모델",
189+
use_case="초고속 응답, 간단한 작업",
190+
supports_temperature=False, # nano는 temperature 미지원
191+
supports_max_tokens=False,
192+
uses_max_completion_tokens=True,
193+
),
194+
"gpt-4.1": ModelConfig(
195+
name="gpt-4.1",
196+
display_name="GPT-4.1",
197+
provider=LLMProvider.OPENAI,
198+
type="llm",
199+
max_tokens=128000,
200+
temperature=0.0,
201+
description="OpenAI의 고성능 모델",
202+
use_case="복잡한 분석, 정확한 답변",
203+
supports_temperature=True,
204+
supports_max_tokens=False,
205+
uses_max_completion_tokens=True,
206+
),
207+
# O3, O4 시리즈 (temperature 미지원)
208+
"o3-mini": ModelConfig(
209+
name="o3-mini",
210+
display_name="O3 Mini",
211+
provider=LLMProvider.OPENAI,
212+
type="llm",
213+
max_tokens=16384,
214+
temperature=0.0,
215+
description="OpenAI의 추론 모델 경량 버전",
216+
use_case="추론 작업, 수학, 과학",
217+
supports_temperature=False, # o3는 temperature 미지원
218+
supports_max_tokens=True,
219+
uses_max_completion_tokens=False,
220+
),
221+
"o3": ModelConfig(
222+
name="o3",
223+
display_name="O3",
224+
provider=LLMProvider.OPENAI,
225+
type="llm",
226+
max_tokens=16384,
227+
temperature=0.0,
228+
description="OpenAI의 추론 모델",
229+
use_case="고급 추론 작업, 수학, 과학",
230+
supports_temperature=False, # o3는 temperature 미지원
231+
supports_max_tokens=True,
232+
uses_max_completion_tokens=False,
233+
),
234+
"o4-mini": ModelConfig(
235+
name="o4-mini",
236+
display_name="O4 Mini",
237+
provider=LLMProvider.OPENAI,
238+
type="llm",
239+
max_tokens=16384,
240+
temperature=0.0,
241+
description="OpenAI의 최신 추론 모델 경량 버전",
242+
use_case="추론 작업, 수학, 과학",
243+
supports_temperature=False, # o4는 temperature 미지원
244+
supports_max_tokens=True,
245+
uses_max_completion_tokens=False,
246+
),
247+
# Anthropic (Claude) 모델
248+
"claude-3-5-sonnet-20241022": ModelConfig(
249+
name="claude-3-5-sonnet-20241022",
250+
display_name="Claude 3.5 Sonnet",
251+
provider=LLMProvider.ANTHROPIC,
252+
type="llm",
253+
max_tokens=8192,
254+
temperature=0.0,
255+
description="Anthropic의 최신 고성능 모델",
256+
use_case="복잡한 추론, 정확한 분석",
257+
supports_temperature=True,
258+
supports_max_tokens=True,
259+
uses_max_completion_tokens=False,
260+
),
261+
"claude-3-opus-20240229": ModelConfig(
262+
name="claude-3-opus-20240229",
263+
display_name="Claude 3 Opus",
264+
provider=LLMProvider.ANTHROPIC,
265+
type="llm",
266+
max_tokens=4096,
267+
temperature=0.0,
268+
description="Anthropic의 최고 성능 모델",
269+
use_case="최고 수준의 추론, 복잡한 작업",
270+
supports_temperature=True,
271+
supports_max_tokens=True,
272+
uses_max_completion_tokens=False,
273+
),
274+
"claude-3-haiku-20240307": ModelConfig(
275+
name="claude-3-haiku-20240307",
276+
display_name="Claude 3 Haiku",
277+
provider=LLMProvider.ANTHROPIC,
278+
type="llm",
279+
max_tokens=4096,
280+
temperature=0.0,
281+
description="Anthropic의 빠른 모델",
282+
use_case="빠른 응답, 간단한 작업",
283+
supports_temperature=True,
284+
supports_max_tokens=True,
285+
uses_max_completion_tokens=False,
286+
),
287+
# Google (Gemini) 모델
288+
"gemini-1.5-pro": ModelConfig(
289+
name="gemini-1.5-pro",
290+
display_name="Gemini 1.5 Pro",
291+
provider=LLMProvider.GOOGLE,
292+
type="llm",
293+
max_tokens=8192,
294+
temperature=0.0,
295+
description="Google의 고성능 모델",
296+
use_case="복잡한 분석, 멀티모달",
297+
supports_temperature=True,
298+
supports_max_tokens=True,
299+
uses_max_completion_tokens=False,
300+
),
301+
"gemini-1.5-flash": ModelConfig(
302+
name="gemini-1.5-flash",
303+
display_name="Gemini 1.5 Flash",
304+
provider=LLMProvider.GOOGLE,
305+
type="llm",
306+
max_tokens=8192,
307+
temperature=0.0,
308+
description="Google의 빠른 모델",
309+
use_case="빠른 응답, 일반 작업",
310+
supports_temperature=True,
311+
supports_max_tokens=True,
312+
uses_max_completion_tokens=False,
313+
),
314+
}
315+
316+
@classmethod
317+
def get_model_config(cls, model_name: str) -> Optional[ModelConfig]:
318+
"""모델 설정 조회"""
319+
return cls.MODELS.get(model_name)
320+
321+
@classmethod
322+
def get_models_by_provider(cls, provider: LLMProvider) -> Dict[str, ModelConfig]:
323+
"""제공자별 모델 조회"""
324+
return {name: config for name, config in cls.MODELS.items() if config.provider == provider}
325+
326+
@classmethod
327+
def get_models_by_type(cls, model_type: str) -> Dict[str, ModelConfig]:
328+
"""타입별 모델 조회"""
329+
return {name: config for name, config in cls.MODELS.items() if config.type == model_type}
330+
331+
@classmethod
332+
def get_slm_models(cls) -> Dict[str, ModelConfig]:
333+
"""SLM 모델 목록"""
334+
return cls.get_models_by_type("slm")
335+
336+
@classmethod
337+
def get_llm_models(cls) -> Dict[str, ModelConfig]:
338+
"""LLM 모델 목록"""
339+
return cls.get_models_by_type("llm")
340+
341+
@classmethod
342+
def get_default_model(cls, provider: Optional[LLMProvider] = None, model_type: str = "llm") -> Optional[str]:
343+
"""기본 모델 조회"""
344+
if provider:
345+
models = cls.get_models_by_provider(provider)
346+
for name, config in models.items():
347+
if config.type == model_type:
348+
return name
349+
else:
350+
if model_type == "slm":
351+
return "phi3.5"
352+
elif model_type == "llm":
353+
# 사용 가능한 제공자에 따라 기본 모델 선택 (EnvConfig 사용)
354+
from src.config.env import EnvConfig
355+
356+
if EnvConfig.ANTHROPIC_API_KEY:
357+
return "claude-3-5-sonnet-20241022"
358+
elif EnvConfig.OPENAI_API_KEY:
359+
return "gpt-4o-mini"
360+
elif EnvConfig.GEMINI_API_KEY:
361+
return "gemini-1.5-flash"
362+
else:
363+
return "qwen2.5:7b"
364+
return None

0 commit comments

Comments
 (0)