Files

1 line
134 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<WaiConfig>;\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<void> {\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<WaiConfig> {\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<void> {\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<WaiConfig> {\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<void> {\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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| Kimi (Moonshot) | moonshot-v1-8k | `wechat-ai set kimi <key>` | [申请](https://platform.moonshot.cn/console/api-keys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| Kimi (Moonshot) | moonshot-v1-8k | `wechat-ai set kimi <key>` | [申请](https://platform.moonshot.cn/console/api-keys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](https://open.bigmodel.cn/usercenter/apikeys) |\n| OpenRouter | 300+ 第三方模型 | `wechat-ai set openrouter <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <模型> <key> # 保存 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 <key>` | [申请](https://bailian.console.aliyun.com/cn-beijing/?tab=model#/api-key) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <key>` | [申请](https://dashscope.console.aliyun.com/apiKey) |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` | [申请](https://platform.deepseek.com/api_keys) |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` | [申请](https://console.anthropic.com/settings/keys) |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` | [申请](https://platform.openai.com/api-keys) |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` | [申请](https://aistudio.google.com/apikey) |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` | [申请](https://platform.minimaxi.com/user-center/basic-information/interface-key) |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` | [申请](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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` |\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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` |\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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` |\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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set glm <key>` |\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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wechat-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wechat-ai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wechat-ai set claude <key>` |\n| GPT | gpt-4o | `wechat-ai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wechat-ai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wechat-ai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wechat-ai set zhipu <key>` |\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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wx-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wx-ai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wx-ai set claude <key>` |\n| GPT | gpt-4o | `wx-ai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wx-ai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wx-ai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wx-ai set zhipu <key>` |\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 <模型> <key> # 保存 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<p align=\"center\">\n <img src=\"docs/screenshot.png\" width=\"800\" alt=\"wx-ai screenshot\" />\n</p>\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 <key>` |\n| DeepSeek | deepseek-chat | `wxai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wxai set claude <key>` |\n| GPT | gpt-4o | `wxai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wxai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wxai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wxai set zhipu <key>` |\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 <模型> <key> # 保存 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 <key>` |\n| DeepSeek | deepseek-chat | `wxai set deepseek <key>` |\n| Claude | claude-opus-4-6 (Agent) | `wxai set claude <key>` |\n| GPT | gpt-4o | `wxai set gpt <key>` |\n| Gemini | gemini-2.0-flash | `wxai set gemini <key>` |\n| MiniMax | MiniMax-Text-01 | `wxai set minimax <key>` |\n| 智谱 (GLM) | glm-4-plus | `wxai set zhipu <key>` |\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 <模型> <key> # 保存 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"}}}}