1f38e71d1a
Verification, as the task asked. Drove что такое фотосинтез through /api/chat with the search reachable, with the container stopped, and with the host blackholed. Kiwix claims the turn in both failure cases, and a stopped container costs nothing: DNS fails and the ZIM answers inside the same second. The blackhole is the case that hurts. The search waited its full 8-second budget before the ZIM was asked and the turn took 15.4s against 3.5, which he sits through with nothing being said. So the connect phase alone is now capped at 1.5s. A reachable instance that is merely slow keeps the whole budget, because it is fanning out to real engines. The RU Wikipedia ZIM is on the box (owner moved it into the kiwix zims dir), and kiwix-serve picked it up. A Cyrillic question now searches book_ru verbatim and skips the RU->EN rewrite: that rewriter is the workaround for an English book, and against a Russian one it is a translation of his own words back at him. Catalog names come from the filename, not the <name> field — books.name=wikipedia_ru_all returns nothing. Measurement in docs/evals/2026-08-05-kiwix-offline-fallback.md. The RU book answering a driven turn needs a rebuild and is not verified yet.
230 lines
8.8 KiB
JSON
230 lines
8.8 KiB
JSON
{
|
|
"db_path": "/var/lib/maven/maven.db.enc",
|
|
"db_tmpfs": "/dev/shm/maven-plain.db",
|
|
"db_key_env": "MAVEN_DB_KEY",
|
|
"socket_path": "/run/maven/mavend.sock",
|
|
"state_dir": "/var/lib/maven",
|
|
|
|
"//disabled_rules": [
|
|
"Nudge rules that are not wired at all. Names come from loop.DefaultRules:",
|
|
"water, meal, break, service_down, netdata_critical.",
|
|
"service_down is back on: mavpoll now writes one fact per kuma monitor",
|
|
"(service_down:<name>), so the nudge names the service and pausing a monitor",
|
|
"in kuma silences that monitor. It is also edge-triggered, so a service that",
|
|
"stays down is one nudge, not one every fifteen minutes."
|
|
],
|
|
"disabled_rules": [],
|
|
|
|
"phraser": {
|
|
"model_path": "/opt/maven/models/llm/qwen3/Qwen3-1.7B-UD-Q4_K_XL.gguf",
|
|
"bin_path": "llama-server",
|
|
"n_gpu_layers": 99,
|
|
"n_ctx": 4096,
|
|
"cache_ram_mib": 512,
|
|
"timeout": "60s",
|
|
"llm_nudges": false
|
|
},
|
|
|
|
"telegram": {
|
|
"bot_token": "${TELEGRAM_BOT_TOKEN}",
|
|
"chat_id": "${TELEGRAM_CHAT_ID}",
|
|
|
|
"//proxy": [
|
|
"api.telegram.org is not reachable directly from this box, so every send",
|
|
"timed out. The relay is the x-ui socks inbound on the host, port 10808;",
|
|
"192.168.240.1 is the maven_default bridge gateway, which is how a",
|
|
"container addresses the host. mavend is on that network.",
|
|
"This needs a matching ufw rule or the container's SYN is dropped:",
|
|
" ufw allow from 192.168.240.0/20 to any port 10808 proto tcp"
|
|
],
|
|
"proxy": "socks5://192.168.240.1:10808"
|
|
},
|
|
|
|
"//workstation": [
|
|
"The big model on the desk PC (workpc, 7900 GRE 16GB), fronted by",
|
|
"mavgpud on port 8080. It runs gemma-4-12b and it is preferred over the",
|
|
"resident Qwen3-1.7B for routing and replies whenever the card is free.",
|
|
"The machine is never assumed up: it sleeps, and the card is often held by",
|
|
"a CPT run, in which case mavgpud answers 503 and Maven falls back to the",
|
|
"resident model without saying so. Deleting this block restores exactly",
|
|
"the behaviour homesrv had before it existed.",
|
|
"Addressed by LAN address, not container name: mavgpud runs on another",
|
|
"machine and there is no shared docker network to name it on."
|
|
],
|
|
"workstation": {
|
|
"url": "http://192.168.1.105:8080",
|
|
"probe": "15s",
|
|
"timeout": "90s"
|
|
},
|
|
|
|
"//search": [
|
|
"The live web, searched after his own notes and before Kiwix. Only the",
|
|
"query string leaves the box — never a note, a fact, the persona block or",
|
|
"the history — and a question about him never reaches here at all.",
|
|
"The instance must have `json` in search.formats (settings.yml); a stock",
|
|
"SearXNG answers 403 to format=json and every search then fails. It is",
|
|
"addressed by container name, so it needs the same maven_default",
|
|
"attachment kiwix has, and it must listen on 9563: 8080 is taken several",
|
|
"times over on this box. No instance reachable ⇒ she falls through to the",
|
|
"ZIMs and never says the search failed."
|
|
],
|
|
"search": {
|
|
"url": "http://searxng:9563",
|
|
"max_results": 4,
|
|
"snippet_runes": 1500,
|
|
"language": "auto",
|
|
"timeout": "8s"
|
|
},
|
|
|
|
"//kiwix": [
|
|
"The offline encyclopedia, searched after his own notes and before anything",
|
|
"on the network. kiwix-server publishes 8034 on loopback only, so a container",
|
|
"cannot reach it by address; it is attached to the maven_default network",
|
|
"instead and addressed by container name. That attachment is imperative and",
|
|
"does not survive recreating the kiwix stack — make it declarative there:",
|
|
" networks: [default, maven_default] # maven_default: external: true",
|
|
"The book is the catalog name from the /content/... href in",
|
|
"/catalog/v2/entries, not the display title. Others on the box:",
|
|
"ifixit_en_all_2025-06, devdocs_en_ansible_2025-10."
|
|
],
|
|
"kiwix": {
|
|
"url": "http://kiwix-server:8080",
|
|
"book": "wikipedia_en_all_maxi_2026-02",
|
|
"book_ru": "wikipedia_ru_all_maxi_2026-02",
|
|
"max_results": 5,
|
|
"snippet_runes": 1500
|
|
},
|
|
|
|
"//morning_routines": [
|
|
"The daily checklist (Vikunja #280). Each item is done when its fact_key",
|
|
"gets a non-voided fact inside the window, so 'выпил воды' closes water and",
|
|
"nothing has to be ticked by hand. nudge_at fires once, at the end of the",
|
|
"window, and only for what is still open. Weekdays empty = every day."
|
|
],
|
|
"morning_routines": [
|
|
{
|
|
"name": "утро",
|
|
"window_start": "08:00",
|
|
"window_end": "11:00",
|
|
"nudge_at": "10:30",
|
|
"severity": 1,
|
|
"items": [
|
|
{ "key": "medicine", "fact_key": "medicine", "label": "лекарство" },
|
|
{ "key": "water", "fact_key": "water", "label": "вода" },
|
|
{ "key": "pets", "fact_key": "pets", "label": "покормить кота" }
|
|
]
|
|
}
|
|
],
|
|
|
|
"//feeds": [
|
|
"RSS reading (Vikunja #258). Every item lands as a note with source",
|
|
"rss:<name>, which is also what puts entries in the intake journal that",
|
|
"/events reads. Only the feed URL leaves the box.",
|
|
"This is a starting pair, not a curated set — trim or extend it."
|
|
],
|
|
"feeds": {
|
|
"poll_interval": "30m",
|
|
"max_items": 5,
|
|
"max_age": "24h",
|
|
"sources": [
|
|
{ "name": "lwn", "url": "https://lwn.net/headlines/newrss", "category": "технологии" },
|
|
{ "name": "archlinux", "url": "https://archlinux.org/feeds/news/", "category": "технологии" }
|
|
]
|
|
},
|
|
|
|
"//crawl": [
|
|
"Reading a web page (Vikunja #259). on_demand answers 'посмотри <URL>'.",
|
|
"No allow_hosts, so any public host he names is readable; private",
|
|
"addresses are refused unconditionally by internal/webfetch and do not",
|
|
"need listing. Setting allow_hosts here would also narrow on-demand,",
|
|
"which is the point of leaving it empty."
|
|
],
|
|
"crawl": {
|
|
"on_demand": true,
|
|
"timeout": "10s",
|
|
"max_runes": 4000
|
|
},
|
|
|
|
"digest": {
|
|
"enabled": true,
|
|
"window": "30m",
|
|
"max_items": 5,
|
|
"severity_ceiling": 2
|
|
},
|
|
|
|
"pattern_proposals": {
|
|
"notify": false,
|
|
"cooldown": "24h"
|
|
},
|
|
|
|
"mcp": {
|
|
"timeout": "15s",
|
|
"servers": [
|
|
{
|
|
"name": "vikunja",
|
|
"url": "http://192.168.1.104:9100/mcp",
|
|
"allow_private": true,
|
|
"allow_tools": ["list_projects", "list_tasks", "get_task_details", "create_task"],
|
|
"max_tools": 6,
|
|
"enabled": false
|
|
}
|
|
]
|
|
},
|
|
|
|
"smarthome": {
|
|
"provider": "homeassistant",
|
|
"url": "http://192.168.1.50:8123",
|
|
"token": "${HA_TOKEN}",
|
|
"domains": ["light", "switch", "sensor"],
|
|
"max_entities": 40,
|
|
"timeout": "10s",
|
|
"refresh": "15m",
|
|
"enabled": false
|
|
},
|
|
|
|
"netscan": {
|
|
"subnets": ["192.168.1.0/24"],
|
|
"ports": [22, 80, 443, 8080],
|
|
"timeout": "400ms",
|
|
"rate": 100,
|
|
"max_hosts": 256,
|
|
"enabled": true
|
|
},
|
|
|
|
"nexus": { "url": "http://nexus:9740" },
|
|
"praxis": { "url": "http://praxis:8989" },
|
|
"hexis": { "url": "http://hexis:9741" },
|
|
|
|
"voice": {
|
|
"enabled": true,
|
|
"bind": "0.0.0.0:9100",
|
|
"lang": "ru",
|
|
"stt": { "socket": "/run/maven/stt.sock", "lang": "ru" },
|
|
"tts": { "socket": "/run/maven/tts.sock", "lang": "ru" },
|
|
"embedder": {
|
|
"model_path": "/opt/maven/models/embedder/multilingual-e5-small/model_quantized.onnx",
|
|
"tokenizer_path": "/opt/maven/models/embedder/multilingual-e5-small/tokenizer.json",
|
|
"lib_path": "/opt/maven/lib/libonnxruntime.so"
|
|
},
|
|
"llm_router": true,
|
|
"query_min_score": 0.55,
|
|
"query_min_margin": 0.008,
|
|
"clarify_max_attempts": 3,
|
|
"tool_timeout": "30s",
|
|
"tools": [
|
|
{ "name": "status", "cmd": ["systemctl", "status"], "scope": "homelab", "destructive": false },
|
|
{ "name": "ps", "cmd": ["docker", "ps"], "scope": "homelab", "destructive": false },
|
|
{ "name": "uptime", "cmd": ["uptime"], "scope": "homelab", "destructive": false },
|
|
{ "name": "disk", "cmd": ["df", "-h"], "scope": "homelab", "destructive": false },
|
|
{ "name": "memory", "cmd": ["free", "-h"], "scope": "homelab", "destructive": false },
|
|
{ "name": "logs", "cmd": ["journalctl", "-n", "50", "-u"], "scope": "homelab", "destructive": false },
|
|
{ "name": "restart", "cmd": ["systemctl", "restart"], "scope": "homelab", "destructive": true },
|
|
{ "name": "stop", "cmd": ["systemctl", "stop"], "scope": "homelab", "destructive": true },
|
|
{ "name": "start", "cmd": ["systemctl", "start"], "scope": "homelab", "destructive": true },
|
|
{ "name": "docker-restart", "cmd": ["docker", "restart"], "scope": "homelab", "destructive": true },
|
|
{ "name": "docker-stop", "cmd": ["docker", "stop"], "scope": "homelab", "destructive": true },
|
|
{ "name": "reboot", "cmd": ["systemctl", "reboot"], "scope": "homelab", "destructive": true }
|
|
]
|
|
}
|
|
}
|