diff --git a/app/ai/client.py b/app/ai/client.py index 887c7ff..3c278a0 100644 --- a/app/ai/client.py +++ b/app/ai/client.py @@ -346,6 +346,10 @@ class AIClient: payload["temperature"] = model_config.temperature if model_config.top_p is not None: payload["top_p"] = model_config.top_p + if model_config.repetition_penalty is not None: + payload["repetition_penalty"] = model_config.repetition_penalty + if model_config.top_k is not None: + payload["top_k"] = model_config.top_k response = await self._http.post( model_config.endpoint, json=payload, diff --git a/app/core/config.py b/app/core/config.py index 5f70fb6..c37e1c4 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -30,6 +30,11 @@ class AIModelConfig(BaseModel): # None = MLX/OpenAI server default. Anthropic branch 는 미적용 (별 plan 범위). temperature: float | None = None top_p: float | None = None + # mlx 네이티브 샘플링 — 한국어 장문 코드스위칭(CJK/라틴 누수)·반복루프 억제용. + # Qwen3 권장: top_k=20, repetition_penalty 1.05~1.1. None = 서버 기본값(주입 안 함). + # OpenAI 호환 분기(mlx)만 적용 — Anthropic 분기는 미적용(별 범위). + repetition_penalty: float | None = None + top_k: int | None = None class DeepSummaryBacklogConfig(BaseModel):