* fix(routing): auto-migrate v0.3.0 inline routing_preferences to v0.4.0 top-level
Lift inline routing_preferences under each model_provider into the
top-level routing_preferences list with merged models[] and bump
version to v0.4.0, with a deprecation warning. Existing v0.3.0
demo configs (Claude Code, Codex, preference_based_routing, etc.)
keep working unchanged. Schema flags the inline shape as deprecated
but still accepts it. Docs and skills updated to canonical top-level
multi-model form.
* test(common): bump reference config assertion to v0.4.0
The rendered reference config was bumped to v0.4.0 when its inline
routing_preferences were lifted to the top level; align the
configuration deserialization test with that change.
* fix(config_generator): bump version to v0.4.0 up front in migration
Move the v0.3.0 -> v0.4.0 version bump to the top of
migrate_inline_routing_preferences so it runs unconditionally,
including for configs that already declare top-level
routing_preferences at v0.3.0. Previously the bump only fired
when inline migration produced entries, leaving top-level v0.3.0
configs rejected by brightstaff's v0.4.0 gate. Tests updated to
cover the new behavior and to confirm we never downgrade newer
versions.
* fix(config_generator): gate routing_preferences migration on version < v0.4.0
Short-circuit the migration when the config already declares v0.4.0
or newer. Anything at v0.4.0+ is assumed to be on the canonical
top-level shape and is passed through untouched, including stray
inline preferences (which are the author's bug to fix). Only v0.3.0
and older configs are rewritten and bumped.
* docs: align signals page with paper taxonomy
Updates docs/source/concepts/signals.rst and the tracing guide's signals
subsection to reflect the three-layer taxonomy shipped in #903:
- Introduces the paper reference (arXiv:2604.00356) and the three layers
(interaction, execution, environment) with all 20 leaf signal types in
three reference tables
- Documents the new layered OTel attribute set
(signals.interaction.*, signals.execution.*, signals.environment.*)
and marks the legacy aggregate keys (signals.follow_up.repair.*,
signals.frustration.*, signals.repetition.count,
signals.escalation.requested, signals.positive_feedback.count) as
deprecated-but-still-emitted
- Adds a Span Events section describing the per-instance signal.<type>
events with confidence / snippet / metadata attributes
- Fixes the flag marker reference ([!] in the code vs 🚩 in the old docs)
- Updates all example attributes, dashboard queries, and alert rules to
use the layered keys
- Updates the tracing guide's behavioral-signals subsection to match
- Notes that the triage sampler is a planned follow-up and today sampling
is consumer-side via observability-platform filters
Build verified locally: sphinx-build produces no warnings on these files.
Made-with: Cursor
* docs: reframe signals intro around the improvement flywheel
Addresses review feedback on #910:
- Replace the triage-only framing at the top with an instrument -> sample
& triage -> construct data -> optimize -> deploy flywheel that explains
why signals matter, not just what they surface. Paper's 82% / 1.52x
numbers move into step 2 of the flywheel where they belong.
- Remove the 'Signals vs Response Quality' section. Per review, signals
and response quality overlap rather than complement each other, so the
comparison is misleading.
- Borrow the per-category summaries and leaf-type descriptions verbatim
from the katanemo/signals reference implementation (module docstrings)
so the documentation and the detector contract stay in sync. Drops the
hand-crafted examples that were not strictly accurate (e.g. 'semantic
overlap is high' for rephrase, 'user explicitly corrects the agent'
for correction).
Made-with: Cursor
* docs: address signals flywheel review feedback
Addresses review comments on #910:
- Shorten the paper citation to (Chen et al., 2026) per common cite
practice (replacing the full author list form).
- Replace the Why Signals Matter section with the review-suggested
rewrite verbatim: more formal intro framing, renumbered steps to
Instrument / Sample & triage / Data Construction / Model Optimization
/ Deploy, removes 'routing decisions' from the data-construction
step, and adds DPO/RLHF/SFT as model-optimization examples.
- Renders tau and O(messages) as proper math glyphs via the sphinx
built-in :math: role (enabled by adding sphinx.ext.mathjax to
conf.py). Using the RST role form rather than raw $...$ inline so
sphinx only injects MathJax on pages that actually have math,
instead of loading ~1MB of JS on every page.
Build verified locally: sphinx-build produces no warnings on the
changed files and the rendered HTML wraps tau and O(messages) in
MathJax-ready <span class="math">\(\tau\)</span> containers.
Made-with: Cursor
* add pluggable session cache with Redis backend
* add Redis session affinity demos (Docker Compose and Kubernetes)
* address PR review feedback on session cache
* document Redis session cache backend for model affinity
* sync rendered config reference with session_cache addition
* add tenant-scoped Redis session cache keys and remove dead log_affinity_hit
- Add tenant_header to SessionCacheConfig; when set, cache keys are scoped
as plano:affinity:{tenant_id}:{session_id} for multi-tenant isolation
- Thread tenant_id through RouterService, routing_service, and llm handlers
- Use Cow<'_, str> in session_key to avoid allocation when no tenant is set
- Remove unused log_affinity_hit (logging was already inlined at call sites)
* remove session_affinity_redis and session_affinity_redis_k8s demos
* support configurable orchestrator model via orchestration config section
* add self-hosting docs and demo for Plano-Orchestrator
* list all Plano-Orchestrator model variants in docs
* use overrides for custom routing and orchestration model
* update docs
* update orchestrator model name
* rename arch provider to plano, use llm_routing_model and agent_orchestration_model
* regenerate rendered config reference
* adding support for signals
* reducing false positives for signals like positive interaction
* adding docs. Still need to fix the messages list, but waiting on PR #621
* Improve frustration detection: normalize contractions and refine punctuation
* Further refine test cases with longer messages
* minor doc changes
* fixing echo statement for build
* fixing the messages construction and using the trait for signals
* update signals docs
* fixed some minor doc changes
* added more tests and fixed docuemtnation. PR 100% ready
* made fixes based on PR comments
* Optimize latency
1. replace sliding window approach with trigram containment check
2. add code to pre-compute ngrams for patterns
* removed some debug statements to make tests easier to read
* PR comments to make ObservableStreamProcessor accept optonal Vec<Messagges>
* fixed PR comments
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-342.local>
Co-authored-by: MeiyuZhong <mariazhong9612@gmail.com>
Co-authored-by: nehcgs <54548843+nehcgs@users.noreply.github.com>
* fixed docs and added ollama as a first-class LLM provider
* matching the LLM routing section on the README.md to the docs
* updated the section on preference-based routing
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-167.local>
* pushing docs updated
* Fixed README.md logo
* Fixed README.md logo
* Fixed README.md spacing
* fixed tag line
* LLM router doc fixes
* minor logo and branding changes
* minor changes to the README
* minor changes to the README
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-329.local>
* updated docs to reflect agent routing and hand off
* updated prompt targets based on review
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-261.local>
* Fix llm_routing provider element
We replaced provider with provider_interface to make it more clear to developers about provider api/backend being used. During that upgrade we removed support for mistral in provider to encourage developers to start using provider_interface. But this demo was not updated to use provider_interface as it was using mistral. This code change fixes it by replacing provider with provider_interface.
Signed-off-by: Adil Hafeez <adil.hafeez@gmail.com>
* fix the path
* move
* add more details
* fix
* Apply suggestions from code review
* fix
* fix
---------
Signed-off-by: Adil Hafeez <adil.hafeez@gmail.com>
* updated docs for 0.1.8 support
* updated REAMDE on root
* updated version reference to 0.1.8 in other parts of the repo
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-261.local>
* updating doc versions, images and cleaning up section for prompt-guard
* updating based on feedback
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-261.local>
* Fix link issues and add icons
* Improve Doc
* fix test
* making minor modifications to shuguangs' doc changes
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-261.local>
Co-authored-by: Adil Hafeez <adil@katanemo.com>
* init update
* Update terminology.rst
* fix the branch to create an index.html, and fix pre-commit issues
* Doc update
* made several changes to the docs after Shuguang's revision
* fixing pre-commit issues
* fixed the reference file to the final prompt config file
* added google analytics
---------
Co-authored-by: Salman Paracha <salmanparacha@MacBook-Pro-261.local>