- go2rtc가 CORS/Origin 체크로 브라우저 직접접속을 막던 문제 해결: 클라이언트 스크립트를 벤더링해 같은 오리진으로 서빙하고, WS는 게이트웨이 프록시 (attachGo2rtcWsProxy)가 Origin을 다시 써서 우회. CCTV 앱의 프린터실 카메라 라이브뷰가 MJPEG 대신 WebRTC/MSE를 쓰도록 전환(대역폭 절감). - go2rtc mjpeg 트랜스코더가 멈추는 경우를 감지해 자동 재기동하는 /api/nvr/mjpeg-health 엔드포인트 추가. - 신규 3D프린터(K2 콤보, Klipper 스탠드얼론)의 내장 WebRTC 카메라 시그널링을 프록시하는 /api/k2/webrtc-signal 추가 — 홈클로가 HTTPS로 서빙되는데 카메라가 평문 HTTP만 지원해 브라우저 mixed-content 차단을 우회하기 위함. - 옛 3D프린터(단종된 Anet A8 Plus, OctoPrint) 앱과 홈 드롭다운 링크 제거. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PppKcQmeTJDQCpfcgKietu
409 lines
11 KiB
JSON
409 lines
11 KiB
JSON
{
|
|
"version": "1.0.1",
|
|
"gateway": {
|
|
"port": 18789,
|
|
"host": "0.0.0.0",
|
|
"auth": {
|
|
"enabled": true,
|
|
"multiUser": true
|
|
}
|
|
},
|
|
"ollama": {
|
|
"endpoint": "http://localhost:11434",
|
|
"timeout": 120,
|
|
"concurrency": {
|
|
"llm_workers": 1,
|
|
"tool_workers": 3
|
|
}
|
|
},
|
|
"llm": {
|
|
"provider": "ollama",
|
|
"providers": {
|
|
"ollama": {
|
|
"endpoint": "http://localhost:11434",
|
|
"model": "gemma4:31b-cloud"
|
|
},
|
|
"lm_studio": {
|
|
"endpoint": "http://192.168.0.7:1234",
|
|
"model": "qwen/qwen3.6-35b-a3b",
|
|
"disable_thinking": true
|
|
},
|
|
"llama_cpp": {
|
|
"endpoint": "http://host.docker.internal:8080",
|
|
"model": ""
|
|
},
|
|
"openai": {
|
|
"api_key": "",
|
|
"model": "gpt-4o"
|
|
},
|
|
"openai_codex": {
|
|
"model": "gpt-5.3-codex"
|
|
},
|
|
"google": {
|
|
"endpoint": "https://generativelanguage.googleapis.com/v1beta/openai",
|
|
"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"
|
|
}
|
|
}
|
|
},
|
|
"models": {
|
|
"primary": "gemma4:31b-cloud",
|
|
"fallback": "kimi-k2.6:cloud",
|
|
"roles": {
|
|
"manager": "gemma4:31b-cloud",
|
|
"executor": "gemma4:31b-cloud",
|
|
"verifier": "gemma4:31b-cloud",
|
|
"background_task": ""
|
|
},
|
|
"profiles": {
|
|
"mistral-large-3:675b-cloud": {
|
|
"extraSystemPrompt": "You have a documented tendency to skip tool calls and answer fluently and confidently from memory instead — on news, weather, and factual/product questions (specs, prices, versions, comparisons) alike, sometimes inventing specific-sounding numbers or even nonexistent events. Before answering ANYTHING with a checkable real-world fact, call the relevant tool (web_search, weather_kma, etc.) first — do not trust your own confidence as a substitute for checking. If a tool call fails or returns nothing useful, say so plainly instead of filling the gap from memory."
|
|
},
|
|
"kimi-k2.6:cloud": {
|
|
"extraSystemPrompt": "You have a documented tendency to massively over-search — observed doing 7+ (once 50+) web_search/web_fetch calls for a single broad request like \"오늘 국제 뉴스 정리\", searching topic-by-topic (Ukraine, Gaza, tariffs, ...) instead of a couple of broad searches. A hard cap now blocks you past 5 web_search/web_fetch calls per turn — but don't rely on the cap. Plan your search angles up front, pick the 1-3 most important ones, and write the answer once you have enough. Exhaustive topic-by-topic coverage is not the goal."
|
|
},
|
|
"gemma4:26b": {
|
|
"extraSystemPrompt": "You are running on 지서버 as gemma4:26b (via Ollama). weather_kma carries no air-quality data: for 미세먼지/PM2.5/PM10/황사 call weather_airkorea instead — re-calling weather_kma with the same arguments will never return air quality.",
|
|
"fixedNumCtx": 262144
|
|
},
|
|
"muse-glimmer:latest": {
|
|
"fixedNumCtx": 131072
|
|
}
|
|
}
|
|
},
|
|
"tools": {
|
|
"enabled": [
|
|
"shell",
|
|
"read",
|
|
"write",
|
|
"edit",
|
|
"search"
|
|
],
|
|
"permissions": {
|
|
"shell": {
|
|
"workspace_only": true,
|
|
"confirm_destructive": true,
|
|
"blocked_patterns": [
|
|
"rm -rf /",
|
|
"del C:\\Windows",
|
|
"format"
|
|
]
|
|
},
|
|
"files": {
|
|
"allowed_paths": [],
|
|
"blocked_paths": [
|
|
"/etc",
|
|
"/System",
|
|
"C:\\Windows",
|
|
"/usr",
|
|
"/bin"
|
|
]
|
|
},
|
|
"browser": {
|
|
"profile": "automation",
|
|
"headless": false
|
|
}
|
|
}
|
|
},
|
|
"skills": {
|
|
"directory": "/srv/homeclaw/.smallclaw/skills",
|
|
"registries": [
|
|
"https://clawhub.ai"
|
|
],
|
|
"auto_update": false
|
|
},
|
|
"memory": {
|
|
"provider": "chromadb",
|
|
"path": "/srv/homeclaw/.smallclaw/memory",
|
|
"embedding_model": "nomic-embed-text"
|
|
},
|
|
"memory_options": {
|
|
"auto_confirm": true,
|
|
"audit": true,
|
|
"truncate_length": 1000
|
|
},
|
|
"ppt": {
|
|
"engine": "python",
|
|
"template": "business",
|
|
"skin": "cream",
|
|
"unsplash_key": "vault:ppt.unsplash_key",
|
|
"pexels_key": "vault:ppt.pexels_key",
|
|
"pixabay_key": "vault:ppt.pixabay_key"
|
|
},
|
|
"heartbeat": {
|
|
"enabled": true,
|
|
"interval_minutes": 30,
|
|
"workspace_file": "HEARTBEAT.md"
|
|
},
|
|
"workspace": {
|
|
"path": "/srv/homeclaw/.smallclaw/workspace",
|
|
"codeDir": "code"
|
|
},
|
|
"agents": [
|
|
{
|
|
"id": "pubmed_researcher",
|
|
"name": "PubMed Researcher",
|
|
"description": "논문 다건 검색·요약·전문 수집 자율 수행. pubmed_search, pubmed_fetch, pubmed_fulltext 도구 사용.",
|
|
"emoji": "🔬",
|
|
"maxSteps": 12,
|
|
"tools": {
|
|
"profile": "pubmed"
|
|
}
|
|
}
|
|
],
|
|
"session": {
|
|
"maxMessages": 2000,
|
|
"compactionThreshold": 0.7,
|
|
"memoryFlushThreshold": 0.75,
|
|
"historyTurns": 8
|
|
},
|
|
"channels": {
|
|
"telegram": {
|
|
"enabled": false,
|
|
"botToken": "",
|
|
"allowedUserIds": [
|
|
8540415328
|
|
],
|
|
"streamMode": "full",
|
|
"userMap": {},
|
|
"voiceEnabled": false
|
|
},
|
|
"discord": {
|
|
"enabled": false,
|
|
"botToken": "",
|
|
"applicationId": "",
|
|
"guildId": "",
|
|
"channelId": "",
|
|
"webhookUrl": ""
|
|
},
|
|
"whatsapp": {
|
|
"enabled": false,
|
|
"accessToken": "",
|
|
"phoneNumberId": "",
|
|
"businessAccountId": "",
|
|
"verifyToken": "",
|
|
"webhookSecret": "",
|
|
"testRecipient": ""
|
|
},
|
|
"kakao": {
|
|
"appKey": "",
|
|
"channelEnabled": true,
|
|
"userMap": {
|
|
"f4e1b2324f39263fa60ef646cb5362b2a9e51e94ce76d1291d1dfd0be40dee1102": "papa"
|
|
}
|
|
}
|
|
},
|
|
"orchestration": {
|
|
"enabled": false,
|
|
"secondary": {
|
|
"provider": "ollama",
|
|
"model": "glm-5.3-flash:cloud"
|
|
},
|
|
"triggers": {
|
|
"consecutive_failures": 2,
|
|
"stagnation_rounds": 3,
|
|
"loop_detection": true,
|
|
"risky_files_threshold": 6,
|
|
"risky_tool_ops_threshold": 220,
|
|
"no_progress_seconds": 90
|
|
},
|
|
"preflight": {
|
|
"mode": "complex_only",
|
|
"allow_secondary_chat": false
|
|
},
|
|
"limits": {
|
|
"assist_cooldown_rounds": 3,
|
|
"max_assists_per_turn": 3,
|
|
"max_assists_per_session": 18,
|
|
"telemetry_history_limit": 100
|
|
},
|
|
"browser": {
|
|
"max_advisor_calls_per_turn": 5,
|
|
"max_collected_items": 80,
|
|
"max_forced_retries": 0,
|
|
"min_feed_items_before_answer": 12
|
|
},
|
|
"file_ops": {
|
|
"enabled": true,
|
|
"primary_create_max_lines": 80,
|
|
"primary_create_max_chars": 3500,
|
|
"primary_edit_max_lines": 12,
|
|
"primary_edit_max_chars": 800,
|
|
"primary_edit_max_files": 1,
|
|
"verify_create_always": true,
|
|
"verify_large_payload_lines": 25,
|
|
"verify_large_payload_chars": 1200,
|
|
"watchdog_no_progress_cycles": 3,
|
|
"checkpointing_enabled": true
|
|
},
|
|
"preempt": {
|
|
"enabled": false,
|
|
"stall_threshold_seconds": 45,
|
|
"max_preempts_per_turn": 1,
|
|
"max_preempts_per_session": 3,
|
|
"restart_mode": "detached_hidden"
|
|
},
|
|
"subagent_mode": false
|
|
},
|
|
"hooks": {
|
|
"enabled": false,
|
|
"token": "",
|
|
"path": "/hooks"
|
|
},
|
|
"voice": {
|
|
"enabled": true,
|
|
"stt": {
|
|
"provider": "whisper_gpu",
|
|
"model": "ggml-base.bin",
|
|
"language": "ko"
|
|
},
|
|
"tts": {
|
|
"provider": "omnivoice_gpu",
|
|
"model": "ko_KR-kss-medium",
|
|
"voice": "ko-KR-SunHiNeural"
|
|
},
|
|
"engine": {
|
|
"port": 8765,
|
|
"sttModel": "medium",
|
|
"speakerWav": "/srv/homeclaw/.smallclaw/voice/speaker_ko.wav",
|
|
"device": "cuda"
|
|
}
|
|
},
|
|
"telegram": {
|
|
"enabled": false,
|
|
"botToken": "",
|
|
"allowedUserIds": [
|
|
8540415328
|
|
],
|
|
"streamMode": "full",
|
|
"userMap": {},
|
|
"voiceEnabled": false
|
|
},
|
|
"search": {
|
|
"preferred_provider": "searxng",
|
|
"search_rigor": "verified",
|
|
"google_cx": "",
|
|
"ollama_model": "",
|
|
"searxng_url": "http://localhost:8888",
|
|
"ollama_api_key": "vault:search.ollama_api_key",
|
|
"tavily_api_key": "vault:search.tavily_api_key",
|
|
"google_api_key": "vault:search.google_api_key"
|
|
},
|
|
"agent_policy": {
|
|
"force_web_for_fresh": true,
|
|
"memory_fallback_on_search_failure": true,
|
|
"auto_store_web_facts": true,
|
|
"natural_language_tool_router": true,
|
|
"retrieval_mode": "standard"
|
|
},
|
|
"openweather": {
|
|
"api_key": "vault:openweather.api_key"
|
|
},
|
|
"pubmed": {
|
|
"api_key": "vault:pubmed.api_key"
|
|
},
|
|
"news": {
|
|
"newsdata_api_key": "vault:news.newsdata_api_key"
|
|
},
|
|
"email": {
|
|
"accounts": [
|
|
{
|
|
"id": "applecherry",
|
|
"imap_host": "121.183.65.201",
|
|
"imap_port": 993,
|
|
"imap_tls": true,
|
|
"imap_reject_unauthorized": false,
|
|
"smtp_host": "121.183.65.201",
|
|
"smtp_port": 587,
|
|
"smtp_secure": false,
|
|
"smtp_reject_unauthorized": false,
|
|
"username": "kim@applecherry.net",
|
|
"password": "vault:email.accounts.applecherry.password"
|
|
},
|
|
{
|
|
"id": "evangel",
|
|
"imap_host": "mail.evangel.xyz",
|
|
"imap_port": 993,
|
|
"imap_tls": true,
|
|
"imap_reject_unauthorized": false,
|
|
"smtp_host": "mail.evangel.xyz",
|
|
"smtp_port": 587,
|
|
"smtp_secure": false,
|
|
"smtp_reject_unauthorized": false,
|
|
"username": "kim@evangel.xyz",
|
|
"password": "vault:email.accounts.evangel.password"
|
|
},
|
|
{
|
|
"id": "daum",
|
|
"imap_host": "imap.daum.net",
|
|
"imap_port": 993,
|
|
"imap_tls": true,
|
|
"imap_reject_unauthorized": true,
|
|
"smtp_host": "smtp.daum.net",
|
|
"smtp_port": 465,
|
|
"smtp_secure": true,
|
|
"smtp_reject_unauthorized": true,
|
|
"username": "kimsgms@hanmail.net",
|
|
"password": "vault:email.accounts.daum.password"
|
|
}
|
|
]
|
|
},
|
|
"traffic": {
|
|
"its_api_key": "vault:traffic.its_api_key"
|
|
},
|
|
"nvr": {
|
|
"host": "192.168.0.95",
|
|
"port": 80,
|
|
"rtspPort": 80,
|
|
"rtspPathTemplate": "/ch{channel}_{stream}.264",
|
|
"username": "admin",
|
|
"password": "vault:nvr.password",
|
|
"channelLabels": {
|
|
"0": "선룸",
|
|
"1": "옥상",
|
|
"2": "대문",
|
|
"3": "뒷산",
|
|
"4": "거실",
|
|
"5": "마당"
|
|
},
|
|
"channelStream": {
|
|
"3": 1
|
|
},
|
|
"extraCameras": [
|
|
{
|
|
"id": 1000,
|
|
"label": "프린터실",
|
|
"host": "192.168.0.32",
|
|
"rtspPort": 554,
|
|
"username": "octoprint",
|
|
"password": "vault:nvr.extraCameras.1000.password",
|
|
"rtspPath": "/stream1",
|
|
"ptz": true,
|
|
"onvifPort": 2020,
|
|
"go2rtcSrc": "cam"
|
|
}
|
|
]
|
|
},
|
|
"writer": {
|
|
"providers": {}
|
|
},
|
|
"collabora": {
|
|
"baseUrl": "https://col.applecherry.net",
|
|
"publicUrl": "https://ai.applecherry.net"
|
|
},
|
|
"legal": {
|
|
"law_go_kr_api_key": "vault:legal.law_go_kr_api_key"
|
|
},
|
|
"mfds": {
|
|
"dur_api_key": "vault:mfds.dur_api_key"
|
|
}
|
|
} |