feat: 지서버 직결 + wol-gate 폴백 (하이브리드 연결)

지서버 트래픽이 전부 wol-gate(TrueNAS) 프록시를 거치고 있었다. 게이트는 자는
타깃에 HTTP 200 + "깨우는 중" HTML을 반환하는데, ollama 클라이언트가 그 HTML을
JSON.parse해서 "Unexpected token '<'"로 죽었다.

endpoint를 지서버 직결(192.168.0.8:11434)로 두고, wake_url을 새로 받아
게이트는 직결이 안 될 때만 쓴다.

- _isAwake(host): 200이어도 본문이 HTML이면 잠든 것으로 판정
- 깨어있으면 즉시 통과(fast path). 기존 코드는 매 호출마다 /api/tags를 찍고
  무조건 5초를 기다린 뒤 재확인했다.
- 게이트를 초인종이 아니라 폴백 경로로 사용. 직결과 게이트를 같은 주기로 확인해
  둘 중 되는 쪽으로 이번 호출을 넘긴다. 08-09 00:52 지서버는 살아있고 게이트는
  정상 프록시 중인데 직결만 타임아웃인 상황이 실제로 관찰됐고, 직결만 폴링하면
  작동하는 경로를 두고 90초를 버린 뒤 실패한다.
- getModelCtx()도 _activeHost를 따라가게 수정. 폴백 중에 num_ctx 계산용
  /api/show만 따로 실패하는 것을 막는다.

wake_url이 없는 provider(클로서버 등)는 기존 동작 그대로다.

검증: 직결을 죽은 주소로 바꿔 강제 재현 → 게이트 경유로 정상 응답(33초),
로그에 routing via wol-gate 기록. 원복 후 직결 fast path 9초.
실제로 잠든 지서버에 채팅 → 23초 만에 기상 후 응답.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kim
2026-08-09 01:04:28 +09:00
co-authored by Claude Opus 5
parent 1146b59199
commit cb8d93e03f
2 changed files with 114 additions and 29 deletions
+14 -8
View File
@@ -17,15 +17,16 @@
}
},
"llm": {
"provider": "ollama",
"provider": "ollama_local",
"providers": {
"ollama": {
"endpoint": "http://localhost:11434",
"model": "gemma4:31b-cloud"
"model": "gemma4:26b"
},
"lm_studio": {
"endpoint": "http://host.docker.internal:1234",
"model": ""
"endpoint": "http://192.168.0.7:1234",
"model": "qwen/qwen3.6-35b-a3b",
"disable_thinking": true
},
"llama_cpp": {
"endpoint": "http://host.docker.internal:8080",
@@ -43,6 +44,11 @@
"api_key": "vault:llm.google.api_key",
"model": "gemini-3.5-flash-lite"
},
"ollama_local": {
"endpoint": "http://192.168.0.8:11434",
"model": "gemma4:26b",
"wake_url": "http://192.168.0.240:8100"
},
"anthropic": {
"api_key": "",
"model": "claude-sonnet-4-6"
@@ -50,12 +56,12 @@
}
},
"models": {
"primary": "gemma4:31b-cloud",
"primary": "gemma4:26b",
"fallback": "kimi-k2.6:cloud",
"roles": {
"manager": "gemma4:31b-cloud",
"executor": "gemma4:31b-cloud",
"verifier": "gemma4:31b-cloud",
"manager": "gemma4:26b",
"executor": "gemma4:26b",
"verifier": "gemma4:26b",
"background_task": ""
},
"profiles": {