Aller au contenu

Les espaces IA

Un espace IA est un hôte DNF de profil ai-space, en général un invité microVM. Il porte un assistant OpenClaw 🡕 réservé à ses membres, avec ses propres secrets et ses propres données.

  1. Déclarer l’hôte et ses membres

    Les users de l’hôte sont ses membres : DNF crée pour eux le groupe Kanidm space-<hôte>.

    etc/config.yaml
    - hostname: "ia-pro"
    zone: "lan:1.40"
    profile: "ai-space"
    features: ["microvm-guest:hyperviseur", "monitoring-node"]
    users: ["alice", "bob"]
    services:
    openclaw: {}

    monitoring-node place l’espace sous la supervision de la zone : sans lui, ni la panne de l’espace ni l’arrêt de l’assistant ne déclenchent d’alerte.

    Le propriétaire est le membre dont l’abonnement fait tourner l’assistant : il reçoit les demandes de validation et les messages spontanés (rappels, tâches planifiées). Seul membre, il est implicite. Avec plusieurs membres, il se déclare dans usr/machines/ia-pro/configuration.nix (l’ordre des users n’est pas conservé) :

    { darkone.service.openclaw.owner = "alice"; }
  2. Initialiser l’espace

    just space-init ia-pro : clé d’hôte, secrets (cf. Hôtes isolés) et, si le réseau a Matrix, le bot @ia-pro:<domaine>. Committer ensuite usr/secrets/ et var/generated/spaces/.

  3. Déployer

    L’hyperviseur, la passerelle de la zone (vhost, DNS) et le HCS (groupe Kanidm) : just apply hyperviseur,gw,hcs.

  4. Connecter le fournisseur d’IA

    Une fois par espace, depuis l’hôte (just enter ia-pro), selon le modèle de l’espace (darkone.service.openclaw.model) :

    ModèleAbonnementConnexion
    anthropic/* (défaut : anthropic/claude-sonnet-5-5)Claude Pro/Max, par le CLI claudesudo -u openclaw -H claude auth login
    openai/*ChatGPT Plus/Pro, par le plugin codexopenclaw models auth login --provider openai

    La commande openclaw de l’hôte passe d’elle-même sous l’utilisateur du service. openclaw models status vérifie la connexion, qui reste dans /var/lib/openclaw, persistant.

Les membres écrivent au bot @<hôte>:<domaine> en message direct, chiffré de bout en bout. Le canal n’existe que si le réseau déclare le service matrix : sans lui, l’espace fonctionne par son interface web seule.

ÉlémentRègle
Qui est écoutéLes membres de l’espace (@<login>:<domaine>), en MP seulement ; les autres comptes sont ignorés
SalonsIgnorés : des non-membres y liraient les réponses
SessionsUne par membre quand ils sont plusieurs, sinon une seule pour tous les canaux
Validation des commandesAucune par défaut (cf. Sécurité) ; une demande éventuelle va au propriétaire, en MP
Messages spontanésEnvoyés au propriétaire, en MP
Clés de chiffrementDans /var/lib/openclaw, persistant

Les MCP, les skills et les outils se déclarent une seule fois par espace, dans usr/machines/<hôte>/configuration.nix. L’assistant et chaque membre (Claude Code, Codex) reçoivent les mêmes.

{ pkgs, ... }:
{
darkone.host.ai-space = {
mcp.fetch = {
command = "uvx";
args = [ "mcp-server-fetch" ];
};
mcp.github = {
command = "github-mcp-server";
args = [ "stdio" ];
secretEnv = [ "GITHUB_PERSONAL_ACCESS_TOKEN" ];
};
mcp.docs.url = "https://mcp.example.com/mcp";
skills.rapport = ./skills/rapport; # dossier avec SKILL.md
packages = [ pkgs.uv pkgs.pandoc pkgs.github-mcp-server ];
};
darkone.service.openclaw = {
workspace."AGENTS.md" = ./AGENTS.md;
projects.notes = "https://forge.example.com/alice/notes.git";
};
}
OptionRôle
darkone.host.ai-space.mcpServeurs MCP, locaux (command, args, env, secretEnv) ou distants (url, headers)
darkone.host.ai-space.skillsSkills par nom : contenu de SKILL.md, fichier ou dossier
darkone.host.ai-space.packagesOutils dans le PATH de l’assistant et chez les membres
darkone.host.ai-space.enableClaude, enableCodexClaude Code et Codex, actifs par défaut
darkone.service.openclaw.execPolitique des commandes (cf. Sécurité)
darkone.service.openclaw.identityNom, emoji et avatar de l’assistant (name, emoji, avatar) : la configuration étant en lecture seule, l’assistant ne peut pas les changer lui-même
darkone.service.openclaw.workspaceFichiers du workspace de l’assistant (AGENTS.md, SOUL.md…)
darkone.service.openclaw.projectsDépôts git clonés une fois dans workspace/projects/<nom>
darkone.service.openclaw.transcriptionTranscription locale des notes vocales (whisper.cpp)

Les notes vocales, Matrix ou web, sont transcrites sur l’espace avec le modèle small de whisper.cpp (466 Mo, sur CPU), sans service externe. La langue est détectée à chaque note ; transcription.language = "fr" la fixe.

Chaque membre a un compte Linux sur l’espace, allégé :

ÉlémentSur l’espace
Profil Home Managerspace-member (zsh, git, vim, tmux), à la place du sien
Outils de l’espaceClaude Code et Codex, avec les MCP et skills de l’espace (darkone.home.aiSpace)
Personnalisationsusr/users/<login>/space.nix (tous ses espaces), puis usr/users/<login>/spaces/<hôte>.nix (cet espace), s’ils existent
usr/users/<login>/default.nixIgnoré : réservé à ses postes
DroitsAucun groupe (pas de sudo), quel que soit son profil

L’administration de l’espace passe par le compte nix (just enter <hôte>).

Chaque membre connecte ses propres abonnements, une fois : claude (puis /login) et codex login --device-auth.

ÉlémentRègle
Adressehttps://openclaw.<zone>.<domaine>
ConnexionSSO Kanidm, réservé au groupe space-<hôte>
AppareilAppairé à la première visite, sans droit d’administration ni de validation (propriétaire seul)
Administrationopenclaw … sur l’hôte, depuis le compte nix
Port de l’assistantJoignable depuis la passerelle de la zone seulement

Par défaut, l’assistant exécute ses commandes sans validation, comme OpenClaw : la barrière est l’espace lui-même (microVM coupée du LAN, secrets propres à l’espace). Son service est en plus confiné : il n’écrit que dans /var/lib/openclaw et ne voit ni les dossiers ni les processus des membres.

darkone.service.openclaw.exec choisit la politique :

ValeurCommandes
full (défaut)Toutes, sans validation
askCelles de la liste blanche passent, les autres sont soumises au propriétaire
autoUn modèle examine celles hors liste blanche et soumet au propriétaire les cas douteux
allowlistCelles de la liste blanche seulement
denyAucune

La liste blanche se remplit sur l’hôte : openclaw approvals allowlist add --agent main <chemin>.