ACP · Verwaltung

Vorschau — Bereitstellung folgt (M7)Preview — provisioning lands in M7

Einen Mandanten in Betrieb nehmenStanding up a tenant

Diese Ansicht stellt die Konfiguration eines neuen Mandanten zusammen und prüft jede Eingabe gegen die Regel, die der Code tatsächlich durchsetzt. Sie legt nichts an: es gibt heute keinen Endpunkt, der einen Mandanten erzeugt — die Registry wird im Prozess aus der Umgebung befüllt (TenantRegistry.from_env) oder in Tests gesetzt. Der Tenant-Store der Steuerebene ist ein M7-Thema.This view assembles a new tenant's configuration and checks every entry against the rule the code actually enforces. It provisions nothing: there is no endpoint today that creates a tenant — the registry is seeded in-process from the environment (TenantRegistry.from_env) or set in tests. The control plane's tenant store is an M7 item.

Das Ergebnis ist die Datei unten: eine .env im 12-Faktor-Stil, die Sie in Ihren Deployment-Pfad legen. Geheimnisse stehen darin ausschließlich als Variablennamen mit _FILE-Pfad — diese Oberfläche erzeugt und zeigt niemals einen echten Geheimniswert.The result is the file at the bottom: a 12-factor .env you drop into your deployment path. Secrets appear in it only as variable names with a _FILE path — this interface never generates or displays a real secret value.

1

Mandanten-KennungTenant id

Die Kennung wird zu einem Pfadsegment und zu einem DNS-Label. Deshalb ist ihr Format eine Sicherheitsgrenze und keine Kosmetik: ein Slug, der ausbrechen könnte, wird bei der Konstruktion abgelehnt, nicht erst bei der Benutzung.The id becomes a path segment and a DNS label. Its format is therefore a security boundary, not cosmetics: a slug that could escape its root is rejected at construction, not at use.

  • Erlaubte ZeichenPermitted characters a–z 0–9 -
  • Muster (genau diese Regex)Pattern (exactly this regex) ^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$
  • LängeLength 1 … 63
  • Normalisierung vor der PrüfungNormalised before validation strip() · lower()
  • Reservierte KennungenReserved identifiers api admin console www static health internal acp

Daraus folgt: DatenwurzelDerived: data root

Daraus folgt: DNS-LabelDerived: DNS label

2

Region & DatenresidenzRegion & data residency

Ehrlich gesagt: ACP_REGION ist heute ein deklaratives Feld. Es wird in Settings.region gehalten und von GET /v1/tenant zurückgegeben — es verschiebt von sich aus keine Daten. Die tatsächliche Residenz ergibt sich daraus, wo dieser Prozess läuft, wo ACP_DATA_ROOT liegt und welche Engine-Endpunkte Sie in Schritt 3 wählen.Plainly: ACP_REGION is a declarative field today. It is held in Settings.region and returned by GET /v1/tenant — it does not move data by itself. Actual residency follows from where this process runs, where ACP_DATA_ROOT lives, and which engine endpoints you pick in step 3.

Jeder Mandant hat seine eigene Datenwurzel. Transkripte, Wissen und Geheimnisse liegen unter <ACP_DATA_ROOT>/<mandant>/ — Isolation ist ein Pfad, keine Konvention.Each tenant owns its data root. Transcripts, knowledge and secrets live under <ACP_DATA_ROOT>/<tenant>/ — isolation is a path, not a convention.

3

EnginesEngines

Alle Engines stehen ab Werk auf mock. Das ist kein Platzhalter, den man vergisst zu ersetzen, sondern die Voreinstellung mit Absicht: die gesamte Plattform läuft und testet grün mit null bezahlten Zugangsdaten. Ob ein echter Engine-Client überhaupt konstruiert werden darf, entscheidet ACP_ENV — nicht diese Felder.Every engine ships as mock. That is not a placeholder somebody forgot to replace, it is the deliberate default: the whole platform runs and tests green with zero paid credentials. Whether a real engine client may be constructed at all is decided by ACP_ENV — not by these fields.

  • cascaded — STT → LLM → TTS. Drei austauschbare Teile, jedes einzeln messbar.cascaded — STT → LLM → TTS. Three swappable parts, each measurable on its own.
  • realtime — Sprache-zu-Sprache in einem Modell. Schneller, aber der Anbieter hört den Rohton.realtime — speech-to-speech in one model. Faster, but the provider hears the raw audio.
  • RESTRICTED sticht diese Wahl — Gespräche mit data_class=restricted werden zwangsweise auf parakeet + piper im cascaded-Pfad gelegt und verlassen die eigene Infrastruktur nie. Es gibt keinen Fallback über diese Grenze hinweg: eine sensible Spur, die on-prem nicht bedient werden kann, scheitert, statt zu einer Frontier-API abzufließen.RESTRICTED overrides this choice — conversations carrying data_class=restricted are forced onto parakeet + piper on the cascaded path and never leave your own infrastructure. There is no cross-boundary fallback: a sensitive lane that cannot be served on-prem fails rather than leaking to a frontier API.
  • CONFIDENTIAL — darf eine Frontier-API nur bedienen, wenn ACP_CONFIDENTIAL_FRONTIER=true gesetzt ist, was eine EU-Region samt Zero-Retention-DPA voraussetzt. Sonst: ebenfalls on-prem.CONFIDENTIAL — may be served by a frontier API only when ACP_CONFIDENTIAL_FRONTIER=true, which presumes an EU region plus a zero-retention DPA. Otherwise: on-prem as well.
