Set repetition_penalty default to 1.0 (disabled) everywhere

Change all repetition_penalty defaults from 1.1 (or 1.05/1.2 in
presets) to 1.0 across the entire backend and frontend. Most models
handle repetition well on their own and a non-1.0 penalty can degrade
output quality, especially for code, structured output, and creative
tasks.

Files changed:
- Backend: inference.py, llama_cpp.py, orchestrator.py, worker.py,
  models/inference.py (Field defaults)
- Frontend: chat-settings-sheet.tsx (Creative/Precise presets),
  runtime-provider.tsx (auto-title generation)
This commit is contained in:
Daniel Han 2026-03-16 07:10:59 +00:00
commit 20c6d9a26a
7 changed files with 19 additions and 19 deletions

View file

@ -628,7 +628,7 @@ class InferenceBackend:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
) -> Generator[str, None, None]:
"""
@ -658,7 +658,7 @@ class InferenceBackend:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
_adapter_state = None,
) -> Generator[str, None, None]:
@ -1077,7 +1077,7 @@ class InferenceBackend:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
_adapter_state = None,
) -> Generator[str, None, None]:
@ -1215,7 +1215,7 @@ class InferenceBackend:
top_k: int = 50,
min_p: float = 0.0,
max_new_tokens: int = 2048,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
use_adapter: Optional[Union[bool, str]] = None,
) -> Tuple[bytes, int]:
"""

View file

@ -929,7 +929,7 @@ class LlamaCppBackend:
top_k: int = 40,
min_p: float = 0.0,
max_tokens: Optional[int] = None,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
stop: Optional[list[str]] = None,
cancel_event: Optional[threading.Event] = None,
) -> Generator[str, None, None]:

View file

@ -395,7 +395,7 @@ class InferenceOrchestrator:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
use_adapter = None,
) -> Generator[str, None, None]:
@ -666,7 +666,7 @@ class InferenceOrchestrator:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
) -> Generator[str, None, None]:
"""Generate response, streaming tokens from subprocess."""
@ -712,7 +712,7 @@ class InferenceOrchestrator:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
use_adapter = None,
) -> Generator[str, None, None]:
@ -763,7 +763,7 @@ class InferenceOrchestrator:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 256,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
use_adapter = None,
) -> Generator[str, None, None]:
@ -862,7 +862,7 @@ class InferenceOrchestrator:
top_k: int = 50,
min_p: float = 0.0,
max_new_tokens: int = 2048,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
use_adapter: Optional[Union[bool, str]] = None,
) -> Tuple[bytes, int]:
"""Generate TTS audio. Returns (wav_bytes, sample_rate).
@ -949,7 +949,7 @@ class InferenceOrchestrator:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 512,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
) -> Generator[str, None, None]:
"""Audio input generation (e.g. Gemma 3n) — streams text tokens."""
@ -978,7 +978,7 @@ class InferenceOrchestrator:
top_k: int = 40,
min_p: float = 0.0,
max_new_tokens: int = 512,
repetition_penalty: float = 1.1,
repetition_penalty: float = 1.0,
cancel_event = None,
) -> Generator[str, None, None]:
"""Shared inner logic for audio input generation (Whisper + ASR)."""

View file

@ -276,7 +276,7 @@ def _handle_generate(
"top_k": cmd.get("top_k", 40),
"min_p": cmd.get("min_p", 0.0),
"max_new_tokens": cmd.get("max_new_tokens", 256),
"repetition_penalty": cmd.get("repetition_penalty", 1.1),
"repetition_penalty": cmd.get("repetition_penalty", 1.0),
"cancel_event": cancel_event,
}
@ -348,7 +348,7 @@ def _handle_generate_audio(
top_k = cmd.get("top_k", 50),
min_p = cmd.get("min_p", 0.0),
max_new_tokens = cmd.get("max_new_tokens", 2048),
repetition_penalty = cmd.get("repetition_penalty", 1.1),
repetition_penalty = cmd.get("repetition_penalty", 1.0),
use_adapter = cmd.get("use_adapter"),
)
@ -411,7 +411,7 @@ def _handle_generate_audio_input(
top_k = cmd.get("top_k", 40),
min_p = cmd.get("min_p", 0.0),
max_new_tokens = cmd.get("max_new_tokens", 512),
repetition_penalty = cmd.get("repetition_penalty", 1.1),
repetition_penalty = cmd.get("repetition_penalty", 1.0),
cancel_event = cancel_event,
)

View file

@ -91,7 +91,7 @@ class GenerateRequest(BaseModel):
2048, ge = 1, le = 4096, description = "Maximum tokens to generate"
)
repetition_penalty: float = Field(
1.1, ge = 1.0, le = 2.0, description = "Repetition penalty"
1.0, ge = 1.0, le = 2.0, description = "Repetition penalty"
)
image_base64: Optional[str] = Field(
None, description = "Base64 encoded image for vision models"

View file

@ -45,7 +45,7 @@ const BUILTIN_PRESETS: Preset[] = [
temperature: 1.2,
topP: 0.95,
topK: 80,
repetitionPenalty: 1.05,
repetitionPenalty: 1.0,
},
},
{
@ -55,7 +55,7 @@ const BUILTIN_PRESETS: Preset[] = [
temperature: 0.2,
topP: 0.7,
topK: 20,
repetitionPenalty: 1.2,
repetitionPenalty: 1.0,
},
},
];

View file

@ -215,7 +215,7 @@ async function generateTitleWithModel(payload: {
top_p: 0.9,
max_tokens: 24,
top_k: 40,
repetition_penalty: 1.05,
repetition_penalty: 1.0,
messages: [
{
role: "system",