docs(hermes): PR-Hermes-Skill-Curl-Refine-2 (SHIPPED) + MaxTokens-Followup (PARTIAL+REVERTED)
Curl-Refine-2 (SHIPPED): 3 SKILL.md 본문 "Tool 선택 (필독)" 단락 추가 — terminal
direct curl 강조 + execute_code Python wrap 금지. E2E: Gemma 1st turn
execute_code → terminal 전환 + DS API 도달 0→1 + real corpus citations
("test-voice-memo", "The Good List") 첫 성공. Hard-Enforcement-1 의 hook 와
시너지 (1 call cap + 1st 정상 path).
MaxTokens-Followup 1차 (PARTIAL+REVERTED): agent.disabled_toolsets 15 toolsets
비활성 → stream 102KB→80KB 22% 감소. BUT Gemma terminal tool_call 시
"invalid tool call" 회귀 발생 → revert. toolset dependency graph 조사 후
minimal safe disabled list 결정 = 별 트랙 PR-Hermes-MaxTokens-Investigation-1.
A 카테고리 6 PR + 부산 Curl-Refine-2 모두 SHIPPED. PR-1/2 user-facing E2E 완성.
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
# PR-Hermes-MaxTokens-Followup 1차 Closure Report — PARTIAL + Reverted
|
||||
|
||||
**Date**: 2026-05-17
|
||||
**범위**: Hermes 의 `agent.disabled_toolsets` 로 무거운 toolsets 제거해 input_tokens 감소 시도
|
||||
**결과**: 22% prompt size 감소 측정, but Gemma 의 tool_call validation 회귀 발생 → **revert 후 재조사 별 트랙**
|
||||
|
||||
## Summary
|
||||
|
||||
PR-Hermes-Polymorphic-Rossum plan 의 A 카테고리 백로그 P3 — Hermes 의 23320 input tokens (31 tools + 90 skills + persona) 대응. 1차 attempt = `agent.disabled_toolsets` 에 15개 무거운 toolsets (browser, vision, video, image_gen 등) 추가. 결과 = prompt 22% 감소 BUT Gemma 가 `terminal` tool_call 시 Hermes 가 "Model generated invalid tool call: terminal" 응답 → 회귀. revert + 별 트랙으로 분리.
|
||||
|
||||
## 시도 사항
|
||||
|
||||
`~/.hermes/config.yaml`:
|
||||
|
||||
```yaml
|
||||
agent:
|
||||
disabled_toolsets:
|
||||
- browser # 브라우저 자동화 (5+ tools 확인)
|
||||
- vision
|
||||
- video
|
||||
- image_gen
|
||||
- video_gen
|
||||
- tts
|
||||
- computer_use
|
||||
- spotify
|
||||
- yuanbao
|
||||
- feishu_doc
|
||||
- feishu_drive
|
||||
- kanban
|
||||
- homeassistant
|
||||
- moa
|
||||
- debugging
|
||||
```
|
||||
|
||||
(`terminal`, `skills`, `clarify`, `todo`, `memory`, `code_execution`, `file` 등 docsrv workflows 필수는 유지)
|
||||
|
||||
## 측정
|
||||
|
||||
**Pre-disabled (Hard-Enforcement-1 검증 시)**:
|
||||
- Hermes 1st turn stream size: ~102KB
|
||||
- input_tokens (이전 분석): 23320
|
||||
|
||||
**Post-disabled**:
|
||||
- Hermes 1st turn stream size: ~80KB (**~22% 감소**)
|
||||
- 4 stream ends 발생 (Gemma 가 turn 진행했으나 invalid tool_call 으로 종료)
|
||||
|
||||
## 회귀 발견
|
||||
|
||||
Hermes chat 종료 시 출력:
|
||||
|
||||
```
|
||||
Error: Model generated invalid tool call: terminal
|
||||
|
||||
session_id: 20260517_074513_c4e853
|
||||
```
|
||||
|
||||
Gemma 가 `terminal` tool 호출 시도, Hermes 가 "invalid" 로 reject. `terminal` 자체는 disabled_toolsets 에 없는데도 무효 판정.
|
||||
|
||||
**가설** (root cause 미확정 — 별 트랙):
|
||||
- (a) `terminal` toolset 이 disabled list 의 어느 toolset 에 dependency
|
||||
- (b) Hermes 의 tools registry 가 disabled_toolsets 처리 시 일부 정상 tool 도 함께 제외
|
||||
- (c) disabled_toolsets 의 어떤 항목이 terminal validation schema 까지 영향
|
||||
- (d) 90 skills 의 어떤 skill 이 활성화 도구 가정 + 제거 toolset 에 의존
|
||||
|
||||
## 결정 사항
|
||||
|
||||
1. **1차 disabled_toolsets attempt = REVERTED**:
|
||||
- Config 백업 `~/.hermes/config.yaml.pre-maxtokens.20260517` 으로 복귀
|
||||
- Hermes restart 후 정상 path 회복 (Curl-Refine-2 closure 시점의 모든 기능 유지)
|
||||
|
||||
2. **MaxTokens-Followup 본격 작업 = 별 트랙 (P3, 진행 가능)**:
|
||||
- **PR-Hermes-MaxTokens-Investigation-1** (P3) — Hermes 의 toolset dependency graph 조사 + disabled_toolsets 안전 list 결정. 작업 단계:
|
||||
1. `~/.hermes/hermes-agent/toolsets/__init__.py` 등에서 dependency 정의 찾기
|
||||
2. 각 toolset 의 tool 등록 site grep — 어떤 모듈이 `terminal` 등록?
|
||||
3. minimal disabled list 실험 (1개씩 추가하며 회귀 측정)
|
||||
4. 안전한 list 확정 후 본 PR 의 1차 attempt 와 비교 (`prompt_tokens` baseline)
|
||||
- **gates**: prompt_tokens 30% 이상 감소 + 회귀 0 + 모든 docsrv_* E2E 통과
|
||||
- 1차 실험 22% 감소가 lower bound (회귀 있었음); 안전한 list 로는 더 적게 줄어들 가능성
|
||||
|
||||
3. **사용자 가치 우선순위**:
|
||||
- Current state: A 카테고리 6 PR closed, user-facing E2E 정상 (DS API 1 call + real corpus citations)
|
||||
- 23000+ token prompt 는 first-token latency ↑ (30s+) 의 root cause 이지만 functional impact = 0
|
||||
- MaxTokens 는 **latency 개선** 목적이라 functional fix 보다 우선순위 낮음 — 사용자 결정에 따라 진행
|
||||
|
||||
## File changes
|
||||
|
||||
### Mac mini
|
||||
- `~/.hermes/config.yaml` — 일시 `disabled_toolsets` 15개 추가했다가 revert
|
||||
- `~/.hermes/config.yaml.pre-maxtokens.20260517` 보존 (7일 안전망 = 진단 reference, revert 의 source 도 됨)
|
||||
|
||||
### 변경 없음 (revert 후)
|
||||
- 3 SKILL.md (Curl-Refine-2 polished 그대로 유지)
|
||||
- hook script
|
||||
- mlx-proxy.py
|
||||
|
||||
## 7일 안전망 (2026-05-24)
|
||||
|
||||
- Mac mini `~/.hermes/config.yaml.pre-maxtokens.20260517` (disabled_toolsets 추가 직전 — 본 PR 의 출발점)
|
||||
|
||||
## 검증 commands (재현)
|
||||
|
||||
```bash
|
||||
# 1. 1차 attempt 재현 (회귀 확인):
|
||||
ssh macmini "~/.hermes/hermes-agent/venv/bin/python <<'PYEOF'
|
||||
import yaml; from pathlib import Path
|
||||
cfg = yaml.safe_load(Path.home().joinpath('.hermes', 'config.yaml').read_text())
|
||||
cfg['agent']['disabled_toolsets'] = ['browser','vision','video','image_gen','video_gen','tts','computer_use','spotify','yuanbao','feishu_doc','feishu_drive','kanban','homeassistant','moa','debugging']
|
||||
Path.home().joinpath('.hermes', 'config.yaml').write_text(yaml.safe_dump(cfg, allow_unicode=True, sort_keys=False))
|
||||
PYEOF
|
||||
launchctl bootout/bootstrap; hermes chat -s docsrv_ask -q 'voice memo'"
|
||||
|
||||
# 2. Revert (회복):
|
||||
ssh macmini "cp ~/.hermes/config.yaml.pre-maxtokens.20260517 ~/.hermes/config.yaml && launchctl bootout/bootstrap"
|
||||
```
|
||||
|
||||
## 후속 트랙 (P3, 진입 가능)
|
||||
|
||||
| 트랙 | 범위 |
|
||||
|---|---|
|
||||
| **PR-Hermes-MaxTokens-Investigation-1** | toolset dependency graph 조사 + minimal safe disabled list 결정. 22% 가 lower bound, safe list 로 더 적게 줄어들 가능성. functional fix 보다 우선순위 ↓ (latency only) |
|
||||
| (선택) Skill 선택 로딩 | `--skills` flag 의 default 가 90 skills 전체 load — chat-specific 만 load 하는 mechanism 검토 |
|
||||
| (선택) channel_prompts 압축 | 9줄 prompt → tokens 적은 형태로 (사용자 의도 보존 가능 시) |
|
||||
@@ -0,0 +1,100 @@
|
||||
# PR-Hermes-Skill-Curl-Refine-2 Closure Report
|
||||
|
||||
**Date**: 2026-05-17
|
||||
**선행 PR**: PR-Hermes-MultiTurn-Hard-Enforcement-1 closure 의 부산 발견 후속
|
||||
**범위**: 3 SKILL.md 본문에 "Tool 선택 (필독)" 단락 추가 — execute_code 회피 + terminal 직접 curl 강조
|
||||
**파일**: `~/.hermes/skills/personal/{docsrv_memo,docsrv_search,docsrv_ask}/SKILL.md`
|
||||
|
||||
## Summary
|
||||
|
||||
PR-Hermes-MultiTurn-Hard-Enforcement-1 closure 시 발견: Gemma 4 가 1st turn `execute_code` (Python sandbox) 로 curl 명령을 wrap → f-string + 백슬래시 escape 충돌로 SyntaxError → DS API 도달 0건. 본 PR 은 SKILL.md 본문에 "Tool 선택" 명시 단락 추가해 Gemma 가 1st turn 부터 `terminal` 로 직접 curl 호출하도록 유도.
|
||||
|
||||
## Skill 변경
|
||||
|
||||
3 SKILL.md 모두 동일 단락 (다른 skill 의 본문에 맞게 약간 차이) 추가, 위치 = `## When to Use` 직전:
|
||||
|
||||
```markdown
|
||||
## Tool 선택 (필독)
|
||||
|
||||
본 skill 은 **반드시 `terminal` tool 로 호출**. `execute_code` (Python sandbox) 우회.
|
||||
|
||||
- ✅ **`terminal`**: 위 "How to ..." 의 curl 명령을 그대로 실행. URL-encode 는 curl 의 `--data-urlencode` 또는 사전 inline 으로 처리.
|
||||
- ❌ **`execute_code`** (Python wrap): 사용 금지. Gemma 4 가 Python f-string 안에 curl 명령을 wrap 할 때 백슬래시/따옴표 escape 충돌로 SyntaxError 빈발 → DS API 도달 0건. 실측 검증 (PR-Hermes-Skill-Curl-Refine-2).
|
||||
- 다중 URL 인코딩이 필요하면 inline 으로 처리 (예: `q=voice%20memo` 직접 박기, Python `urllib.parse.quote` 호출 X).
|
||||
|
||||
오류 패턴 예시 (금지):
|
||||
[Python f-string with curl in command — broken pattern showing SyntaxError]
|
||||
|
||||
정상 패턴:
|
||||
[terminal direct curl with inline URL-encoded query]
|
||||
```
|
||||
|
||||
(전체 본문은 `~/.hermes/skills/personal/docsrv_ask/SKILL.md` line 20~46 참조)
|
||||
|
||||
## 검증
|
||||
|
||||
### E2E (Hermes chat E2E)
|
||||
|
||||
```
|
||||
hermes chat -s docsrv_ask -q '내 자료에서 voice memo 관련 자료 찾아줘'
|
||||
```
|
||||
|
||||
**측정 결과**:
|
||||
|
||||
| 항목 | Pre-Curl-Refine-2 (Hard-Enforcement-1 검증 시) | Post-Curl-Refine-2 |
|
||||
|---|---|---|
|
||||
| Gemma 1st turn tool | `execute_code` (Python wrap) | **`terminal` (direct curl)** ✅ |
|
||||
| Python SyntaxError 발생 | YES (f-string + backslash) | NO ✅ |
|
||||
| DS API 도달 횟수 | **0** (sandbox 실행 실패) | **1** ✅ |
|
||||
| DS RAG 결과 | (no call) | `conf=medium completeness=full refused=False ev_ms=4389 cite=2` ✅ |
|
||||
| Real corpus citations | hallucinated | "test-voice-memo" + "The Good List" 실제 corpus ✅ |
|
||||
| Hook 동작 | 1st call 카운트 → terminal 2nd call block | 1st call 카운트, 2nd call 발생 안 함 (Gemma 가 1턴 결과로 만족) ✅ |
|
||||
|
||||
**Hook state**: `/tmp/hermes-skill-counts/default.json` = `{"docsrv_ask": 1}` — Hard-Enforcement-1 가 1 call cap.
|
||||
|
||||
**DS log evidence**:
|
||||
```
|
||||
[INFO] ask query='voice memo' results=10 evidence=2 cite=2 synth=completed
|
||||
conf=medium completeness=full refused=False grounding_weak=1
|
||||
ev_ms=4389 synth_ms=0 total=7071
|
||||
GET /api/search/ask?q=voice%20memo&limit=10 HTTP/1.1 200 OK
|
||||
```
|
||||
|
||||
## 결정 사항
|
||||
|
||||
1. **PR-Hermes-Skill-Curl-Refine-2 = SHIPPED**:
|
||||
- Gemma 1st turn 부터 terminal 선택 (이전 execute_code 우회 패턴 폐기)
|
||||
- DS API 도달 0 → 1 (real corpus citations 첫 성공 = pre-Curl-Refine-2 측정의 첫 user-facing 의미있는 응답)
|
||||
- Hard-Enforcement-1 의 multi-turn block 과 시너지 (1 call cap + 1st call 정상 path)
|
||||
|
||||
2. **부산 효과 — A 카테고리 5 PR 모두 SHIPPED + user-facing E2E 완성**:
|
||||
- Docsrv-Search-1 (skill) ✅
|
||||
- WebSearch-1 (ddgs) ✅
|
||||
- ToolCall-Adapter-1 (SSE filter) ✅
|
||||
- Sandbox-Env-Propagation-1 (env_passthrough) ✅
|
||||
- Skill-Polish-1 (frontmatter) ✅
|
||||
- MultiTurn-Hard-Enforcement-1 (hook) ✅
|
||||
- **Skill-Curl-Refine-2 (Gemma terminal preference) ✅**
|
||||
|
||||
## File changes
|
||||
|
||||
### Mac mini
|
||||
- `~/.hermes/skills/personal/docsrv_ask/SKILL.md` — Tool 선택 단락 추가 (line 20 이후, 약 30줄)
|
||||
- `~/.hermes/skills/personal/docsrv_search/SKILL.md` — 동일
|
||||
- `~/.hermes/skills/personal/docsrv_memo/SKILL.md` — 동일
|
||||
- `*.SKILL.md.pre-curlrefine2.20260517` 3개 (7일 안전망)
|
||||
|
||||
## 7일 안전망 (2026-05-24)
|
||||
|
||||
- Mac mini `~/.hermes/skills/personal/docsrv_{memo,search,ask}/SKILL.md.pre-curlrefine2.20260517` 3개
|
||||
|
||||
## 검증 commands (재실행)
|
||||
|
||||
```bash
|
||||
ssh macmini "rm -rf /tmp/hermes-skill-counts && HERMES_DOCSRV_TOKEN=... && \
|
||||
~/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main chat -Q -s docsrv_ask \
|
||||
-q '내 자료에서 voice memo 관련 자료 찾아줘'"
|
||||
ssh gpu "cd ~/Documents/code/hyungi_Document_Server && \
|
||||
docker compose logs --since=5m fastapi | grep -c 'ask query.*voice memo'"
|
||||
# 기대: DS API 1 call + real corpus citations
|
||||
```
|
||||
Reference in New Issue
Block a user