c6b1e72130
The operator decides which model providers exist (env / registry — Anthropic,
OpenAI, x.AI, Ollama, several at once). The *tree owner* decides who uses which:
- Members' assistant -> one configured provider (or none)
- Recommender (association/connection finder) -> one configured provider (or none)
- Owner -> may use any configured provider
Backend: two nullable columns on `trees` (ai_member_provider,
ai_recommender_provider) + migration; `configured_llm_providers()` exposes the
registry as {name, model} with no secrets; owner-gated GET/PATCH
/trees/{id}/ai validate names against the configured set. Frontend: owner-only
"AI models" page with a dropdown per role, graceful 403 for non-owners, and a
sidebar link.
Per-model-within-a-provider selection is a follow-up; today each provider maps
to its single configured model.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Justin Paul <justin@jpaul.me>
23 lines
698 B
Python
23 lines
698 B
Python
from pydantic import BaseModel
|
|
|
|
|
|
class ConfiguredProvider(BaseModel):
|
|
name: str
|
|
model: str
|
|
|
|
|
|
class TreeAiPolicyRead(BaseModel):
|
|
# The model non-owners' assistant uses (null = none).
|
|
member_provider: str | None
|
|
# The model the association/recommendation engine uses (null = none).
|
|
recommender_provider: str | None
|
|
# Providers the operator has configured (from env). The owner may use any of
|
|
# these; the two settings above restrict members and the recommender to one.
|
|
configured_providers: list[ConfiguredProvider]
|
|
default_provider: str
|
|
|
|
|
|
class TreeAiPolicyUpdate(BaseModel):
|
|
member_provider: str | None = None
|
|
recommender_provider: str | None = None
|