{"repo": "anxiong2025/wechat-ai", "files": {"src/config.ts": {"0c2830e2b3d538db4733241c42bd5c30758047b0": {"t": 1785745562.1247766, "n": 4269, "h": "887b082ea8010ddf", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"claw-agent\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"claw-agent\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"claw-agent\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"claw-agent\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"claw-agent\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"claw-agent\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n kimi: {\n type: \"claw-agent\",\n baseUrl: \"https://api.moonshot.cn/v1\",\n model: \"moonshot-v1-8k\",\n apiKeyEnv: \"MOONSHOT_API_KEY\",\n },\n openrouter: {\n type: \"claw-agent\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n model: \"google/gemini-2.5-flash\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n discord: {\n type: \"discord\",\n enabled: false,\n // token: \"your-bot-token\",\n },\n whatsapp: {\n type: \"whatsapp\",\n enabled: false,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Always reply in the same language the user uses. Respond concisely.\",\n chunkSize: 4000,\n skills: {\n translator: {\n description: \"中英翻译助手\",\n systemPrompt: \"You are a professional translator. Translate Chinese to English and English to Chinese. Only output the translation, no explanations.\",\n },\n coder: {\n description: \"编程助手\",\n systemPrompt: \"You are a senior software engineer. Help with coding questions. Be concise and provide code examples.\",\n },\n writer: {\n description: \"写作助手\",\n systemPrompt: \"You are a skilled writer. Help with writing, editing, and polishing text. Match the user's language.\",\n },\n },\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "3b91bba8fa7b3039f3537cb12204a3bff1edc2a7": {"t": 1785754237.8647976, "n": 4269, "h": "887b082ea8010ddf", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"claw-agent\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"claw-agent\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"claw-agent\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"claw-agent\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"claw-agent\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"claw-agent\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n kimi: {\n type: \"claw-agent\",\n baseUrl: \"https://api.moonshot.cn/v1\",\n model: \"moonshot-v1-8k\",\n apiKeyEnv: \"MOONSHOT_API_KEY\",\n },\n openrouter: {\n type: \"claw-agent\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n model: \"google/gemini-2.5-flash\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n discord: {\n type: \"discord\",\n enabled: false,\n // token: \"your-bot-token\",\n },\n whatsapp: {\n type: \"whatsapp\",\n enabled: false,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Always reply in the same language the user uses. Respond concisely.\",\n chunkSize: 4000,\n skills: {\n translator: {\n description: \"中英翻译助手\",\n systemPrompt: \"You are a professional translator. Translate Chinese to English and English to Chinese. Only output the translation, no explanations.\",\n },\n coder: {\n description: \"编程助手\",\n systemPrompt: \"You are a senior software engineer. Help with coding questions. Be concise and provide code examples.\",\n },\n writer: {\n description: \"写作助手\",\n systemPrompt: \"You are a skilled writer. Help with writing, editing, and polishing text. Match the user's language.\",\n },\n },\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "96d0b5531cd65ce8a17ac6a5475d52d9fd477444": {"t": 1785754239.18736, "n": 4099, "h": "61e0b5ffdb0fc6ce", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"claw-agent\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"claw-agent\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"claw-agent\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"claw-agent\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"claw-agent\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"claw-agent\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n kimi: {\n type: \"claw-agent\",\n baseUrl: \"https://api.moonshot.cn/v1\",\n model: \"moonshot-v1-8k\",\n apiKeyEnv: \"MOONSHOT_API_KEY\",\n },\n openrouter: {\n type: \"claw-agent\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n model: \"google/gemini-2.5-flash\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Always reply in the same language the user uses. Respond concisely.\",\n chunkSize: 4000,\n skills: {\n translator: {\n description: \"中英翻译助手\",\n systemPrompt: \"You are a professional translator. Translate Chinese to English and English to Chinese. Only output the translation, no explanations.\",\n },\n coder: {\n description: \"编程助手\",\n systemPrompt: \"You are a senior software engineer. Help with coding questions. Be concise and provide code examples.\",\n },\n writer: {\n description: \"写作助手\",\n systemPrompt: \"You are a skilled writer. Help with writing, editing, and polishing text. Match the user's language.\",\n },\n },\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "51b6b89f724a98038a3c292028bcf2f85103ee2b": {"t": 1785754240.4049788, "n": 3941, "h": "6d0b61bd52119ef4", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"claw-agent\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"claw-agent\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"claw-agent\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"claw-agent\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"claw-agent\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"claw-agent\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n openrouter: {\n type: \"claw-agent\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n model: \"google/gemini-2.5-flash\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Always reply in the same language the user uses. Respond concisely.\",\n chunkSize: 4000,\n skills: {\n translator: {\n description: \"中英翻译助手\",\n systemPrompt: \"You are a professional translator. Translate Chinese to English and English to Chinese. Only output the translation, no explanations.\",\n },\n coder: {\n description: \"编程助手\",\n systemPrompt: \"You are a senior software engineer. Help with coding questions. Be concise and provide code examples.\",\n },\n writer: {\n description: \"写作助手\",\n systemPrompt: \"You are a skilled writer. Help with writing, editing, and polishing text. Match the user's language.\",\n },\n },\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "4617dc2c88692ee27220bc49e4a3d21ad9ea5af2": {"t": 1785754243.6045766, "n": 3941, "h": "4ab0a45bdfd84804", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"openai-compatible\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"openai-compatible\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n openrouter: {\n type: \"openai-compatible\",\n baseUrl: \"https://openrouter.ai/api/v1\",\n model: \"google/gemini-2.5-flash\",\n apiKeyEnv: \"OPENROUTER_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Respond concisely.\",\n chunkSize: 4000,\n skills: {\n translator: {\n description: \"中英翻译助手\",\n systemPrompt: \"You are a professional translator. Translate Chinese to English and English to Chinese. Only output the translation, no explanations.\",\n },\n coder: {\n description: \"编程助手\",\n systemPrompt: \"You are a senior software engineer. Help with coding questions. Be concise and provide code examples.\",\n },\n writer: {\n description: \"写作助手\",\n systemPrompt: \"You are a skilled writer. Help with writing, editing, and polishing text. Match the user's language.\",\n },\n },\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "4524bf42b7d718d5b338933db4d4dfda04870d9f": {"t": 1785754246.1941986, "n": 3757, "h": "fc1a7b2e07dae1dd", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"openai-compatible\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"openai-compatible\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Respond concisely.\",\n chunkSize: 4000,\n skills: {\n translator: {\n description: \"中英翻译助手\",\n systemPrompt: \"You are a professional translator. Translate Chinese to English and English to Chinese. Only output the translation, no explanations.\",\n },\n coder: {\n description: \"编程助手\",\n systemPrompt: \"You are a senior software engineer. Help with coding questions. Be concise and provide code examples.\",\n },\n writer: {\n description: \"写作助手\",\n systemPrompt: \"You are a skilled writer. Help with writing, editing, and polishing text. Match the user's language.\",\n },\n },\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "48e85fb2516160a7332793d68421da5553327b96": {"t": 1785754248.3535023, "n": 3185, "h": "8649f59091de1aa5", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"openai-compatible\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"openai-compatible\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Respond concisely.\",\n chunkSize: 4000,\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n const user = JSON.parse(raw) as Partial;\n\n // Deep merge: default providers + user providers (user overrides per provider)\n const providers = { ...DEFAULT_CONFIG.providers };\n if (user.providers) {\n for (const [key, val] of Object.entries(user.providers)) {\n providers[key] = val;\n }\n }\n\n const config = { ...DEFAULT_CONFIG, ...user, providers } as WaiConfig;\n\n // Migrate: zhipu → glm\n if (config.providers.zhipu) {\n if (!config.providers.glm) {\n config.providers.glm = { ...config.providers.zhipu, apiKeyEnv: \"GLM_API_KEY\" };\n }\n delete config.providers.zhipu;\n if (config.defaultProvider === \"zhipu\") config.defaultProvider = \"glm\";\n await saveConfig(config);\n }\n\n return config;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "0db01e15f08f38b983588d6c262efcb093f9af4b": {"t": 1785754249.651983, "n": 2514, "h": "9d693a564b0052b5", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"openai-compatible\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n glm: {\n type: \"openai-compatible\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"GLM_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Respond concisely.\",\n chunkSize: 4000,\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n return { ...DEFAULT_CONFIG, ...JSON.parse(raw) } as WaiConfig;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}, "11c21a773d1d87970a31db22d14df338ca80d75f": {"t": 1785754250.7877614, "n": 2518, "h": "9c91cfe73ea69a00", "c": "import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { WaiConfig } from \"./types.js\";\n\nconst WAI_DIR = join(homedir(), \".wai\");\nconst CONFIG_PATH = join(WAI_DIR, \"config.json\");\n\nconst DEFAULT_CONFIG: WaiConfig = {\n defaultProvider: \"qwen\",\n providers: {\n claude: {\n type: \"claude-agent\",\n allowedTools: [\"Read\", \"Glob\", \"Grep\", \"Bash\", \"WebSearch\", \"WebFetch\"],\n },\n qwen: {\n type: \"openai-compatible\",\n baseUrl: \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n model: \"qwen-plus\",\n apiKeyEnv: \"DASHSCOPE_API_KEY\",\n },\n deepseek: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.deepseek.com/v1\",\n model: \"deepseek-chat\",\n apiKeyEnv: \"DEEPSEEK_API_KEY\",\n },\n gpt: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.openai.com/v1\",\n model: \"gpt-4o\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n },\n gemini: {\n type: \"openai-compatible\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n model: \"gemini-2.0-flash\",\n apiKeyEnv: \"GEMINI_API_KEY\",\n },\n minimax: {\n type: \"openai-compatible\",\n baseUrl: \"https://api.minimax.chat/v1\",\n model: \"MiniMax-Text-01\",\n apiKeyEnv: \"MINIMAX_API_KEY\",\n },\n zhipu: {\n type: \"openai-compatible\",\n baseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n model: \"glm-4-plus\",\n apiKeyEnv: \"ZHIPU_API_KEY\",\n },\n },\n channels: {\n weixin: {\n type: \"weixin\",\n enabled: true,\n },\n },\n systemPrompt: \"You are a helpful AI assistant. Respond concisely.\",\n chunkSize: 4000,\n};\n\nexport async function ensureDir(dir: string) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nexport async function loadConfig(): Promise {\n await ensureDir(WAI_DIR);\n\n if (!existsSync(CONFIG_PATH)) {\n await writeFile(CONFIG_PATH, JSON.stringify(DEFAULT_CONFIG, null, 2));\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = await readFile(CONFIG_PATH, \"utf-8\");\n return { ...DEFAULT_CONFIG, ...JSON.parse(raw) } as WaiConfig;\n}\n\nexport async function saveConfig(config: WaiConfig): Promise {\n await ensureDir(WAI_DIR);\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport function getDataDir(): string {\n return WAI_DIR;\n}\n\nexport function getAccountsDir(): string {\n return join(WAI_DIR, \"accounts\");\n}\n"}}, "README.md": {"0c2830e2b3d538db4733241c42bd5c30758047b0": {"t": 1785746512.3567154, "n": 8487, "h": "595e4646ddb7d262", "c": "# wechat-ai\n\n多渠道 AI 机器人 — 一条命令连接微信、Discord、WhatsApp 与任意 AI 模型。\n\n基于微信官方 iLink Bot API 构建,合规、稳定、不怕封号。同时支持 Discord Bot 和 WhatsApp 渠道。\n\n

\n \"wechat-ai\n

\n\n## 特性\n\n- **多渠道支持** — 微信、Discord、WhatsApp 三合一,统一管理\n- **一条命令启动** — `npx wechat-ai`,扫码即用,零配置门槛\n- **8+ 内置模型** — Claude、GPT、Gemini、Qwen、DeepSeek、MiniMax、GLM,一键切换\n- **300+ 第三方模型** — 通过 OpenRouter 接入,`/model vendor/model` 随时切换\n- **微信官方协议** — 基于 iLink Bot API(`ilinkai.weixin.qq.com`),非逆向、非第三方\n- **全模型 Agent 能力** — 不只是聊天,所有模型均支持搜索网页、读写文件、执行代码(由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动)\n- **语音收发** — 语音消息自动转文字 (Whisper ASR),支持语音回复 (TTS)\n- **图片生成** — `/画 <描述>` 直接在微信里生图\n- **图片理解** — 发图片自动切换到视觉模型分析\n- **MCP 工具扩展** — 通过 [Model Context Protocol](https://modelcontextprotocol.io) 接入任意外部工具\n- **Function Calling** — 所有模型均支持工具调用\n- **中间件系统** — Koa 风格洋葱模型,方便二次开发\n- **Skills 人设系统** — 预设翻译官、程序员、写手等角色,一键切换\n- **Webhook API** — HTTP 接口主动推送消息,方便集成外部系统\n- **后台运行** — Daemon 模式,支持开机自启\n- **可编程 API** — 同时作为 npm 库导出,支持嵌入你自己的项目\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai logout # 退出所有渠道登录\nwechat-ai logout <渠道> # 退出指定渠道(weixin / whatsapp)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| Kimi (Moonshot) | moonshot-v1-8k | `wechat-ai set kimi ` | [申请](https://platform.moonshot.cn/console/api-keys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter ` | [申请](https://openrouter.ai/settings/keys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\n所有模型均通过 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 获得 Agent 能力,支持搜索网页、读写文件、执行代码。Claude 另外通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,提供最强质量。\n\n### 第三方模型 (OpenRouter)\n\n配置一个 [OpenRouter](https://openrouter.ai) Key 即可使用 300+ 模型,无需逐个申请:\n\n```bash\nwechat-ai set openrouter sk-or-xxx\n```\n\n在微信中通过 `/model vendor/model` 切换:\n\n```\n/model google/gemini-2.5-pro Google Gemini\n/model anthropic/claude-sonnet-4 Anthropic Claude\n/model meta-llama/llama-4-maverick Meta Llama\n```\n\n更多模型见 [OpenRouter Models](https://openrouter.ai/models)。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model qwen 切换内置模型\n/model google/gemini-2.5-pro 切换第三方模型\n/cc /qwen /deepseek /gpt 快捷切换\n@指南 查看快捷指南\n/help 显示全部指令\n/ping 检查状态\n```\n\n### Agent 能力(所有模型)\n\nv0.4.0 起,所有模型均具备 Agent 能力:搜索网页、查天气资讯、读写文件、执行命令。由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动,无需额外配置。\n\n详见 [完整使用指南](docs/guide.md#agent-能力)。\n\n## 高级配置\n\n配置文件位于 `~/.wai/config.json`,以下为可选的高级功能。\n\n### Discord 渠道\n\n在 `~/.wai/config.json` 中启用并填入 Bot Token:\n\n```json\n{\n \"channels\": {\n \"discord\": {\n \"type\": \"discord\",\n \"enabled\": true,\n \"token\": \"your-bot-token\"\n }\n }\n}\n```\n\nBot Token 在 [Discord Developer Portal](https://discord.com/developers/applications) 创建应用后获取。需开启 **Message Content Intent**。\n\n### WhatsApp 渠道\n\n在 `~/.wai/config.json` 中启用:\n\n```json\n{\n \"channels\": {\n \"whatsapp\": {\n \"type\": \"whatsapp\",\n \"enabled\": true\n }\n }\n}\n```\n\n首次启动会弹出二维码,用 WhatsApp 扫码绑定。如需重新绑定:`wechat-ai logout whatsapp`。\n\n### Webhook(HTTP 消息推送)\n\n启用后可通过 HTTP API 主动向微信用户发送消息:\n\n```json\n{\n \"webhook\": {\n \"enabled\": true,\n \"port\": 4800,\n \"secret\": \"your-secret\"\n }\n}\n```\n\n```bash\ncurl -X POST http://localhost:4800 \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer your-secret\" \\\n -d '{\"targetId\": \"wxid_xxx\", \"text\": \"Hello from API\"}'\n```\n\n### 语音消息 (ASR / TTS)\n\n```json\n{\n \"asr\": {\n \"provider\": \"whisper\",\n \"apiKey\": \"sk-xxx\"\n },\n \"tts\": {\n \"provider\": \"openai\",\n \"apiKey\": \"sk-xxx\",\n \"voice\": \"alloy\"\n }\n}\n```\n\n- **ASR**:收到语音消息自动转文字,支持 Whisper\n- **TTS**:AI 回复自动合成语音,支持 OpenAI / Gemini\n\n### MCP 工具\n\n通过 [MCP](https://modelcontextprotocol.io) 协议接入外部工具,所有模型均可调用:\n\n```json\n{\n \"mcpServers\": {\n \"weather\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@weather/mcp-server\"]\n },\n \"remote-api\": {\n \"transport\": \"streamable-http\",\n \"url\": \"https://api.example.com/mcp\"\n }\n }\n}\n```\n\n支持 `stdio`、`sse`、`streamable-http` 三种传输方式。\n\n### Skills 人设\n\n预设不同 AI 角色,在微信中通过 `/skill` 切换:\n\n```json\n{\n \"skills\": {\n \"translator\": {\n \"description\": \"英汉翻译\",\n \"systemPrompt\": \"你是一个专业翻译,用户发中文你翻英文,发英文你翻中文。\"\n },\n \"coder\": {\n \"description\": \"编程助手\",\n \"systemPrompt\": \"你是一个资深程序员,用简洁的代码和清晰的解释回答问题。\",\n \"provider\": \"claude\"\n }\n }\n}\n```\n\n## 架构\n\n```\n微信用户 / Discord / WhatsApp\n │\n ▼\n渠道适配层\n ├── 微信 (iLink Bot API — 官方协议)\n ├── Discord (discord.js Bot)\n └── WhatsApp (Baileys)\n │\n ▼\nwechat-ai 网关\n ├── 统一登录管理(多渠道扫码/Token)\n ├── 会话管理(per-user 独立上下文)\n ├── 消息聚合(防抖合并连续消息)\n ├── 中间件链(Koa 风格洋葱模型)\n ├── MCP 工具管理\n ├── ASR / TTS 语音处理\n └── 模型路由\n │\n ├── Claude Agent SDK(Claude 专属,最强质量)\n └── claw-agent-sdk(Qwen, DeepSeek, GPT, Gemini, OpenRouter 300+)\n └── 内置工具: 搜索, 文件读写, 命令执行, 网页抓取\n```\n\n### 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 语言 | TypeScript (ESM) |\n| 运行时 | Node.js 22+ |\n| 微信协议 | iLink Bot API(官方) |\n| Discord | discord.js |\n| WhatsApp | Baileys (Multi-Device) |\n| AI 接入 | Claude Agent SDK + [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) |\n| 工具扩展 | Model Context Protocol (MCP) |\n| 构建 | tsup |\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息网关 & 会话管理 & Webhook 服务\n├── config.ts 配置管理 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── mcp.ts MCP 客户端管理\n├── asr.ts 语音转文字 (Whisper)\n├── tts.ts 文字转语音 (OpenAI / Gemini)\n├── channels/\n│ ├── weixin.ts 微信 iLink 协议实现\n│ ├── discord.ts Discord Bot 渠道\n│ └── whatsapp.ts WhatsApp 渠道 (Baileys)\n└── providers/\n ├── claude-agent.ts Claude Agent SDK 接入\n ├── claw-agent.ts claw-agent-sdk 接入(全模型 Agent)\n └── openai-compatible.ts 通用 OpenAI 兼容 API(兼容旧版)\n```\n\n## 作为库使用\n\nwechat-ai 同时导出为 npm 库,可嵌入你自己的项目:\n\n```bash\nnpm install wechat-ai\n```\n\n```typescript\nimport { Gateway } from \"wechat-ai\";\n\nconst gw = new Gateway(config);\ngw.use(async (ctx, next) => {\n console.log(`收到消息: ${ctx.message.text}`);\n await next();\n});\nawait gw.start();\n```\n\n## 计划\n\n- [x] 微信 iLink 官方协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示(正在输入...)\n- [x] 8 个内置模型 + OpenRouter 300+\n- [x] npm 发布 (CLI + Library)\n- [x] 中间件系统\n- [x] MCP 客户端 & 全模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [x] Webhook HTTP API\n- [x] Skills 人设系统\n- [x] 语音消息 (ASR / TTS)\n- [x] 图片理解(自动切换视觉模型)\n- [x] 图片生成 (`/画`)\n- [x] 全模型 Agent 能力 (claw-agent-sdk)\n- [ ] Web 管理面板\n- [x] Discord 渠道\n- [x] WhatsApp 渠道\n- [ ] Telegram 渠道\n- [ ] 群聊支持\n\n## 协议\n\nMIT\n"}, "96d0b5531cd65ce8a17ac6a5475d52d9fd477444": {"t": 1785754237.996705, "n": 7457, "h": "ac2e1696000fa45f", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n基于微信官方 iLink Bot API 构建,合规、稳定、不怕封号。\n\n

\n \"wechat-ai\n

\n\n## 特性\n\n- **一条命令启动** — `npx wechat-ai`,扫码即用,零配置门槛\n- **8+ 内置模型** — Claude、GPT、Gemini、Qwen、DeepSeek、MiniMax、GLM,一键切换\n- **300+ 第三方模型** — 通过 OpenRouter 接入,`/model vendor/model` 随时切换\n- **微信官方协议** — 基于 iLink Bot API(`ilinkai.weixin.qq.com`),非逆向、非第三方\n- **全模型 Agent 能力** — 不只是聊天,所有模型均支持搜索网页、读写文件、执行代码(由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动)\n- **语音收发** — 语音消息自动转文字 (Whisper ASR),支持语音回复 (TTS)\n- **图片生成** — `/画 <描述>` 直接在微信里生图\n- **图片理解** — 发图片自动切换到视觉模型分析\n- **MCP 工具扩展** — 通过 [Model Context Protocol](https://modelcontextprotocol.io) 接入任意外部工具\n- **Function Calling** — 所有模型均支持工具调用\n- **中间件系统** — Koa 风格洋葱模型,方便二次开发\n- **Skills 人设系统** — 预设翻译官、程序员、写手等角色,一键切换\n- **Webhook API** — HTTP 接口主动推送消息,方便集成外部系统\n- **后台运行** — Daemon 模式,支持开机自启\n- **可编程 API** — 同时作为 npm 库导出,支持嵌入你自己的项目\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| Kimi (Moonshot) | moonshot-v1-8k | `wechat-ai set kimi ` | [申请](https://platform.moonshot.cn/console/api-keys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter ` | [申请](https://openrouter.ai/settings/keys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\n所有模型均通过 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 获得 Agent 能力,支持搜索网页、读写文件、执行代码。Claude 另外通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,提供最强质量。\n\n### 第三方模型 (OpenRouter)\n\n配置一个 [OpenRouter](https://openrouter.ai) Key 即可使用 300+ 模型,无需逐个申请:\n\n```bash\nwechat-ai set openrouter sk-or-xxx\n```\n\n在微信中通过 `/model vendor/model` 切换:\n\n```\n/model google/gemini-2.5-pro Google Gemini\n/model anthropic/claude-sonnet-4 Anthropic Claude\n/model meta-llama/llama-4-maverick Meta Llama\n```\n\n更多模型见 [OpenRouter Models](https://openrouter.ai/models)。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model qwen 切换内置模型\n/model google/gemini-2.5-pro 切换第三方模型\n/cc /qwen /deepseek /gpt 快捷切换\n@指南 查看快捷指南\n/help 显示全部指令\n/ping 检查状态\n```\n\n### Agent 能力(所有模型)\n\nv0.4.0 起,所有模型均具备 Agent 能力:搜索网页、查天气资讯、读写文件、执行命令。由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动,无需额外配置。\n\n详见 [完整使用指南](docs/guide.md#agent-能力)。\n\n## 高级配置\n\n配置文件位于 `~/.wai/config.json`,以下为可选的高级功能。\n\n### Webhook(HTTP 消息推送)\n\n启用后可通过 HTTP API 主动向微信用户发送消息:\n\n```json\n{\n \"webhook\": {\n \"enabled\": true,\n \"port\": 4800,\n \"secret\": \"your-secret\"\n }\n}\n```\n\n```bash\ncurl -X POST http://localhost:4800 \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer your-secret\" \\\n -d '{\"targetId\": \"wxid_xxx\", \"text\": \"Hello from API\"}'\n```\n\n### 语音消息 (ASR / TTS)\n\n```json\n{\n \"asr\": {\n \"provider\": \"whisper\",\n \"apiKey\": \"sk-xxx\"\n },\n \"tts\": {\n \"provider\": \"openai\",\n \"apiKey\": \"sk-xxx\",\n \"voice\": \"alloy\"\n }\n}\n```\n\n- **ASR**:收到语音消息自动转文字,支持 Whisper\n- **TTS**:AI 回复自动合成语音,支持 OpenAI / Gemini\n\n### MCP 工具\n\n通过 [MCP](https://modelcontextprotocol.io) 协议接入外部工具,所有模型均可调用:\n\n```json\n{\n \"mcpServers\": {\n \"weather\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@weather/mcp-server\"]\n },\n \"remote-api\": {\n \"transport\": \"streamable-http\",\n \"url\": \"https://api.example.com/mcp\"\n }\n }\n}\n```\n\n支持 `stdio`、`sse`、`streamable-http` 三种传输方式。\n\n### Skills 人设\n\n预设不同 AI 角色,在微信中通过 `/skill` 切换:\n\n```json\n{\n \"skills\": {\n \"translator\": {\n \"description\": \"英汉翻译\",\n \"systemPrompt\": \"你是一个专业翻译,用户发中文你翻英文,发英文你翻中文。\"\n },\n \"coder\": {\n \"description\": \"编程助手\",\n \"systemPrompt\": \"你是一个资深程序员,用简洁的代码和清晰的解释回答问题。\",\n \"provider\": \"claude\"\n }\n }\n}\n```\n\n## 架构\n\n```\n微信用户\n │\n ▼\n微信服务器\n │\n ▼ (iLink Bot API — 微信官方协议)\n │\nwechat-ai 网关\n ├── 会话管理(per-user 独立上下文)\n ├── 消息聚合(防抖合并连续消息)\n ├── 中间件链(Koa 风格洋葱模型)\n ├── MCP 工具管理\n ├── ASR / TTS 语音处理\n └── 模型路由\n │\n ├── Claude Agent SDK(Claude 专属,最强质量)\n └── claw-agent-sdk(Qwen, DeepSeek, GPT, Gemini, OpenRouter 300+)\n └── 内置工具: 搜索, 文件读写, 命令执行, 网页抓取\n```\n\n### 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 语言 | TypeScript (ESM) |\n| 运行时 | Node.js 22+ |\n| 微信协议 | iLink Bot API(官方) |\n| AI 接入 | Claude Agent SDK + [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) |\n| 工具扩展 | Model Context Protocol (MCP) |\n| 构建 | tsup |\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息网关 & 会话管理 & Webhook 服务\n├── config.ts 配置管理 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── mcp.ts MCP 客户端管理\n├── asr.ts 语音转文字 (Whisper)\n├── tts.ts 文字转语音 (OpenAI / Gemini)\n├── channels/\n│ └── weixin.ts 微信 iLink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK 接入\n ├── claw-agent.ts claw-agent-sdk 接入(全模型 Agent)\n └── openai-compatible.ts 通用 OpenAI 兼容 API(兼容旧版)\n```\n\n## 作为库使用\n\nwechat-ai 同时导出为 npm 库,可嵌入你自己的项目:\n\n```bash\nnpm install wechat-ai\n```\n\n```typescript\nimport { Gateway } from \"wechat-ai\";\n\nconst gw = new Gateway(config);\ngw.use(async (ctx, next) => {\n console.log(`收到消息: ${ctx.message.text}`);\n await next();\n});\nawait gw.start();\n```\n\n## 计划\n\n- [x] 微信 iLink 官方协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示(正在输入...)\n- [x] 8 个内置模型 + OpenRouter 300+\n- [x] npm 发布 (CLI + Library)\n- [x] 中间件系统\n- [x] MCP 客户端 & 全模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [x] Webhook HTTP API\n- [x] Skills 人设系统\n- [x] 语音消息 (ASR / TTS)\n- [x] 图片理解(自动切换视觉模型)\n- [x] 图片生成 (`/画`)\n- [x] 全模型 Agent 能力 (claw-agent-sdk)\n- [ ] Web 管理面板\n- [ ] Telegram / Discord 渠道\n- [ ] 群聊支持\n\n## 协议\n\nMIT\n"}, "e45158fd896fc55774e9d860962ed72fd86e77fd": {"t": 1785754239.263541, "n": 7337, "h": "95403bd2e3f5e836", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n基于微信官方 iLink Bot API 构建,合规、稳定、不怕封号。\n\n

\n \"wechat-ai\n

\n\n## 特性\n\n- **一条命令启动** — `npx wechat-ai`,扫码即用,零配置门槛\n- **8+ 内置模型** — Claude、GPT、Gemini、Qwen、DeepSeek、MiniMax、GLM,一键切换\n- **300+ 第三方模型** — 通过 OpenRouter 接入,`/model vendor/model` 随时切换\n- **微信官方协议** — 基于 iLink Bot API(`ilinkai.weixin.qq.com`),非逆向、非第三方\n- **全模型 Agent 能力** — 不只是聊天,所有模型均支持搜索网页、读写文件、执行代码(由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动)\n- **语音收发** — 语音消息自动转文字 (Whisper ASR),支持语音回复 (TTS)\n- **图片生成** — `/画 <描述>` 直接在微信里生图\n- **图片理解** — 发图片自动切换到视觉模型分析\n- **MCP 工具扩展** — 通过 [Model Context Protocol](https://modelcontextprotocol.io) 接入任意外部工具\n- **Function Calling** — 所有模型均支持工具调用\n- **中间件系统** — Koa 风格洋葱模型,方便二次开发\n- **Skills 人设系统** — 预设翻译官、程序员、写手等角色,一键切换\n- **Webhook API** — HTTP 接口主动推送消息,方便集成外部系统\n- **后台运行** — Daemon 模式,支持开机自启\n- **可编程 API** — 同时作为 npm 库导出,支持嵌入你自己的项目\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter ` | [申请](https://openrouter.ai/settings/keys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\n所有模型均通过 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 获得 Agent 能力,支持搜索网页、读写文件、执行代码。Claude 另外通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,提供最强质量。\n\n### 第三方模型 (OpenRouter)\n\n配置一个 [OpenRouter](https://openrouter.ai) Key 即可使用 300+ 模型,无需逐个申请:\n\n```bash\nwechat-ai set openrouter sk-or-xxx\n```\n\n在微信中通过 `/model vendor/model` 切换:\n\n```\n/model google/gemini-2.5-pro Google Gemini\n/model anthropic/claude-sonnet-4 Anthropic Claude\n/model meta-llama/llama-4-maverick Meta Llama\n```\n\n更多模型见 [OpenRouter Models](https://openrouter.ai/models)。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model qwen 切换内置模型\n/model google/gemini-2.5-pro 切换第三方模型\n/cc /qwen /deepseek /gpt 快捷切换\n@指南 查看快捷指南\n/help 显示全部指令\n/ping 检查状态\n```\n\n### Agent 能力(所有模型)\n\nv0.4.0 起,所有模型均具备 Agent 能力:搜索网页、查天气资讯、读写文件、执行命令。由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动,无需额外配置。\n\n详见 [完整使用指南](docs/guide.md#agent-能力)。\n\n## 高级配置\n\n配置文件位于 `~/.wai/config.json`,以下为可选的高级功能。\n\n### Webhook(HTTP 消息推送)\n\n启用后可通过 HTTP API 主动向微信用户发送消息:\n\n```json\n{\n \"webhook\": {\n \"enabled\": true,\n \"port\": 4800,\n \"secret\": \"your-secret\"\n }\n}\n```\n\n```bash\ncurl -X POST http://localhost:4800 \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer your-secret\" \\\n -d '{\"targetId\": \"wxid_xxx\", \"text\": \"Hello from API\"}'\n```\n\n### 语音消息 (ASR / TTS)\n\n```json\n{\n \"asr\": {\n \"provider\": \"whisper\",\n \"apiKey\": \"sk-xxx\"\n },\n \"tts\": {\n \"provider\": \"openai\",\n \"apiKey\": \"sk-xxx\",\n \"voice\": \"alloy\"\n }\n}\n```\n\n- **ASR**:收到语音消息自动转文字,支持 Whisper\n- **TTS**:AI 回复自动合成语音,支持 OpenAI / Gemini\n\n### MCP 工具\n\n通过 [MCP](https://modelcontextprotocol.io) 协议接入外部工具,所有模型均可调用:\n\n```json\n{\n \"mcpServers\": {\n \"weather\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@weather/mcp-server\"]\n },\n \"remote-api\": {\n \"transport\": \"streamable-http\",\n \"url\": \"https://api.example.com/mcp\"\n }\n }\n}\n```\n\n支持 `stdio`、`sse`、`streamable-http` 三种传输方式。\n\n### Skills 人设\n\n预设不同 AI 角色,在微信中通过 `/skill` 切换:\n\n```json\n{\n \"skills\": {\n \"translator\": {\n \"description\": \"英汉翻译\",\n \"systemPrompt\": \"你是一个专业翻译,用户发中文你翻英文,发英文你翻中文。\"\n },\n \"coder\": {\n \"description\": \"编程助手\",\n \"systemPrompt\": \"你是一个资深程序员,用简洁的代码和清晰的解释回答问题。\",\n \"provider\": \"claude\"\n }\n }\n}\n```\n\n## 架构\n\n```\n微信用户\n │\n ▼\n微信服务器\n │\n ▼ (iLink Bot API — 微信官方协议)\n │\nwechat-ai 网关\n ├── 会话管理(per-user 独立上下文)\n ├── 消息聚合(防抖合并连续消息)\n ├── 中间件链(Koa 风格洋葱模型)\n ├── MCP 工具管理\n ├── ASR / TTS 语音处理\n └── 模型路由\n │\n ├── Claude Agent SDK(Claude 专属,最强质量)\n └── claw-agent-sdk(Qwen, DeepSeek, GPT, Gemini, OpenRouter 300+)\n └── 内置工具: 搜索, 文件读写, 命令执行, 网页抓取\n```\n\n### 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 语言 | TypeScript (ESM) |\n| 运行时 | Node.js 22+ |\n| 微信协议 | iLink Bot API(官方) |\n| AI 接入 | Claude Agent SDK + [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) |\n| 工具扩展 | Model Context Protocol (MCP) |\n| 构建 | tsup |\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息网关 & 会话管理 & Webhook 服务\n├── config.ts 配置管理 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── mcp.ts MCP 客户端管理\n├── asr.ts 语音转文字 (Whisper)\n├── tts.ts 文字转语音 (OpenAI / Gemini)\n├── channels/\n│ └── weixin.ts 微信 iLink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK 接入\n ├── claw-agent.ts claw-agent-sdk 接入(全模型 Agent)\n └── openai-compatible.ts 通用 OpenAI 兼容 API(兼容旧版)\n```\n\n## 作为库使用\n\nwechat-ai 同时导出为 npm 库,可嵌入你自己的项目:\n\n```bash\nnpm install wechat-ai\n```\n\n```typescript\nimport { Gateway } from \"wechat-ai\";\n\nconst gw = new Gateway(config);\ngw.use(async (ctx, next) => {\n console.log(`收到消息: ${ctx.message.text}`);\n await next();\n});\nawait gw.start();\n```\n\n## 计划\n\n- [x] 微信 iLink 官方协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示(正在输入...)\n- [x] 8 个内置模型 + OpenRouter 300+\n- [x] npm 发布 (CLI + Library)\n- [x] 中间件系统\n- [x] MCP 客户端 & 全模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [x] Webhook HTTP API\n- [x] Skills 人设系统\n- [x] 语音消息 (ASR / TTS)\n- [x] 图片理解(自动切换视觉模型)\n- [x] 图片生成 (`/画`)\n- [x] 全模型 Agent 能力 (claw-agent-sdk)\n- [ ] Web 管理面板\n- [ ] Telegram / Discord 渠道\n- [ ] 群聊支持\n\n## 协议\n\nMIT\n"}, "51b6b89f724a98038a3c292028bcf2f85103ee2b": {"t": 1785754240.7203941, "n": 7820, "h": "0fcec77d8ab19dc6", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n基于微信官方 iLink Bot API 构建,合规、稳定、不怕封号。\n\n

\n \"wechat-ai\n

\n\n## 特性\n\n- **一条命令启动** — `npx wechat-ai`,扫码即用,零配置门槛\n- **8+ 内置模型** — Claude、GPT、Gemini、Qwen、DeepSeek、MiniMax、GLM,一键切换\n- **300+ 第三方模型** — 通过 OpenRouter 接入,`/model vendor/model` 随时切换\n- **微信官方协议** — 基于 iLink Bot API(`ilinkai.weixin.qq.com`),非逆向、非第三方\n- **全模型 Agent 能力** — 不只是聊天,所有模型均支持搜索网页、读写文件、执行代码(由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 驱动)\n- **语音收发** — 语音消息自动转文字 (Whisper ASR),支持语音回复 (TTS)\n- **图片生成** — `/画 <描述>` 直接在微信里生图\n- **图片理解** — 发图片自动切换到视觉模型分析\n- **MCP 工具扩展** — 通过 [Model Context Protocol](https://modelcontextprotocol.io) 接入任意外部工具\n- **Function Calling** — 所有模型均支持工具调用\n- **中间件系统** — Koa 风格洋葱模型,方便二次开发\n- **Skills 人设系统** — 预设翻译官、程序员、写手等角色,一键切换\n- **Webhook API** — HTTP 接口主动推送消息,方便集成外部系统\n- **后台运行** — Daemon 模式,支持开机自启\n- **可编程 API** — 同时作为 npm 库导出,支持嵌入你自己的项目\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter ` | [申请](https://openrouter.ai/settings/keys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\n所有模型均通过 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 获得 Agent 能力,支持搜索网页、读写文件、执行代码。Claude 另外通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,提供最强质量。\n\n### 第三方模型 (OpenRouter)\n\n配置一个 [OpenRouter](https://openrouter.ai) Key 即可使用 300+ 模型,无需逐个申请:\n\n```bash\nwechat-ai set openrouter sk-or-xxx\n```\n\n在微信中通过 `/model vendor/model` 切换:\n\n```\n/model google/gemini-2.5-pro Google Gemini\n/model anthropic/claude-sonnet-4 Anthropic Claude\n/model meta-llama/llama-4-maverick Meta Llama\n```\n\n更多模型见 [OpenRouter Models](https://openrouter.ai/models)。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model qwen 切换内置模型\n/model google/gemini-2.5-pro 切换第三方模型\n/cc /qwen /deepseek /gpt 快捷切换\n@指南 查看快捷指南\n/help 显示全部指令\n/ping 检查状态\n```\n\n### Agent 能力(所有模型)\n\nv0.4.0 起,所有模型均具备 Agent 能力,不只是对话:\n\n| 能力 | 示例 | 说明 |\n|------|------|------|\n| 🔍 搜索网页 | \"今天深圳天气如何\" | 自动搜索实时信息 |\n| 📰 查资讯 | \"最新的 AI 行业动态\" | 搜索国内外新闻 |\n| 📂 读取文件 | \"读取 package.json 内容\" | 读取服务器上的文件 |\n| ✏️ 写入文件 | \"创建一个 hello.txt\" | 创建或修改文件 |\n| 🔎 搜索文件 | \"找到所有 .ts 文件\" | 按模式匹配文件路径 |\n| 💻 执行命令 | \"运行 npm test\" | 执行 shell 命令 |\n| 🌐 抓取网页 | \"抓取这个 URL 的内容\" | 获取指定网页内容 |\n\n由 [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) 提供,无需额外配置。\n\n### 免费第三方模型\n\n配置 OpenRouter Key 后,可使用免费模型:\n\n```\n/model stepfun/step-3.5-flash:free\n/model nvidia/nemotron-3-super-120b-a12b:free\n```\n\n更多免费模型见 [OpenRouter Models](https://openrouter.ai/models)(筛选 Prompt pricing: $0)。\n\n## 高级配置\n\n配置文件位于 `~/.wai/config.json`,以下为可选的高级功能。\n\n### Webhook(HTTP 消息推送)\n\n启用后可通过 HTTP API 主动向微信用户发送消息:\n\n```json\n{\n \"webhook\": {\n \"enabled\": true,\n \"port\": 4800,\n \"secret\": \"your-secret\"\n }\n}\n```\n\n```bash\ncurl -X POST http://localhost:4800 \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer your-secret\" \\\n -d '{\"targetId\": \"wxid_xxx\", \"text\": \"Hello from API\"}'\n```\n\n### 语音消息 (ASR / TTS)\n\n```json\n{\n \"asr\": {\n \"provider\": \"whisper\",\n \"apiKey\": \"sk-xxx\"\n },\n \"tts\": {\n \"provider\": \"openai\",\n \"apiKey\": \"sk-xxx\",\n \"voice\": \"alloy\"\n }\n}\n```\n\n- **ASR**:收到语音消息自动转文字,支持 Whisper\n- **TTS**:AI 回复自动合成语音,支持 OpenAI / Gemini\n\n### MCP 工具\n\n通过 [MCP](https://modelcontextprotocol.io) 协议接入外部工具,所有模型均可调用:\n\n```json\n{\n \"mcpServers\": {\n \"weather\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@weather/mcp-server\"]\n },\n \"remote-api\": {\n \"transport\": \"streamable-http\",\n \"url\": \"https://api.example.com/mcp\"\n }\n }\n}\n```\n\n支持 `stdio`、`sse`、`streamable-http` 三种传输方式。\n\n### Skills 人设\n\n预设不同 AI 角色,在微信中通过 `/skill` 切换:\n\n```json\n{\n \"skills\": {\n \"translator\": {\n \"description\": \"英汉翻译\",\n \"systemPrompt\": \"你是一个专业翻译,用户发中文你翻英文,发英文你翻中文。\"\n },\n \"coder\": {\n \"description\": \"编程助手\",\n \"systemPrompt\": \"你是一个资深程序员,用简洁的代码和清晰的解释回答问题。\",\n \"provider\": \"claude\"\n }\n }\n}\n```\n\n## 架构\n\n```\n微信用户\n │\n ▼\n微信服务器\n │\n ▼ (iLink Bot API — 微信官方协议)\n │\nwechat-ai 网关\n ├── 会话管理(per-user 独立上下文)\n ├── 消息聚合(防抖合并连续消息)\n ├── 中间件链(Koa 风格洋葱模型)\n ├── MCP 工具管理\n ├── ASR / TTS 语音处理\n └── 模型路由\n │\n ├── Claude Agent SDK(Claude 专属,最强质量)\n └── claw-agent-sdk(Qwen, DeepSeek, GPT, Gemini, OpenRouter 300+)\n └── 内置工具: 搜索, 文件读写, 命令执行, 网页抓取\n```\n\n### 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 语言 | TypeScript (ESM) |\n| 运行时 | Node.js 22+ |\n| 微信协议 | iLink Bot API(官方) |\n| AI 接入 | Claude Agent SDK + [claw-agent-sdk](https://github.com/anxiong2025/claw-agent-sdk) |\n| 工具扩展 | Model Context Protocol (MCP) |\n| 构建 | tsup |\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息网关 & 会话管理 & Webhook 服务\n├── config.ts 配置管理 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── mcp.ts MCP 客户端管理\n├── asr.ts 语音转文字 (Whisper)\n├── tts.ts 文字转语音 (OpenAI / Gemini)\n├── channels/\n│ └── weixin.ts 微信 iLink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK 接入\n ├── claw-agent.ts claw-agent-sdk 接入(全模型 Agent)\n └── openai-compatible.ts 通用 OpenAI 兼容 API(兼容旧版)\n```\n\n## 作为库使用\n\nwechat-ai 同时导出为 npm 库,可嵌入你自己的项目:\n\n```bash\nnpm install wechat-ai\n```\n\n```typescript\nimport { Gateway } from \"wechat-ai\";\n\nconst gw = new Gateway(config);\ngw.use(async (ctx, next) => {\n console.log(`收到消息: ${ctx.message.text}`);\n await next();\n});\nawait gw.start();\n```\n\n## 计划\n\n- [x] 微信 iLink 官方协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示(正在输入...)\n- [x] 8 个内置模型 + OpenRouter 300+\n- [x] npm 发布 (CLI + Library)\n- [x] 中间件系统\n- [x] MCP 客户端 & 全模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [x] Webhook HTTP API\n- [x] Skills 人设系统\n- [x] 语音消息 (ASR / TTS)\n- [x] 图片理解(自动切换视觉模型)\n- [x] 图片生成 (`/画`)\n- [x] 全模型 Agent 能力 (claw-agent-sdk)\n- [ ] Web 管理面板\n- [ ] Telegram / Discord 渠道\n- [ ] 群聊支持\n\n## 协议\n\nMIT\n"}, "d49cbfdb2b64355dcb37fb398cd1344e8c7fa8f7": {"t": 1785754242.0013146, "n": 6805, "h": "2337d9a8e703a416", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n基于微信官方 iLink Bot API 构建,合规、稳定、不怕封号。\n\n

\n \"wechat-ai\n

\n\n## 特性\n\n- **一条命令启动** — `npx wechat-ai`,扫码即用,零配置门槛\n- **8+ 内置模型** — Claude、GPT、Gemini、Qwen、DeepSeek、MiniMax、GLM,一键切换\n- **300+ 第三方模型** — 通过 OpenRouter 接入,`/model vendor/model` 随时切换\n- **微信官方协议** — 基于 iLink Bot API(`ilinkai.weixin.qq.com`),非逆向、非第三方\n- **Claude Agent 模式** — 不只是聊天,还能执行代码、读写文件、搜索网页\n- **语音收发** — 语音消息自动转文字 (Whisper ASR),支持语音回复 (TTS)\n- **图片生成** — `/画 <描述>` 直接在微信里生图\n- **图片理解** — 发图片自动切换到视觉模型分析\n- **MCP 工具扩展** — 通过 [Model Context Protocol](https://modelcontextprotocol.io) 接入任意外部工具\n- **Function Calling** — 所有模型均支持工具调用\n- **中间件系统** — Koa 风格洋葱模型,方便二次开发\n- **Skills 人设系统** — 预设翻译官、程序员、写手等角色,一键切换\n- **Webhook API** — HTTP 接口主动推送消息,方便集成外部系统\n- **后台运行** — Daemon 模式,支持开机自启\n- **可编程 API** — 同时作为 npm 库导出,支持嵌入你自己的项目\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anthropics/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter ` | [申请](https://openrouter.ai/settings/keys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n### 第三方模型 (OpenRouter)\n\n配置一个 [OpenRouter](https://openrouter.ai) Key 即可使用 300+ 模型,无需逐个申请:\n\n```bash\nwechat-ai set openrouter sk-or-xxx\n```\n\n在微信中通过 `/model vendor/model` 切换:\n\n```\n/model google/gemini-2.5-pro Google Gemini\n/model anthropic/claude-sonnet-4 Anthropic Claude\n/model meta-llama/llama-4-maverick Meta Llama\n```\n\n更多模型见 [OpenRouter Models](https://openrouter.ai/models)。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model qwen 切换内置模型\n/model google/gemini-2.5-pro 切换第三方模型\n/cc /qwen /deepseek /gpt 快捷切换\n@指南 查看快捷指南\n/help 显示全部指令\n/ping 检查状态\n```\n\n## 高级配置\n\n配置文件位于 `~/.wai/config.json`,以下为可选的高级功能。\n\n### Webhook(HTTP 消息推送)\n\n启用后可通过 HTTP API 主动向微信用户发送消息:\n\n```json\n{\n \"webhook\": {\n \"enabled\": true,\n \"port\": 4800,\n \"secret\": \"your-secret\"\n }\n}\n```\n\n```bash\ncurl -X POST http://localhost:4800 \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer your-secret\" \\\n -d '{\"targetId\": \"wxid_xxx\", \"text\": \"Hello from API\"}'\n```\n\n### 语音消息 (ASR / TTS)\n\n```json\n{\n \"asr\": {\n \"provider\": \"whisper\",\n \"apiKey\": \"sk-xxx\"\n },\n \"tts\": {\n \"provider\": \"openai\",\n \"apiKey\": \"sk-xxx\",\n \"voice\": \"alloy\"\n }\n}\n```\n\n- **ASR**:收到语音消息自动转文字,支持 Whisper\n- **TTS**:AI 回复自动合成语音,支持 OpenAI / Gemini\n\n### MCP 工具\n\n通过 [MCP](https://modelcontextprotocol.io) 协议接入外部工具,所有模型均可调用:\n\n```json\n{\n \"mcpServers\": {\n \"weather\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@weather/mcp-server\"]\n },\n \"remote-api\": {\n \"transport\": \"streamable-http\",\n \"url\": \"https://api.example.com/mcp\"\n }\n }\n}\n```\n\n支持 `stdio`、`sse`、`streamable-http` 三种传输方式。\n\n### Skills 人设\n\n预设不同 AI 角色,在微信中通过 `/skill` 切换:\n\n```json\n{\n \"skills\": {\n \"translator\": {\n \"description\": \"英汉翻译\",\n \"systemPrompt\": \"你是一个专业翻译,用户发中文你翻英文,发英文你翻中文。\"\n },\n \"coder\": {\n \"description\": \"编程助手\",\n \"systemPrompt\": \"你是一个资深程序员,用简洁的代码和清晰的解释回答问题。\",\n \"provider\": \"claude\"\n }\n }\n}\n```\n\n## 架构\n\n```\n微信用户\n │\n ▼\n微信服务器\n │\n ▼ (iLink Bot API — 微信官方协议)\n │\nwechat-ai 网关\n ├── 会话管理(per-user 独立上下文)\n ├── 消息聚合(防抖合并连续消息)\n ├── 中间件链(Koa 风格洋葱模型)\n ├── MCP 工具管理\n ├── ASR / TTS 语音处理\n └── 模型路由\n │\n ├── Claude Agent SDK(工具: Bash, 文件读写, Web 搜索)\n └── OpenAI 兼容 API(Qwen, DeepSeek, GPT, Gemini, OpenRouter 300+)\n```\n\n### 技术栈\n\n| 组件 | 技术 |\n|------|------|\n| 语言 | TypeScript (ESM) |\n| 运行时 | Node.js 22+ |\n| 微信协议 | iLink Bot API(官方) |\n| AI 接入 | Claude Agent SDK + OpenAI 兼容 API |\n| 工具扩展 | Model Context Protocol (MCP) |\n| 构建 | tsup |\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息网关 & 会话管理 & Webhook 服务\n├── config.ts 配置管理 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── mcp.ts MCP 客户端管理\n├── asr.ts 语音转文字 (Whisper)\n├── tts.ts 文字转语音 (OpenAI / Gemini)\n├── channels/\n│ └── weixin.ts 微信 iLink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK 接入\n └── openai-compatible.ts 通用 OpenAI 兼容 API\n```\n\n## 作为库使用\n\nwechat-ai 同时导出为 npm 库,可嵌入你自己的项目:\n\n```bash\nnpm install wechat-ai\n```\n\n```typescript\nimport { Gateway } from \"wechat-ai\";\n\nconst gw = new Gateway(config);\ngw.use(async (ctx, next) => {\n console.log(`收到消息: ${ctx.message.text}`);\n await next();\n});\nawait gw.start();\n```\n\n## 计划\n\n- [x] 微信 iLink 官方协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示(正在输入...)\n- [x] 8 个内置模型 + OpenRouter 300+\n- [x] npm 发布 (CLI + Library)\n- [x] 中间件系统\n- [x] MCP 客户端 & 全模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [x] Webhook HTTP API\n- [x] Skills 人设系统\n- [x] 语音消息 (ASR / TTS)\n- [x] 图片理解(自动切换视觉模型)\n- [x] 图片生成 (`/画`)\n- [ ] Web 管理面板\n- [ ] Telegram / Discord 渠道\n- [ ] 群聊支持\n\n## 协议\n\nMIT\n"}, "4617dc2c88692ee27220bc49e4a3d21ad9ea5af2": {"t": 1785754244.3609724, "n": 4021, "h": "fb6d29c25cea995e", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anthropics/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter ` | [申请](https://openrouter.ai/settings/keys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n### 第三方模型 (OpenRouter)\n\n配置一个 [OpenRouter](https://openrouter.ai) Key 即可使用 300+ 模型,无需逐个申请:\n\n```bash\nwechat-ai set openrouter sk-or-xxx\n```\n\n在微信中通过 `/model vendor/model` 切换:\n\n```\n/model google/gemini-2.5-pro Google Gemini\n/model anthropic/claude-sonnet-4 Anthropic Claude\n/model meta-llama/llama-4-maverick Meta Llama\n```\n\n更多模型见 [OpenRouter Models](https://openrouter.ai/models)。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model qwen 切换内置模型\n/model google/gemini-2.5-pro 切换第三方模型\n/cc /qwen /deepseek /gpt 快捷切换\n@指南 查看快捷指南\n/help 显示全部指令\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴─────────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini,\n OpenRouter 300+)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 8 个内置模型 + OpenRouter 300+\n- [x] npm 发布\n- [x] 中间件系统\n- [x] MCP 客户端支持\n- [x] 所有模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [ ] 图片/文件收发\n- [ ] 语音消息 (ASR/TTS)\n- [ ] Telegram / Discord 渠道\n\n## 协议\n\nMIT\n"}, "e0b1e482a31a840cb3aa0270880cc503c90084d7": {"t": 1785754246.3704646, "n": 3269, "h": "8065973a43b3e395", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\n# macOS / Linux\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n\n# Windows(Key 需要加引号,避免特殊字符被 cmd 解析)\nwechat-ai set qwen \"sk-xxx\"\nwechat-ai set deepseek \"sk-xxx\"\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anthropics/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [x] 中间件系统\n- [x] MCP 客户端支持\n- [x] 所有模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [ ] 图片/文件收发\n- [ ] 语音消息 (ASR/TTS)\n- [ ] Telegram / Discord 渠道\n\n## 协议\n\nMIT\n"}, "4cb994d091cdc14ecbdcf7266f5693f701db419d": {"t": 1785754247.5527475, "n": 3156, "h": "cf7756271c392734", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n## 快速开始\n\n### 1. 安装\n\n```bash\nnpm i -g wechat-ai\n```\n\n### 2. 设置 API Key(任选一个模型)\n\n```bash\nwechat-ai set qwen sk-xxx # 通义千问\nwechat-ai set deepseek sk-xxx # DeepSeek\nwechat-ai set gemini AIza-xxx # Gemini\n```\n\n### 3. 启动\n\n```bash\nwechat-ai # 首次启动会弹出微信扫码\n```\n\n扫码登录后,给微信机器人发消息即可开始对话。\n\n## 其他安装方式\n\n```bash\n# 免安装体验\nnpx wechat-ai\n\n# 从源码运行\ngit clone https://github.com/anthropics/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai start # 后台运行(daemon 模式)\nwechat-ai stop # 停止后台进程\nwechat-ai logs # 查看后台日志\nwechat-ai update # 更新到最新版\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [x] 中间件系统\n- [x] MCP 客户端支持\n- [x] 所有模型 Function Calling\n- [x] 后台运行 (daemon 模式)\n- [ ] 图片/文件收发\n- [ ] 语音消息 (ASR/TTS)\n- [ ] Telegram / Discord 渠道\n\n## 协议\n\nMIT\n"}, "a62fe1e92c01e1fd90c329783e7deec1a4e1fe1f": {"t": 1785754250.507752, "n": 2990, "h": "105b4212382ac635", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n```bash\nnpm i -g wechat-ai\nwechat-ai set qwen sk-xxx\nwechat-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key | 获取 Key |\n|------|---------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` | [申请](https://dashscope.console.aliyun.com/apiKey) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt ` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wechat-ai\n\n# 方式二:全局安装\nnpm i -g wechat-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai update # 更新到最新版\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n\n## 协议\n\nMIT\n"}, "4524bf42b7d718d5b338933db4d4dfda04870d9f": {"t": 1785754251.6536047, "n": 3063, "h": "e1cb4ca235ec0a67", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n```bash\nnpm i -g wechat-ai\nwechat-ai set qwen sk-xxx\nwechat-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` |\n| GPT | gpt-4o | `wechat-ai set gpt ` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n### API Key 获取\n\n| 模型 | 申请地址 |\n|------|---------|\n| 通义千问 (Qwen) | https://dashscope.console.aliyun.com/apiKey |\n| DeepSeek | https://platform.deepseek.com/api_keys |\n| Claude | https://console.anthropic.com/settings/keys |\n| GPT | https://platform.openai.com/api-keys |\n| Gemini | https://aistudio.google.com/apikey |\n| MiniMax | https://platform.minimaxi.com/user-center/basic-information/interface-key |\n| 智谱 (GLM) | https://open.bigmodel.cn/usercenter/apikeys |\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wechat-ai\n\n# 方式二:全局安装\nnpm i -g wechat-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai update # 更新到最新版\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n\n## 协议\n\nMIT\n"}, "10d25398a16702ac5103bfd2e49419f9e6525c59": {"t": 1785754252.9505014, "n": 3062, "h": "00d8103701719e71", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n```bash\nnpm i -g wechat-ai\nwechat-ai set qwen sk-xxx\nwechat-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` |\n| GPT | gpt-4o | `wechat-ai set gpt ` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wechat-ai\n\n# 方式二:全局安装\nnpm i -g wechat-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai update # 更新到最新版\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n\n## API Key 获取\n\n| 模型 | 申请地址 |\n|------|---------|\n| 通义千问 (Qwen) | https://dashscope.console.aliyun.com/apiKey |\n| DeepSeek | https://platform.deepseek.com/api_keys |\n| Claude | https://console.anthropic.com/settings/keys |\n| GPT | https://platform.openai.com/api-keys |\n| Gemini | https://aistudio.google.com/apikey |\n| MiniMax | https://platform.minimaxi.com/user-center/basic-information/interface-key |\n| 智谱 (GLM) | https://open.bigmodel.cn/usercenter/apikeys |\n\n## 协议\n\nMIT\n"}, "48e85fb2516160a7332793d68421da5553327b96": {"t": 1785754254.4801118, "n": 2598, "h": "8573d832ba7631fb", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n```bash\nnpm i -g wechat-ai\nwechat-ai set qwen sk-xxx\nwechat-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` |\n| GPT | gpt-4o | `wechat-ai set gpt ` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wechat-ai\n\n# 方式二:全局安装\nnpm i -g wechat-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\nwechat-ai update # 更新到最新版\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n\n## 协议\n\nMIT\n"}, "0db01e15f08f38b983588d6c262efcb093f9af4b": {"t": 1785754255.9475965, "n": 2556, "h": "635cd7afc2a127be", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n```bash\nnpm i -g wechat-ai\nwechat-ai set qwen sk-xxx\nwechat-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` |\n| GPT | gpt-4o | `wechat-ai set gpt ` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wechat-ai\n\n# 方式二:全局安装\nnpm i -g wechat-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n\n## 协议\n\nMIT\n"}, "3071bcdc135f3968a22fb55414b251e6de173949": {"t": 1785754257.1099691, "n": 2558, "h": "a9d13c744f52cf36", "c": "# wechat-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wechat-ai\n

\n\n```bash\nnpm i -g wechat-ai\nwechat-ai set qwen sk-xxx\nwechat-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wechat-ai set qwen ` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude ` |\n| GPT | gpt-4o | `wechat-ai set gpt ` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set zhipu ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wechat-ai\n\n# 方式二:全局安装\nnpm i -g wechat-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wechat-ai.git\ncd wechat-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwechat-ai # 启动(首次自动弹出二维码)\nwechat-ai set <模型> # 保存 API Key\nwechat-ai use <模型> # 设置默认模型\nwechat-ai config # 查看配置(Key 已脱敏)\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wechat-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [x] npm 发布\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n\n## 协议\n\nMIT\n"}, "80c9a2898ade2e8f756c25385a09247e212c1436": {"t": 1785754258.3372142, "n": 2474, "h": "dacb016fe0219511", "c": "# wx-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wx-ai\n

\n\n```bash\nnpm i -g wx-ai\nwx-ai set qwen sk-xxx\nwx-ai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wx-ai set qwen ` |\n| DeepSeek | deepseek-chat | `wx-ai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wx-ai set claude ` |\n| GPT | gpt-4o | `wx-ai set gpt ` |\n| Gemini | gemini-2.0-flash | `wx-ai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wx-ai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wx-ai set zhipu ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wx-ai\n\n# 方式二:全局安装\nnpm i -g wx-ai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wx-ai.git\ncd wx-ai && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwx-ai # 启动(首次自动弹出二维码)\nwx-ai set <模型> # 保存 API Key\nwx-ai use <模型> # 设置默认模型\nwx-ai config # 查看配置(Key 已脱敏)\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wx-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n- [ ] npm 发布\n\n## 协议\n\nMIT\n"}, "4ee57b6b0e4e01ce535e79f99547a5e290721159": {"t": 1785754259.524648, "n": 2460, "h": "21a383aa54fcff1f", "c": "# wx-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n

\n \"wx-ai\n

\n\n```bash\nnpm i -g wxai\nwxai set qwen sk-xxx\nwxai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wxai set qwen ` |\n| DeepSeek | deepseek-chat | `wxai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wxai set claude ` |\n| GPT | gpt-4o | `wxai set gpt ` |\n| Gemini | gemini-2.0-flash | `wxai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wxai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wxai set zhipu ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wxai\n\n# 方式二:全局安装\nnpm i -g wxai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wx-bot.git\ncd wx-bot && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwxai # 启动(首次自动弹出二维码)\nwxai set <模型> # 保存 API Key\nwxai use <模型> # 设置默认模型\nwxai config # 查看配置(Key 已脱敏)\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wx-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n- [ ] npm 发布\n\n## 协议\n\nMIT\n"}, "11c21a773d1d87970a31db22d14df338ca80d75f": {"t": 1785754260.9209673, "n": 2364, "h": "963efb8ad0bd2882", "c": "# wx-ai\n\n微信 AI 机器人 — 一条命令连接微信与任意 AI 模型。\n\n```bash\nnpm i -g wxai\nwxai set qwen sk-xxx\nwxai\n```\n\n## 支持模型\n\n| 模型 | 默认版本 | 设置 Key |\n|------|---------|---------|\n| 通义千问 (Qwen) | qwen-plus | `wxai set qwen ` |\n| DeepSeek | deepseek-chat | `wxai set deepseek ` |\n| Claude | claude-opus-4-6 (Agent) | `wxai set claude ` |\n| GPT | gpt-4o | `wxai set gpt ` |\n| Gemini | gemini-2.0-flash | `wxai set gemini ` |\n| MiniMax | MiniMax-Text-01 | `wxai set minimax ` |\n| 智谱 (GLM) | glm-4-plus | `wxai set zhipu ` |\n\n支持任何 OpenAI 兼容 API,编辑 `~/.wai/config.json` 即可添加。\n\nClaude 通过 [Agent SDK](https://github.com/anthropics/claude-agent-sdk-typescript) 接入,支持执行代码、读写文件、搜索网页,不只是聊天。\n\n## 安装运行\n\n```bash\n# 方式一:直接运行(无需安装)\nnpx wxai\n\n# 方式二:全局安装\nnpm i -g wxai\n\n# 方式三:克隆源码\ngit clone https://github.com/anxiong2025/wx-bot.git\ncd wx-bot && npm install && npm run build && node dist/cli.js\n```\n\n## 命令\n\n```bash\nwxai # 启动(首次自动弹出二维码)\nwxai set <模型> # 保存 API Key\nwxai use <模型> # 设置默认模型\nwxai config # 查看配置(Key 已脱敏)\n```\n\n### 微信内指令\n\n```\n/model 查看当前模型\n/model deepseek 切换到 DeepSeek\n/model qwen 切换到 Qwen\n/help 显示指令列表\n/ping 检查状态\n```\n\n## 架构\n\n```\n微信 ──ilink──> wx-ai 网关 ──路由──> AI 模型\n │ │\n 会话管理 ┌────┴────┐\n 模型路由 │ │\n Claude Agent OpenAI 兼容\n (工具: Bash, (Qwen, DeepSeek,\n Read, Web) GPT, Gemini...)\n```\n\n## 项目结构\n\n```\nsrc/\n├── cli.ts 命令行入口\n├── gateway.ts 消息路由 & 会话管理\n├── config.ts 配置 (~/.wai/config.json)\n├── types.ts 核心接口定义\n├── channels/weixin.ts 微信 ilink 协议实现\n└── providers/\n ├── claude-agent.ts Claude Agent SDK\n └── openai-compatible.ts 通用 OpenAI 兼容\n```\n\n## 微信协议\n\n直接实现微信 ilink bot API,不依赖 OpenClaw:\n\n- 登录:`ilink/bot/get_bot_qrcode` 扫码\n- 收消息:`ilink/bot/getupdates` 长轮询\n- 发消息:`ilink/bot/sendmessage`\n- 输入状态:`ilink/bot/sendtyping`\n\n参考:[@tencent-weixin/openclaw-weixin](https://www.npmjs.com/package/@tencent-weixin/openclaw-weixin) (MIT)\n\n## 计划\n\n- [x] 微信 ilink 协议\n- [x] 多模型切换 (`/model`)\n- [x] 输入状态提示\n- [x] 7 个内置模型\n- [ ] 图片/文件收发\n- [ ] Telegram / Discord 渠道\n- [ ] MCP 支持\n- [ ] npm 发布\n\n## 协议\n\nMIT\n"}}}}