Files
Salastil 7e2b8cd6cc Split AI connection into per-model-type embedding/synthesis servers
The admin panel had one shared "AI service connection" and three model
dropdowns (embedding, synthesis, image), but the image slot was pure
vestigial plumbing — no image-selection AI call exists anywhere. Remove
it, along with the shared connection panel, and give embedding/
clustering and article synthesis each their own independent host/port/
Test/Save connection in the Models tab, so they can point at different
Ollama installs. Threads an AiProviders { embedding, synthesis } bundle
through the pipeline/queue/scheduler layers wherever both are needed
together; functions that only ever call one or the other keep a plain
InferenceProvider argument.

Also, since nomic-embed already touches every article for clustering:
- Give non-synthesized (single-source/direct-published) articles tags
  too, by matching their embedding against existing tags by cosine
  similarity (tags.ts's scoreTagsBySimilarity) instead of running the
  reasoning-heavy LLM tag-extraction step that was starving these
  articles of tags in the first place.
- Dedupe resolveTagIds's output — two different LLM-proposed labels
  can resolve to the same existing tag via embedding similarity, which
  was producing literal duplicate tag ids on published articles.
- Add a "disable reasoning" (think:false) toggle for the synthesis
  model, since Ollama's think parameter isn't respected uniformly
  across reasoning models and CPU-only inference makes the hidden
  reasoning pass expensive for no quality benefit on a rewrite task.
- Record real per-call throughput (prompt/gen tokens-per-second,
  duration) from Ollama's own stats into a new synthesis_runs table,
  surfaced as benchmark history in the admin Logs tab, for comparing
  models on the actual production hardware.
2026-08-14 14:30:30 -04:00
..
2026-07-17 10:33:20 -04:00
2026-07-17 10:33:20 -04:00