feat: [models.llm] request_timeout_secs config + 권장 모델 가이드 #162

Merged
altair823 merged 2 commits from feat/llm-timeout-config into main 2026-05-25 03:21:21 +00:00
Owner

요약

v0.17.0 확장 도그푸딩 (2026-05-25 — tasks/HOTFIXES.md entry) 의 두 가지 follow-up 을 한 PR 에 묶음. additive — wire / 기존 config 호환.

(1) timeout config 노브: crates/kebab-llm-local/src/ollama.rs 의 hard-coded REQUEST_TIMEOUT = 300s 가 8B+ 모델 (gemma4:e4b 등) 의 CPU 추론 시간을 초과 → error: kb-rag: llm.generate_stream 으로 떨어지던 문제. [models.llm] request_timeout_secs (default 300, env override 가능) 로 빼냄. 옛 config 가 키 누락해도 그대로 파싱.

(2) 권장 모델 가이드: README 사전 요구 절 + docs/SMOKE.md ollama 안내에 한 단락 — CPU only / RAM ≤ 16 GB 환경 ⇒ ≤ 4B Q4 모델 (gemma3:4b / qwen2.5:3b / phi3:mini) 권장 + 8B+ 시 timeout 사전 안내.

변경 요약

  • kebab-config: LlmCfg.request_timeout_secs: u64 additive (#[serde(default = "default_llm_request_timeout_secs")], default 300). Config::defaults() 의 LlmCfg literal 갱신. env override KEBAB_MODELS_LLM_REQUEST_TIMEOUT_SECS.
  • kebab-llm-local::ollama.rs: REQUEST_TIMEOUT 상수 제거 — OllamaLanguageModel::newDuration::from_secs(llm.request_timeout_secs) 로 client 빌드. doc comment (line 51-55, 263-270) 도 동일 갱신.
  • test: 3 신규 unit test in kebab-config — default 300 핀 / env override / legacy config (필드 누락) backward-compat parse.
  • docs: README + SMOKE + HOTFIXES 2026-05-25 entry.

사용자 가시 영향

  • 기본 동작 동일 (300s default 유지). 옛 config 호환.
  • config.toml[models.llm] 절에 request_timeout_secs = 1200 (또는 env) 추가하면 8B+ 모델 시도 가능.
  • kebab init 가 생성하는 template config 에는 노출 안 함 (additive default field) — 사용자가 명시적으로 추가하거나 env override.

검증

  • 신규 unit test 3 PASS:
    • default_llm_request_timeout_secs_is_300
    • env_overrides_models_llm_request_timeout_secs
    • legacy_config_without_request_timeout_secs_uses_default (옛 config TOML 시뮬레이션)
  • cargo test --workspace --no-fail-fast -j 1 + cargo clippy --workspace --all-targets -- -D warnings green.

시험 항목 (Test Plan)

  • 기존 config.toml (request_timeout_secs 키 없음) 로 kebab ask 실행 → 동일 동작 (300s).
  • [models.llm] request_timeout_secs = 1200 추가 → gemma4:e4b 같은 8B+ 모델 ask 시 timeout 안 걸림 (단 응답 시간만큼 RAM 점유).
  • KEBAB_MODELS_LLM_REQUEST_TIMEOUT_SECS=60 kebab ask "..." 환경에서 timeout 빠르게 검증.

미진행 (scope 외)

  • crates/kebab-parse-image/src/ocr.rs 의 동일한 hard-coded 300s — OCR 은 가벼운 inference 라 부담 적지만 일관성 측면에서 다음 round.
  • kebab ask --stream (fb-33) 권장 강조 — UX 개선 후속.

Assisted-by: Claude Code

## 요약 v0.17.0 확장 도그푸딩 (2026-05-25 — `tasks/HOTFIXES.md` entry) 의 두 가지 follow-up 을 한 PR 에 묶음. **additive — wire / 기존 config 호환**. (1) **timeout config 노브**: `crates/kebab-llm-local/src/ollama.rs` 의 hard-coded `REQUEST_TIMEOUT = 300s` 가 8B+ 모델 (gemma4:e4b 등) 의 CPU 추론 시간을 초과 → `error: kb-rag: llm.generate_stream` 으로 떨어지던 문제. `[models.llm] request_timeout_secs` (default 300, env override 가능) 로 빼냄. 옛 config 가 키 누락해도 그대로 파싱. (2) **권장 모델 가이드**: README 사전 요구 절 + `docs/SMOKE.md` ollama 안내에 한 단락 — CPU only / RAM ≤ 16 GB 환경 ⇒ ≤ 4B Q4 모델 (gemma3:4b / qwen2.5:3b / phi3:mini) 권장 + 8B+ 시 timeout 사전 안내. ## 변경 요약 - **kebab-config**: `LlmCfg.request_timeout_secs: u64` additive (`#[serde(default = "default_llm_request_timeout_secs")]`, default 300). `Config::defaults()` 의 LlmCfg literal 갱신. env override `KEBAB_MODELS_LLM_REQUEST_TIMEOUT_SECS`. - **kebab-llm-local::ollama.rs**: `REQUEST_TIMEOUT` 상수 제거 — `OllamaLanguageModel::new` 가 `Duration::from_secs(llm.request_timeout_secs)` 로 client 빌드. doc comment (line 51-55, 263-270) 도 동일 갱신. - **test**: 3 신규 unit test in `kebab-config` — default 300 핀 / env override / legacy config (필드 누락) backward-compat parse. - **docs**: README + SMOKE + HOTFIXES 2026-05-25 entry. ## 사용자 가시 영향 - 기본 동작 동일 (300s default 유지). 옛 config 호환. - `config.toml` 의 `[models.llm]` 절에 `request_timeout_secs = 1200` (또는 env) 추가하면 8B+ 모델 시도 가능. - `kebab init` 가 생성하는 template config 에는 노출 안 함 (additive default field) — 사용자가 명시적으로 추가하거나 env override. ## 검증 - 신규 unit test 3 PASS: - `default_llm_request_timeout_secs_is_300` - `env_overrides_models_llm_request_timeout_secs` - `legacy_config_without_request_timeout_secs_uses_default` (옛 config TOML 시뮬레이션) - `cargo test --workspace --no-fail-fast -j 1` + `cargo clippy --workspace --all-targets -- -D warnings` green. ## 시험 항목 (Test Plan) - [ ] 기존 `config.toml` (request_timeout_secs 키 없음) 로 `kebab ask` 실행 → 동일 동작 (300s). - [ ] `[models.llm] request_timeout_secs = 1200` 추가 → gemma4:e4b 같은 8B+ 모델 ask 시 timeout 안 걸림 (단 응답 시간만큼 RAM 점유). - [ ] `KEBAB_MODELS_LLM_REQUEST_TIMEOUT_SECS=60 kebab ask "..."` 환경에서 timeout 빠르게 검증. ## 미진행 (scope 외) - `crates/kebab-parse-image/src/ocr.rs` 의 동일한 hard-coded 300s — OCR 은 가벼운 inference 라 부담 적지만 일관성 측면에서 다음 round. - `kebab ask --stream` (fb-33) 권장 강조 — UX 개선 후속. Assisted-by: Claude Code
altair823 added 1 commit 2026-05-25 03:01:44 +00:00
v0.17.0 확장 도그푸딩 (2026-05-25) 에서 발견된 두 가지를
한 PR 에 묶음.

(1) llm.generate_stream 의 hard-coded 300s timeout 을 config 노브로
    빼냄. 8B+ 모델 (gemma4:e4b 등) 은 CPU only 환경에서 5분
    안에 첫 RAG 답변 못 마치고 `error: kb-rag: llm.generate_stream`
    으로 떨어지던 문제.

    - kebab-config::LlmCfg 에 request_timeout_secs: u64 additive
      필드 (#[serde(default = "default_llm_request_timeout_secs")]
      default 300). 옛 config 가 키 누락해도 그대로 파싱 + 동일
      동작.
    - env override KEBAB_MODELS_LLM_REQUEST_TIMEOUT_SECS.
    - kebab-llm-local::ollama.rs 의 REQUEST_TIMEOUT 상수 제거 →
      OllamaLanguageModel::new 가 Duration::from_secs(
      llm.request_timeout_secs) 로 reqwest client 빌드. doc
      comment 도 동일 갱신.
    - 신규 unit test 3 — default 300 핀 / env override / legacy
      config (필드 누락) backward-compat.

(2) docs — README 사전 요구 절 + docs/SMOKE.md ollama 안내에 한 단락:
    CPU only / RAM ≤ 16 GB 환경 ⇒ ≤ 4B Q4 모델 권장
    (gemma3:4b / qwen2.5:3b / phi3:mini). 8B+ 시도 시 timeout
    패턴 사전 안내. request_timeout_secs 노브 사용법.

    HOTFIXES 2026-05-25 entry — 위 두 변경 + 미진행 사항
    (kebab-parse-image OCR 의 같은 hard-coded 300s 는 scope 외
    follow-up 으로 등재 + ask --stream 권장 강조 후속) 기록.

workspace cargo test -j 1 + clippy 통과. 코드 변경은 backwards-compat
(additive serde field) 라 기존 사용자 영향 없음.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
altair823 added 1 commit 2026-05-25 03:14:47 +00:00
PR #162 워커 리뷰 반영.

- MEDIUM (W2) + LOW (W1): request_timeout_secs = 0 이 reqwest 의
  의미상 disable 이 아닌 instant timeout (모든 요청 즉시 실패).
  LlmCfg field rustdoc + ollama.rs module-level comment + README
  세 군데에 명시 + u64::MAX / 86400 같은 large finite 값 권장.
- NIT (W1): HOTFIXES 2026-05-25 entry 의 '답변이 인 5분' typo →
  '답변이 5분' (1자 삭제).
- NIT (W1): README + HOTFIXES 의 '확장 도그푸딩' 내부 jargon →
  '후속 도그푸딩' 으로 통일.

코드 동작 변경 없음 — doc only. cargo test request_timeout 3 PASS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
altair823 merged commit abb05ebc23 into main 2026-05-25 03:21:21 +00:00
altair823 deleted branch feat/llm-timeout-config 2026-05-25 03:21:22 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#162