4

Freigabe-Schwelle & ZugbudgetApproval threshold & turn budget

Aktionen über diesem Betrag warten blockierend auf einen Menschen. Der Agent antwortet erst, wenn entschieden wurde.Actions above this amount block on a human. The agent does not answer until somebody decides.

Das Latenzbudget eines Wortwechsels — die Physik natürlicher Sprache. Wird es überschritten, entsteht das Ereignis turn.budget_exceeded.The latency budget for one turn — the physics of natural voice. A breach raises the turn.budget_exceeded event.

5

ERP-Anbindung (Odoo)ERP connection (Odoo)

Drei Felder sind Konfiguration und stehen hier. Das vierte ist ein Geheimnis und steht bewusst nicht hier: ODOO_API_KEY wird niemals in eine Weboberfläche getippt, sondern als Datei bereitgestellt.Three fields are configuration and belong here. The fourth is a secret and deliberately does not: ODOO_API_KEY is never typed into a web interface, it is supplied as a file.

Das GeheimnisThe secret

ODOO_API_KEY_FILE=/run/secrets/odoo_api_key

Die Datei schlägt den Inline-Wert. Ein Docker- oder Kubernetes-Secret taucht so weder in docker inspect noch in einem Crash-Dump auf. Leerer Inhalt gilt als nicht gesetzt.The file beats the inline value. A Docker or Kubernetes secret then appears in neither docker inspect nor a crash dump. Empty contents count as unset.

Ohne ERP-Anbindung bleibt der Agent auskunftsfähig, aber handlungsunfähig: er kann nachschlagen, aber nichts buchen.Without an ERP connection the agent can still inform but cannot act: it can look things up, but book nothing.

6

API-Schlüssel ausstellenIssue an API key

Vorschau — Bereitstellung folgt (M7)Preview — provisioning lands in M7

Es gibt keinen Endpunkt, der einen Schlüssel ausstellt, und diese Seite erzeugt auch keinen im Browser — ein clientseitig gewürfelter „Schlüssel“ wäre eine Zeichenkette ohne Eintrag im Store und würde bei der ersten Anfrage mit 401 abgewiesen. Ausgestellt wird heute im Prozess, über ApiKeyStore.issue().No endpoint issues a key, and this page does not mint one in the browser either — a client-side “key” would be a string with no record in the store and would be refused with 401 on its first request. Issuance happens in-process today, through ApiKeyStore.issue().

BerechtigungenScopes

So wird ausgestellt (auf dem Server, einmal)How issuance happens (server-side, once)


          

Der Klartext existiert genau in dieser einen Ausgabe. Gespeichert wird nur ein SHA-256-Hash; ist der Klartext fort, ist er fort, und ein neuer Schlüssel muss ausgestellt werden.The plaintext exists only in that one output. Only a SHA-256 hash is stored; once the plaintext is gone it is gone, and a new key must be issued.

7

Webhook-EndpunktWebhook endpoint

Hier nur die Vorprüfung: die Regeln, die der Server ohnehin anwendet, vorab im Browser. Registrieren können Sie den Endpunkt drüben unter Webhooks, sobald ein Schlüssel vorliegt.A dry run only: the rules the server applies anyway, checked here in the browser first. You register the endpoint over in Webhooks, once you have a key.

ErgebnisResult

Konfiguration — VorschauConfiguration — preview


      

Jede Zeile mit _FILE erwartet eine Datei mit dem Geheimnis darin. Diese Vorschau nennt nur Namen und Pfade — sie kennt keinen einzigen Ihrer Werte und soll auch keinen kennen.Every _FILE line expects a file containing the secret. This preview names variables and paths only — it knows none of your values, and is not meant to.