Model rules: who a chat's model may bring into a conversation

Rules read from the main model decide who it is offered as a crowd member,
a friend and on its roster; any-to-any with denies by default, or
none-to-none with allows. The crowd picker names what it holds back and
why, and a model held back only by a person's own rule -- or by anything,
with the new rules.override -- can still be added by hand. Another data
group is now a deny that an explicit rule opens. Admin -> Model rules and
a card in Settings, each with a matrix drawn by the enforcing function.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-29 17:20:40 +00:00
co-authored by Claude Opus 5.5
parent 9970bb43c6
commit c27fe47d4d
24 changed files with 1324 additions and 29 deletions
+31
View File
@@ -185,6 +185,37 @@
</ul>
</div>
{% endif %}
{#
Who your models may talk to. Anybody may narrow the instance's rules
for themselves; widening them takes `rules.override`, and the text
below says which of the two this person has, so a rule that does
nothing is not a mystery.
#}
<div class="card">
<h2 class="card__title">{{ t("Who your models may talk to") }}</h2>
<p class="card__lede">
{% if talk_override %}
{{ t("Your rules and your setting win over the instance's, for you. You can also add any model to a crowd by hand.") }}
{% else %}
{{ t("Your rules can only narrow the instance's. A model your own rule holds back can still be added to a crowd by hand; one the instance holds back cannot.") }}
{% endif %}
</p>
<form method="post" action="/api/preferences/talk-mode" class="row"
style="gap: var(--sp-2); margin-bottom: var(--sp-4)">
<label class="visually-hidden" for="talk-mode">{{ t("Your starting point") }}</label>
<select class="select" id="talk-mode" name="mode" style="flex: 1; min-width: 0">
<option value="" {{ 'selected' if not talk_mode }}>{{ t("Follow the instance") }}</option>
<option value="open" {{ 'selected' if talk_mode == 'open' }}>{{ t("Any model may talk to any other") }}</option>
<option value="closed" {{ 'selected' if talk_mode == 'closed' }}>{{ t("No model may talk to another") }}</option>
</select>
<button class="btn" type="submit">{{ t("Save") }}</button>
</form>
{% set rules_action = "/api/preferences/talk-rules" %}
{% set rules = talk_rules %}
{% set matrix = talk_matrix %}
{% set matrix_models = talk_matrix_models %}
{% include "partials/_talk_rules.html" %}
</div>
</section>
{# --- Appearance --- #}