Port of zerto-docs PR #45. OllamaEmbeddings previously made a single
attempt per batch — any transient connection drop or HTTP error from
one endpoint failed the entire index rebuild.
- _embed() now rotates to the next endpoint and retries with backoff
(5 attempts) on transport errors, and additionally halves the input
(floor 16) on HTTP status errors: the .0.125 Windows Ollama (4090)
400s when its model runner dies on an oversized input array. Error
response bodies are logged instead of swallowed.
- CI workflows: OLLAMA_URLS extended from the two ripper instances to
the full 4-endpoint GPU pool (+ .0.125 4090, + .0.126). At the
64-chunk batches this indexer already uses, .0.125 is the fastest
embedder in the fleet (242 embeds/s measured on seed-mcp).
Verified against the live pool: 64-text happy path, dead-endpoint
rotation, and a forced 512-text 400 on .0.125 that split and completed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Match the OLLAMA_URLS pattern from zerto-docs-rag so every docs MCP
build fans out across the same two GPU-pinned Ollama containers on
192.168.0.2 (:11435 Titan X, :11436 1080 Ti). The host's primary
Ollama on :11434 is left alone for OpenWebUI.
rag.embeddings now reads OLLAMA_URLS (plural CSV) preferentially with
fallback to OLLAMA_URL, defaulting to http://192.168.0.2:11434 — same
shape as zerto's embeddings.py. The OllamaEmbeddings class already
round-robins per batch, so both GPUs run in parallel during the
chroma rebuild.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The chunker emits any single paragraph as a stand-alone chunk regardless
of size. One HVM page had a 14,858-char paragraph (a big config table) —
nomic-embed-text 400'd the entire embed batch because the model's context
is 2048 tokens. Added a hard-split fallback that splits any oversized
chunk on line boundaries to MAX_CHARS=6000 (~1500 tokens, headroom).
Also defaulted PRODUCT_NAME to "hvm" in rag/index.py to match server.py.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>