Constant TESTING
Source pub const TESTING: &str = "---\nread_when:\n - \u{5728}\u{672c}\u{5730}\u{6216} CI \u{4e2d}\u{8fd0}\u{884c}\u{6d4b}\u{8bd5}\n - \u{4e3a}\u{6a21}\u{578b}/\u{63d0}\u{4f9b}\u{5546}\u{95ee}\u{9898}\u{6dfb}\u{52a0}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\n - \u{8c03}\u{8bd5} Gateway \u{7f51}\u{5173} + \u{667a}\u{80fd}\u{4f53}\u{884c}\u{4e3a}\nsummary: \u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\u{ff1a}\u{5355}\u{5143}/\u{7aef}\u{5230}\u{7aef}/\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\u{3001}Docker \u{8fd0}\u{884c}\u{5668}\u{ff0c}\u{4ee5}\u{53ca}\u{6bcf}\u{4e2a}\u{6d4b}\u{8bd5}\u{7684}\u{8986}\u{76d6}\u{8303}\u{56f4}\ntitle: \u{6d4b}\u{8bd5}\nx-i18n:\n generated_at: \"2026-02-03T09:23:12Z\"\n model: claude-opus-4-5\n provider: pi\n source_hash: 8c236673838731c49464622ac54bf0336acf787b857677c8c2d2aa52949c8ad5\n source_path: help/testing.md\n workflow: 15\n---\n\n# \u{6d4b}\u{8bd5}\n\nOpenClaw \u{5305}\u{542b}\u{4e09}\u{4e2a} Vitest \u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\u{ff08}\u{5355}\u{5143}/\u{96c6}\u{6210}\u{3001}\u{7aef}\u{5230}\u{7aef}\u{3001}\u{5b9e}\u{65f6}\u{ff09}\u{4ee5}\u{53ca}\u{4e00}\u{5c0f}\u{7ec4} Docker \u{8fd0}\u{884c}\u{5668}\u{3002}\n\n\u{672c}\u{6587}\u{6863}\u{662f}\u{4e00}\u{4efd}\"\u{6211}\u{4eec}\u{5982}\u{4f55}\u{6d4b}\u{8bd5}\"\u{7684}\u{6307}\u{5357}\u{ff1a}\n\n- \u{6bcf}\u{4e2a}\u{5957}\u{4ef6}\u{8986}\u{76d6}\u{4ec0}\u{4e48}\u{ff08}\u{4ee5}\u{53ca}\u{5b83}\u{523b}\u{610f}*\u{4e0d}*\u{8986}\u{76d6}\u{4ec0}\u{4e48}\u{ff09}\n- \u{5e38}\u{89c1}\u{5de5}\u{4f5c}\u{6d41}\u{7a0b}\u{5e94}\u{8fd0}\u{884c}\u{54ea}\u{4e9b}\u{547d}\u{4ee4}\u{ff08}\u{672c}\u{5730}\u{3001}\u{63a8}\u{9001}\u{524d}\u{3001}\u{8c03}\u{8bd5}\u{ff09}\n- \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{5982}\u{4f55}\u{53d1}\u{73b0}\u{51ed}\u{8bc1}\u{5e76}\u{9009}\u{62e9}\u{6a21}\u{578b}/\u{63d0}\u{4f9b}\u{5546}\n- \u{5982}\u{4f55}\u{4e3a}\u{73b0}\u{5b9e}\u{4e2d}\u{7684}\u{6a21}\u{578b}/\u{63d0}\u{4f9b}\u{5546}\u{95ee}\u{9898}\u{6dfb}\u{52a0}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\n\n## \u{5feb}\u{901f}\u{5f00}\u{59cb}\n\n\u{65e5}\u{5e38}\u{4f7f}\u{7528}\u{ff1a}\n\n- \u{5b8c}\u{6574}\u{68c0}\u{67e5}\u{ff08}\u{63a8}\u{9001}\u{524d}\u{7684}\u{9884}\u{671f}\u{6d41}\u{7a0b}\u{ff09}\u{ff1a}`pnpm build && pnpm check && pnpm test`\n\n\u{5f53}\u{4f60}\u{4fee}\u{6539}\u{6d4b}\u{8bd5}\u{6216}\u{9700}\u{8981}\u{989d}\u{5916}\u{7684}\u{4fe1}\u{5fc3}\u{65f6}\u{ff1a}\n\n- \u{8986}\u{76d6}\u{7387}\u{68c0}\u{67e5}\u{ff1a}`pnpm test:coverage`\n- \u{7aef}\u{5230}\u{7aef}\u{5957}\u{4ef6}\u{ff1a}`pnpm test:e2e`\n\n\u{8c03}\u{8bd5}\u{771f}\u{5b9e}\u{63d0}\u{4f9b}\u{5546}/\u{6a21}\u{578b}\u{65f6}\u{ff08}\u{9700}\u{8981}\u{771f}\u{5b9e}\u{51ed}\u{8bc1}\u{ff09}\u{ff1a}\n\n- \u{5b9e}\u{65f6}\u{5957}\u{4ef6}\u{ff08}\u{6a21}\u{578b} + Gateway \u{7f51}\u{5173}\u{5de5}\u{5177}/\u{56fe}\u{50cf}\u{63a2}\u{6d4b}\u{ff09}\u{ff1a}`pnpm test:live`\n\n\u{63d0}\u{793a}\u{ff1a}\u{5f53}\u{4f60}\u{53ea}\u{9700}\u{8981}\u{4e00}\u{4e2a}\u{5931}\u{8d25}\u{7528}\u{4f8b}\u{65f6}\u{ff0c}\u{5efa}\u{8bae}\u{4f7f}\u{7528}\u{4e0b}\u{6587}\u{63cf}\u{8ff0}\u{7684}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{6765}\u{7f29}\u{5c0f}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{8303}\u{56f4}\u{3002}\n\n## \u{6d4b}\u{8bd5}\u{5957}\u{4ef6}\u{ff08}\u{5728}\u{54ea}\u{91cc}\u{8fd0}\u{884c}\u{4ec0}\u{4e48}\u{ff09}\n\n\u{53ef}\u{4ee5}\u{5c06}\u{8fd9}\u{4e9b}\u{5957}\u{4ef6}\u{7406}\u{89e3}\u{4e3a}\"\u{9010}\u{6e10}\u{589e}\u{5f3a}\u{7684}\u{771f}\u{5b9e}\u{6027}\"\u{ff08}\u{4ee5}\u{53ca}\u{9010}\u{6e10}\u{589e}\u{52a0}\u{7684}\u{4e0d}\u{7a33}\u{5b9a}\u{6027}/\u{6210}\u{672c}\u{ff09}\u{ff1a}\n\n### \u{5355}\u{5143}/\u{96c6}\u{6210}\u{6d4b}\u{8bd5}\u{ff08}\u{9ed8}\u{8ba4}\u{ff09}\n\n- \u{547d}\u{4ee4}\u{ff1a}`pnpm test`\n- \u{914d}\u{7f6e}\u{ff1a}`vitest.config.ts`\n- \u{6587}\u{4ef6}\u{ff1a}`src/**/*.test.ts`\n- \u{8303}\u{56f4}\u{ff1a}\n - \u{7eaf}\u{5355}\u{5143}\u{6d4b}\u{8bd5}\n - \u{8fdb}\u{7a0b}\u{5185}\u{96c6}\u{6210}\u{6d4b}\u{8bd5}\u{ff08}Gateway \u{7f51}\u{5173}\u{8ba4}\u{8bc1}\u{3001}\u{8def}\u{7531}\u{3001}\u{5de5}\u{5177}\u{3001}\u{89e3}\u{6790}\u{3001}\u{914d}\u{7f6e}\u{ff09}\n - \u{5df2}\u{77e5}\u{95ee}\u{9898}\u{7684}\u{786e}\u{5b9a}\u{6027}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\n- \u{9884}\u{671f}\u{ff1a}\n - \u{5728} CI \u{4e2d}\u{8fd0}\u{884c}\n - \u{4e0d}\u{9700}\u{8981}\u{771f}\u{5b9e}\u{5bc6}\u{94a5}\n - \u{5e94}\u{8be5}\u{5feb}\u{901f}\u{4e14}\u{7a33}\u{5b9a}\n\n### \u{7aef}\u{5230}\u{7aef}\u{6d4b}\u{8bd5}\u{ff08}Gateway \u{7f51}\u{5173}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff09}\n\n- \u{547d}\u{4ee4}\u{ff1a}`pnpm test:e2e`\n- \u{914d}\u{7f6e}\u{ff1a}`vitest.e2e.config.ts`\n- \u{6587}\u{4ef6}\u{ff1a}`src/**/*.e2e.test.ts`\n- \u{8303}\u{56f4}\u{ff1a}\n - \u{591a}\u{5b9e}\u{4f8b} Gateway \u{7f51}\u{5173}\u{7aef}\u{5230}\u{7aef}\u{884c}\u{4e3a}\n - WebSocket/HTTP \u{63a5}\u{53e3}\u{3001}\u{8282}\u{70b9}\u{914d}\u{5bf9}\u{548c}\u{8f83}\u{91cd}\u{7684}\u{7f51}\u{7edc}\u{64cd}\u{4f5c}\n- \u{9884}\u{671f}\u{ff1a}\n - \u{5728} CI \u{4e2d}\u{8fd0}\u{884c}\u{ff08}\u{5f53}\u{5728}\u{6d41}\u{6c34}\u{7ebf}\u{4e2d}\u{542f}\u{7528}\u{65f6}\u{ff09}\n - \u{4e0d}\u{9700}\u{8981}\u{771f}\u{5b9e}\u{5bc6}\u{94a5}\n - \u{6bd4}\u{5355}\u{5143}\u{6d4b}\u{8bd5}\u{6709}\u{66f4}\u{591a}\u{6d3b}\u{52a8}\u{90e8}\u{4ef6}\u{ff08}\u{53ef}\u{80fd}\u{8f83}\u{6162}\u{ff09}\n\n### \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{ff08}\u{771f}\u{5b9e}\u{63d0}\u{4f9b}\u{5546} + \u{771f}\u{5b9e}\u{6a21}\u{578b}\u{ff09}\n\n- \u{547d}\u{4ee4}\u{ff1a}`pnpm test:live`\n- \u{914d}\u{7f6e}\u{ff1a}`vitest.live.config.ts`\n- \u{6587}\u{4ef6}\u{ff1a}`src/**/*.live.test.ts`\n- \u{9ed8}\u{8ba4}\u{ff1a}\u{901a}\u{8fc7} `pnpm test:live` **\u{542f}\u{7528}**\u{ff08}\u{8bbe}\u{7f6e} `OPENCLAW_LIVE_TEST=1`\u{ff09}\n- \u{8303}\u{56f4}\u{ff1a}\n - \"\u{8fd9}\u{4e2a}\u{63d0}\u{4f9b}\u{5546}/\u{6a21}\u{578b}\u{7528}\u{771f}\u{5b9e}\u{51ed}\u{8bc1}*\u{4eca}\u{5929}*\u{5b9e}\u{9645}\u{80fd}\u{5de5}\u{4f5c}\u{5417}\u{ff1f}\"\n - \u{6355}\u{83b7}\u{63d0}\u{4f9b}\u{5546}\u{683c}\u{5f0f}\u{53d8}\u{66f4}\u{3001}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{602a}\u{7656}\u{3001}\u{8ba4}\u{8bc1}\u{95ee}\u{9898}\u{548c}\u{901f}\u{7387}\u{9650}\u{5236}\u{884c}\u{4e3a}\n- \u{9884}\u{671f}\u{ff1a}\n - \u{8bbe}\u{8ba1}\u{4e0a}\u{4e0d}\u{9002}\u{5408} CI \u{7a33}\u{5b9a}\u{8fd0}\u{884c}\u{ff08}\u{771f}\u{5b9e}\u{7f51}\u{7edc}\u{3001}\u{771f}\u{5b9e}\u{63d0}\u{4f9b}\u{5546}\u{7b56}\u{7565}\u{3001}\u{914d}\u{989d}\u{3001}\u{6545}\u{969c}\u{ff09}\n - \u{82b1}\u{8d39}\u{91d1}\u{94b1}/\u{4f7f}\u{7528}\u{901f}\u{7387}\u{9650}\u{5236}\n - \u{5efa}\u{8bae}\u{8fd0}\u{884c}\u{7f29}\u{5c0f}\u{8303}\u{56f4}\u{7684}\u{5b50}\u{96c6}\u{800c}\u{975e}\"\u{5168}\u{90e8}\"\n - \u{5b9e}\u{65f6}\u{8fd0}\u{884c}\u{4f1a}\u{52a0}\u{8f7d} `~/.profile` \u{4ee5}\u{83b7}\u{53d6}\u{7f3a}\u{5931}\u{7684} API \u{5bc6}\u{94a5}\n - Anthropic \u{5bc6}\u{94a5}\u{8f6e}\u{6362}\u{ff1a}\u{8bbe}\u{7f6e} `OPENCLAW_LIVE_ANTHROPIC_KEYS=\"sk-...,sk-...\"`\u{ff08}\u{6216} `OPENCLAW_LIVE_ANTHROPIC_KEY=sk-...`\u{ff09}\u{6216}\u{591a}\u{4e2a} `ANTHROPIC_API_KEY*` \u{53d8}\u{91cf}\u{ff1b}\u{6d4b}\u{8bd5}\u{4f1a}\u{5728}\u{9047}\u{5230}\u{901f}\u{7387}\u{9650}\u{5236}\u{65f6}\u{91cd}\u{8bd5}\n\n## \u{6211}\u{5e94}\u{8be5}\u{8fd0}\u{884c}\u{54ea}\u{4e2a}\u{5957}\u{4ef6}\u{ff1f}\n\n\u{4f7f}\u{7528}\u{8fd9}\u{4e2a}\u{51b3}\u{7b56}\u{8868}\u{ff1a}\n\n- \u{7f16}\u{8f91}\u{903b}\u{8f91}/\u{6d4b}\u{8bd5}\u{ff1a}\u{8fd0}\u{884c} `pnpm test`\u{ff08}\u{5982}\u{679c}\u{6539}\u{52a8}\u{8f83}\u{5927}\u{ff0c}\u{52a0}\u{4e0a} `pnpm test:coverage`\u{ff09}\n- \u{6d89}\u{53ca} Gateway \u{7f51}\u{5173}\u{7f51}\u{7edc}/WS \u{534f}\u{8bae}/\u{914d}\u{5bf9}\u{ff1a}\u{52a0}\u{4e0a} `pnpm test:e2e`\n- \u{8c03}\u{8bd5}\"\u{6211}\u{7684}\u{673a}\u{5668}\u{4eba}\u{6302}\u{4e86}\"/\u{63d0}\u{4f9b}\u{5546}\u{7279}\u{5b9a}\u{6545}\u{969c}/\u{5de5}\u{5177}\u{8c03}\u{7528}\u{ff1a}\u{8fd0}\u{884c}\u{7f29}\u{5c0f}\u{8303}\u{56f4}\u{7684} `pnpm test:live`\n\n## \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{ff1a}\u{6a21}\u{578b}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff08}\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{5bc6}\u{94a5}\u{ff09}\n\n\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{5206}\u{4e3a}\u{4e24}\u{5c42}\u{ff0c}\u{4ee5}\u{4fbf}\u{9694}\u{79bb}\u{6545}\u{969c}\u{ff1a}\n\n- \"\u{76f4}\u{63a5}\u{6a21}\u{578b}\"\u{544a}\u{8bc9}\u{6211}\u{4eec}\u{63d0}\u{4f9b}\u{5546}/\u{6a21}\u{578b}\u{662f}\u{5426}\u{80fd}\u{7528}\u{7ed9}\u{5b9a}\u{7684}\u{5bc6}\u{94a5}\u{6b63}\u{5e38}\u{54cd}\u{5e94}\u{3002}\n- \"Gateway \u{7f51}\u{5173}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\"\u{544a}\u{8bc9}\u{6211}\u{4eec}\u{5b8c}\u{6574}\u{7684} Gateway \u{7f51}\u{5173} + \u{667a}\u{80fd}\u{4f53}\u{7ba1}\u{9053}\u{662f}\u{5426}\u{5bf9}\u{8be5}\u{6a21}\u{578b}\u{6b63}\u{5e38}\u{5de5}\u{4f5c}\u{ff08}\u{4f1a}\u{8bdd}\u{3001}\u{5386}\u{53f2}\u{8bb0}\u{5f55}\u{3001}\u{5de5}\u{5177}\u{3001}\u{6c99}\u{7bb1}\u{7b56}\u{7565}\u{7b49}\u{ff09}\u{3002}\n\n### \u{7b2c}\u{4e00}\u{5c42}\u{ff1a}\u{76f4}\u{63a5}\u{6a21}\u{578b}\u{8865}\u{5168}\u{ff08}\u{65e0} Gateway \u{7f51}\u{5173}\u{ff09}\n\n- \u{6d4b}\u{8bd5}\u{ff1a}`src/agents/models.profiles.live.test.ts`\n- \u{76ee}\u{6807}\u{ff1a}\n - \u{679a}\u{4e3e}\u{53d1}\u{73b0}\u{7684}\u{6a21}\u{578b}\n - \u{4f7f}\u{7528} `getApiKeyForModel` \u{9009}\u{62e9}\u{4f60}\u{6709}\u{51ed}\u{8bc1}\u{7684}\u{6a21}\u{578b}\n - \u{6bcf}\u{4e2a}\u{6a21}\u{578b}\u{8fd0}\u{884c}\u{4e00}\u{4e2a}\u{5c0f}\u{578b}\u{8865}\u{5168}\u{ff08}\u{4ee5}\u{53ca}\u{9700}\u{8981}\u{65f6}\u{7684}\u{9488}\u{5bf9}\u{6027}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\u{ff09}\n- \u{5982}\u{4f55}\u{542f}\u{7528}\u{ff1a}\n - `pnpm test:live`\u{ff08}\u{6216}\u{76f4}\u{63a5}\u{8c03}\u{7528} Vitest \u{65f6}\u{4f7f}\u{7528} `OPENCLAW_LIVE_TEST=1`\u{ff09}\n- \u{8bbe}\u{7f6e} `OPENCLAW_LIVE_MODELS=modern`\u{ff08}\u{6216} `all`\u{ff0c}modern \u{7684}\u{522b}\u{540d}\u{ff09}\u{4ee5}\u{5b9e}\u{9645}\u{8fd0}\u{884c}\u{6b64}\u{5957}\u{4ef6}\u{ff1b}\u{5426}\u{5219}\u{4f1a}\u{8df3}\u{8fc7}\u{4ee5}\u{4fdd}\u{6301} `pnpm test:live` \u{4e13}\u{6ce8}\u{4e8e} Gateway \u{7f51}\u{5173}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\n- \u{5982}\u{4f55}\u{9009}\u{62e9}\u{6a21}\u{578b}\u{ff1a}\n - `OPENCLAW_LIVE_MODELS=modern` \u{8fd0}\u{884c}\u{73b0}\u{4ee3}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{ff08}Opus/Sonnet/Haiku 4.5\u{3001}GPT-5.x + Codex\u{3001}Gemini 3\u{3001}GLM 4.7\u{3001}MiniMax M2.1\u{3001}Grok 4\u{ff09}\n - `OPENCLAW_LIVE_MODELS=all` \u{662f}\u{73b0}\u{4ee3}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{7684}\u{522b}\u{540d}\n - \u{6216} `OPENCLAW_LIVE_MODELS=\"openai/gpt-5.2,anthropic/claude-opus-4-5,...\"`\u{ff08}\u{9017}\u{53f7}\u{5206}\u{9694}\u{7684}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{ff09}\n- \u{5982}\u{4f55}\u{9009}\u{62e9}\u{63d0}\u{4f9b}\u{5546}\u{ff1a}\n - `OPENCLAW_LIVE_PROVIDERS=\"google,google-antigravity,google-gemini-cli\"`\u{ff08}\u{9017}\u{53f7}\u{5206}\u{9694}\u{7684}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{ff09}\n- \u{5bc6}\u{94a5}\u{6765}\u{6e90}\u{ff1a}\n - \u{9ed8}\u{8ba4}\u{ff1a}\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{5b58}\u{50a8}\u{548c}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{56de}\u{9000}\n - \u{8bbe}\u{7f6e} `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` \u{4ee5}\u{5f3a}\u{5236}**\u{4ec5}\u{4f7f}\u{7528}\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{5b58}\u{50a8}**\n- \u{4e3a}\u{4ec0}\u{4e48}\u{5b58}\u{5728}\u{8fd9}\u{4e2a}\u{6d4b}\u{8bd5}\u{ff1a}\n - \u{5c06}\"\u{63d0}\u{4f9b}\u{5546} API \u{635f}\u{574f}/\u{5bc6}\u{94a5}\u{65e0}\u{6548}\"\u{4e0e}\"Gateway \u{7f51}\u{5173}\u{667a}\u{80fd}\u{4f53}\u{7ba1}\u{9053}\u{635f}\u{574f}\"\u{5206}\u{79bb}\n - \u{5305}\u{542b}\u{5c0f}\u{578b}\u{3001}\u{9694}\u{79bb}\u{7684}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\u{ff08}\u{4f8b}\u{5982}\u{ff1a}OpenAI Responses/Codex Responses \u{63a8}\u{7406}\u{91cd}\u{653e} + \u{5de5}\u{5177}\u{8c03}\u{7528}\u{6d41}\u{7a0b}\u{ff09}\n\n### \u{7b2c}\u{4e8c}\u{5c42}\u{ff1a}Gateway \u{7f51}\u{5173} + \u{5f00}\u{53d1}\u{667a}\u{80fd}\u{4f53}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff08}\"@openclaw\"\u{5b9e}\u{9645}\u{505a}\u{7684}\u{4e8b}\u{ff09}\n\n- \u{6d4b}\u{8bd5}\u{ff1a}`src/gateway/gateway-models.profiles.live.test.ts`\n- \u{76ee}\u{6807}\u{ff1a}\n - \u{542f}\u{52a8}\u{4e00}\u{4e2a}\u{8fdb}\u{7a0b}\u{5185} Gateway \u{7f51}\u{5173}\n - \u{521b}\u{5efa}/\u{4fee}\u{8865}\u{4e00}\u{4e2a} `agent:dev:*` \u{4f1a}\u{8bdd}\u{ff08}\u{6bcf}\u{6b21}\u{8fd0}\u{884c}\u{8986}\u{76d6}\u{6a21}\u{578b}\u{ff09}\n - \u{904d}\u{5386}\u{6709}\u{5bc6}\u{94a5}\u{7684}\u{6a21}\u{578b}\u{5e76}\u{65ad}\u{8a00}\u{ff1a}\n - \"\u{6709}\u{610f}\u{4e49}\u{7684}\"\u{54cd}\u{5e94}\u{ff08}\u{65e0}\u{5de5}\u{5177}\u{ff09}\n - \u{771f}\u{5b9e}\u{7684}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{5de5}\u{4f5c}\u{6b63}\u{5e38}\u{ff08}\u{8bfb}\u{53d6}\u{63a2}\u{6d4b}\u{ff09}\n - \u{53ef}\u{9009}\u{7684}\u{989d}\u{5916}\u{5de5}\u{5177}\u{63a2}\u{6d4b}\u{ff08}\u{6267}\u{884c}+\u{8bfb}\u{53d6}\u{63a2}\u{6d4b}\u{ff09}\n - OpenAI \u{56de}\u{5f52}\u{8def}\u{5f84}\u{ff08}\u{4ec5}\u{5de5}\u{5177}\u{8c03}\u{7528} \u{2192} \u{540e}\u{7eed}\u{ff09}\u{4fdd}\u{6301}\u{5de5}\u{4f5c}\n- \u{63a2}\u{6d4b}\u{8be6}\u{60c5}\u{ff08}\u{4ee5}\u{4fbf}\u{4f60}\u{80fd}\u{5feb}\u{901f}\u{89e3}\u{91ca}\u{6545}\u{969c}\u{ff09}\u{ff1a}\n - `read` \u{63a2}\u{6d4b}\u{ff1a}\u{6d4b}\u{8bd5}\u{5728}\u{5de5}\u{4f5c}\u{533a}\u{5199}\u{5165}\u{4e00}\u{4e2a}\u{968f}\u{673a}\u{6570}\u{6587}\u{4ef6}\u{ff0c}\u{8981}\u{6c42}\u{667a}\u{80fd}\u{4f53} `read` \u{5b83}\u{5e76}\u{56de}\u{663e}\u{968f}\u{673a}\u{6570}\u{3002}\n - `exec+read` \u{63a2}\u{6d4b}\u{ff1a}\u{6d4b}\u{8bd5}\u{8981}\u{6c42}\u{667a}\u{80fd}\u{4f53} `exec` \u{5c06}\u{968f}\u{673a}\u{6570}\u{5199}\u{5165}\u{4e34}\u{65f6}\u{6587}\u{4ef6}\u{ff0c}\u{7136}\u{540e} `read` \u{56de}\u{6765}\u{3002}\n - \u{56fe}\u{50cf}\u{63a2}\u{6d4b}\u{ff1a}\u{6d4b}\u{8bd5}\u{9644}\u{52a0}\u{4e00}\u{4e2a}\u{751f}\u{6210}\u{7684} PNG\u{ff08}\u{732b} + \u{968f}\u{673a}\u{4ee3}\u{7801}\u{ff09}\u{ff0c}\u{671f}\u{671b}\u{6a21}\u{578b}\u{8fd4}\u{56de} `cat <CODE>`\u{3002}\n - \u{5b9e}\u{73b0}\u{53c2}\u{8003}\u{ff1a}`src/gateway/gateway-models.profiles.live.test.ts` \u{548c} `src/gateway/live-image-probe.ts`\u{3002}\n- \u{5982}\u{4f55}\u{542f}\u{7528}\u{ff1a}\n - `pnpm test:live`\u{ff08}\u{6216}\u{76f4}\u{63a5}\u{8c03}\u{7528} Vitest \u{65f6}\u{4f7f}\u{7528} `OPENCLAW_LIVE_TEST=1`\u{ff09}\n- \u{5982}\u{4f55}\u{9009}\u{62e9}\u{6a21}\u{578b}\u{ff1a}\n - \u{9ed8}\u{8ba4}\u{ff1a}\u{73b0}\u{4ee3}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{ff08}Opus/Sonnet/Haiku 4.5\u{3001}GPT-5.x + Codex\u{3001}Gemini 3\u{3001}GLM 4.7\u{3001}MiniMax M2.1\u{3001}Grok 4\u{ff09}\n - `OPENCLAW_LIVE_GATEWAY_MODELS=all` \u{662f}\u{73b0}\u{4ee3}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{7684}\u{522b}\u{540d}\n - \u{6216}\u{8bbe}\u{7f6e} `OPENCLAW_LIVE_GATEWAY_MODELS=\"provider/model\"`\u{ff08}\u{6216}\u{9017}\u{53f7}\u{5206}\u{9694}\u{5217}\u{8868}\u{ff09}\u{6765}\u{7f29}\u{5c0f}\u{8303}\u{56f4}\n- \u{5982}\u{4f55}\u{9009}\u{62e9}\u{63d0}\u{4f9b}\u{5546}\u{ff08}\u{907f}\u{514d}\"OpenRouter \u{5168}\u{90e8}\"\u{ff09}\u{ff1a}\n - `OPENCLAW_LIVE_GATEWAY_PROVIDERS=\"google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax\"`\u{ff08}\u{9017}\u{53f7}\u{5206}\u{9694}\u{7684}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{ff09}\n- \u{5de5}\u{5177} + \u{56fe}\u{50cf}\u{63a2}\u{6d4b}\u{5728}\u{6b64}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{4e2d}\u{59cb}\u{7ec8}\u{5f00}\u{542f}\u{ff1a}\n - `read` \u{63a2}\u{6d4b} + `exec+read` \u{63a2}\u{6d4b}\u{ff08}\u{5de5}\u{5177}\u{538b}\u{529b}\u{6d4b}\u{8bd5}\u{ff09}\n - \u{5f53}\u{6a21}\u{578b}\u{58f0}\u{660e}\u{652f}\u{6301}\u{56fe}\u{50cf}\u{8f93}\u{5165}\u{65f6}\u{8fd0}\u{884c}\u{56fe}\u{50cf}\u{63a2}\u{6d4b}\n - \u{6d41}\u{7a0b}\u{ff08}\u{9ad8}\u{5c42}\u{6b21}\u{ff09}\u{ff1a}\n - \u{6d4b}\u{8bd5}\u{751f}\u{6210}\u{4e00}\u{4e2a}\u{5e26}\u{6709}\"CAT\"+ \u{968f}\u{673a}\u{4ee3}\u{7801}\u{7684}\u{5c0f}\u{578b} PNG\u{ff08}`src/gateway/live-image-probe.ts`\u{ff09}\n - \u{901a}\u{8fc7} `agent` `attachments: [{ mimeType: \"image/png\", content: \"<base64>\" }]` \u{53d1}\u{9001}\n - Gateway \u{7f51}\u{5173}\u{5c06}\u{9644}\u{4ef6}\u{89e3}\u{6790}\u{4e3a} `images[]`\u{ff08}`src/gateway/server-methods/agent.ts` + `src/gateway/chat-attachments.ts`\u{ff09}\n - \u{5d4c}\u{5165}\u{5f0f}\u{667a}\u{80fd}\u{4f53}\u{5c06}\u{591a}\u{6a21}\u{6001}\u{7528}\u{6237}\u{6d88}\u{606f}\u{8f6c}\u{53d1}\u{7ed9}\u{6a21}\u{578b}\n - \u{65ad}\u{8a00}\u{ff1a}\u{56de}\u{590d}\u{5305}\u{542b} `cat` + \u{4ee3}\u{7801}\u{ff08}OCR \u{5bb9}\u{5dee}\u{ff1a}\u{5141}\u{8bb8}\u{8f7b}\u{5fae}\u{9519}\u{8bef}\u{ff09}\n\n\u{63d0}\u{793a}\u{ff1a}\u{8981}\u{67e5}\u{770b}\u{4f60}\u{7684}\u{673a}\u{5668}\u{4e0a}\u{53ef}\u{4ee5}\u{6d4b}\u{8bd5}\u{4ec0}\u{4e48}\u{ff08}\u{4ee5}\u{53ca}\u{786e}\u{5207}\u{7684} `provider/model` ID\u{ff09}\u{ff0c}\u{8fd0}\u{884c}\u{ff1a}\n\n```bash\nopenclaw models list\nopenclaw models list --json\n```\n\n## \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{ff1a}Anthropic \u{8bbe}\u{7f6e}\u{4ee4}\u{724c}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\n\n- \u{6d4b}\u{8bd5}\u{ff1a}`src/agents/anthropic.setup-token.live.test.ts`\n- \u{76ee}\u{6807}\u{ff1a}\u{9a8c}\u{8bc1} Claude Code CLI \u{8bbe}\u{7f6e}\u{4ee4}\u{724c}\u{ff08}\u{6216}\u{7c98}\u{8d34}\u{7684}\u{8bbe}\u{7f6e}\u{4ee4}\u{724c}\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{ff09}\u{80fd}\u{5b8c}\u{6210} Anthropic \u{63d0}\u{793a}\u{3002}\n- \u{542f}\u{7528}\u{ff1a}\n - `pnpm test:live`\u{ff08}\u{6216}\u{76f4}\u{63a5}\u{8c03}\u{7528} Vitest \u{65f6}\u{4f7f}\u{7528} `OPENCLAW_LIVE_TEST=1`\u{ff09}\n - `OPENCLAW_LIVE_SETUP_TOKEN=1`\n- \u{4ee4}\u{724c}\u{6765}\u{6e90}\u{ff08}\u{9009}\u{62e9}\u{4e00}\u{4e2a}\u{ff09}\u{ff1a}\n - \u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{ff1a}`OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test`\n - \u{539f}\u{59cb}\u{4ee4}\u{724c}\u{ff1a}`OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...`\n- \u{6a21}\u{578b}\u{8986}\u{76d6}\u{ff08}\u{53ef}\u{9009}\u{ff09}\u{ff1a}\n - `OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-5`\n\n\u{8bbe}\u{7f6e}\u{793a}\u{4f8b}\u{ff1a}\n\n```bash\nopenclaw models auth paste-token --provider anthropic --profile-id anthropic:setup-token-test\nOPENCLAW_LIVE_SETUP_TOKEN=1 OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test pnpm test:live src/agents/anthropic.setup-token.live.test.ts\n```\n\n## \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{ff1a}CLI \u{540e}\u{7aef}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff08}Claude Code CLI \u{6216}\u{5176}\u{4ed6}\u{672c}\u{5730} CLI\u{ff09}\n\n- \u{6d4b}\u{8bd5}\u{ff1a}`src/gateway/gateway-cli-backend.live.test.ts`\n- \u{76ee}\u{6807}\u{ff1a}\u{4f7f}\u{7528}\u{672c}\u{5730} CLI \u{540e}\u{7aef}\u{9a8c}\u{8bc1} Gateway \u{7f51}\u{5173} + \u{667a}\u{80fd}\u{4f53}\u{7ba1}\u{9053}\u{ff0c}\u{800c}\u{4e0d}\u{5f71}\u{54cd}\u{4f60}\u{7684}\u{9ed8}\u{8ba4}\u{914d}\u{7f6e}\u{3002}\n- \u{542f}\u{7528}\u{ff1a}\n - `pnpm test:live`\u{ff08}\u{6216}\u{76f4}\u{63a5}\u{8c03}\u{7528} Vitest \u{65f6}\u{4f7f}\u{7528} `OPENCLAW_LIVE_TEST=1`\u{ff09}\n - `OPENCLAW_LIVE_CLI_BACKEND=1`\n- \u{9ed8}\u{8ba4}\u{503c}\u{ff1a}\n - \u{6a21}\u{578b}\u{ff1a}`claude-cli/claude-sonnet-4-5`\n - \u{547d}\u{4ee4}\u{ff1a}`claude`\n - \u{53c2}\u{6570}\u{ff1a}`[\"-p\",\"--output-format\",\"json\",\"--dangerously-skip-permissions\"]`\n- \u{8986}\u{76d6}\u{ff08}\u{53ef}\u{9009}\u{ff09}\u{ff1a}\n - `OPENCLAW_LIVE_CLI_BACKEND_MODEL=\"claude-cli/claude-opus-4-5\"`\n - `OPENCLAW_LIVE_CLI_BACKEND_MODEL=\"codex-cli/gpt-5.2-codex\"`\n - `OPENCLAW_LIVE_CLI_BACKEND_COMMAND=\"/full/path/to/claude\"`\n - `OPENCLAW_LIVE_CLI_BACKEND_ARGS=\'[\"-p\",\"--output-format\",\"json\",\"--permission-mode\",\"bypassPermissions\"]\'`\n - `OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV=\'[\"ANTHROPIC_API_KEY\",\"ANTHROPIC_API_KEY_OLD\"]\'`\n - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1` \u{53d1}\u{9001}\u{771f}\u{5b9e}\u{56fe}\u{50cf}\u{9644}\u{4ef6}\u{ff08}\u{8def}\u{5f84}\u{6ce8}\u{5165}\u{5230}\u{63d0}\u{793a}\u{4e2d}\u{ff09}\u{3002}\n - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG=\"--image\"` \u{5c06}\u{56fe}\u{50cf}\u{6587}\u{4ef6}\u{8def}\u{5f84}\u{4f5c}\u{4e3a} CLI \u{53c2}\u{6570}\u{4f20}\u{9012}\u{800c}\u{975e}\u{63d0}\u{793a}\u{6ce8}\u{5165}\u{3002}\n - `OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE=\"repeat\"`\u{ff08}\u{6216} `\"list\"`\u{ff09}\u{63a7}\u{5236}\u{8bbe}\u{7f6e} `IMAGE_ARG` \u{65f6}\u{5982}\u{4f55}\u{4f20}\u{9012}\u{56fe}\u{50cf}\u{53c2}\u{6570}\u{3002}\n - `OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1` \u{53d1}\u{9001}\u{7b2c}\u{4e8c}\u{8f6e}\u{5e76}\u{9a8c}\u{8bc1}\u{6062}\u{590d}\u{6d41}\u{7a0b}\u{3002}\n- `OPENCLAW_LIVE_CLI_BACKEND_DISABLE_MCP_CONFIG=0` \u{4fdd}\u{6301} Claude Code CLI MCP \u{914d}\u{7f6e}\u{542f}\u{7528}\u{ff08}\u{9ed8}\u{8ba4}\u{4f7f}\u{7528}\u{4e34}\u{65f6}\u{7a7a}\u{6587}\u{4ef6}\u{7981}\u{7528} MCP \u{914d}\u{7f6e}\u{ff09}\u{3002}\n\n\u{793a}\u{4f8b}\u{ff1a}\n\n```bash\nOPENCLAW_LIVE_CLI_BACKEND=1 \\\n OPENCLAW_LIVE_CLI_BACKEND_MODEL=\"claude-cli/claude-sonnet-4-5\" \\\n pnpm test:live src/gateway/gateway-cli-backend.live.test.ts\n```\n\n### \u{63a8}\u{8350}\u{7684}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{914d}\u{65b9}\n\n\u{7f29}\u{5c0f}\u{8303}\u{56f4}\u{7684}\u{663e}\u{5f0f}\u{5141}\u{8bb8}\u{5217}\u{8868}\u{6700}\u{5feb}\u{4e14}\u{6700}\u{4e0d}\u{6613}\u{51fa}\u{9519}\u{ff1a}\n\n- \u{5355}\u{4e2a}\u{6a21}\u{578b}\u{ff0c}\u{76f4}\u{63a5}\u{6d4b}\u{8bd5}\u{ff08}\u{65e0} Gateway \u{7f51}\u{5173}\u{ff09}\u{ff1a}\n - `OPENCLAW_LIVE_MODELS=\"openai/gpt-5.2\" pnpm test:live src/agents/models.profiles.live.test.ts`\n\n- \u{5355}\u{4e2a}\u{6a21}\u{578b}\u{ff0c}Gateway \u{7f51}\u{5173}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff1a}\n - `OPENCLAW_LIVE_GATEWAY_MODELS=\"openai/gpt-5.2\" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`\n\n- \u{8de8}\u{591a}\u{4e2a}\u{63d0}\u{4f9b}\u{5546}\u{7684}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{ff1a}\n - `OPENCLAW_LIVE_GATEWAY_MODELS=\"openai/gpt-5.2,anthropic/claude-opus-4-5,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.1\" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`\n\n- Google \u{4e13}\u{9879}\u{ff08}Gemini API \u{5bc6}\u{94a5} + Antigravity\u{ff09}\u{ff1a}\n - Gemini\u{ff08}API \u{5bc6}\u{94a5}\u{ff09}\u{ff1a}`OPENCLAW_LIVE_GATEWAY_MODELS=\"google/gemini-3-flash-preview\" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`\n - Antigravity\u{ff08}OAuth\u{ff09}\u{ff1a}`OPENCLAW_LIVE_GATEWAY_MODELS=\"google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high\" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`\n\n\u{6ce8}\u{610f}\u{ff1a}\n\n- `google/...` \u{4f7f}\u{7528} Gemini API\u{ff08}API \u{5bc6}\u{94a5}\u{ff09}\u{3002}\n- `google-antigravity/...` \u{4f7f}\u{7528} Antigravity OAuth \u{6865}\u{63a5}\u{ff08}Cloud Code Assist \u{98ce}\u{683c}\u{7684}\u{667a}\u{80fd}\u{4f53}\u{7aef}\u{70b9}\u{ff09}\u{3002}\n- `google-gemini-cli/...` \u{4f7f}\u{7528}\u{4f60}\u{673a}\u{5668}\u{4e0a}\u{7684}\u{672c}\u{5730} Gemini CLI\u{ff08}\u{72ec}\u{7acb}\u{7684}\u{8ba4}\u{8bc1} + \u{5de5}\u{5177}\u{602a}\u{7656}\u{ff09}\u{3002}\n- Gemini API \u{4e0e} Gemini CLI\u{ff1a}\n - API\u{ff1a}OpenClaw \u{901a}\u{8fc7} HTTP \u{8c03}\u{7528} Google \u{6258}\u{7ba1}\u{7684} Gemini API\u{ff08}API \u{5bc6}\u{94a5}/\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{8ba4}\u{8bc1}\u{ff09}\u{ff1b}\u{8fd9}\u{662f}\u{5927}\u{591a}\u{6570}\u{7528}\u{6237}\u{8bf4}\u{7684}\"Gemini\"\u{3002}\n - CLI\u{ff1a}OpenClaw \u{8c03}\u{7528}\u{672c}\u{5730} `gemini` \u{4e8c}\u{8fdb}\u{5236}\u{6587}\u{4ef6}\u{ff1b}\u{5b83}\u{6709}\u{81ea}\u{5df1}\u{7684}\u{8ba4}\u{8bc1}\u{ff0c}\u{884c}\u{4e3a}\u{53ef}\u{80fd}\u{4e0d}\u{540c}\u{ff08}\u{6d41}\u{5f0f}\u{4f20}\u{8f93}/\u{5de5}\u{5177}\u{652f}\u{6301}/\u{7248}\u{672c}\u{5dee}\u{5f02}\u{ff09}\u{3002}\n\n## \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{ff1a}\u{6a21}\u{578b}\u{77e9}\u{9635}\u{ff08}\u{6211}\u{4eec}\u{8986}\u{76d6}\u{4ec0}\u{4e48}\u{ff09}\n\n\u{6ca1}\u{6709}\u{56fa}\u{5b9a}\u{7684}\"CI \u{6a21}\u{578b}\u{5217}\u{8868}\"\u{ff08}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{662f}\u{53ef}\u{9009}\u{7684}\u{ff09}\u{ff0c}\u{4f46}\u{8fd9}\u{4e9b}\u{662f}\u{5efa}\u{8bae}\u{5728}\u{6709}\u{5bc6}\u{94a5}\u{7684}\u{5f00}\u{53d1}\u{673a}\u{5668}\u{4e0a}\u{5b9a}\u{671f}\u{8986}\u{76d6}\u{7684}**\u{63a8}\u{8350}**\u{6a21}\u{578b}\u{3002}\n\n### \u{73b0}\u{4ee3}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{96c6}\u{ff08}\u{5de5}\u{5177}\u{8c03}\u{7528} + \u{56fe}\u{50cf}\u{ff09}\n\n\u{8fd9}\u{662f}\u{6211}\u{4eec}\u{671f}\u{671b}\u{4fdd}\u{6301}\u{5de5}\u{4f5c}\u{7684}\"\u{5e38}\u{7528}\u{6a21}\u{578b}\"\u{8fd0}\u{884c}\u{ff1a}\n\n- OpenAI\u{ff08}\u{975e} Codex\u{ff09}\u{ff1a}`openai/gpt-5.2`\u{ff08}\u{53ef}\u{9009}\u{ff1a}`openai/gpt-5.1`\u{ff09}\n- OpenAI Codex\u{ff1a}`openai-codex/gpt-5.2`\u{ff08}\u{53ef}\u{9009}\u{ff1a}`openai-codex/gpt-5.2-codex`\u{ff09}\n- Anthropic\u{ff1a}`anthropic/claude-opus-4-5`\u{ff08}\u{6216} `anthropic/claude-sonnet-4-5`\u{ff09}\n- Google\u{ff08}Gemini API\u{ff09}\u{ff1a}`google/gemini-3-pro-preview` \u{548c} `google/gemini-3-flash-preview`\u{ff08}\u{907f}\u{514d}\u{8f83}\u{65e7}\u{7684} Gemini 2.x \u{6a21}\u{578b}\u{ff09}\n- Google\u{ff08}Antigravity\u{ff09}\u{ff1a}`google-antigravity/claude-opus-4-6-thinking` \u{548c} `google-antigravity/gemini-3-flash`\n- Z.AI\u{ff08}GLM\u{ff09}\u{ff1a}`zai/glm-4.7`\n- MiniMax\u{ff1a}`minimax/minimax-m2.1`\n\n\u{8fd0}\u{884c}\u{5e26}\u{5de5}\u{5177} + \u{56fe}\u{50cf}\u{7684} Gateway \u{7f51}\u{5173}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff1a}\n`OPENCLAW_LIVE_GATEWAY_MODELS=\"openai/gpt-5.2,openai-codex/gpt-5.2,anthropic/claude-opus-4-5,google/gemini-3-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.1\" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`\n\n### \u{57fa}\u{7ebf}\u{ff1a}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{ff08}Read + \u{53ef}\u{9009} Exec\u{ff09}\n\n\u{6bcf}\u{4e2a}\u{63d0}\u{4f9b}\u{5546}\u{7cfb}\u{5217}\u{81f3}\u{5c11}\u{9009}\u{62e9}\u{4e00}\u{4e2a}\u{ff1a}\n\n- OpenAI\u{ff1a}`openai/gpt-5.2`\u{ff08}\u{6216} `openai/gpt-5-mini`\u{ff09}\n- Anthropic\u{ff1a}`anthropic/claude-opus-4-5`\u{ff08}\u{6216} `anthropic/claude-sonnet-4-5`\u{ff09}\n- Google\u{ff1a}`google/gemini-3-flash-preview`\u{ff08}\u{6216} `google/gemini-3-pro-preview`\u{ff09}\n- Z.AI\u{ff08}GLM\u{ff09}\u{ff1a}`zai/glm-4.7`\n- MiniMax\u{ff1a}`minimax/minimax-m2.1`\n\n\u{53ef}\u{9009}\u{7684}\u{989d}\u{5916}\u{8986}\u{76d6}\u{ff08}\u{9526}\u{4e0a}\u{6dfb}\u{82b1}\u{ff09}\u{ff1a}\n\n- xAI\u{ff1a}`xai/grok-4`\u{ff08}\u{6216}\u{6700}\u{65b0}\u{53ef}\u{7528}\u{7248}\u{672c}\u{ff09}\n- Mistral\u{ff1a}`mistral/`\u{2026}\u{ff08}\u{9009}\u{62e9}\u{4e00}\u{4e2a}\u{4f60}\u{5df2}\u{542f}\u{7528}\u{7684}\"\u{5de5}\u{5177}\"\u{80fd}\u{529b}\u{6a21}\u{578b}\u{ff09}\n- Cerebras\u{ff1a}`cerebras/`\u{2026}\u{ff08}\u{5982}\u{679c}\u{4f60}\u{6709}\u{8bbf}\u{95ee}\u{6743}\u{9650}\u{ff09}\n- LM Studio\u{ff1a}`lmstudio/`\u{2026}\u{ff08}\u{672c}\u{5730}\u{ff1b}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{53d6}\u{51b3}\u{4e8e} API \u{6a21}\u{5f0f}\u{ff09}\n\n### \u{89c6}\u{89c9}\u{ff1a}\u{56fe}\u{50cf}\u{53d1}\u{9001}\u{ff08}\u{9644}\u{4ef6} \u{2192} \u{591a}\u{6a21}\u{6001}\u{6d88}\u{606f}\u{ff09}\n\n\u{5728} `OPENCLAW_LIVE_GATEWAY_MODELS` \u{4e2d}\u{81f3}\u{5c11}\u{5305}\u{542b}\u{4e00}\u{4e2a}\u{652f}\u{6301}\u{56fe}\u{50cf}\u{7684}\u{6a21}\u{578b}\u{ff08}Claude/Gemini/OpenAI \u{89c6}\u{89c9}\u{80fd}\u{529b}\u{53d8}\u{4f53}\u{7b49}\u{ff09}\u{4ee5}\u{6d4b}\u{8bd5}\u{56fe}\u{50cf}\u{63a2}\u{6d4b}\u{3002}\n\n### \u{805a}\u{5408}\u{5668}/\u{66ff}\u{4ee3} Gateway \u{7f51}\u{5173}\n\n\u{5982}\u{679c}\u{4f60}\u{542f}\u{7528}\u{4e86}\u{5bc6}\u{94a5}\u{ff0c}\u{6211}\u{4eec}\u{4e5f}\u{652f}\u{6301}\u{901a}\u{8fc7}\u{4ee5}\u{4e0b}\u{65b9}\u{5f0f}\u{6d4b}\u{8bd5}\u{ff1a}\n\n- OpenRouter\u{ff1a}`openrouter/...`\u{ff08}\u{6570}\u{767e}\u{4e2a}\u{6a21}\u{578b}\u{ff1b}\u{4f7f}\u{7528} `openclaw models scan` \u{67e5}\u{627e}\u{652f}\u{6301}\u{5de5}\u{5177}+\u{56fe}\u{50cf}\u{7684}\u{5019}\u{9009}\u{6a21}\u{578b}\u{ff09}\n- OpenCode Zen\u{ff1a}`opencode/...`\u{ff08}\u{901a}\u{8fc7} `OPENCODE_API_KEY` / `OPENCODE_ZEN_API_KEY` \u{8ba4}\u{8bc1}\u{ff09}\n\n\u{5982}\u{679c}\u{4f60}\u{6709}\u{51ed}\u{8bc1}/\u{914d}\u{7f6e}\u{ff0c}\u{53ef}\u{4ee5}\u{5728}\u{5b9e}\u{65f6}\u{77e9}\u{9635}\u{4e2d}\u{5305}\u{542b}\u{66f4}\u{591a}\u{63d0}\u{4f9b}\u{5546}\u{ff1a}\n\n- \u{5185}\u{7f6e}\u{ff1a}`openai`\u{3001}`openai-codex`\u{3001}`anthropic`\u{3001}`google`\u{3001}`google-vertex`\u{3001}`google-antigravity`\u{3001}`google-gemini-cli`\u{3001}`zai`\u{3001}`openrouter`\u{3001}`opencode`\u{3001}`xai`\u{3001}`groq`\u{3001}`cerebras`\u{3001}`mistral`\u{3001}`github-copilot`\n- \u{901a}\u{8fc7} `models.providers`\u{ff08}\u{81ea}\u{5b9a}\u{4e49}\u{7aef}\u{70b9}\u{ff09}\u{ff1a}`minimax`\u{ff08}\u{4e91}/API\u{ff09}\u{ff0c}\u{4ee5}\u{53ca}\u{4efb}\u{4f55} OpenAI/Anthropic \u{517c}\u{5bb9}\u{4ee3}\u{7406}\u{ff08}LM Studio\u{3001}vLLM\u{3001}LiteLLM \u{7b49}\u{ff09}\n\n\u{63d0}\u{793a}\u{ff1a}\u{4e0d}\u{8981}\u{8bd5}\u{56fe}\u{5728}\u{6587}\u{6863}\u{4e2d}\u{786c}\u{7f16}\u{7801}\"\u{6240}\u{6709}\u{6a21}\u{578b}\"\u{3002}\u{6743}\u{5a01}\u{5217}\u{8868}\u{662f}\u{4f60}\u{673a}\u{5668}\u{4e0a} `discoverModels(...)` \u{8fd4}\u{56de}\u{7684}\u{5185}\u{5bb9} + \u{53ef}\u{7528}\u{7684}\u{5bc6}\u{94a5}\u{3002}\n\n## \u{51ed}\u{8bc1}\u{ff08}\u{7edd}\u{4e0d}\u{63d0}\u{4ea4}\u{ff09}\n\n\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{4ee5}\u{4e0e} CLI \u{76f8}\u{540c}\u{7684}\u{65b9}\u{5f0f}\u{53d1}\u{73b0}\u{51ed}\u{8bc1}\u{3002}\u{5b9e}\u{9645}\u{542b}\u{4e49}\u{ff1a}\n\n- \u{5982}\u{679c} CLI \u{80fd}\u{5de5}\u{4f5c}\u{ff0c}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{5e94}\u{8be5}\u{80fd}\u{627e}\u{5230}\u{76f8}\u{540c}\u{7684}\u{5bc6}\u{94a5}\u{3002}\n- \u{5982}\u{679c}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{8bf4}\"\u{65e0}\u{51ed}\u{8bc1}\"\u{ff0c}\u{7528}\u{8c03}\u{8bd5} `openclaw models list`/\u{6a21}\u{578b}\u{9009}\u{62e9}\u{76f8}\u{540c}\u{7684}\u{65b9}\u{5f0f}\u{8c03}\u{8bd5}\u{3002}\n\n- \u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{5b58}\u{50a8}\u{ff1a}`~/.openclaw/credentials/`\u{ff08}\u{9996}\u{9009}\u{ff1b}\u{6d4b}\u{8bd5}\u{4e2d}\"\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{5bc6}\u{94a5}\"\u{7684}\u{542b}\u{4e49}\u{ff09}\n- \u{914d}\u{7f6e}\u{ff1a}`~/.openclaw/openclaw.json`\u{ff08}\u{6216} `OPENCLAW_CONFIG_PATH`\u{ff09}\n\n\u{5982}\u{679c}\u{4f60}\u{60f3}\u{4f9d}\u{8d56}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{5bc6}\u{94a5}\u{ff08}\u{4f8b}\u{5982}\u{5728} `~/.profile` \u{4e2d}\u{5bfc}\u{51fa}\u{7684}\u{ff09}\u{ff0c}\u{5728} `source ~/.profile` \u{540e}\u{8fd0}\u{884c}\u{672c}\u{5730}\u{6d4b}\u{8bd5}\u{ff0c}\u{6216}\u{4f7f}\u{7528}\u{4e0b}\u{9762}\u{7684} Docker \u{8fd0}\u{884c}\u{5668}\u{ff08}\u{5b83}\u{4eec}\u{53ef}\u{4ee5}\u{5c06} `~/.profile` \u{6302}\u{8f7d}\u{5230}\u{5bb9}\u{5668}\u{4e2d}\u{ff09}\u{3002}\n\n## Deepgram \u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{ff08}\u{97f3}\u{9891}\u{8f6c}\u{5f55}\u{ff09}\n\n- \u{6d4b}\u{8bd5}\u{ff1a}`src/media-understanding/providers/deepgram/audio.live.test.ts`\n- \u{542f}\u{7528}\u{ff1a}`DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts`\n\n## Docker \u{8fd0}\u{884c}\u{5668}\u{ff08}\u{53ef}\u{9009}\u{7684}\"\u{5728} Linux \u{4e2d}\u{5de5}\u{4f5c}\"\u{68c0}\u{67e5}\u{ff09}\n\n\u{8fd9}\u{4e9b}\u{5728}\u{4ed3}\u{5e93} Docker \u{955c}\u{50cf}\u{5185}\u{8fd0}\u{884c} `pnpm test:live`\u{ff0c}\u{6302}\u{8f7d}\u{4f60}\u{7684}\u{672c}\u{5730}\u{914d}\u{7f6e}\u{76ee}\u{5f55}\u{548c}\u{5de5}\u{4f5c}\u{533a}\u{ff08}\u{5982}\u{679c}\u{6302}\u{8f7d}\u{4e86} `~/.profile` \u{5219}\u{4f1a}\u{52a0}\u{8f7d}\u{5b83}\u{ff09}\u{ff1a}\n\n- \u{76f4}\u{63a5}\u{6a21}\u{578b}\u{ff1a}`pnpm test:docker:live-models`\u{ff08}\u{811a}\u{672c}\u{ff1a}`scripts/test-live-models-docker.sh`\u{ff09}\n- Gateway \u{7f51}\u{5173} + \u{5f00}\u{53d1}\u{667a}\u{80fd}\u{4f53}\u{ff1a}`pnpm test:docker:live-gateway`\u{ff08}\u{811a}\u{672c}\u{ff1a}`scripts/test-live-gateway-models-docker.sh`\u{ff09}\n- \u{65b0}\u{624b}\u{5f15}\u{5bfc}\u{5411}\u{5bfc}\u{ff08}TTY\u{ff0c}\u{5b8c}\u{6574}\u{811a}\u{624b}\u{67b6}\u{ff09}\u{ff1a}`pnpm test:docker:onboard`\u{ff08}\u{811a}\u{672c}\u{ff1a}`scripts/e2e/onboard-docker.sh`\u{ff09}\n- Gateway \u{7f51}\u{5173}\u{7f51}\u{7edc}\u{ff08}\u{4e24}\u{4e2a}\u{5bb9}\u{5668}\u{ff0c}WS \u{8ba4}\u{8bc1} + \u{5065}\u{5eb7}\u{68c0}\u{67e5}\u{ff09}\u{ff1a}`pnpm test:docker:gateway-network`\u{ff08}\u{811a}\u{672c}\u{ff1a}`scripts/e2e/gateway-network-docker.sh`\u{ff09}\n- \u{63d2}\u{4ef6}\u{ff08}\u{81ea}\u{5b9a}\u{4e49}\u{6269}\u{5c55}\u{52a0}\u{8f7d} + \u{6ce8}\u{518c}\u{8868}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{ff09}\u{ff1a}`pnpm test:docker:plugins`\u{ff08}\u{811a}\u{672c}\u{ff1a}`scripts/e2e/plugins-docker.sh`\u{ff09}\n\n\u{6709}\u{7528}\u{7684}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{ff1a}\n\n- `OPENCLAW_CONFIG_DIR=...`\u{ff08}\u{9ed8}\u{8ba4}\u{ff1a}`~/.openclaw`\u{ff09}\u{6302}\u{8f7d}\u{5230} `/home/node/.openclaw`\n- `OPENCLAW_WORKSPACE_DIR=...`\u{ff08}\u{9ed8}\u{8ba4}\u{ff1a}`~/.openclaw/workspace`\u{ff09}\u{6302}\u{8f7d}\u{5230} `/home/node/.openclaw/workspace`\n- `OPENCLAW_PROFILE_FILE=...`\u{ff08}\u{9ed8}\u{8ba4}\u{ff1a}`~/.profile`\u{ff09}\u{6302}\u{8f7d}\u{5230} `/home/node/.profile` \u{5e76}\u{5728}\u{8fd0}\u{884c}\u{6d4b}\u{8bd5}\u{524d}\u{52a0}\u{8f7d}\n- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` \u{7528}\u{4e8e}\u{7f29}\u{5c0f}\u{8fd0}\u{884c}\u{8303}\u{56f4}\n- `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` \u{786e}\u{4fdd}\u{51ed}\u{8bc1}\u{6765}\u{81ea}\u{914d}\u{7f6e}\u{6587}\u{4ef6}\u{5b58}\u{50a8}\u{ff08}\u{800c}\u{975e}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{ff09}\n\n## \u{6587}\u{6863}\u{5b8c}\u{6574}\u{6027}\u{68c0}\u{67e5}\n\n\u{6587}\u{6863}\u{7f16}\u{8f91}\u{540e}\u{8fd0}\u{884c}\u{6587}\u{6863}\u{68c0}\u{67e5}\u{ff1a}`pnpm docs:list`\u{3002}\n\n## \u{79bb}\u{7ebf}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\u{ff08}CI \u{5b89}\u{5168}\u{ff09}\n\n\u{8fd9}\u{4e9b}\u{662f}\u{6ca1}\u{6709}\u{771f}\u{5b9e}\u{63d0}\u{4f9b}\u{5546}\u{7684}\"\u{771f}\u{5b9e}\u{7ba1}\u{9053}\"\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\u{ff1a}\n\n- Gateway \u{7f51}\u{5173}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{ff08}\u{6a21}\u{62df} OpenAI\u{ff0c}\u{771f}\u{5b9e} Gateway \u{7f51}\u{5173} + \u{667a}\u{80fd}\u{4f53}\u{5faa}\u{73af}\u{ff09}\u{ff1a}`src/gateway/gateway.tool-calling.mock-openai.test.ts`\n- Gateway \u{7f51}\u{5173}\u{5411}\u{5bfc}\u{ff08}WS `wizard.start`/`wizard.next`\u{ff0c}\u{5199}\u{5165}\u{914d}\u{7f6e} + \u{5f3a}\u{5236}\u{8ba4}\u{8bc1}\u{ff09}\u{ff1a}`src/gateway/gateway.wizard.e2e.test.ts`\n\n## \u{667a}\u{80fd}\u{4f53}\u{53ef}\u{9760}\u{6027}\u{8bc4}\u{4f30}\u{ff08}Skills\u{ff09}\n\n\u{6211}\u{4eec}\u{5df2}\u{7ecf}\u{6709}\u{4e00}\u{4e9b} CI \u{5b89}\u{5168}\u{7684}\u{6d4b}\u{8bd5}\u{ff0c}\u{5b83}\u{4eec}\u{7684}\u{884c}\u{4e3a}\u{7c7b}\u{4f3c}\u{4e8e}\"\u{667a}\u{80fd}\u{4f53}\u{53ef}\u{9760}\u{6027}\u{8bc4}\u{4f30}\"\u{ff1a}\n\n- \u{901a}\u{8fc7}\u{771f}\u{5b9e} Gateway \u{7f51}\u{5173} + \u{667a}\u{80fd}\u{4f53}\u{5faa}\u{73af}\u{7684}\u{6a21}\u{62df}\u{5de5}\u{5177}\u{8c03}\u{7528}\u{ff08}`src/gateway/gateway.tool-calling.mock-openai.test.ts`\u{ff09}\u{3002}\n- \u{9a8c}\u{8bc1}\u{4f1a}\u{8bdd}\u{8fde}\u{63a5}\u{548c}\u{914d}\u{7f6e}\u{6548}\u{679c}\u{7684}\u{7aef}\u{5230}\u{7aef}\u{5411}\u{5bfc}\u{6d41}\u{7a0b}\u{ff08}`src/gateway/gateway.wizard.e2e.test.ts`\u{ff09}\u{3002}\n\n\u{5bf9}\u{4e8e} Skills \u{4ecd}\u{7136}\u{7f3a}\u{5c11}\u{7684}\u{5185}\u{5bb9}\u{ff08}\u{53c2}\u{89c1} [Skills](/tools/skills)\u{ff09}\u{ff1a}\n\n- **\u{51b3}\u{7b56}\u{ff1a}** \u{5f53} Skills \u{5728}\u{63d0}\u{793a}\u{4e2d}\u{5217}\u{51fa}\u{65f6}\u{ff0c}\u{667a}\u{80fd}\u{4f53}\u{662f}\u{5426}\u{9009}\u{62e9}\u{6b63}\u{786e}\u{7684} skill\u{ff08}\u{6216}\u{907f}\u{514d}\u{4e0d}\u{76f8}\u{5173}\u{7684}\u{ff09}\u{ff1f}\n- **\u{5408}\u{89c4}\u{6027}\u{ff1a}** \u{667a}\u{80fd}\u{4f53}\u{662f}\u{5426}\u{5728}\u{4f7f}\u{7528}\u{524d}\u{8bfb}\u{53d6} `SKILL.md` \u{5e76}\u{9075}\u{5faa}\u{6240}\u{9700}\u{7684}\u{6b65}\u{9aa4}/\u{53c2}\u{6570}\u{ff1f}\n- **\u{5de5}\u{4f5c}\u{6d41}\u{5951}\u{7ea6}\u{ff1a}** \u{65ad}\u{8a00}\u{5de5}\u{5177}\u{987a}\u{5e8f}\u{3001}\u{4f1a}\u{8bdd}\u{5386}\u{53f2}\u{5ef6}\u{7eed}\u{548c}\u{6c99}\u{7bb1}\u{8fb9}\u{754c}\u{7684}\u{591a}\u{8f6e}\u{573a}\u{666f}\u{3002}\n\n\u{672a}\u{6765}\u{7684}\u{8bc4}\u{4f30}\u{5e94}\u{8be5}\u{9996}\u{5148}\u{4fdd}\u{6301}\u{786e}\u{5b9a}\u{6027}\u{ff1a}\n\n- \u{4f7f}\u{7528}\u{6a21}\u{62df}\u{63d0}\u{4f9b}\u{5546}\u{6765}\u{65ad}\u{8a00}\u{5de5}\u{5177}\u{8c03}\u{7528} + \u{987a}\u{5e8f}\u{3001}skill \u{6587}\u{4ef6}\u{8bfb}\u{53d6}\u{548c}\u{4f1a}\u{8bdd}\u{8fde}\u{63a5}\u{7684}\u{573a}\u{666f}\u{8fd0}\u{884c}\u{5668}\u{3002}\n- \u{4e00}\u{5c0f}\u{5957}\u{4e13}\u{6ce8}\u{4e8e} skill \u{7684}\u{573a}\u{666f}\u{ff08}\u{4f7f}\u{7528} vs \u{907f}\u{514d}\u{3001}\u{95e8}\u{63a7}\u{3001}\u{63d0}\u{793a}\u{6ce8}\u{5165}\u{ff09}\u{3002}\n- \u{53ef}\u{9009}\u{7684}\u{5b9e}\u{65f6}\u{8bc4}\u{4f30}\u{ff08}\u{53ef}\u{9009}\u{7684}\u{ff0c}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{95e8}\u{63a7}\u{ff09}\u{ff0c}\u{4ec5}\u{5728} CI \u{5b89}\u{5168}\u{5957}\u{4ef6}\u{5c31}\u{4f4d}\u{540e}\u{3002}\n\n## \u{6dfb}\u{52a0}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\u{ff08}\u{6307}\u{5bfc}\u{ff09}\n\n\u{5f53}\u{4f60}\u{4fee}\u{590d}\u{5728}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{4e2d}\u{53d1}\u{73b0}\u{7684}\u{63d0}\u{4f9b}\u{5546}/\u{6a21}\u{578b}\u{95ee}\u{9898}\u{65f6}\u{ff1a}\n\n- \u{5982}\u{679c}\u{53ef}\u{80fd}\u{ff0c}\u{6dfb}\u{52a0} CI \u{5b89}\u{5168}\u{7684}\u{56de}\u{5f52}\u{6d4b}\u{8bd5}\u{ff08}\u{6a21}\u{62df}/\u{5b58}\u{6839}\u{63d0}\u{4f9b}\u{5546}\u{ff0c}\u{6216}\u{6355}\u{83b7}\u{786e}\u{5207}\u{7684}\u{8bf7}\u{6c42}\u{5f62}\u{72b6}\u{8f6c}\u{6362}\u{ff09}\n- \u{5982}\u{679c}\u{5b83}\u{672c}\u{8d28}\u{4e0a}\u{662f}\u{4ec5}\u{9650}\u{5b9e}\u{65f6}\u{7684}\u{ff08}\u{901f}\u{7387}\u{9650}\u{5236}\u{3001}\u{8ba4}\u{8bc1}\u{7b56}\u{7565}\u{ff09}\u{ff0c}\u{4fdd}\u{6301}\u{5b9e}\u{65f6}\u{6d4b}\u{8bd5}\u{8303}\u{56f4}\u{5c0f}\u{4e14}\u{901a}\u{8fc7}\u{73af}\u{5883}\u{53d8}\u{91cf}\u{53ef}\u{9009}\n- \u{4f18}\u{5148}\u{9488}\u{5bf9}\u{80fd}\u{6355}\u{83b7}\u{95ee}\u{9898}\u{7684}\u{6700}\u{5c0f}\u{5c42}\u{ff1a}\n - \u{63d0}\u{4f9b}\u{5546}\u{8bf7}\u{6c42}\u{8f6c}\u{6362}/\u{91cd}\u{653e}\u{95ee}\u{9898} \u{2192} \u{76f4}\u{63a5}\u{6a21}\u{578b}\u{6d4b}\u{8bd5}\n - Gateway \u{7f51}\u{5173}\u{4f1a}\u{8bdd}/\u{5386}\u{53f2}/\u{5de5}\u{5177}\u{7ba1}\u{9053}\u{95ee}\u{9898} \u{2192} Gateway \u{7f51}\u{5173}\u{5b9e}\u{65f6}\u{5192}\u{70df}\u{6d4b}\u{8bd5}\u{6216} CI \u{5b89}\u{5168}\u{7684} Gateway \u{7f51}\u{5173}\u{6a21}\u{62df}\u{6d4b}\u{8bd5}\n";