The operator decides which providers exist (env / registry — Anthropic, OpenAI, x.AI, Ollama, any number at once). The tree owner decides who uses which:
Members' assistant → one configured provider (or none)
Owner-configured, per-tree AI model policy.
The **operator** decides which providers exist (env / registry — Anthropic, OpenAI, x.AI, Ollama, any number 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
- `trees.ai_member_provider` / `ai_recommender_provider` (nullable String(32)) + migration `b2c3d4e5f6a7` (verified: applies cleanly through the full chain).
- `configured_llm_providers()` surfaces the registry as `{name, model}` — **no secrets**.
- Owner-gated `GET`/`PATCH /trees/{id}/ai`; provider names validated against the configured set (unconfigured → 403).
- Tests: owner-only enforcement + set/validate/clear. Full suite 89 passing.
### Frontend
- Owner-only **AI models** page: a dropdown per role, graceful 403 for non-owners, empty state when no providers are configured.
- Sidebar link; regenerated OpenAPI client.
Per-model-within-a-provider selection is a follow-up; today each provider maps to its single configured model.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
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) <[email protected]>
Signed-off-by: Justin Paul <[email protected]>
justin
merged commit f8fa23c1f6 into main2026-06-09 20:53:07 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Owner-configured, per-tree AI model policy.
The operator decides which providers exist (env / registry — Anthropic, OpenAI, x.AI, Ollama, any number at once). The tree owner decides who uses which:
Backend
trees.ai_member_provider/ai_recommender_provider(nullable String(32)) + migrationb2c3d4e5f6a7(verified: applies cleanly through the full chain).configured_llm_providers()surfaces the registry as{name, model}— no secrets.GET/PATCH /trees/{id}/ai; provider names validated against the configured set (unconfigured → 403).Frontend
Per-model-within-a-provider selection is a follow-up; today each provider maps to its single configured model.
🤖 Generated with Claude Code
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) <[email protected]> Signed-off-by: Justin Paul <[email protected]>