{% extends "_base.html" %} {% from "_macros.html" import tabs %} {% block title %}Settings · Urika{% endblock %} {% block heading %}Global settings{% endblock %} {% block breadcrumb %} {% endblock %} {% block content %} {# ---- Compliance banner --------------------------------------------- #} {# Anthropic Consumer Terms §3.7 + April 2026 Agent SDK clarification: Urika requires ANTHROPIC_API_KEY. Show a banner whenever the dashboard process can't see the env var. The Privacy tab is where the user adds endpoints (and references API key env-var names); for the actual key value they need to either run `urika config api-key` or export the variable. #} {% if api_key_configured %} {# Positive companion to the unset-key banner. Confirms Urika sees a key AND lets the user verify it actually works against api.anthropic.com via POST /api/settings/test-anthropic-key. The verify path is the same one the CLI's `urika config api-key --test` uses (urika.core.anthropic_check.verify_anthropic_api_key). #}
ANTHROPIC_API_KEY configured.
{% endif %} {% if not api_key_configured %} {% endif %}
{% call(active) tabs("global-settings", [ {"id": "privacy", "label": "Privacy"}, {"id": "models", "label": "Models"}, {"id": "preferences", "label": "Preferences"}, {"id": "notifications", "label": "Notifications"} ]) %} {# ---- Privacy tab -------------------------------------------------- #} {# Multi-endpoint editor. Each row defines a named endpoint under [privacy.endpoints.] in ~/.urika/settings.toml. The Models tab's per-agent endpoint dropdown lists every endpoint defined here (plus the implicit 'open' cloud endpoint). Mode selection still lives on each project (set at `urika new` time). Submission: rather than rely on Alpine :name= bindings inside an x-for template (which has timing edge cases with HTMX form serialization), the entire endpoints array is serialized as JSON into a single hidden #endpoints_json input on form submit. The server's /api/settings handler accepts both the indexed endpoints[][name] shape and the JSON shape. #}

Define one or more named endpoints. Each can be referenced from the Models tab to route specific agents through it. The runtime loader treats open as the cloud (Claude) endpoint implicitly; don't define one with that name.

{# Hidden input is the actual carrier for the multi-endpoint submission. Alpine keeps :value reactively synced to the endpoints array; HTMX serializes it like any normal form field. Avoids the timing pitfalls of :name= bindings inside