本地模型

本地运行是可行的,但 OpenClaw 期望大上下文 + 强大的提示注入防御。小显存会截断上下文并泄露安全性。目标要高:≥2 台满配 Mac Studio 或同等 GPU 配置(约 $30k+)。单张 24 GB GPU 仅适用于较轻的提示,且延迟更高。使用你能运行的最大/完整尺寸模型变体;激进量化或"小型"检查点会增加提示注入风险(参见安全)。 推荐:LM Studio + MiniMax M2.1(Responses API,完整尺寸) 当前最佳本地堆栈。在 LM Studio 中加载 MiniMax M2.1,启用本地服务器(默认 http://127.0.0.1:1234),并使用 Responses API 将推理与最终文本分开。 { agents: { defaults: { model: { primary: "lmstudio/minimax-m2.1-gs32" }, models: { "anthropic/claude-opus-4-5": { alias: "Opus" }, "lmstudio/minimax-m2.1-gs32": { alias: "Minimax" }, }, }, }, 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, }, ], }, }, }, } 设置清单 ...

沙箱 vs 工具策略 vs 提权

OpenClaw 有三个相关(但不同)的控制: 沙箱(agents.defaults.sandbox.* / agents.list[].sandbox.*)决定工具在哪里运行(Docker vs 主机)。 工具策略(tools.*、tools.sandbox.tools.*、agents.list[].tools.*)决定哪些工具可用/允许。 提权(tools.elevated.*、agents.list[].tools.elevated.*)是一个仅限 exec 的逃逸通道,允许在沙箱隔离时在主机上运行。 快速调试 使用检查器查看 OpenClaw 实际在做什么: openclaw sandbox explain openclaw sandbox explain --session agent:main:main openclaw sandbox explain --agent work openclaw sandbox explain --json 它会打印: 生效的沙箱模式/范围/工作区访问 会话当前是否被沙箱隔离(主 vs 非主) 生效的沙箱工具允许/拒绝(以及它来自智能体/全局/默认哪里) 提权限制和修复键路径 沙箱:工具在哪里运行 沙箱隔离由 agents.defaults.sandbox.mode 控制: "off":所有内容在主机上运行。 "non-main":仅非主会话被沙箱隔离(群组/渠道的常见"意外")。 "all":所有内容都被沙箱隔离。 参见沙箱隔离了解完整矩阵(范围、工作区挂载、镜像)。 绑定挂载(安全快速检查) docker.binds 穿透沙箱文件系统:你挂载的任何内容在容器内以你设置的模式(:ro 或 :rw)可见。 如果省略模式,默认为读写;对于源代码/密钥优先使用 :ro。 scope: "shared" 忽略每个智能体的绑定(仅全局绑定适用)。 绑定 /var/run/docker.sock 实际上将主机控制权交给沙箱;只有在有意为之时才这样做。 工作区访问(workspaceAccess: "ro"/"rw")独立于绑定模式。 工具策略:哪些工具存在/可调用 两个层次很重要: 工具配置文件:tools.profile 和 agents.list[].tools.profile(基础允许列表) 提供商工具配置文件:tools.byProvider[provider].profile 和 agents.list[].tools.byProvider[provider].profile 全局/每个智能体工具策略:tools.allow/tools.deny 和 agents.list[].tools.allow/agents.list[].tools.deny 提供商工具策略:tools.byProvider[provider].allow/deny 和 agents.list[].tools.byProvider[provider].allow/deny 沙箱工具策略(仅在沙箱隔离时适用):tools.sandbox.tools.allow/tools.sandbox.tools.deny 和 agents.list[].tools.sandbox.tools.* 经验法则: ...

沙箱隔离

OpenClaw 可以在 Docker 容器内运行工具以减少影响范围。 这是可选的,由配置控制(agents.defaults.sandbox 或 agents.list[].sandbox)。如果沙箱隔离关闭,工具在主机上运行。 Gateway 网关保留在主机上;启用时工具执行在隔离的沙箱中运行。 这不是完美的安全边界,但当模型做出愚蠢行为时,它实质性地限制了文件系统和进程访问。 什么会被沙箱隔离 工具执行(exec、read、write、edit、apply_patch、process 等)。 可选的沙箱浏览器(agents.defaults.sandbox.browser)。 默认情况下,当浏览器工具需要时,沙箱浏览器会自动启动(确保 CDP 可达)。 通过 agents.defaults.sandbox.browser.autoStart 和 agents.defaults.sandbox.browser.autoStartTimeoutMs 配置。 agents.defaults.sandbox.browser.allowHostControl 允许沙箱会话显式定位主机浏览器。 可选的允许列表限制 target: "custom":allowedControlUrls、allowedControlHosts、allowedControlPorts。 不被沙箱隔离: Gateway 网关进程本身。 任何明确允许在主机上运行的工具(例如 tools.elevated)。 提权 exec 在主机上运行并绕过沙箱隔离。 如果沙箱隔离关闭,tools.elevated 不会改变执行(已经在主机上)。参见提权模式。 模式 agents.defaults.sandbox.mode 控制何时使用沙箱隔离: "off":不使用沙箱隔离。 "non-main":仅沙箱隔离非主会话(如果你想让普通聊天在主机上运行,这是默认值)。 "all":每个会话都在沙箱中运行。 注意:"non-main" 基于 session.mainKey(默认 "main"),而不是智能体 ID。 群组/频道会话使用它们自己的键,因此它们算作非主会话并将被沙箱隔离。 作用域 agents.defaults.sandbox.scope 控制创建多少容器: "session"(默认):每个会话一个容器。 "agent":每个智能体一个容器。 "shared":所有沙箱会话共享一个容器。 工作区访问 agents.defaults.sandbox.workspaceAccess 控制沙箱可以看到什么: "none"(默认):工具看到 ~/.openclaw/sandboxes 下的沙箱工作区。 "ro":以只读方式在 /agent 挂载智能体工作区(禁用 write/edit/apply_patch)。 "rw":以读写方式在 /workspace 挂载智能体工作区。 入站媒体被复制到活动沙箱工作区(media/inbound/*)。 Skills 注意事项:read 工具以沙箱为根。使用 workspaceAccess: "none" 时,OpenClaw 将符合条件的 Skills 镜像到沙箱工作区(.../skills)以便可以读取。使用 "rw" 时,工作区 Skills 可从 /workspace/skills 读取。 ...

认证

OpenClaw 支持模型提供商的 OAuth 和 API 密钥。对于 Anthropic 账户,我们推荐使用 API 密钥。对于 Claude 订阅访问,使用 claude setup-token 创建的长期令牌。 参阅 /concepts/oauth 了解完整的 OAuth 流程和存储布局。 推荐的 Anthropic 设置(API 密钥) 如果你直接使用 Anthropic,请使用 API 密钥。 在 Anthropic 控制台创建 API 密钥。 将其放在 Gateway 网关主机(运行 openclaw gateway 的机器)上。 export ANTHROPIC_API_KEY="..." openclaw models status 如果 Gateway 网关在 systemd/launchd 下运行,最好将密钥放在 ~/.openclaw/.env 中以便守护进程可以读取: cat >> ~/.openclaw/.env <<'EOF' ANTHROPIC_API_KEY=... EOF 然后重启守护进程(或重启你的 Gateway 网关进程)并重新检查: openclaw models status openclaw doctor 如果你不想自己管理环境变量,新手引导向导可以为守护进程使用存储 API 密钥:openclaw onboard。 参阅帮助了解环境变量继承的详情(env.shellEnv、~/.openclaw/.env、systemd/launchd)。 Anthropic:setup-token(订阅认证) 对于 Anthropic,推荐的路径是 API 密钥。如果你使用 Claude 订阅,也支持 setup-token 流程。在 Gateway 网关主机上运行: ...

设备发现 & 传输协议

OpenClaw 有两个表面上看起来相似的不同问题: 操作员远程控制:macOS 菜单栏应用控制运行在其他地方的 Gateway 网关。 节点配对:iOS/Android(以及未来的节点)发现 Gateway 网关并安全配对。 设计目标是将所有网络发现/广播保留在 Node Gateway 网关(openclaw gateway)中,并让客户端(mac 应用、iOS)作为消费者。 术语 Gateway 网关:一个长期运行的 Gateway 网关进程,拥有状态(会话、配对、节点注册表)并运行渠道。大多数设置每台主机使用一个;也可以进行隔离的多 Gateway 网关设置。 Gateway 网关 WS(控制平面):默认在 127.0.0.1:18789 上的 WebSocket 端点;可通过 gateway.bind 绑定到 LAN/tailnet。 直连 WS 传输:面向 LAN/tailnet 的 Gateway 网关 WS 端点(无 SSH)。 SSH 传输(回退):通过 SSH 转发 127.0.0.1:18789 进行远程控制。 旧版 TCP 桥接(已弃用/移除):旧的节点传输(参见 桥接协议);不再用于发现广播。 协议详情: Gateway 网关协议 桥接协议(旧版) 为什么我们同时保留"直连"和 SSH 直连 WS 在同一网络和 tailnet 内提供最佳用户体验: 通过 Bonjour 在 LAN 上自动发现 配对令牌 + ACL 由 Gateway 网关管理 无需 shell 访问;协议表面可保持紧凑和可审计 SSH 仍然是通用回退方案: 只要你有 SSH 访问权限就能工作(即使跨越不相关的网络) 能应对多播/mDNS 问题 除 SSH 外无需新的入站端口 发现输入(客户端如何了解 Gateway 网关位置) 1)Bonjour / mDNS(仅限 LAN) Bonjour 是尽力而为的,不会跨网络。它仅用于"同一 LAN"的便利性。 ...

远程访问(SSH、隧道和 tailnet)

本仓库通过在专用主机(桌面/服务器)上运行单个 Gateway 网关(主节点)并让客户端连接到它来支持"SSH 远程"。 对于操作员(你/macOS 应用):SSH 隧道是通用的回退方案。 对于节点(iOS/Android 和未来的设备):连接到 Gateway WebSocket(LAN/tailnet 或根据需要通过 SSH 隧道)。 核心理念 Gateway WebSocket 绑定到你配置端口的 loopback(默认为 18789)。 对于远程使用,你通过 SSH 转发该 loopback 端口(或使用 tailnet/VPN 减少隧道需求)。 常见的 VPN/tailnet 设置(智能体所在位置) 将 Gateway 网关主机视为"智能体所在的位置"。它拥有会话、身份验证配置文件、渠道和状态。 你的笔记本电脑/桌面(和节点)连接到该主机。 1) tailnet 中始终在线的 Gateway 网关(VPS 或家庭服务器) 在持久主机上运行 Gateway 网关,并通过 Tailscale 或 SSH 访问它。 最佳用户体验: 保持 gateway.bind: "loopback" 并使用 Tailscale Serve 作为控制 UI。 回退方案: 保持 loopback + 从任何需要访问的机器建立 SSH 隧道。 示例: exe.dev(简易 VM)或 Hetzner(生产 VPS)。 当你的笔记本电脑经常休眠但你希望智能体始终在线时,这是理想的选择。 2) 家庭桌面运行 Gateway 网关,笔记本电脑作为远程控制 笔记本电脑不运行智能体。它远程连接: ...

配置 🔧

OpenClaw 从 ~/.openclaw/openclaw.json 读取可选的 JSON5 配置(支持注释和尾逗号)。 如果文件不存在,OpenClaw 使用安全的默认值(内置 Pi 智能体 + 按发送者分会话 + 工作区 ~/.openclaw/workspace)。通常只在以下情况需要配置: 限制谁可以触发机器人(channels.whatsapp.allowFrom、channels.telegram.allowFrom 等) 控制群组白名单 + 提及行为(channels.whatsapp.groups、channels.telegram.groups、channels.discord.guilds、agents.list[].groupChat) 自定义消息前缀(messages) 设置智能体工作区(agents.defaults.workspace 或 agents.list[].workspace) 调整内置智能体默认值(agents.defaults)和会话行为(session) 设置每个智能体的身份标识(agents.list[].identity) 初次接触配置? 请查阅配置示例指南,获取带有详细说明的完整示例! 严格配置验证 OpenClaw 只接受完全匹配 schema 的配置。 未知键、类型错误或无效值会导致 Gateway 网关 拒绝启动以确保安全。 验证失败时: Gateway 网关不会启动。 只允许诊断命令(例如:openclaw doctor、openclaw logs、openclaw health、openclaw status、openclaw service、openclaw help)。 运行 openclaw doctor 查看具体问题。 运行 openclaw doctor --fix(或 --yes)应用迁移/修复。 Doctor 不会写入任何更改,除非你明确选择了 --fix/--yes。 Schema + UI 提示 Gateway 网关通过 config.schema 暴露配置的 JSON Schema 表示,供 UI 编辑器使用。 控制台 UI 根据此 schema 渲染表单,并提供 Raw JSON 编辑器作为应急手段。 ...

配置示例

以下示例与当前配置模式一致。有关详尽的参考和每个字段的说明,请参阅配置。 快速开始 绝对最小配置 { 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 也可以使用。 { // 环境 + shell 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, }, // Webhooks 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 网关 + 网络 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 列表必须包含 "*"。 提供商 ID 各不相同(电话号码、用户 ID、频道 ID)。使用提供商文档确认格式。 稍后添加的可选部分:web、browser、ui、discovery、canvasHost、talk、signal、imessage。 参阅提供商和故障排除了解更深入的设置说明。