Примеры конфигурации

Примеры ниже соответствуют текущей схеме конфигурации. Для исчерпывающей справки и примечаний по полям см. Конфигурация.

Быстрый старт

Абсолютный минимум

\{
  agent: \{ workspace: "~/.openclaw/workspace" \},
  channels: \{ whatsapp: \{ allowFrom: ["+15555550123"] \} \}
\}

Сохраните в ~/.openclaw/openclaw.json, и вы сможете отправлять личные сообщения боту с этого номера.

Рекомендуемый стартер

\{
  identity: \{
    name: "Clawd",
    theme: "helpful assistant",
    emoji: "🦞"
  \},
  agent: \{
    workspace: "~/.openclaw/workspace",
    model: \{ primary: "anthropic/claude-sonnet-4-5" \}
  \},
  channels: \{
    whatsapp: \{
      allowFrom: ["+15555550123"],
      groups: \{ "*": \{ requireMention: true \} \}
    \}
  \}
\}

Расширенный пример (основные опции)

JSON5 позволяет использовать комментарии и завершающие запятые. Обычный JSON тоже работает.

\{
  // Окружение + оболочка
  env: \{
    OPENROUTER_API_KEY: "sk-or-...",
    vars: \{
      GROQ_API_KEY: "gsk-..."
    \},
    shellEnv: \{
      enabled: true,
      timeoutMs: 15000
    \}
  \},

  // Метаданные профиля аутентификации (секреты находятся в auth-profiles.json)
  auth: \{
    profiles: \{
      "anthropic:[email protected]": \{ provider: "anthropic", mode: "oauth", email: "[email protected]" \},
      "anthropic:work": \{ provider: "anthropic", mode: "api_key" \},
      "openai:default": \{ provider: "openai", mode: "api_key" \},
      "openai-codex:default": \{ provider: "openai-codex", mode: "oauth" \}
    \},
    order: \{
      anthropic: ["anthropic:[email protected]", "anthropic:work"],
      openai: ["openai:default"],
      "openai-codex": ["openai-codex:default"]
    \}
  \},

  // Идентичность
  identity: \{
    name: "Samantha",
    theme: "helpful sloth",
    emoji: "🦥"
  \},

  // Логирование
  logging: \{
    level: "info",
    file: "/tmp/openclaw/openclaw.log",
    consoleLevel: "info",
    consoleStyle: "pretty",
    redactSensitive: "tools"
  \},

  // Форматирование сообщений
  messages: \{
    messagePrefix: "[openclaw]",
    responsePrefix: ">",
    ackReaction: "👀",
    ackReactionScope: "group-mentions"
  \},

  // Маршрутизация + очередь
  routing: \{
    groupChat: \{
      mentionPatterns: ["@openclaw", "openclaw"],
      historyLimit: 50
    \},
    queue: \{
      mode: "collect",
      debounceMs: 1000,
      cap: 20,
      drop: "summarize",
      byChannel: \{
        whatsapp: "collect",
        telegram: "collect",
        discord: "collect",
        slack: "collect",
        signal: "collect",
        imessage: "collect",
        webchat: "collect"
      \}
    \}
  \},

  // Инструменты
  tools: \{
    media: \{
      audio: \{
        enabled: true,
        maxBytes: 20971520,
        models: [
          \{ provider: "openai", model: "gpt-4o-mini-transcribe" \},
          // Опциональный CLI резерв (бинарный файл Whisper):
          // \{ type: "cli", command: "whisper", args: ["--model", "base", "\{\{MediaPath\}\}"] \}
        ],
        timeoutSeconds: 120
      \},
      video: \{
        enabled: true,
        maxBytes: 52428800,
        models: [\{ provider: "google", model: "gemini-3-flash-preview" \}]
      \}
    \}
  \},

  // Поведение сессии
  session: \{
    scope: "per-sender",
    reset: \{
      mode: "daily",
      atHour: 4,
      idleMinutes: 60
    \},
    resetByChannel: \{
      discord: \{ mode: "idle", idleMinutes: 10080 \}
    \},
    resetTriggers: ["/new", "/reset"],
    store: "~/.openclaw/agents/default/sessions/sessions.json",
    typingIntervalSeconds: 5,
    sendPolicy: \{
      default: "allow",
      rules: [
        \{ action: "deny", match: \{ channel: "discord", chatType: "group" \} \}
      ]
    \}
  \},

  // Каналы
  channels: \{
    whatsapp: \{
      dmPolicy: "pairing",
      allowFrom: ["+15555550123"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["+15555550123"],
      groups: \{ "*": \{ requireMention: true \} \}
    \},

    telegram: \{
      enabled: true,
      botToken: "YOUR_TELEGRAM_BOT_TOKEN",
      allowFrom: ["123456789"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["123456789"],
      groups: \{ "*": \{ requireMention: true \} \}
    \},

    discord: \{
      enabled: true,
      token: "YOUR_DISCORD_BOT_TOKEN",
      dm: \{ enabled: true, allowFrom: ["steipete"] \},
      guilds: \{
        "123456789012345678": \{
          slug: "friends-of-openclaw",
          requireMention: false,
          channels: \{
            general: \{ allow: true \},
            help: \{ allow: true, requireMention: true \}
          \}
        \}
      \}
    \},

    slack: \{
      enabled: true,
      botToken: "xoxb-REPLACE_ME",
      appToken: "xapp-REPLACE_ME",
      channels: \{
        "#general": \{ allow: true, requireMention: true \}
      \},
      dm: \{ enabled: true, allowFrom: ["U123"] \},
      slashCommand: \{
        enabled: true,
        name: "openclaw",
        sessionPrefix: "slack:slash",
        ephemeral: true
      \}
    \}
  \},

  // Среда выполнения агента
  agents: \{
    defaults: \{
      workspace: "~/.openclaw/workspace",
      userTimezone: "America/Chicago",
      model: \{
        primary: "anthropic/claude-sonnet-4-5",
        fallbacks: ["anthropic/claude-opus-4-5", "openai/gpt-5.2"]
      \},
      imageModel: \{
        primary: "openrouter/anthropic/claude-sonnet-4-5"
      \},
      models: \{
        "anthropic/claude-opus-4-5": \{ alias: "opus" \},
        "anthropic/claude-sonnet-4-5": \{ alias: "sonnet" \},
        "openai/gpt-5.2": \{ alias: "gpt" \}
      \},
      thinkingDefault: "low",
      verboseDefault: "off",
      elevatedDefault: "on",
      blockStreamingDefault: "off",
      blockStreamingBreak: "text_end",
      blockStreamingChunk: \{
        minChars: 800,
        maxChars: 1200,
        breakPreference: "paragraph"
      \},
      blockStreamingCoalesce: \{
        idleMs: 1000
      \},
      humanDelay: \{
        mode: "natural"
      \},
      timeoutSeconds: 600,
      mediaMaxMb: 5,
      typingIntervalSeconds: 5,
      maxConcurrent: 3,
      heartbeat: \{
        every: "30m",
        model: "anthropic/claude-sonnet-4-5",
        target: "last",
        to: "+15555550123",
        prompt: "HEARTBEAT",
        ackMaxChars: 300
      \},
      memorySearch: \{
        provider: "gemini",
        model: "gemini-embedding-001",
        remote: \{
          apiKey: "$\{GEMINI_API_KEY\}"
        \},
        extraPaths: ["../team-docs", "/srv/shared-notes"]
      \},
      sandbox: \{
        mode: "non-main",
        perSession: true,
        workspaceRoot: "~/.openclaw/sandboxes",
        docker: \{
          image: "openclaw-sandbox:bookworm-slim",
          workdir: "/workspace",
          readOnlyRoot: true,
          tmpfs: ["/tmp", "/var/tmp", "/run"],
          network: "none",
          user: "1000:1000"
        \},
        browser: \{
          enabled: false
        \}
      \}
    \}
  \},

  tools: \{
    allow: ["exec", "process", "read", "write", "edit", "apply_patch"],
    deny: ["browser", "canvas"],
    exec: \{
      backgroundMs: 10000,
      timeoutSec: 1800,
      cleanupMs: 1800000
    \},
    elevated: \{
      enabled: true,
      allowFrom: \{
        whatsapp: ["+15555550123"],
        telegram: ["123456789"],
        discord: ["steipete"],
        slack: ["U123"],
        signal: ["+15555550123"],
        imessage: ["[email protected]"],
        webchat: ["session:demo"]
      \}
    \}
  \},

  // Пользовательские провайдеры моделей
  models: \{
    mode: "merge",
    providers: \{
      "custom-proxy": \{
        baseUrl: "http://localhost:4000/v1",
        apiKey: "LITELLM_KEY",
        api: "openai-responses",
        authHeader: true,
        headers: \{ "X-Proxy-Region": "us-west" \},
        models: [
          \{
            id: "llama-3.1-8b",
            name: "Llama 3.1 8B",
            api: "openai-responses",
            reasoning: false,
            input: ["text"],
            cost: \{ input: 0, output: 0, cacheRead: 0, cacheWrite: 0 \},
            contextWindow: 128000,
            maxTokens: 32000
          \}
        ]
      \}
    \}
  \},

  // Задания Cron
  cron: \{
    enabled: true,
    store: "~/.openclaw/cron/cron.json",
    maxConcurrentRuns: 2
  \},

  // Веб-хуки
  hooks: \{
    enabled: true,
    path: "/hooks",
    token: "shared-secret",
    presets: ["gmail"],
    transformsDir: "~/.openclaw/hooks",
    mappings: [
      \{
        id: "gmail-hook",
        match: \{ path: "gmail" \},
        action: "agent",
        wakeMode: "now",
        name: "Gmail",
        sessionKey: "hook:gmail:\{\{messages[0].id\}\}",
        messageTemplate: "From: \{\{messages[0].from\}\}\\nSubject: \{\{messages[0].subject\}\}",
        textTemplate: "\{\{messages[0].snippet\}\}",
        deliver: true,
        channel: "last",
        to: "+15555550123",
        thinking: "low",
        timeoutSeconds: 300,
        transform: \{ module: "./transforms/gmail.js", export: "transformGmail" \}
      \}
    ],
    gmail: \{
      account: "[email protected]",
      label: "INBOX",
      topic: "projects/<project-id>/topics/gog-gmail-watch",
      subscription: "gog-gmail-watch-push",
      pushToken: "shared-push-token",
      hookUrl: "http://127.0.0.1:18789/hooks/gmail",
      includeBody: true,
      maxBytes: 20000,
      renewEveryMinutes: 720,
      serve: \{ bind: "127.0.0.1", port: 8788, path: "/" \},
      tailscale: \{ mode: "funnel", path: "/gmail-pubsub" \}
    \}
  \},

  // Шлюз + сеть
  gateway: \{
    mode: "local",
    port: 18789,
    bind: "loopback",
    controlUi: \{ enabled: true, basePath: "/openclaw" \},
    auth: \{
      mode: "token",
      token: "gateway-token",
      allowTailscale: true
    \},
    tailscale: \{ mode: "serve", resetOnExit: false \},
    remote: \{ url: "ws://gateway.tailnet:18789", token: "remote-token" \},
    reload: \{ mode: "hybrid", debounceMs: 300 \}
  \},

  skills: \{
    allowBundled: ["gemini", "peekaboo"],
    load: \{
      extraDirs: ["~/Projects/agent-scripts/skills"]
    \},
    install: \{
      preferBrew: true,
      nodeManager: "npm"
    \},
    entries: \{
      "nano-banana-pro": \{
        enabled: true,
        apiKey: "GEMINI_KEY_HERE",
        env: \{ GEMINI_API_KEY: "GEMINI_KEY_HERE" \}
      \},
      peekaboo: \{ enabled: true \}
    \}
  \}
\}

Общие шаблоны

Мультиплатформенная настройка

\{
  agent: \{ workspace: "~/.openclaw/workspace" \},
  channels: \{
    whatsapp: \{ allowFrom: ["+15555550123"] \},
    telegram: \{
      enabled: true,
      botToken: "YOUR_TOKEN",
      allowFrom: ["123456789"]
    \},
    discord: \{
      enabled: true,
      token: "YOUR_TOKEN",
      dm: \{ allowFrom: ["yourname"] \}
    \}
  \}
\}

OAuth с резервом по API-ключу

\{
  auth: \{
    profiles: \{
      "anthropic:subscription": \{
        provider: "anthropic",
        mode: "oauth",
        email: "[email protected]"
      \},
      "anthropic:api": \{
        provider: "anthropic",
        mode: "api_key"
      \}
    \},
    order: \{
      anthropic: ["anthropic:subscription", "anthropic:api"]
    \}
  \},
  agent: \{
    workspace: "~/.openclaw/workspace",
    model: \{
      primary: "anthropic/claude-sonnet-4-5",
      fallbacks: ["anthropic/claude-opus-4-5"]
    \}
  \}
\}

Подписка Anthropic + API-ключ, резерв MiniMax

\{
  auth: \{
    profiles: \{
      "anthropic:subscription": \{
        provider: "anthropic",
        mode: "oauth",
        email: "[email protected]"
      \},
      "anthropic:api": \{
        provider: "anthropic",
        mode: "api_key"
      \}
    \},
    order: \{
      anthropic: ["anthropic:subscription", "anthropic:api"]
    \}
  \},
  models: \{
    providers: \{
      minimax: \{
        baseUrl: "https://api.minimax.io/anthropic",
        api: "anthropic-messages",
        apiKey: "$\{MINIMAX_API_KEY\}"
      \}
    \}
  \},
  agent: \{
    workspace: "~/.openclaw/workspace",
    model: \{
      primary: "anthropic/claude-opus-4-5",
      fallbacks: ["minimax/MiniMax-M2.1"]
    \}
  \}
\}

Рабочий бот (ограниченный доступ)

\{
  identity: \{
    name: "WorkBot",
    theme: "professional assistant"
  \},
  agent: \{
    workspace: "~/work-openclaw",
    elevated: \{ enabled: false \}
  \},
  channels: \{
    slack: \{
      enabled: true,
      botToken: "xoxb-...",
      channels: \{
        "#engineering": \{ allow: true, requireMention: true \},
        "#general": \{ allow: true, requireMention: true \}
      \}
    \}
  \}
\}

Только локальные модели

\{
  agent: \{
    workspace: "~/.openclaw/workspace",
    model: \{ primary: "lmstudio/minimax-m2.1-gs32" \}
  \},
  models: \{
    mode: "merge",
    providers: \{
      lmstudio: \{
        baseUrl: "http://127.0.0.1:1234/v1",
        apiKey: "lmstudio",
        api: "openai-responses",
        models: [
          \{
            id: "minimax-m2.1-gs32",
            name: "MiniMax M2.1 GS32",
            reasoning: false,
            input: ["text"],
            cost: \{ input: 0, output: 0, cacheRead: 0, cacheWrite: 0 \},
            contextWindow: 196608,
            maxTokens: 8192
          \}
        ]
      \}
    \}
  \}
\}

Советы

  • Если вы установите dmPolicy: "open", соответствующий список allowFrom должен включать "*".
  • Идентификаторы провайдеров различаются (номера телефонов, идентификаторы пользователей, идентификаторы каналов). Используйте документацию провайдера для подтверждения формата.
  • Опциональные секции для добавления позже: web, browser, ui, discovery, canvasHost, talk, signal, imessage.
  • См. Провайдеры и Устранение неполадок для более глубоких примечаний по настройке.